diff --git a/design_system_dependences/nospam/.ok b/design_system_dependences/nospam/.ok
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/nospam/v2.4.4/action/nospam_confirm_action.php b/design_system_dependences/nospam/v2.4.4/action/nospam_confirm_action.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff5b09e67402300ce2b9d03d08e21adf488d95cd
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/action/nospam_confirm_action.php
@@ -0,0 +1,240 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+define('_DIR_CONFIRM_ACTIONS', 'actions_a_confirmer');
+
+/**
+ * Traiter la confirmation d'action envoyee par le navigateur apres le POST du formulaire
+ */
+function action_nospam_confirm_action_dist() {
+
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$hash = $securiser_action();
+
+	$dir_actions = sous_repertoire(_DIR_TMP,_DIR_CONFIRM_ACTIONS);
+	if (file_exists($fichier_action = $dir_actions. $hash . '.json')) {
+
+		lire_fichier($fichier_action, $desc_json);
+		if ($desc_json and $hash === nospam_hash_action($desc_json)) {
+
+			if ($desc = json_decode($desc_json, true)) {
+				// on move ce fichier, le temps de l'execution, pour eviter une double exec (les navs font parfois un double hit sur l'iframe)
+				@rename($fichier_action, $fichier_action = $fichier_action . ".inprogress");
+
+				// si on a fournit un time alors il faut ajouter l'action dans la queue
+				if (!is_null($desc['time'])) {
+					spip_log("nospam_confirm_action_dist $hash: ajout de l'action a job_queue $desc_json", 'nospam' . _LOG_DEBUG);
+					job_queue_add($desc['function'], $desc['description'], $desc['arguments'], $desc['file'], false, $desc['time']);
+				}
+				else {
+					$fonction = $desc['function'];
+					if (strlen($inclure = trim($desc['file']))) {
+						if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction
+							$f = charger_fonction($fonction, rtrim($inclure, '/'), false);
+							if ($f) {
+								$fonction = $f;
+							}
+						} else {
+							include_spip($inclure);
+						}
+					}
+
+					if (!function_exists($fonction)) {
+						spip_log("nospam_confirm_action_dist $hash: fonction $fonction ($inclure) inexistante $desc_json", 'nospam' . _LOG_ERREUR);
+					}
+					else {
+						$res = call_user_func_array($fonction, $desc['arguments']);
+						spip_log("nospam_confirm_action_dist $hash: execution de $fonction() $desc_json RES=" . var_export($res,true), 'nospam' . _LOG_DEBUG);
+					}
+				}
+			}
+			else {
+				spip_log("nospam_confirm_action_dist:contenu action $desc_json invalide", 'nospam' . _LOG_ERREUR);
+			}
+		}
+		else {
+			spip_log("nospam_confirm_action_dist:hash $hash errone: contenu action $desc_json", 'nospam' . _LOG_ERREUR);
+		}
+
+		// dans tous les cas on purge ce fichier, l'action est faite ou impossible
+		@unlink($fichier_action);
+	}
+	else {
+		// pas la peine de loger si le fichier .inprogress est la, c'est un autre thread qui s'en occupe
+		if (!file_exists($fichier_action . '.inprogress')) {
+			spip_log("nospam_confirm_action_dist:hash $hash errone: fichier $fichier_action absent (doublon deja execute ?)", 'nospam' . _LOG_ERREUR);
+		}
+	}
+
+	// supprimer les actions plus vieilles que 5mn en les logeant
+	$old_time = $_SERVER['REQUEST_TIME'] - 5 * 60;
+	nospam_purge_actions($dir_actions, ['mtime' => $old_time, 'limit' => 1000]);
+
+	// et on renvoie un html minimum
+	if (!_request('redirect')) {
+		include_spip('inc/headers');
+		http_response_code(204); // No Content
+		header("Connection: close");
+	}
+}
+
+
+/**
+ * Generer le HTML a afficher pour faire confirmer une action par l'utilisateur a son insu
+ * (antispam qui declenche donc l'action uniquement si l'utilisateur charge les ressources de la page)
+ *
+ * @param string $function
+ * @param string $description
+ * @param array $arguments
+ * @param string $file
+ * @param null $time
+ * @param string $method
+ * @return string
+ */
+function nospam_confirm_action_prepare(
+	$function,
+	$description,
+	$arguments = array(),
+	$file = '',
+	$time = null,
+	$method = 'script') {
+
+	// on stocke le descriptif de l'action a lancer dans un fichier
+	$desc = [
+		'function' => $function,
+		'description' => $description,
+		'arguments' => $arguments,
+		'file' => $file,
+		'time' => $time,
+		// et des infos pour qualifier les spammeurs plus tard si besoin
+		'ip' => $GLOBALS['ip'],
+		'date' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']), // pour les logs, on met la date de la demande d'action
+		'ua' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined',
+	];
+	$desc = json_encode($desc);
+
+	$dir_actions = sous_repertoire(_DIR_TMP,_DIR_CONFIRM_ACTIONS);
+
+	$hash = nospam_hash_action($desc);
+	ecrire_fichier($dir_actions . $hash . ".json", $desc);
+
+	include_spip('inc/actions');
+	include_spip('inc/filtres');
+	$url_action = str_replace("&amp;", "&", generer_action_auteur("nospam_confirm_action", $hash));
+	$url_action_redirect = parametre_url($url_action, 'redirect', self(), '&');
+
+	switch ($method) {
+		case 'iframe':
+			$title = attribut_html(_T('nospam:info_alt_antispam'));
+			$html_action = "<iframe src='$url_action' width='1' height='1' style='display:inline-block;border:0;background:transparent;overflow:hidden;' title='$title'></iframe>";
+			break;
+
+		case 'script':
+		default:
+
+			$bouton_action = charger_filtre('bouton_action');
+			$libelle = attribut_html(_T('nospam:libelle_je_ne_suis_pas_un_robot'));
+			$html_action = $bouton_action($libelle, $url_action_redirect, 'btn-primary btn-sm btn-antispam');
+
+			$js = "jQuery.ajax({url: '{$url_action}'}).done(function(){jQuery('.nospam-checkbox').addClass('checked');})";
+			$html_action = "<span class='nospam-checkbox small'></span><script>$js</script><noscript>$html_action</noscript>";
+			$css = file_get_contents(find_in_path('css/nospam-checkbox.min.css'));
+			$html_action .= "<style type='text/css'>$css</style>";
+			break;
+
+	}
+
+	// supprimer des actions plus vieilles que 5mn en les logeant
+	// si on le fait qu'a l'exec d'action legitime, on risque le flood si y a que des spammeurs !
+	$old_time = $_SERVER['REQUEST_TIME'] - 5 * 60;
+	nospam_purge_actions($dir_actions, ['mtime' => $old_time, 'limit' => 10]);
+
+	return $html_action;
+}
+
+
+/**
+ * Calculer un hash pour une action donnee
+ *
+ * @param $desc_json
+ * @return bool|string
+ */
+function nospam_hash_action($desc_json) {
+	if (!function_exists('secret_du_site')) {
+		include_spip('inc/securiser_action');
+	}
+	$hash = substr(md5(__FILE__ . secret_du_site() . $desc_json), 0, 16);
+
+	return $hash;
+}
+
+
+/**
+ * Purge le répertoire des actions en logant tout ce qu'on purge
+ *
+ * @param string $dir
+ *     Chemin du répertoire à purger
+ * @param array $options
+ *     Tableau des options. Peut être :
+ *
+ *     - atime : timestamp pour ne supprimer que les fichiers antérieurs
+ *       à cette date (via fileatime)
+ *     - mtime : timestamp pour ne supprimer que les fichiers antérieurs
+ *       à cette date (via filemtime)
+ *     - limit : nombre maximum de suppressions
+ * @return int
+ *     Nombre de fichiers supprimés
+ **/
+function nospam_purge_actions($dir, $options = array()) {
+	if (!is_dir($dir) or !is_readable($dir)) {
+		return;
+	}
+	$handle = opendir($dir);
+	if (!$handle) {
+		return;
+	}
+
+	$total = 0;
+
+	while (($fichier = @readdir($handle)) !== false) {
+		// Eviter ".", "..", ".htaccess", ".svn" etc.
+		if ($fichier[0] == '.') {
+			continue;
+		}
+		$chemin = "$dir/$fichier";
+		if (is_file($chemin)) {
+			if ((!isset($options['atime']) or (@fileatime($chemin) < $options['atime']))
+				and (!isset($options['mtime']) or (@filemtime($chemin) < $options['mtime']))
+			) {
+				$action = file_get_contents($chemin);
+				spip_log("Purge action non confirmee $fichier: $action", 'nospam_unconfirmed' . _LOG_INFO_IMPORTANTE);
+				@unlink($chemin);
+				$total++;
+			}
+		} else {
+			if (is_dir($chemin)) {
+				$opts = $options;
+				if (isset($options['limit'])) {
+					$opts['limit'] = $options['limit'] - $total;
+				}
+				$total += nospam_purge_actions($chemin, $opts);
+				if (isset($options['subdir']) && $options['subdir']) {
+					spip_unlink($chemin);
+				}
+			}
+		}
+
+		if (isset($options['limit']) and $total >= $options['limit']) {
+			break;
+		}
+	}
+	closedir($handle);
+
+	return $total;
+}
diff --git a/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.css b/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.css
new file mode 100644
index 0000000000000000000000000000000000000000..f834c2dbd2088b215eb2b8b3daad071e2ca103c6
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.css
@@ -0,0 +1,146 @@
+@-moz-keyframes dothabottomcheck {
+	0% {
+		height: 0;
+	}
+	100% {
+		height: 0.5em;
+	}
+}
+
+@-webkit-keyframes dothabottomcheck {
+	0% {
+		height: 0;
+	}
+	100% {
+		height: 0.5em;
+	}
+}
+
+@keyframes dothabottomcheck {
+	0% {
+		height: 0;
+	}
+	100% {
+		height: 0.5em;
+	}
+}
+
+@keyframes dothatopcheck {
+	0% {
+		height: 0;
+	}
+	50% {
+		height: 0;
+	}
+	100% {
+		height: 1.2em;
+	}
+}
+
+@-webkit-keyframes dothatopcheck {
+	0% {
+		height: 0;
+	}
+	50% {
+		height: 0;
+	}
+	100% {
+		height: 1.2em;
+	}
+}
+
+@-moz-keyframes dothatopcheck {
+	0% {
+		height: 0;
+	}
+	50% {
+		height: 0;
+	}
+	100% {
+		height: 1.2em;
+	}
+}
+
+.nospam-checkbox {
+	height: 1em;
+	width: 1em;
+	background-color: transparent;
+	border: 0.15em solid #888;
+	border-radius: 0.1em;
+	position: relative;
+	display: inline-block;
+	-moz-box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	-moz-transition: border-color ease 0.2s;
+	-o-transition: border-color ease 0.2s;
+	-webkit-transition: border-color ease 0.2s;
+	transition: border-color ease 0.2s;
+	opacity: 0;
+}
+.loading .nospam-checkbox {
+	visibility: hidden !important;
+}
+
+.nospam-checkbox::before,
+.nospam-checkbox::after {
+	-moz-box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	position: absolute;
+	height: 0;
+	width: 0.2em;
+	background-color: currentColor;
+	display: inline-block;
+	-moz-transform-origin: left top;
+	-ms-transform-origin: left top;
+	-o-transform-origin: left top;
+	-webkit-transform-origin: left top;
+	transform-origin: left top;
+	border-radius: 0.05em;
+	content: ' ';
+	-webkit-transition: opacity ease .5;
+	-moz-transition: opacity ease .5;
+	transition: opacity ease .5;
+}
+
+.nospam-checkbox::before {
+	top: 0.72em;
+	left: 0.41em;
+	-moz-transform: rotate(-135deg);
+	-ms-transform: rotate(-135deg);
+	-o-transform: rotate(-135deg);
+	-webkit-transform: rotate(-135deg);
+	transform: rotate(-135deg);
+}
+
+.nospam-checkbox::after {
+	top: 0.37em;
+	left: 0.05em;
+	-moz-transform: rotate(-45deg);
+	-ms-transform: rotate(-45deg);
+	-o-transform: rotate(-45deg);
+	-webkit-transform: rotate(-45deg);
+	transform: rotate(-45deg);
+}
+
+.nospam-checkbox.checked {
+	border-color: currentColor;
+	opacity: 1;
+}
+
+.nospam-checkbox.checked::after {
+	height: 0.5em;
+	-moz-animation: dothabottomcheck 0.2s ease 0s forwards;
+	-o-animation: dothabottomcheck 0.2s ease 0s forwards;
+	-webkit-animation: dothabottomcheck 0.2s ease 0s forwards;
+	animation: dothabottomcheck 0.2s ease 0s forwards;
+}
+
+.nospam-checkbox.checked::before {
+	height: 1.2em;
+	-moz-animation: dothatopcheck 0.4s ease 0s forwards;
+	-o-animation: dothatopcheck 0.4s ease 0s forwards;
+	-webkit-animation: dothatopcheck 0.4s ease 0s forwards;
+	animation: dothatopcheck 0.4s ease 0s forwards;
+}
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.min.css b/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..705c96ae7a9b0e337e8de5df7133b95f68ae4fbd
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/css/nospam-checkbox.min.css
@@ -0,0 +1 @@
+@-moz-keyframes dothabottomcheck{0%{height:0}100%{height:0.5em}}@-webkit-keyframes dothabottomcheck{0%{height:0}100%{height:0.5em}}@keyframes dothabottomcheck{0%{height:0}100%{height:0.5em}}@keyframes dothatopcheck{0%{height:0}50%{height:0}100%{height:1.2em}}@-webkit-keyframes dothatopcheck{0%{height:0}50%{height:0}100%{height:1.2em}}@-moz-keyframes dothatopcheck{0%{height:0}50%{height:0}100%{height:1.2em}}.nospam-checkbox{height:1em;width:1em;background-color:transparent;border:0.15em solid #888;border-radius:0.1em;position:relative;display:inline-block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-transition:border-color ease 0.2s;-o-transition:border-color ease 0.2s;-webkit-transition:border-color ease 0.2s;transition:border-color ease 0.2s;opacity:0}.loading .nospam-checkbox{visibility:hidden !important}.nospam-checkbox::after,.nospam-checkbox::before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;height:0;width:0.2em;background-color:currentColor;display:inline-block;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;-webkit-transform-origin:left top;transform-origin:left top;border-radius:0.05em;content:' ';-webkit-transition:opacity ease 0.5;-moz-transition:opacity ease 0.5;transition:opacity ease 0.5}.nospam-checkbox::before{top:0.72em;left:0.41em;-moz-transform:rotate(-135deg);-ms-transform:rotate(-135deg);-o-transform:rotate(-135deg);-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.nospam-checkbox::after{top:0.37em;left:0.05em;-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.nospam-checkbox.checked{border-color:currentColor;opacity:1}.nospam-checkbox.checked::after{height:0.5em;-moz-animation:dothabottomcheck 0.2s ease 0s forwards;-o-animation:dothabottomcheck 0.2s ease 0s forwards;-webkit-animation:dothabottomcheck 0.2s ease 0s forwards;animation:dothabottomcheck 0.2s ease 0s forwards}.nospam-checkbox.checked::before{height:1.2em;-moz-animation:dothatopcheck 0.4s ease 0s forwards;-o-animation:dothatopcheck 0.4s ease 0s forwards;-webkit-animation:dothatopcheck 0.4s ease 0s forwards;animation:dothatopcheck 0.4s ease 0s forwards}
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/images/nospam-32.png b/design_system_dependences/nospam/v2.4.4/images/nospam-32.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f7a2525b865328d07855cd37e5d6bc3112027ea
Binary files /dev/null and b/design_system_dependences/nospam/v2.4.4/images/nospam-32.png differ
diff --git a/design_system_dependences/nospam/v2.4.4/images/nospam-64.png b/design_system_dependences/nospam/v2.4.4/images/nospam-64.png
new file mode 100644
index 0000000000000000000000000000000000000000..c003b369234614606e604934538a2d94de7c93c8
Binary files /dev/null and b/design_system_dependences/nospam/v2.4.4/images/nospam-64.png differ
diff --git a/design_system_dependences/nospam/v2.4.4/images/nospam-xx.svg b/design_system_dependences/nospam/v2.4.4/images/nospam-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9f17255cf49ecad659f6893d00043bb779ac62bc
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/images/nospam-xx.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M10.5 7.1v35h.8L32 58.7l22.2-16.6v-35H10.5z" />
+  <path fill="#666" d="M9.2 6.5L32 1.4l22.8 5.1c1.3.3 2.2 1.4 2.2 2.7V37c0 5.6-2.8 10.8-7.4 13.9L32 62.6 14.4 50.8C9.8 47.7 7 42.5 7 37V9.2c0-1.3.9-2.4 2.2-2.7zm3.4 5V37c0 3.7 1.9 7.2 4.9 9.2L32 55.9l14.5-9.7c3.1-2.1 4.9-5.5 4.9-9.2V11.5L32 7.1l-19.4 4.4z"/>
+  <path fill="#1d83d4" d="M32 45.1c-6.2 0-11.2-5-11.2-11.3 0-3.1 1.3-6.1 3.5-8.2 2-1.9 7-5.3 6.2-12.8 9 6 13.5 12 4.5 21 1.5 0 3.8 0 7.5-3.7.4 1.2.8 2.4.8 3.7 0 6.3-5.1 11.3-11.3 11.3z"/>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/inc/detecter_langue.php b/design_system_dependences/nospam/v2.4.4/inc/detecter_langue.php
new file mode 100644
index 0000000000000000000000000000000000000000..226a46008a30f7aea41c38a9b54db303a0edb306
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/inc/detecter_langue.php
@@ -0,0 +1,260 @@
+<?php
+
+$GLOBALS["ngrams"]['af'] = array("ie ", " di", "die", "en ", "ing", "an ", " en", "van", " va", "ng ", "te ", "n d", "ver", "er ", "e v", " ge", " be", "de ", " ve", "nde", " in", " te", "le ", "der", "ers", "et ", "oor", " 'n", "'n ", "at ", "eer", "ste", "ord", "aar", "sie", " wa", "es ", "e s", "aan", " on", "is ", "in ", "e o", "rde", "e b", "asi", "rin", "ond", "e w", "el ", " is", "and", "e e", "eid", "e d", "om ", "ke ", " om", "eri", " wo", "e g", "r d", "ale", "wat", " vo", "id ", "it ", "rd ", " aa", "lik", " we", "t d", " op", "e t", "ngs", "se ", "end", "uit", " st", " le", "ens", "ter", " re", "e a", "ies", "wor", "g v", "sta", "n s", " na", " pr", "n o", " me", "al ", "of ", " vi", "erd", "lee", "e k", " de", "ite", "erk", "ik ", "e r", "e p", "n v", "e i", "e n", "een", "eli", "wer", " of", " da", "tel", "nie", "ike", "s e", "taa", "ge ", "vir", "hei", "ir ", "reg", "ede", "s v", "ur ", "pro", "ele", "ion", "wet", "e l", " mo", "e m", "daa", "sio", "s d", " he", " to", "ent", "ard", "nge", " oo", "eur", "lle", "ien", "n b", "eke", "lin", "raa", " ni", "ont", "bes", "rdi", "voo", "ns ", "n a", "del", "dig", "nas", " sa", " gr", "nis", "kom", " ui", "men", "op ", "ins", "ona", "ere", "s o", " so", "n g", "ig ", "moe", " ko", "rs ", "ges", "nal", "vol", "e h", "geb", "rui", "ang", "ige", "oet", "ar ", "wys", "lig", "as ", "n w", " as", "met", "gs ", "deu", "t v", "aal", "erw", "dit", "ken", "sse", "kel", " hu", "ewe", "din", "n t", " se", "est", "ika", "n p", "ntw", "t i", "eni", " ka", "n e", "doe", "ali", "eme", "gro", "nte", " ho", "nsi", "gen", "ier", "gew", "n h", "or ", " ma", "ind", "ne ", "ek ", "aat", "n '", " sk", "ide", " ta", "dat", "ska", "ger", "soo", "n k", "s i", " af", "tee", "nd ", "eel", "hul", "nee", "woo", "rik", "d v", "n m", "re ", "art", "ebr", "lan", "kke", "ron", "aam", "tre", "str", "kan", "ree", "lei", "t o", "gra", "het", "evo", "tan", "den", "ist", " do", "bru", "toe", "olg", "rsk", "uik", "rwy", "min", "lge", "g e", "g o", "nst", "r v", "gte", "waa", "we ", "ans", "esi", "ese", "voe", "epa", "gel", " hi", "vin", "nse", "s w", "s t", "tei", "eit", "pre");
+$GLOBALS["ngrams"]['ar'] = array(" ال", "الع", "لعر", "عرا", "راق", " في", "في ", "ين ", "ية ", "ن ا", "الم", "ات ", "من ", "ي ا", " من", "الأ", "ة ا", "اق ", " وا", "اء ", "الإ", " أن", "وال", "ما ", " عل", "لى ", "ت ا", "ون ", "هم ", "اقي", "ام ", "ل ا", "أن ", "م ا", "الت", "لا ", "الا", "ان ", "ها ", "ال ", "ة و", "ا ا", "رها", "لام", "يين", " ول", "لأم", "نا ", "على", "ن ي", "الب", "اد ", "الق", "د ا", "ذا ", "ه ا", " با", "الد", "ب ا", "مري", "لم ", " إن", " لل", "سلا", "أمر", "ريك", "مة ", "ى ا", "ا ي", " عن", " هذ", "ء ا", "ر ا", "كان", "قتل", "إسل", "الح", "وا ", " إل", "ا أ", "بال", "ن م", "الس", "رة ", "لإس", "ن و", "هاب", "ي و", "ير ", " كا", "لة ", "يات", " لا", "انت", "ن أ", "يكي", "الر", "الو", "ة ف", "دة ", "الج", "قي ", "وي ", "الذ", "الش", "امي", "اني", "ذه ", "عن ", "لما", "هذه", "ول ", "اف ", "اوي", "بري", "ة ل", " أم", " لم", " ما", "يد ", " أي", "إره", "ع ا", "عمل", "ولا", "إلى", "ابي", "ن ف", "ختط", "لك ", "نه ", "ني ", "إن ", "دين", "ف ا", "لذي", "ي أ", "ي ب", " وأ", "ا ع", "الخ", "تل ", "تي ", "قد ", "لدي", " كل", " مع", "اب ", "اخت", "ار ", "الن", "علا", "م و", "مع ", "س ا", "كل ", "لاء", "ن ب", "ن ت", "ي م", "عرب", "م ب", " وق", " يق", "ا ل", "ا م", "الف", "تطا", "داد", "لمس", "له ", "هذا", " مح", "ؤلا", "بي ", "ة م", "ن ل", "هؤل", "كن ", "لإر", "لتي", " أو", " ان", " عم", "ا ف", "ة أ", "طاف", "عب ", "ل م", "ن ع", "ور ", "يا ", " يس", "ا ت", "ة ب", "راء", "عال", "قوا", "قية", "لعا", "م ي", "مي ", "مية", "نية", "أي ", "ابا", "بغد", "بل ", "رب ", "عما", "غدا", "مال", "ملي", "يس ", " بأ", " بع", " بغ", " وم", "بات", "بية", "ذلك", "عة ", "قاو", "قيي", "كي ", "م م", "ي ع", " عر", " قا", "ا و", "رى ", "ق ا", "وات", "وم ", " هؤ", "ا ب", "دام", "دي ", "رات", "شعب", "لان", "لشع", "لقو", "ليا", "ن ه", "ي ت", "ي ي", " وه", " يح", "جرا", "جما", "حمد", "دم ", "كم ", "لاو", "لره", "ماع", "ن ق", "نة ", "هي ", " بل", " به", " له", " وي", "ا ك", "اذا", "اع ", "ت م", "تخا", "خاب", "ر م", "لمت", "مسل", "ى أ", "يست", "يطا", " لأ", " لي", "أمن", "است", "بعض", "ة ت", "ري ", "صدا", "ق و", "قول", "مد ", "نتخ", "نفس", "نها", "هنا", "أعم", "أنه", "ائن", "الآ", "الك", "حة ", "د م", "ر ع", "ربي");
+$GLOBALS["ngrams"]['az'] = array("lər", "in ", "ın ", "lar", "da ", "an ", "ir ", "də ", "ki ", " bi", "ən ", "əri", "arı", "ər ", "dir", "nda", " ki", "rin", "nın", "əsi", "ini", " ed", " qa", " tə", " ba", " ol", "ası", "ilə", "rın", " ya", "anı", " və", "ndə", "ni ", "ara", "ını", "ınd", " bu", "si ", "ib ", "aq ", "dən", "iya", "nə ", "rə ", "n b", "sın", "və ", "iri", "lə ", "nin", "əli", " de", " mü", "bir", "n s", "ri ", "ək ", " az", " sə", "ar ", "bil", "zər", "bu ", "dan", "edi", "ind", "man", "un ", "ərə", " ha", "lan", "yyə", "iyy", " il", " ne", "r k", "ə b", " is", "na ", "nun", "ır ", " da", " hə", "a b", "inə", "sin", "yan", "ərb", " də", " mə", " qə", "dır", "li ", "ola", "rba", "azə", "can", "lı ", "nla", " et", " gö", "alı", "ayc", "bay", "eft", "ist", "n i", "nef", "tlə", "yca", "yət", "əcə", " la", "ild", "nı ", "tin", "ldi", "lik", "n h", "n m", "oyu", "raq", "ya ", "əti", " ar", "ada", "edə", "mas", "sı ", "ına", "ə d", "ələ", "ayı", "iyi", "lma", "mək", "n d", "ti ", "yin", "yun", "ət ", "azı", "ft ", "i t", "lli", "n a", "ra ", " cə", " gə", " ko", " nə", " oy", "a d", "ana", "cək", "eyi", "ilm", "irl", "lay", "liy", "lub", "n ə", "ril", "rlə", "unu", "ver", "ün ", "ə o", "əni", " he", " ma", " on", " pa", "ala", "dey", "i m", "ima", "lmə", "mət", "par", "yə ", "ətl", " al", " mi", " sa", " əl", "adı", "akı", "and", "ard", "art", "ayi", "i a", "i q", "i y", "ili", "ill", "isə", "n o", "n q", "olu", "rla", "stə", "sə ", "tan", "tel", "yar", "ədə", " me", " rə", " ve", " ye", "a k", "at ", "baş", "diy", "ent", "eti", "həs", "i i", "ik ", "la ", "miş", "n n", "nu ", "qar", "ran", "tər", "xan", "ə a", "ə g", "ə t", " dü", "ama", "b k", "dil", "era", "etm", "i b", "kil", "mil", "n r", "qla", "r s", "ras", "siy", "son", "tim", "yer", "ə k", " gü", " so", " sö", " te", " xa", "ai ", "bar", "cti", "di ", "eri", "gör", "gün", "gəl", "hbə", "ihə", "iki", "isi", "lin", "mai", "maq", "n k", "n t", "n v", "onu", "qan", "qəz", "tə ", "xal", "yib", "yih", "zet", "zır", "ıb ", "ə m", "əze", " br", " in", " i̇r", " pr", " ta", " to", " üç", "a o", "ali", "ani", "anl", "aql", "azi", "bri");
+$GLOBALS["ngrams"]['bg'] = array("на ", " на", "то ", " пр", " за", "та ", " по", "ите", "те ", "а п", "а с", " от", "за ", "ата", "ия ", " в ", "е н", " да", "а н", " се", " ко", "да ", "от ", "ани", "пре", "не ", "ени", "о н", "ни ", "се ", " и ", "но ", "ане", "ето", "а в", "ва ", "ван", "е п", "а о", "ото", "ран", "ат ", "ред", " не", "а д", "и п", " до", "про", " съ", "ли ", "при", "ния", "ски", "тел", "а и", "по ", "ри ", " е ", " ка", "ира", "кат", "ние", "нит", "е з", "и с", "о с", "ост", "че ", " ра", "ист", "о п", " из", " са", "е д", "ини", "ки ", "мин", " ми", "а б", "ава", "е в", "ие ", "пол", "ств", "т н", " въ", " ст", " то", "аза", "е о", "ов ", "ст ", "ът ", "и н", "ият", "нат", "ра ", " бъ", " че", "алн", "е с", "ен ", "ест", "и д", "лен", "нис", "о о", "ови", " об", " сл", "а р", "ато", "кон", "нос", "ров", "ще ", " ре", " с ", " сп", "ват", "еше", "и в", "иет", "о в", "ове", "ста", "а к", "а т", "дат", "ент", "ка ", "лед", "нет", "ори", "стр", "стъ", "ти ", "тър", " те", "а з", "а м", "ад ", "ана", "ено", "и о", "ина", "ити", "ма ", "ска", "сле", "тво", "тер", "ция", "ят ", " бе", " де", " па", "ате", "вен", "ви ", "вит", "и з", "и и", "нар", "нов", "ова", "пов", "рез", "рит", "са ", "ята", " го", " ще", "али", "в п", "гра", "е и", "еди", "ели", "или", "каз", "кит", "лно", "мен", "оли", "раз", " ве", " гр", " им", " ме", " пъ", "ави", "ако", "ача", "вин", "во ", "гов", "дан", "ди ", "до ", "ед ", "ери", "еро", "жда", "ито", "ков", "кол", "лни", "мер", "нач", "о з", "ола", "он ", "она", "пра", "рав", "рем", "сия", "сти", "т п", "тан", "ха ", "ше ", "шен", "ълг", " ба", " си", "аро", "бъл", "в р", "гар", "е е", "елн", "еме", "ико", "има", "ко ", "кои", "ла ", "лга", "о д", "ози", "оит", "под", "рес", "рие", "сто", "т к", "т м", "т с", "уст", " би", " дв", " дъ", " ма", " мо", " ни", " ос", "ала", "анс", "ара", "ати", "аци", "беш", "вър", "е р", "едв", "ема", "жав", "и к", "иал", "ица", "иче", "кия", "лит", "о б", "ово", "оди", "ока", "пос", "род", "сед", "слу", "т и", "тов", "ува", "циа", "чес", "я з", " во", " ил", " ск", " тр", " це", "ами", "ари", "бат", "би ", "бра", "бъд");
+$GLOBALS["ngrams"]['br'] = array("ar ", " a ", "en ", "an ", "et ", " ar", "ez ", " he", " ha", " an", "n d", " ho", " da", " va", " eu", "ur ", "er ", " pe", " de", "nt ", " ma", "n e", "var", " en", " be", " di", " ch", " e ", "eur", "ou ", "uz ", "it ", "ho ", "z a", "he ", "da ", "a z", "n a", " do", "oue", "ha ", "n h", " ne", "dou", "t a", " ke", " ev", "un ", "ag ", "t e", "euz", " me", " ga", " : ", "ant", " zo", "ll ", "ad ", "ch ", "oun", "t h", " la", "t d", "r a", "a d", " ve", "r b", "ed ", "enn", "hag", " re", "ue ", "zo ", "a v", "ra ", "r p", "ma ", " go", "r g", "el ", "cho", "evi", "a g", "a r", "hen", "vez", "deu", "aou", "c'h", "eo ", "z e", "ent", "z h", "che", "a b", "vit", "vel", " dr", "eme", "eve", "r m", "our", "mp ", "e a", " ra", " ka", " pa", "omp", "han", "eun", "den", "ne ", "r h", "rou", "a e", "ist", " gu", "d a", "o d", "uez", "gan", "az ", " tr", " eo", "e d", "och", "ell", "e v", "or ", "va ", "on ", " br", "r v", "ro ", "ket", "ava", "all", "gou", "o e", "g a", "re ", "ude", "e e", "oud", " se", " ko", "z d", "eze", "tra", "lav", "e h", "kou", "oul", " al", "r e", "lou", "ken", " ze", "iou", "are", "ud ", " gr", "u a", "hou", "ach", "n t", " na", "mar", "r c", "a l", "ret", "zou", " er", "l a", "mad", "nn ", "a c", "ze ", "oll", "a h", "r d", "l e", "ris", "e g", "per", "eza", "mez", "a n", "ech", "oua", "st ", "ont", "bed", "at ", " zi", "t m", "iz ", "za ", "bre", "d e", "o a", "o k", "hor", "d h", "rn ", "a m", "em ", "ene", " c'", "etr", "e k", "ara", "in ", " et", "gue", "t g", "us ", " em", "e z", "t k", "cha", "na ", "ouz", "as ", "nte", "ut ", " ou", " ta", " le", "ere", "red", " ba", " sa", "g e", "rez", "a k", "nan", " sk", "e m", "rei", " te", "t p", "dre", "ele", "men", "ran", "o h", "e c", "e b", "her", "tro", " dh", "ber", "ste", "o p", "reu", " za", "ui ", "bar", "hon", "n n", "out", "spe", "dis", "alo", "uel", "a a", "hol", "ver", "ezo", "bez", "hoa", "i a", "tre", "ank", "gal", "kri", "bet", "ni ", "dig", "al ", "a p", "una", "r s", "env", "net", "ave", "ten", " kr", "rea", "e p", " hi", "tez", "ta ", "l d", "u d", "eud", "r z", "r r", "ren");
+$GLOBALS["ngrams"]['ca'] = array(" de", "es ", "de ", "la ", " la", "el ", "que", " el", " co", "ent", "s d", " qu", " i ", "en ", "er ", " a ", "ls ", "nt ", " pe", "e l", "a d", " en", "per", "ci ", "ar ", "ue ", "al ", " se", "est", "at ", " es", "ts ", " s ", " pr", "aci", " un", "res", "men", "s e", "del", "s a", "s p", " re", "les", " l'", "na ", "a l", " ca", " d'", "els", "a p", "ia ", "ns ", "con", " le", "tat", "a c", "i d", "a a", "ra ", "a e", " no", "ant", " al", "t d", "s i", " di", "ta ", "re ", "a s", "com", "s c", "ita", "ons", "sta", "ica", " po", "r a", " in", "pro", "tre", " pa", "ues", "amb", "ion", "des", "un ", " ma", "da ", "s s", "a i", "an ", "mb ", " am", "l d", "e d", "va ", "pre", "ter", "e e", "e c", "a m", "cia", "una", "i e", "nci", "tra", " te", "ona", "os ", "t e", "n e", "l c", "ca ", "cio", "l p", " tr", "par", "r l", "t a", "e p", "aqu", "nta", " so", "ame", "era", "r e", "e s", "ada", "n a", "s q", " si", " ha", "als", "tes", " va", " m ", "ici", "nte", "s l", "s m", "i a", "or ", " mo", "ist", "ect", "lit", "m s", " to", "ir ", "a t", "esp", "ran", "str", "om ", "l s", "st ", "nts", " me", "no ", "r d", "d'a", "l'a", "ats", "ria", "s t", " ta", "sen", "rs ", "eix", "tar", "s n", "n l", "tal", "e a", "t p", "art", " mi", " ll", "tic", "ten", "ser", " aq", "ina", "ntr", "a f", "sti", "ol ", "a q", "for", "ura", "ers", "ari", "int", "act", "l'e", " fi", "r s", "e t", "tor", "si ", "ste", "rec", "a r", " fe", "is ", "em ", "n d", "car", "bre", " fo", " vi", " an", "ali", "i p", "ix ", "ell", "l m", "pos", "orm", "l l", "i l", " ac", "fer", "s r", "ess", "eu ", "e m", "ens", "ara", "eri", "sa ", "ssi", "us ", "ort", "tot", "ll ", "por", "ora", " ci", "tan", "ass", "n c", "ost", "nes", "rac", "a u", "ver", "ont", "ha ", " ti", "itz", "gra", "t c", " n ", "a v", "ren", "cat", "nal", " ri", "qua", "t l", " do", "t s", "rma", "ual", "i s", "s f", "n p", "s v", "te ", "t i", " ba", "cte", "tam", "man", "l t", "ial", " fa", "ic ", " ve", "ble", "a n", "all", "tza", "ies", " s'", "le ", "omp", "r c", " nc", "rti", "it ", "rre", "fic", "any", "on ", " sa", "r p", "tur");
+$GLOBALS["ngrams"]['ceb'] = array("ng ", "sa ", " sa", "ang", "ga ", "nga", " ka", " ng", "an ", " an", " na", " ma", " ni", "a s", "a n", "on ", " pa", " si", "a k", "a m", " ba", "ong", "a i", "ila", " mg", "mga", "a p", "iya", "a a", "ay ", "ka ", "ala", "ing", "g m", "n s", "g n", "lan", " gi", "na ", "ni ", "o s", "g p", "n n", " da", "ag ", "pag", "g s", "yan", "ayo", "o n", "si ", " mo", "a b", "g a", "ail", "g b", "han", "a d", "asu", "nag", "ya ", "man", "ne ", "pan", "kon", " il", " la", "aka", "ako", "ana", "bas", "ko ", "od ", "yo ", " di", " ko", " ug", "a u", "g k", "kan", "la ", "len", "sur", "ug ", " ai", "apa", "aw ", "d s", "g d", "g g", "ile", "nin", " iy", " su", "ene", "og ", "ot ", "aba", "aha", "as ", "imo", " ki", "a t", "aga", "ban", "ero", "nan", "o k", "ran", "ron", "sil", "una", "usa", " us", "a g", "ahi", "ani", "er ", "ha ", "i a", "rer", "yon", " pu", "ini", "nak", "ro ", "to ", "ure", " ed", " og", " wa", "ili", "mo ", "n a", "nd ", "o a", " ad", " du", " pr", "aro", "i s", "ma ", "n m", "ulo", "und", " ta", "ara", "asa", "ato", "awa", "dmu", "e n", "edm", "ina", "mak", "mun", "niy", "san", "wa ", " tu", " un", "a l", "bay", "iga", "ika", "ita", "kin", "lis", "may", "os ", " ar", "ad ", "ali", "ama", "ers", "ipa", "isa", "mao", "nim", "t s", "tin", " ak", " ap", " hi", "abo", "agp", "ano", "ata", "g i", "gan", "gka", "gpa", "i m", "iha", "k s", "law", "or ", "rs ", "siy", "tag", " al", " at", " ha", " hu", " im", "a h", "bu ", "e s", "gma", "kas", "lag", "mon", "nah", "ngo", "r s", "ra ", "sab", "sam", "sul", "uba", "uha", " lo", " re", "ada", "aki", "aya", "bah", "ce ", "d n", "lab", "pa ", "pak", "s n", "s s", "tan", "taw", "te ", "uma", "ura", " in", " lu", "a c", "abi", "at ", "awo", "bat", "dal", "dla", "ele", "g t", "g u", "gay", "go ", "hab", "hin", "i e", "i n", "kab", "kap", "lay", "lin", "nil", "pam", "pas", "pro", "pul", "ta ", "ton", "uga", "ugm", "unt", " co", " gu", " mi", " pi", " ti", "a o", "abu", "adl", "ado", "agh", "agk", "ao ", "art", "bal", "cit", "di ", "dto", "dun", "ent", "g e", "gon", "gug", "ia ", "iba", "ice", "in ", "inu", "it ", "kaa");
+$GLOBALS["ngrams"]['cs'] = array(" pr", " po", "ní ", "pro", " na", "na ", " př", "ch ", " je", " ne", "že ", " že", " se", " do", " ro", " st", " v ", " ve", "pře", "se ", "ho ", "sta", " to", " vy", " za", "ou ", " a ", "to ", " by", "la ", "ce ", "e v", "ist", "le ", "pod", "í p", " vl", "e n", "e s", "je ", "ké ", "by ", "em ", "ých", " od", "ova", "řed", "dy ", "ení", "kon", "li ", "ně ", "str", " zá", "ve ", " ka", " sv", "e p", "it ", "lád", "oho", "rov", "roz", "ter", "vlá", "ím ", " ko", "hod", "nis", "pří", "ský", " mi", " ob", " so", "a p", "ali", "bud", "edn", "ick", "kte", "ku ", "o s", "al ", "ci ", "e t", "il ", "ny ", "né ", "odl", "ová", "rot", "sou", "ání", " bu", " mo", " o ", "ast", "byl", "de ", "ek ", "ost", " mí", " ta", "es ", "jed", "ky ", "las", "m p", "nes", "ním", "ran", "rem", "ros", "ého", " de", " kt", " ni", " si", " vý", "at ", "jí ", "ký ", "mi ", "pre", "tak", "tan", "y v", "řek", " ch", " li", " ná", " pa", " ře", "da ", "dle", "dne", "i p", "i v", "ly ", "min", "o n", "o v", "pol", "tra", "val", "vní", "ích", "ý p", "řej", " ce", " kd", " le", "a s", "a z", "cen", "e k", "eds", "ekl", "emi", "kl ", "lat", "lo ", "mié", "nov", "pra", "sku", "ské", "sti", "tav", "ti ", "ty ", "ván", "vé ", "y n", "y s", "í s", "í v", "ě p", " dn", " ně", " sp", " čs", "a n", "a t", "ak ", "dní", "doh", "e b", "e m", "ejn", "ena", "est", "ini", "m z", "nal", "nou", "ná ", "ovi", "ové", "ový", "rsk", "stá", "tí ", "tře", "tů ", "ude", "za ", "é p", "ém ", "í d", " ir", " zv", "ale", "aně", "ave", "cké", "den", "e z", "ech", "en ", "erý", "hla", "i s", "iér", "lov", "mu ", "neb", "nic", "o b", "o m", "pad", "pot", "rav", "rop", "rý ", "sed", "si ", "t p", "tic", "tu ", "tě ", "u p", "u v", "vá ", "výš", "zvý", "ční", "ří ", "ům ", " bl", " br", " ho", " ja", " re", " s ", " z ", " zd", "a v", "ani", "ato", "bla", "bri", "ečn", "eře", "h v", "i n", "ie ", "ila", "irs", "ite", "kov", "nos", "o o", "o p", "oce", "ody", "ohl", "oli", "ovo", "pla", "poč", "prá", "ra ", "rit", "rod", "ry ", "sd ", "sko", "ssd", "tel", "u s", "vat", "veř", "vit", "vla", "y p", "áln", "čss", "šen", " al");
+$GLOBALS["ngrams"]['cy'] = array("yn ", "dd ", " yn", " y ", "ydd", "eth", "th ", " i ", "aet", "d y", "ch ", "od ", "ol ", "edd", " ga", " gw", "'r ", "au ", "ddi", "ad ", " cy", " gy", " ei", " o ", "iad", "yr ", "an ", "bod", "wed", " bo", " dd", "el ", "n y", " am", "di ", "edi", "on ", " we", " ym", " ar", " rh", "odd", " ca", " ma", "ael", "oed", "dae", "n a", "dda", "er ", "h y", "all", "ei ", " ll", "am ", "eu ", "fod", "fyd", "l y", "n g", "wyn", "d a", "i g", "mae", "neu", "os ", " ne", "d i", "dod", "dol", "n c", "r h", "wyd", "wyr", "ai ", "ar ", "in ", "rth", " fy", " he", " me", " yr", "'n ", "dia", "est", "h c", "hai", "i d", "id ", "r y", "y b", " dy", " ha", "ada", "i b", "n i", "ote", "rot", "tes", "y g", "yd ", " ad", " mr", " un", "cyn", "dau", "ddy", "edo", "i c", "i w", "ith", "lae", "lla", "nd ", "oda", "ryd", "tho", " a ", " dr", "aid", "ain", "ddo", "dyd", "fyn", "gyn", "hol", "io ", "o a", "wch", "wyb", "ybo", "ych", " br", " by", " di", " fe", " na", " o'", " pe", "art", "byd", "dro", "gal", "l e", "lai", "mr ", "n n", "r a", "rhy", "wn ", "ynn", " on", " r ", "cae", "d g", "d o", "d w", "gan", "gwy", "n d", "n f", "n o", "ned", "ni ", "o'r", "r d", "ud ", "wei", "wrt", " an", " cw", " da", " ni", " pa", " pr", " wy", "d e", "dai", "dim", "eud", "gwa", "idd", "im ", "iri", "lwy", "n b", "nol", "r o", "rwy", " ch", " er", " fo", " ge", " hy", " i'", " ro", " sa", " tr", "bob", "cwy", "cyf", "dio", "dyn", "eit", "hel", "hyn", "ich", "ll ", "mdd", "n r", "ond", "pro", "r c", "r g", "red", "rha", "u a", "u c", "u y", "y c", "ymd", "ymr", "yw ", " ac", " be", " bl", " co", " os", "adw", "ae ", "af ", "d p", "efn", "eic", "en ", "eol", "es ", "fer", "gel", "h g", "hod", "ied", "ir ", "laf", "n h", "na ", "nyd", "odo", "ofy", "rdd", "rie", "ros", "stw", "twy", "yda", "yng", " at", " de", " go", " id", " oe", " â ", "'ch", "ac ", "ach", "ae'", "al ", "bl ", "d c", "d l", "dan", "dde", "ddw", "dir", "dla", "ed ", "ela", "ell", "ene", "ewn", "gyd", "hau", "hyw", "i a", "i f", "iol", "ion", "l a", "l i", "lia", "med", "mon", "n s", "no ", "obl", "ola", "ref", "rn ", "thi", "un ");
+$GLOBALS["ngrams"]['da'] = array("er ", "en ", " de", "et ", "der", "de ", "for", " fo", " i ", "at ", " at", "re ", "det", " ha", "nde", "ere", "ing", "den", " me", " og", "ger", "ter", " er", " si", "and", " af", "or ", " st", " ti", " en", "og ", "ar ", "il ", "r s", "ige", "til", "ke ", "r e", "af ", "kke", " ma", " på", "om ", "på ", "ed ", "ge ", "end", "nge", "t s", "e s", "ler", " sk", "els", "ern", "sig", "ne ", "lig", "r d", "ska", " vi", "har", " be", " se", "an ", "ikk", "lle", "gen", "n f", "ste", "t a", "t d", "rin", " ik", "es ", "ng ", "ver", "r b", "sen", "ede", "men", "r i", " he", " et", "ig ", "lan", "med", "nd ", "rne", " da", " in", "e t", "mme", "und", " om", "e e", "e m", "her", "le ", "r f", "t f", "så ", "te ", " so", "ele", "t e", " ko", "est", "ske", " bl", "e f", "ekt", "mar", "bru", "e a", "el ", "ers", "ret", "som", "tte", "ve ", " la", " ud", " ve", "age", "e d", "e h", "lse", "man", "rug", "sel", "ser", " fi", " op", " pr", "dt ", "e i", "n m", "r m", " an", " re", " sa", "ion", "ner", "res", "t i", "get", "n s", "one", "orb", "t h", "vis", "år ", " fr", "bil", "e k", "ens", "ind", "omm", "t m", " hv", " je", "dan", "ent", "fte", "nin", " mi", "e o", "e p", "n o", "nte", " ku", "ell", "nas", "ore", "r h", "r k", "sta", "sto", "dag", "eri", "kun", "lde", "mer", "r a", "r v", "rek", "rer", "t o", "tor", "tør", " få", " må", " to", "boe", "che", "e v", "i d", "ive", "kab", "ns ", "oel", "se ", "t v", " al", " bo", " un", "ans", "dre", "ire", "køb", "ors", "ove", "ren", "t b", "ør ", " ka", "ald", "bet", "gt ", "isk", "kal", "kom", "lev", "n d", "n i", "pri", "r p", "rbr", "søg", "tel", " så", " te", " va", "al ", "dir", "eje", "fis", "gså", "isc", "jer", "ker", "ogs", "sch", "st ", "t k", "uge", " di", "ag ", "d a", "g i", "ill", "l a", "lsk", "n a", "on ", "sam", "str", "tet", "var", " mo", "art", "ash", "att", "e b", "han", "hav", "kla", "kon", "n t", "ned", "r o", "ra ", "rre", "ves", "vil", " el", " kr", " ov", "ann", "e u", "ess", "fra", "g a", "g d", "int", "ngs", "rde", "tra", " år", "akt", "asi", "em ", "gel", "gym", "hol", "kan", "mna", "n h", "nsk", "old");
+$GLOBALS["ngrams"]['de'] = array("en ", "er ", " de", "der", "ie ", " di", "die", "sch", "ein", "che", "ich", "den", "in ", "te ", "ch ", " ei", "ung", "n d", "nd ", " be", "ver", "es ", " zu", "eit", "gen", "und", " un", " au", " in", "cht", "it ", "ten", " da", "ent", " ve", "and", " ge", "ine", " mi", "r d", "hen", "ng ", "nde", " vo", "e d", "ber", "men", "ei ", "mit", " st", "ter", "ren", "t d", " er", "ere", "n s", "ste", " se", "e s", "ht ", "des", "ist", "ne ", "auf", "e a", "isc", "on ", "rte", " re", " we", "ges", "uch", " fü", " so", "bei", "e e", "nen", "r s", "ach", "für", "ier", "par", "ür ", " ha", "as ", "ert", " an", " pa", " sa", " sp", " wi", "for", "tag", "zu ", "das", "rei", "he ", "hre", "nte", "sen", "vor", " sc", "ech", "etz", "hei", "lan", "n a", "pd ", "st ", "sta", "ese", "lic", " ab", " si", "gte", " wa", "iti", "kei", "n e", "nge", "sei", "tra", "zen", " im", " la", "art", "im ", "lle", "n w", "rde", "rec", "set", "str", "tei", "tte", " ni", "e p", "ehe", "ers", "g d", "nic", "von", " al", " pr", "an ", "aus", "erf", "r e", "tze", "tür", "uf ", "ag ", "als", "ar ", "chs", "end", "ge ", "ige", "ion", "ls ", "n m", "ngs", "nis", "nt ", "ord", "s s", "sse", " tü", "ahl", "e b", "ede", "em ", "len", "n i", "orm", "pro", "rke", "run", "s d", "wah", "wer", "ürk", " me", "age", "att", "ell", "est", "hat", "n b", "oll", "raf", "s a", "tsc", " es", " fo", " gr", " ja", "abe", "auc", "ben", "e n", "ege", "lie", "n u", "r v", "re ", "rit", "sag", " am", "agt", "ahr", "bra", "de ", "erd", "her", "ite", "le ", "n p", "n v", "or ", "rbe", "rt ", "sic", "wie", "übe", " is", " üb", "cha", "chi", "e f", "e m", "eri", "ied", "mme", "ner", "r a", "sti", "t a", "t s", "tis", " ko", "arb", "ds ", "gan", "n z", "r f", "r w", "ran", "se ", "t i", "wei", "wir", " br", " np", "am ", "bes", "d d", "deu", "e g", "e k", "efo", "et ", "eut", "fen", "hse", "lte", "n r", "npd", "r b", "rhe", "t w", "tz ", " fr", " ih", " ke", " ma", "ame", "ang", "d s", "eil", "el ", "era", "erh", "h d", "i d", "kan", "n f", "n l", "nts", "och", "rag", "rd ", "spd", "spr", "tio", " ar", " en", " ka", "ark", "ass");
+$GLOBALS["ngrams"]['en'] = array(" th", "the", "he ", "ed ", " to", " in", "er ", "ing", "ng ", " an", "nd ", " of", "and", "to ", "of ", " co", "at ", "on ", "in ", " a ", "d t", " he", "e t", "ion", "es ", " re", "re ", "hat", " sa", " st", " ha", "her", "tha", "tio", "or ", " ''", "en ", " wh", "e s", "ent", "n t", "s a", "as ", "for", "is ", "t t", " be", "ld ", "e a", "rs ", " wa", "ut ", "ve ", "ll ", "al ", " ma", "e i", " fo", "'s ", "an ", "est", " hi", " mo", " se", " pr", "s t", "ate", "st ", "ter", "ere", "ted", "nt ", "ver", "d a", " wi", "se ", "e c", "ect", "ns ", " on", "ly ", "tol", "ey ", "r t", " ca", "ati", "ts ", "all", " no", "his", "s o", "ers", "con", "e o", "ear", "f t", "e w", "was", "ons", "sta", "'' ", "sti", "n a", "sto", "t h", " we", "id ", "th ", " it", "ce ", " di", "ave", "d h", "cou", "pro", "ad ", "oll", "ry ", "d s", "e m", " so", "ill", "cti", "te ", "tor", "eve", "g t", "it ", " ch", " de", "hav", "oul", "ty ", "uld", "use", " al", "are", "ch ", "me ", "out", "ove", "wit", "ys ", "chi", "t a", "ith", "oth", " ab", " te", " wo", "s s", "res", "t w", "tin", "e b", "e h", "nce", "t s", "y t", "e p", "ele", "hin", "s i", "nte", " li", "le ", " do", "aid", "hey", "ne ", "s w", " as", " fr", " tr", "end", "sai", " el", " ne", " su", "'t ", "ay ", "hou", "ive", "lec", "n't", " ye", "but", "d o", "o t", "y o", " ho", " me", "be ", "cal", "e e", "had", "ple", " at", " bu", " la", "d b", "s h", "say", "t i", " ar", "e f", "ght", "hil", "igh", "int", "not", "ren", " is", " pa", " sh", "ays", "com", "n s", "r a", "rin", "y a", " un", "n c", "om ", "thi", " mi", "by ", "d i", "e d", "e n", "t o", " by", "e r", "eri", "old", "ome", "whe", "yea", " gr", "ar ", "ity", "mpl", "oun", "one", "ow ", "r s", "s f", "tat", " ba", " vo", "bou", "sam", "tim", "vot", "abo", "ant", "ds ", "ial", "ine", "man", "men", " or", " po", "amp", "can", "der", "e l", "les", "ny ", "ot ", "rec", "tes", "tho", "ica", "ild", "ir ", "nde", "ose", "ous", "pre", "ste", "era", "per", "r o", "red", "rie", " bo", " le", "ali", "ars", "ore", "ric", "s m", "str", " fa", "ess", "ie ", "ist", "lat", "uri");
+$GLOBALS["ngrams"]['es'] = array(" de", "de ", " la", "os ", "la ", "el ", "es ", " qu", " co", "e l", "as ", "que", " el", "ue ", "en ", "ent", " en", " se", "nte", "res", "con", "est", " es", "s d", " lo", " pr", "los", " y ", "do ", "ón ", "ión", " un", "ció", "del", "o d", " po", "a d", "aci", "sta", "te ", "ado", "pre", "to ", "par", "a e", "a l", "ra ", "al ", "e e", "se ", "pro", "ar ", "ia ", "o e", " re", "ida", "dad", "tra", "por", "s p", " a ", "a p", "ara", "cia", " pa", "com", "no ", " di", " in", "ien", "n l", "ad ", "ant", "e s", "men", "a c", "on ", "un ", "las", "nci", " tr", "cio", "ier", "nto", "tiv", "n d", "n e", "or ", "s c", "enc", "ern", "io ", "a s", "ici", "s e", " ma", "dos", "e a", "e c", "emp", "ica", "ivo", "l p", "n c", "r e", "ta ", "ter", "e d", "esa", "ez ", "mpr", "o a", "s a", " ca", " su", "ion", " cu", " ju", "an ", "da ", "ene", "ero", "na ", "rec", "ro ", "tar", " al", " an", "bie", "e p", "er ", "l c", "n p", "omp", "ten", " em", "ist", "nes", "nta", "o c", "so ", "tes", "era", "l d", "l m", "les", "ntr", "o s", "ore", "rá ", "s q", "s y", "sto", "a a", "a r", "ari", "des", "e q", "ivi", "lic", "lo ", "n a", "one", "ora", "per", "pue", "r l", "re ", "ren", "una", "ía ", "ada", "cas", "ere", "ide", "min", "n s", "ndo", "ran", "rno", " ac", " ex", " go", " no", "a t", "aba", "ble", "ece", "ect", "l a", "l g", "lid", "nsi", "ons", "rac", "rio", "str", "uer", "ust", " ha", " le", " mi", " mu", " ob", " pe", " pu", " so", "a i", "ale", "ca ", "cto", "e i", "e u", "eso", "fer", "fic", "gob", "jo ", "ma ", "mpl", "o p", "obi", "s m", "sa ", "sep", "ste", "sti", "tad", "tod", "y s", " ci", "and", "ces", "có ", "dor", "e m", "eci", "eco", "esi", "int", "iza", "l e", "lar", "mie", "ner", "orc", "rci", "ria", "tic", "tor", " as", " si", "ce ", "den", "e r", "e t", "end", "eri", "esp", "ial", "ido", "ina", "inc", "mit", "o l", "ome", "pli", "ras", "s t", "sid", "sup", "tab", "uen", "ues", "ura", "vo ", "vor", " sa", " ti", "abl", "ali", "aso", "ast", "cor", "cti", "cue", "div", "duc", "ens", "eti", "imi", "ini", "lec", "o q", "oce", "ort", "ral", "rma", "roc", "rod");
+$GLOBALS["ngrams"]['et'] = array("st ", " ka", "on ", "ja ", " va", " on", " ja", " ko", "se ", "ast", "le ", "es ", "as ", "is ", "ud ", " sa", "da ", "ga ", " ta", "aja", "sta", " ku", " pe", "a k", "est", "ist", "ks ", "ta ", "al ", "ava", "id ", "saa", "mis", "te ", "val", " et", "nud", " te", "inn", " se", " tu", "a v", "alu", "e k", "ise", "lu ", "ma ", "mes", " mi", "et ", "iku", "lin", "ad ", "el ", "ime", "ne ", "nna", " ha", " in", " ke", " võ", "a s", "a t", "ab ", "e s", "esi", " la", " li", "e v", "eks", "ema", "las", "les", "rju", "tle", "tsi", "tus", "upa", "use", "ust", "var", " lä", "ali", "arj", "de ", "ete", "i t", "iga", "ilm", "kui", "li ", "tul", " ei", " me", " sõ", "aal", "ata", "dus", "ei ", "nik", "pea", "s k", "s o", "sal", "sõn", "ter", "ul ", "või", " el", " ne", "a j", "ate", "end", "i k", "ita", "kar", "kor", "l o", "lt ", "maa", "oli", "sti", "vad", "ään", " ju", " jä", " kü", " ma", " po", " üt", "aas", "aks", "at ", "ed ", "eri", "hoi", "i s", "ka ", "la ", "nni", "oid", "pai", "rit", "us ", "ütl", " aa", " lo", " to", " ve", "a e", "ada", "aid", "ami", "and", "dla", "e j", "ega", "gi ", "gu ", "i p", "idl", "ik ", "ini", "jup", "kal", "kas", "kes", "koh", "s e", "s p", "sel", "sse", "ui ", " pi", " si", "aru", "eda", "eva", "fil", "i v", "ida", "ing", "lää", "me ", "na ", "nda", "nim", "ole", "ots", "ris", "s l", "sia", "t p", " en", " mu", " ol", " põ", " su", " vä", " üh", "a l", "a p", "aga", "ale", "aps", "arv", "e a", "ela", "ika", "lle", "loo", "mal", "pet", "t k", "tee", "tis", "vat", "äne", "õnn", " es", " fi", " vi", "a i", "a o", "aab", "aap", "ala", "alt", "ama", "anu", "e p", "e t", "eal", "eli", "haa", "hin", "iva", "kon", "ku ", "lik", "lm ", "min", "n t", "odu", "oon", "psa", "ri ", "si ", "stu", "t e", "t s", "ti ", "ule", "uur", "vas", "vee", " ki", " ni", " nä", " ra", "aig", "aka", "all", "atu", "e e", "eis", "ers", "i e", "ii ", "iis", "il ", "ima", "its", "kka", "kuh", "l k", "lat", "maj", "ndu", "ni ", "nii", "oma", "ool", "rso", "ru ", "rva", "s t", "sek", "son", "ste", "t m", "taj", "tam", "ude", "uho", "vai", " ag", " os", " pa", " re");
+$GLOBALS["ngrams"]['eu'] = array("en ", "an ", "eta", "ta ", " et", "iza", "n e", "ko ", "ide", " ba", "a e", "giz", " es", " gi", "arr", "bid", "ren", "rri", "are", "la ", "sku", " be", "asu", "esk", "sun", "tas", " iz", "ean", "eko", "ela", "ik ", "kub", "n a", "n i", "tza", "ubi", "za ", "zan", " er", "a b", "ask", "era", "n b", "rre", "ten", "tze", " as", " ko", "a a", "a g", "ald", "ani", "de ", "dee", "ea ", "ek ", "kat", "kon", "n d", "ont", "uan", " du", " na", "ata", "egi", "est", "k e", "nik", "ntu", "ntz", "ska", "tua", " de", " di", " ez", " he", "a d", "a k", "ak ", "aki", "ako", "art", "atu", "azi", "bat", "ber", "itz", "kun", "n h", "o b", "ria", "rte", "tat", "une", "zar", " al", " ar", " ha", "aku", "atz", "bai", "dar", "dea", "del", "een", "ema", "err", "iak", "iar", "in ", "ina", "kia", "nar", "naz", "nea", "o e", "orr", "ra ", "ste", "tek", "zak", "zek", "zio", " da", " em", " hi", " ho", " ma", " oi", "agu", "ate", "aur", "bes", "din", "dir", "dut", "ert", "ez ", "ezi", "har", "her", "hit", "ia ", "ien", "ika", "io ", "ire", "ite", "k b", "k g", "kid", "kor", "lda", "n o", "nko", "o a", "oin", "ori", "rak", "rea", "rie", "rik", "rra", "tan", "tea", "tu ", "una", "und", "unt", "urr", "ute", "z e", "zko", " au", " eg", " gu", " ir", " ki", " or", "a h", "a j", "abe", "agi", "ai ", "ail", "ait", "ape", "ari", "dez", "e e", "ear", "eek", "erd", "ere", "eza", "ezk", "gir", "git", "hor", "i e", "ian", "iek", "ila", "ink", "int", "ira", "ita", "itu", "k n", "kap", "koa", "kum", "lan", "lde", "mai", "man", "men", "n g", "n u", "na ", "nta", "o h", "oa ", "oro", "pen", "rdi", "ri ", "rta", "sta", "tel", "tet", "tik", "tue", "tzi", "ume", "un ", "uzt", "zea", "zen", "zia", "zin", " az", " bi", " bu", " el", " ga", " jo", " mu", " ti", " un", " za", " zi", "a n", "a o", "a s", "a t", "a z", "aba", "adi", "ake", "ala", "and", "ar ", "aud", "bak", "bal", "beg", "beh", "bul", "dau", "den", "du ", "dui", "e b", "e d", "e h", "e o", "eak", "eet", "eha", "elk", "enb", "ete", "eti", "gab", "gin", "go ", "gus", "gut", "guz", "hau", "ibe", "inb", "ine", "ioa", "iru", "iur", "izi", "izk", "izo");
+$GLOBALS["ngrams"]['fa'] = array("ان ", "ای ", "ه ا", " اي", " در", "به ", " بر", "در ", "ران", " به", "ی ا", "از ", "ين ", "می ", " از", "ده ", "ست ", "است", " اس", " که", "که ", "اير", "ند ", "اين", " ها", "يرا", "ود ", " را", "های", " خو", "ته ", "را ", "رای", "رد ", "ن ب", "کرد", " و ", " کر", "ات ", "برا", "د ک", "مان", "ی د", " ان", "خوا", "شور", " با", "ن ا", " سا", "تمی", "ری ", "اتم", "ا ا", "واه", " ات", " عر", "اق ", "ر م", "راق", "عرا", "ی ب", " تا", " تو", "ار ", "ر ا", "ن م", "ه ب", "ور ", "يد ", "ی ک", " ام", " دا", " کن", "اهد", "هد ", " آن", " می", " ني", " گف", "د ا", "گفت", " کش", "ا ب", "نی ", "ها ", "کشو", " رو", "ت ک", "نيو", "ه م", "وی ", "ی ت", " شو", "ال ", "دار", "مه ", "ن ک", "ه د", "يه ", " ما", "امه", "د ب", "زار", "ورا", "گزا", " پي", "آن ", "انت", "ت ا", "فت ", "ه ن", "ی خ", "اما", "بات", "ما ", "ملل", "نام", "ير ", "ی م", "ی ه", " آم", " ای", " من", "انس", "اني", "ت د", "رده", "ساز", "ن د", "نه ", "ورد", " او", " بي", " سو", " شد", "اده", "اند", "با ", "ت ب", "ر ب", "ز ا", "زما", "سته", "ن ر", "ه س", "وان", "وز ", "ی ر", "ی س", " هس", "ابا", "ام ", "اور", "تخا", "خاب", "خود", "د د", "دن ", "رها", "روز", "رگز", "نتخ", "ه ش", "ه ه", "هست", "يت ", "يم ", " دو", " دي", " مو", " نو", " هم", " کا", "اد ", "اری", "انی", "بر ", "بود", "ت ه", "ح ه", "حال", "رش ", "عه ", "لی ", "وم ", "ژان", " سل", "آمر", "اح ", "توس", "داد", "دام", "ر د", "ره ", "ريک", "زی ", "سلا", "شود", "لاح", "مري", "نند", "ه ع", "يما", "يکا", "پيم", "گر ", " آژ", " ال", " بو", " مق", " مل", " وی", "آژا", "ازم", "ازی", "بار", "برن", "ر آ", "ز س", "سعه", "شته", "مات", "ن آ", "ن پ", "نس ", "ه گ", "وسع", "يان", "يوم", "کا ", "کام", "کند", " خا", " سر", "آور", "ارد", "اقد", "ايم", "ايی", "برگ", "ت ع", "تن ", "خت ", "د و", "ر خ", "رک ", "زير", "فته", "قدا", "ل ت", "مين", "ن گ", "ه آ", "ه خ", "ه ک", "ورک", "ويو", "يور", "يوي", "يی ", "ک ت", "ی ش", " اق", " حا", " حق", " دس", " شک", " عم", " يک", "ا ت", "ا د", "ارج", "بين", "ت م", "ت و", "تاي", "دست", "ر ح", "ر س", "رنا", "ز ب", "شکا", "لل ", "م ک", "مز ", "ندا", "نوا", "و ا", "وره", "ون ", "وند", "يمز", " آو", " اع", " فر", " مت", " نه", " هر", " وز", " گز");
+$GLOBALS["ngrams"]['fi'] = array("en ", "in ", "an ", "on ", "ist", "ta ", "ja ", "n t", "sa ", "sta", "aan", "n p", " on", "ssa", "tta", "tä ", " ka", " pa", "si ", " ja", "n k", "lla", "än ", "een", "n v", "ksi", "ett", "nen", "taa", "ttä", " va", "ill", "itt", " jo", " ko", "n s", " tu", "ia ", " su", "a p", "aa ", "la ", "lle", "n m", "le ", "tte", "na ", " ta", " ve", "at ", " vi", "utt", " sa", "ise", "sen", " ku", " nä", " pä", "ste", " ol", "a t", "ais", "maa", "ti ", "a o", "oit", "pää", " pi", "a v", "ala", "ine", "isi", "tel", "tti", " si", "a k", "all", "iin", "kin", "stä", "uom", "vii", " ma", " se", "enä", " mu", "a s", "est", "iss", "llä", "lok", "lä ", "n j", "n o", "toi", "ven", "ytt", " li", "ain", "et ", "ina", "n a", "n n", "oll", "plo", "ten", "ust", "äll", "ään", " to", "den", "men", "oki", "suo", "sä ", "tää", "uks", "vat", " al", " ke", " te", "a e", "lii", "tai", "tei", "äis", "ää ", " pl", "ell", "i t", "ide", "ikk", "ki ", "nta", "ova", "yst", "yt ", "ä p", "äyt", " ha", " pe", " tä", "a n", "aik", "i p", "i v", "nyt", "näy", "pal", "tee", "un ", " me", "a m", "ess", "kau", "pai", "stu", "ut ", "voi", " et", "a h", "eis", "hte", "i o", "iik", "ita", "jou", "mis", "nin", "nut", "sia", "ssä", "van", " ty", " yh", "aks", "ime", "loi", "me ", "n e", "n h", "n l", "oin", "ome", "ott", "ouk", "sit", "sti", "tet", "tie", "ukk", "ä k", " ra", " ti", "aja", "asi", "ent", "iga", "iig", "ite", "jan", "kaa", "kse", "laa", "lan", "li ", "näj", "ole", "tii", "usi", "äjä", " ov", "a a", "ant", "ava", "ei ", "eri", "kan", "kku", "lai", "lis", "läi", "mat", "ois", "pel", "sil", "sty", "taj", "tav", "ttu", "työ", "yös", "ä o", " ai", " pu", "a j", "a l", "aal", "arv", "ass", "ien", "imi", "imm", "itä", "ka ", "kes", "kue", "lee", "lin", "llo", "one", "ri ", "t o", "t p", "tu ", "val", "vuo", " ei", " he", " hy", " my", " vo", "ali", "alo", "ano", "ast", "att", "auk", "eli", "ely", "hti", "ika", "ken", "kki", "lys", "min", "myö", "oht", "oma", "tus", "umi", "yks", "ät ", "ääl", "ös ", " ar", " eu", " hu", " na", "aat", "alk", "alu", "ans", "arj", "enn", "han", "kuu", "n y", "set", "sim");
+$GLOBALS["ngrams"]['fr'] = array("es ", " de", "de ", " le", "ent", "le ", "nt ", "la ", "s d", " la", "ion", "on ", "re ", " pa", "e l", "e d", " l'", "e p", " co", " pr", "tio", "ns ", " en", "ne ", "que", "r l", "les", "ur ", "en ", "ati", "ue ", " po", " d'", "par", " a ", "et ", "it ", " qu", "men", "ons", "te ", " et", "t d", " re", "des", " un", "ie ", "s l", " su", "pou", " au", " à ", "con", "er ", " no", "ait", "e c", "se ", "té ", "du ", " du", " dé", "ce ", "e e", "is ", "n d", "s a", " so", "e r", "e s", "our", "res", "ssi", "eur", " se", "eme", "est", "us ", "sur", "ant", "iqu", "s p", "une", "uss", "l'a", "pro", "ter", "tre", "end", "rs ", " ce", "e a", "t p", "un ", " ma", " ru", " ré", "ous", "ris", "rus", "sse", "ans", "ar ", "com", "e m", "ire", "nce", "nte", "t l", " av", " mo", " te", "il ", "me ", "ont", "ten", "a p", "dan", "pas", "qui", "s e", "s s", " in", "ist", "lle", "nou", "pré", "'un", "air", "d'a", "ir ", "n e", "rop", "ts ", " da", "a s", "as ", "au ", "den", "mai", "mis", "ori", "out", "rme", "sio", "tte", "ux ", "a d", "ien", "n a", "ntr", "omm", "ort", "ouv", "s c", "son", "tes", "ver", "ère", " il", " m ", " sa", " ve", "a r", "ais", "ava", "di ", "n p", "sti", "ven", " mi", "ain", "enc", "for", "ité", "lar", "oir", "rem", "ren", "rro", "rés", "sie", "t a", "tur", " pe", " to", "d'u", "ell", "err", "ers", "ide", "ine", "iss", "mes", "por", "ran", "sit", "st ", "t r", "uti", "vai", "é l", "ési", " di", " n'", " ét", "a c", "ass", "e t", "in ", "nde", "pre", "rat", "s m", "ste", "tai", "tch", "ui ", "uro", "ès ", " es", " fo", " tr", "'ad", "app", "aux", "e à", "ett", "iti", "lit", "nal", "opé", "r d", "ra ", "rai", "ror", "s r", "tat", "uté", "à l", " af", "anc", "ara", "art", "bre", "ché", "dre", "e f", "ens", "lem", "n r", "n t", "ndr", "nne", "onn", "pos", "s t", "tiq", "ure", " tu", "ale", "and", "ave", "cla", "cou", "e n", "emb", "ins", "jou", "mme", "rie", "rès", "sem", "str", "t i", "ues", "uni", "uve", "é d", "ée ", " ch", " do", " eu", " fa", " lo", " ne", " ra", "arl", "att", "ec ", "ica", "l a", "l'o", "l'é", "mmi", "nta", "orm", "ou ", "r u", "rle");
+$GLOBALS["ngrams"]['ha'] = array(" da", "da ", "in ", "an ", "ya ", " wa", " ya", "na ", "ar ", "a d", " ma", "wa ", "a a", "a k", "a s", " ta", "wan", " a ", " ba", " ka", "ta ", "a y", "n d", " ha", " na", " su", " sa", "kin", "sa ", "ata", " ko", "a t", "su ", " ga", "ai ", " sh", "a m", "uwa", "iya", "ma ", "a w", "asa", "yan", "ka ", "ani", "shi", "a b", "a h", "a c", "ama", "ba ", "nan", "n a", " mu", "ana", " yi", "a g", " za", "i d", " ku", "aka", "yi ", "n k", "ann", "ke ", "tar", " ci", "iki", "n s", "ko ", " ra", "ki ", "ne ", "a z", "mat", "hak", "nin", "e d", "nna", "uma", "nda", "a n", "ada", "cik", "ni ", "rin", "una", "ara", "kum", "akk", " ce", " du", "man", "n y", "nci", "sar", "aki", "awa", "ci ", "kan", "kar", "ari", "n m", "and", "hi ", "n t", "ga ", "owa", "ash", "kam", "dan", "ewa", "nsa", "ali", "ami", " ab", " do", "anc", "n r", "aya", "i n", "sun", "uka", " al", " ne", "a'a", "cew", "cin", "mas", "tak", "un ", "aba", "kow", "a r", "ra ", " ja", " ƙa", "en ", "r d", "sam", "tsa", " ru", "ce ", "i a", "abi", "ida", "mut", "n g", "n j", "san", "a ƙ", "har", "on ", "i m", "suk", " ak", " ji", "yar", "'ya", "kwa", "min", " 'y", "ane", "ban", "ins", "ruw", "i k", "n h", " ad", "ake", "n w", "sha", "utu", " ƴa", "bay", "tan", "ƴan", "bin", "duk", "e m", "n n", "oka", "yin", "ɗan", " fa", "a i", "kki", "re ", "za ", "ala", "asu", "han", "i y", "mar", "ran", "ƙas", "add", "ars", "gab", "ira", "mma", "u d", " ts", "abb", "abu", "aga", "gar", "n b", " ɗa", "aci", "aik", "am ", "dun", "e s", "i b", "i w", "kas", "kok", "wam", " am", "amf", "bba", "din", "fan", "gwa", "i s", "wat", "ano", "are", "dai", "iri", "ma'", " la", "all", "dam", "ika", "mi ", "she", "tum", "uni", " an", " ai", " ke", " ki", "dag", "mai", "mfa", "no ", "nsu", "o d", "sak", "um ", " bi", " gw", " kw", "jam", "yya", "a j", "fa ", "uta", " hu", "'a ", "ans", "aɗa", "dda", "hin", "niy", "r s", "bat", "dar", "gan", "i t", "nta", "oki", "omi", "sal", "a l", "kac", "lla", "wad", "war", "amm", "dom", "r m", "ras", "sai", " lo", "ats", "hal", "kat", "li ", "lok", "n c", "nar", "tin", "afa", "bub", "i g", "isa", "mak");
+$GLOBALS["ngrams"]['haw'] = array(" ka", "na ", " o ", "ka ", " ma", " a ", " la", "a i", "a m", " i ", "la ", "ana", "ai ", "ia ", "a o", "a k", "a h", "o k", " ke", "a a", "i k", " ho", " ia", "ua ", " na", " me", "e k", "e a", "au ", "ke ", "ma ", "mai", "aku", " ak", "ahi", " ha", " ko", " e ", "a l", " no", "me ", "ku ", "aka", "kan", "no ", "i a", "ho ", "ou ", " ai", "i o", "a p", "o l", "o a", "ama", "a n", " an", "i m", "han", "i i", "iho", "kou", "ne ", " ih", "o i", "iki", "ona", "hoo", "le ", "e h", " he", "ina", " wa", "ea ", "ako", "u i", "kah", "oe ", "i l", "u a", " pa", "hoi", "e i", "era", "ko ", "u m", "kua", "mak", "oi ", "kai", "i n", "a e", "hin", "ane", " ol", "i h", "mea", "wah", "lak", "e m", "o n", "u l", "ika", "ki ", "a w", "mal", "hi ", "e n", "u o", "hik", " ku", "e l", "ele", "ra ", "ber", "ine", "abe", "ain", "ala", "lo ", " po", "kon", " ab", "ole", "he ", "pau", "mah", "va ", "ela", "kau", "nak", " oe", "kei", "oia", " ie", "ram", " oi", "oa ", "eho", "hov", "ieh", "ova", " ua", "una", "ara", "o s", "awa", "o o", "nau", "u n", "wa ", "wai", "hel", " ae", " al", "ae ", "ta ", "aik", " hi", "ale", "ila", "lel", "ali", "eik", "olo", "onu", " lo", "aua", "e o", "ola", "hon", "mam", "nan", " au", "aha", "lau", "nua", "oho", "oma", " ao", "ii ", "alu", "ima", "mau", "ike", "apa", "elo", "lii", "poe", "aia", "noa", " in", "o m", "oka", "'u ", "aho", "ei ", "eka", "ha ", "lu ", "nei", "hol", "ino", "o e", "ema", "iwa", "olu", "ada", "naa", "pa ", "u k", "ewa", "hua", "lam", "lua", "o h", "ook", "u h", " li", "ahu", "amu", "ui ", " il", " mo", " se", "eia", "law", " hu", " ik", "ail", "e p", "li ", "lun", "uli", "io ", "kik", "noh", "u e", " sa", "aaw", "awe", "ena", "hal", "kol", "lan", " le", " ne", "a'u", "ilo", "kap", "oko", "sa ", " pe", "hop", "loa", "ope", "pe ", " ad", " pu", "ahe", "aol", "ia'", "lai", "loh", "na'", "oom", "aau", "eri", "kul", "we ", "ake", "kek", "laa", "ri ", "iku", "kak", "lim", "nah", "ner", "nui", "ono", "a u", "dam", "kum", "lok", "mua", "uma", "wal", "wi ", "'i ", "a'i", "aan", "alo", "eta", "mu ", "ohe", "u p", "ula", "uwa", " nu", "amo");
+$GLOBALS["ngrams"]['hi'] = array("ें ", " है", "में", " मे", "ने ", "की ", "के ", "है ", " के", " की", " को", "ों ", "को ", "ा ह", " का", "से ", "ा क", "े क", "ं क", "या ", " कि", " से", "का ", "ी क", " ने", " और", "और ", "ना ", "कि ", "भी ", "ी स", " जा", " पर", "ार ", " कर", "ी ह", " हो", "ही ", "िया", " इस", " रह", "र क", "ुना", "ता ", "ान ", "े स", " भी", " रा", "े ह", " चु", " पा", "पर ", "चुन", "नाव", " कह", "प्र", " भा", "राज", "हैं", "ा स", "ै क", "ैं ", "नी ", "ल क", "ीं ", "़ी ", "था ", "री ", "ाव ", "े ब", " प्", "क्ष", "पा ", "ले ", " दे", "ला ", "हा ", "ाजप", " था", " नह", "इस ", "कर ", "जपा", "नही", "भाज", "यों", "र स", "हीं", " अम", " बा", " मा", " वि", "रीक", "िए ", "े प", "्या", " ही", "ं म", "कार", "ा ज", "े ल", " ता", " दि", " सा", " हम", "ा न", "ा म", "ाक़", "्ता", " एक", " सं", " स्", "अमर", "क़ी", "ताज", "मरी", "स्थ", "ा थ", "ार्", " हु", "इरा", "एक ", "न क", "र म", "राक", "ी ज", "ी न", " इर", " उन", " पह", "कहा", "ते ", "े अ", " तो", " सु", "ति ", "ती ", "तो ", "मिल", "िक ", "ियो", "्रे", " अप", " फ़", " लि", " लो", " सम", "म क", "र्ट", "हो ", "ा च", "ाई ", "ाने", "िन ", "्य ", " उस", " क़", " सक", " सै", "ं प", "ं ह", "गी ", "त क", "मान", "र न", "ष्ट", "स क", "स्त", "ाँ ", "ी ब", "ी म", "्री", " दो", " मि", " मु", " ले", " शा", "ं स", "ज़ा", "त्र", "थी ", "लिए", "सी ", "़ा ", "़ार", "ांग", "े द", "े म", "्व ", " ना", " बन", "ंग्", "कां", "गा ", "ग्र", "जा ", "ज्य", "दी ", "न म", "पार", "भा ", "रही", "रे ", "रेस", "ली ", "सभा", "ा र", "ाल ", "ी अ", "ीकी", "े त", "ेश ", " अं", " तक", " या", "ई ह", "करन", "तक ", "देश", "वर्", "ाया", "ी भ", "ेस ", "्ष ", " गय", " जि", " थी", " बड", " यह", " वा", "ंतर", "अंत", "क़ ", "गया", "टी ", "निक", "न्ह", "पहल", "बड़", "मार", "र प", "रने", "ाज़", "ि इ", "ी र", "े ज", "े व", "्ट ", "्टी", " अब", " लग", " वर", " सी", "ं भ", "उन्", "क क", "किय", "देख", "पूर", "फ़्", "यह ", "यान", "रिक", "रिय", "र्ड", "लेक", "सकत", "हों", "होग", "ा अ", "ा द", "ा प", "ाद ", "ारा", "ित ", "ी त", "ी प", "ो क", "ो द", " ते", " नि", " सर", " हा", "ं द", "अपन", "जान", "त म", "थित", "पनी", "महल", "र ह", "लोग", "व क", "हना", "हल ", "हाँ", "ाज्", "ाना", "िक्", "िस्");
+$GLOBALS["ngrams"]['hr'] = array("je ", " na", " pr", " po", "na ", " je", " za", "ije", "ne ", " i ", "ti ", "da ", " ko", " ne", "li ", " bi", " da", " u ", "ma ", "mo ", "a n", "ih ", "za ", "a s", "ko ", "i s", "a p", "koj", "pro", "ju ", "se ", " go", "ost", "to ", "va ", " do", " to", "e n", "i p", " od", " ra", "no ", "ako", "ka ", "ni ", " ka", " se", " mo", " st", "i n", "ima", "ja ", "pri", "vat", "sta", " su", "ati", "e p", "ta ", "tsk", "e i", "nij", " tr", "cij", "jen", "nos", "o s", " iz", "om ", "tro", "ili", "iti", "pos", " al", "a i", "a o", "e s", "ija", "ini", "pre", "str", "la ", "og ", "ovo", " sv", "ekt", "nje", "o p", "odi", "rva", " ni", "ali", "min", "rij", "a t", "a z", "ats", "iva", "o t", "od ", "oje", "ra ", " hr", "a m", "a u", "hrv", "im ", "ke ", "o i", "ovi", "red", "riv", "te ", "bi ", "e o", "god", "i d", "lek", "umi", "zvo", "din", "e u", "ene", "jed", "ji ", "lje", "nog", "su ", " a ", " el", " mi", " o ", "a d", "alu", "ele", "i u", "izv", "ktr", "lum", "o d", "ori", "rad", "sto", "a k", "anj", "ava", "e k", "men", "nic", "o j", "oj ", "ove", "ski", "tvr", "una", "vor", " di", " no", " s ", " ta", " tv", "i i", "i o", "kak", "roš", "sko", "vod", " sa", " će", "a b", "adi", "amo", "eni", "gov", "iju", "ku ", "o n", "ora", "rav", "ruj", "smo", "tav", "tru", "u p", "ve ", " in", " pl", "aci", "bit", "de ", "diš", "ema", "i m", "ika", "išt", "jer", "ki ", "mog", "nik", "nov", "nu ", "oji", "oli", "pla", "pod", "st ", "sti", "tra", "tre", "vo ", " sm", " št", "dan", "e z", "i t", "io ", "ist", "kon", "lo ", "stv", "u s", "uje", "ust", "će ", "ći ", "što", " dr", " im", " li", "ada", "aft", "ani", "ao ", "ars", "ata", "e t", "emo", "i k", "ine", "jem", "kov", "lik", "lji", "mje", "naf", "ner", "nih", "nja", "ogo", "oiz", "ome", "pot", "ran", "ri ", "roi", "rtk", "ska", "ter", "u i", "u o", "vi ", "vrt", " me", " ug", "ak ", "ama", "drž", "e e", "e g", "e m", "em ", "eme", "enj", "ent", "er ", "ere", "erg", "eur", "go ", "i b", "i z", "jet", "ksi", "o u", "oda", "ona", "pra", "reb", "rem", "rop", "tri", "žav", " ci", " eu", " re", " te", " uv", " ve", "aju", "an ");
+$GLOBALS["ngrams"]['hu'] = array(" a ", " az", " sz", "az ", " me", "en ", " el", " ho", "ek ", "gy ", "tt ", "ett", "sze", " fe", "és ", " ki", "tet", " be", "et ", "ter", " kö", " és", "hog", "meg", "ogy", "szt", "te ", "t a", "zet", "a m", "nek", "nt ", "ség", "szá", "ak ", " va", "an ", "eze", "ra ", "ta ", " mi", "int", "köz", " is", "esz", "fel", "min", "nak", "ors", "zer", " te", "a a", "a k", "is ", " cs", "ele", "er ", "men", "si ", "tek", "ti ", " ne", "csa", "ent", "z e", "a t", "ala", "ere", "es ", "lom", "lte", "mon", "ond", "rsz", "sza", "tte", "zág", "ány", " fo", " ma", "ai ", "ben", "el ", "ene", "ik ", "jel", "tás", "áll", " ha", " le", " ál", "agy", "alá", "isz", "y a", "zte", "ás ", " al", "e a", "egy", "ely", "for", "lat", "lt ", "n a", "oga", "on ", "re ", "st ", "ság", "t m", "án ", "ét ", "ült", " je", "gi ", "k a", "kül", "lam", "len", "lás", "más", "s k", "vez", "áso", "özö", " ta", "a s", "a v", "asz", "atá", "ető", "kez", "let", "mag", "nem", "szé", "z m", "át ", "éte", "ölt", " de", " gy", " ké", " mo", " vá", " ér", "a b", "a f", "ami", "at ", "ato", "att", "bef", "dta", "gya", "hat", "i s", "las", "ndt", "rt ", "szo", "t k", "tár", "tés", "van", "ásá", "ól ", " bé", " eg", " or", " pá", " pé", " ve", "ban", "eke", "ekü", "elő", "erv", "ete", "fog", "i a", "kis", "lád", "nte", "nye", "nyi", "ok ", "omá", "os ", "rán", "rás", "sal", "t e", "vál", "yar", "ágo", "ála", "ége", "ény", "ött", " tá", "adó", "elh", "fej", "het", "hoz", "ill", "jár", "kés", "llo", "mi ", "ny ", "ont", "ren", "res", "rin", "s a", "s e", "ssz", "zt ", " ez", " ka", " ke", " ko", " re", "a h", "a n", "den", "dó ", "efo", "gad", "gat", "gye", "hel", "k e", "ket", "les", "mán", "nde", "nis", "ozz", "t b", "t i", "t é", "tat", "tos", "val", "z o", "zak", "ád ", "ály", "ára", "ési", "ész", " ak", " am", " es", " há", " ny", " tö", "aka", "art", "ató", "azt", "bbe", "ber", "ció", "cso", "em ", "eti", "eté", "gal", "i t", "ini", "ist", "ja ", "ker", "ki ", "kor", "koz", "l é", "ljá", "lye", "n v", "ni ", "pál", "ror", "ról", "rül", "s c", "s p", "s s", "s v", "sok", "t j", "t t", "tar", "tel", "vat");
+$GLOBALS["ngrams"]['id'] = array("an ", " me", "kan", "ang", "ng ", " pe", "men", " di", " ke", " da", " se", "eng", " be", "nga", "nya", " te", "ah ", "ber", "aka", " ya", "dan", "di ", "yan", "n p", "per", "a m", "ita", " pa", "da ", "ata", "ada", "ya ", "ta ", " in", "ala", "eri", "ia ", "a d", "n k", "am ", "ga ", "at ", "era", "n d", "ter", " ka", "a p", "ari", "emb", "n m", "ri ", " ba", "aan", "ak ", "ra ", " it", "ara", "ela", "ni ", "ali", "ran", "ar ", "eru", "lah", "a b", "asi", "awa", "eba", "gan", "n b", " ha", "ini", "mer", " la", " mi", "and", "ena", "wan", " sa", "aha", "lam", "n i", "nda", " wa", "a i", "dua", "g m", "mi ", "n a", "rus", "tel", "yak", " an", "dal", "h d", "i s", "ing", "min", "ngg", "tak", "ami", "beb", "den", "gat", "ian", "ih ", "pad", "rga", "san", "ua ", " de", "a t", "arg", "dar", "elu", "har", "i k", "i m", "i p", "ika", "in ", "iny", "itu", "mba", "n t", "ntu", "pan", "pen", "sah", "tan", "tu ", "a k", "ban", "edu", "eka", "g d", "ka ", "ker", "nde", "nta", "ora", "usa", " du", " ma", "a s", "ai ", "ant", "bas", "end", "i d", "ira", "kam", "lan", "n s", "uli", "al ", "apa", "ere", "ert", "lia", "mem", "rka", "si ", "tal", "ung", " ak", "a a", "a w", "ani", "ask", "ent", "gar", "haa", "i i", "isa", "ked", "mbe", "ska", "tor", "uan", "uk ", "uka", " ad", " to", "asa", "aya", "bag", "dia", "dun", "erj", "mas", "na ", "rek", "rit", "sih", "us ", " bi", "a h", "ama", "dib", "ers", "g s", "han", "ik ", "kem", "ma ", "n l", "nit", "r b", "rja", "sa ", " ju", " or", " si", " ti", "a y", "aga", "any", "as ", "cul", "eme", "emu", "eny", "epa", "erb", "erl", "gi ", "h m", "i a", "kel", "li ", "mel", "nia", "opa", "rta", "sia", "tah", "ula", "un ", "unt", " at", " bu", " pu", " ta", "agi", "alu", "amb", "bah", "bis", "er ", "i t", "ibe", "ir ", "ja ", "k m", "kar", "lai", "lal", "lu ", "mpa", "ngk", "nja", "or ", "pa ", "pas", "pem", "rak", "rik", "seb", "tam", "tem", "top", "tuk", "uni", "war", " al", " ga", " ge", " ir", " ja", " mu", " na", " pr", " su", " un", "ad ", "adi", "akt", "ann", "apo", "bel", "bul", "der", "ega", "eke", "ema", "emp", "ene", "enj", "esa");
+$GLOBALS["ngrams"]['is'] = array("að ", "um ", " að", "ir ", "ið ", "ur ", " ve", " í ", "na ", " á ", " se", " er", " og", "ar ", "og ", "ver", " mi", "inn", "nn ", " fy", "er ", "fyr", " ek", " en", " ha", " he", "ekk", " st", "ki ", "st ", "ði ", " ba", " me", " vi", "ig ", "rir", "yri", " um", "g f", "leg", "lei", "ns ", "ð s", " ei", " þa", "in ", "kki", "r h", "r s", "egi", "ein", "ga ", "ing", "ra ", "sta", " va", " þe", "ann", "en ", "mil", "sem", "tjó", "arð", "di ", "eit", "haf", "ill", "ins", "ist", "llj", "ndi", "r a", "r e", "seg", "un ", "var", " bi", " el", " fo", " ge", " yf", "and", "aug", "bau", "big", "ega", "eld", "erð", "fir", "foo", "gin", "itt", "n s", "ngi", "num", "od ", "ood", "sin", "ta ", "tt ", "við", "yfi", "ð e", "ð f", " hr", " sé", " þv", "a e", "a á", "em ", "gi ", "i f", "jar", "jór", "lja", "m e", "r á", "rei", "rst", "rða", "rði", "rðu", "stj", "und", "veg", "ví ", "ð v", "það", "því", " fj", " ko", " sl", "eik", "end", "ert", "ess", "fjá", "fur", "gir", "hús", "jár", "n e", "ri ", "tar", "ð þ", "ðar", "ður", "þes", " br", " hú", " kr", " le", " up", "a s", "egg", "i s", "irt", "ja ", "kið", "len", "með", "mik", "n b", "nar", "nir", "nun", "r f", "r v", "rið", "rt ", "sti", "t v", "ti ", "una", "upp", "ða ", "óna", " al", " fr", " gr", "a v", "all", "an ", "da ", "eið", "eð ", "fa ", "fra", "g e", "ger", "gið", "gt ", "han", "hef", "hel", "her", "hra", "i a", "i e", "i v", "i þ", "iki", "jón", "jör", "ka ", "kró", "lík", "m h", "n a", "nga", "r l", "ram", "ru ", "ráð", "rón", "svo", "vin", "í b", "í h", "ð h", "ð k", "ð m", "örð", " af", " fa", " lí", " rá", " sk", " sv", " te", "a b", "a f", "a h", "a k", "a u", "afi", "agn", "arn", "ast", "ber", "efu", "enn", "erb", "erg", "fi ", "g a", "gar", "iðs", "ker", "kke", "lan", "ljó", "llt", "ma ", "mið", "n v", "n í", "nan", "nda", "ndu", "nið", "nna", "nnu", "nu ", "r o", "rbe", "rgi", "slö", "sé ", "t a", "t h", "til", "tin", "ugu", "vil", "ygg", "á s", "ð a", "ð b", "órn", "ögn", "öku", " at", " fi", " fé", " ka", " ma", " no", " sa", " si", " ti", " ák", "a m", "a t", "a í", "a þ", "afa", "afs", "ald", "arf");
+$GLOBALS["ngrams"]['it'] = array(" di", "to ", "la ", " de", "di ", "no ", " co", "re ", "ion", "e d", " e ", "le ", "del", "ne ", "ti ", "ell", " la", " un", "ni ", "i d", "per", " pe", "ent", " in", "one", "he ", "ta ", "zio", "che", "o d", "a d", "na ", "ato", "e s", " so", "i s", "lla", "a p", "li ", "te ", " al", " ch", "er ", " pa", " si", "con", "sta", " pr", "a c", " se", "el ", "ia ", "si ", "e p", " da", "e i", "i p", "ont", "ano", "i c", "all", "azi", "nte", "on ", "nti", "o s", " ri", "i a", "o a", "un ", " an", "are", "ari", "e a", "i e", "ita", "men", "ri ", " ca", " il", " no", " po", "a s", "ant", "il ", "in ", "a l", "ati", "cia", "e c", "ro ", "ann", "est", "gli", "tà ", " qu", "e l", "nta", " a ", "com", "o c", "ra ", " le", " ne", "ali", "ere", "ist", " ma", " è ", "io ", "lle", "me ", "era", "ica", "ost", "pro", "tar", "una", " pi", "da ", "tat", " mi", "att", "ca ", "mo ", "non", "par", "sti", " fa", " i ", " re", " su", "ess", "ini", "nto", "o l", "ssi", "tto", "a e", "ame", "col", "ei ", "ma ", "o i", "za ", " st", "a a", "ale", "anc", "ani", "i m", "ian", "o p", "oni", "sio", "tan", "tti", " lo", "i r", "oci", "oli", "ona", "ono", "tra", " l ", "a r", "eri", "ett", "lo ", "nza", "que", "str", "ter", "tta", " ba", " li", " te", "ass", "e f", "enz", "for", "nno", "olo", "ori", "res", "tor", " ci", " vo", "a i", "al ", "chi", "e n", "lia", "pre", "ria", "uni", "ver", " sp", "imo", "l a", "l c", "ran", "sen", "soc", "tic", " fi", " mo", "a n", "ce ", "dei", "ggi", "gio", "iti", "l s", "lit", "ll ", "mon", "ola", "pac", "sim", "tit", "utt", "vol", " ar", " fo", " ha", " sa", "acc", "e r", "ire", "man", "ntr", "rat", "sco", "tro", "tut", "va ", " do", " gi", " me", " sc", " tu", " ve", " vi", "a m", "ber", "can", "cit", "i l", "ier", "ità", "lli", "min", "n p", "nat", "nda", "o e", "o f", "o u", "ore", "oro", "ort", "sto", "ten", "tiv", "van", "art", "cco", "ci ", "cos", "dal", "e v", "i i", "ila", "ino", "l p", "n c", "nit", "ole", "ome", "po ", "rio", "sa ", " ce", " es", " tr", "a b", "and", "ata", "der", "ens", "ers", "gi ", "ial", "ina", "itt", "izi", "lan", "lor", "mil");
+$GLOBALS["ngrams"]['kk'] = array("ан ", "ен ", "ың ", " қа", " ба", "ай ", "нда", "ын ", " са", " ал", "ді ", "ары", "ды ", "ып ", " мұ", " бі", "асы", "да ", "най", " жа", "мұн", "ста", "ған", "н б", "ұна", " бо", "ның", "ін ", "лар", "сын", " де", "аға", "тан", " кө", "бір", "ер ", "мен", "аза", "ынд", "ыны", " ме", "анд", "ері", "бол", "дың", "қаз", "аты", "сы ", "тын", "ғы ", " ке", "ар ", "зақ", "ық ", "ала", "алы", "аны", "ара", "ағы", "ген", "тар", "тер", "тыр", "айд", "ард", "де ", "ға ", " қо", "бар", "ің ", "қан", " бе", " қы", "ақс", "гер", "дан", "дар", "лық", "лға", "ына", "ір ", "ірі", "ғас", " та", "а б", "гі ", "еді", "еле", "йды", "н к", "н т", "ола", "рын", "іп ", "қст", "қта", "ң б", " ай", " ол", " со", "айт", "дағ", "иге", "лер", "лып", "н а", "ік ", "ақт", "бағ", "кен", "н қ", "ны ", "рге", "рға", "ыр ", " ар", "алғ", "аса", "бас", "бер", "ге ", "еті", "на ", "нде", "не ", "ниг", "рды", "ры ", "сай", " ау", " кү", " ни", " от", " өз", "ауд", "еп ", "иял", "лты", "н ж", "н о", "осы", "оты", "рып", "рі ", "тке", "ты ", "ы б", "ы ж", "ылы", "ысы", "і с", "қар", " бұ", " да", " же", " тұ", " құ", "ады", "айл", "ап ", "ата", "ені", "йла", "н м", "н с", "нды", "нді", "р м", "тай", "тін", "ы т", "ыс ", "інд", " би", "а ж", "ауы", "деп", "дің", "еке", "ери", "йын", "кел", "лды", "ма ", "нан", "оны", "п ж", "п о", "р б", "рия", "рла", "уда", "шыл", "ы а", "ықт", "і а", "і б", "із ", "ілі", "ң қ", " ас", " ек", " жо", " мә", " ос", " ре", " се", "алд", "дал", "дег", "дей", "е б", "ет ", "жас", "й б", "лау", "лда", "мет", "нын", "сар", "сі ", "ті ", "ыры", "ыта", "ісі", "ң а", "өте", " ат", " ел", " жү", " ма", " то", " шы", "а а", "алт", "ама", "арл", "аст", "бұл", "дай", "дық", "ек ", "ель", "есі", "зді", "көт", "лем", "ль ", "н е", "п а", "р а", "рес", "са ", "та ", "тте", "тұр", "шы ", "ы д", "ы қ", "ыз ", "қыт", " ко", " не", " ой", " ор", " сұ", " тү", "аль", "аре", "атт", "дір", "ев ", "егі", "еда", "екі", "елд", "ерг", "ерд", "ияд", "кер", "кет", "лыс", "ліс", "мед", "мпи", "н д", "ні ", "нін", "п т", "пек", "рел", "рта", "ріл", "рін", "сен", "тал", "шіл", "ы к", "ы м", "ыст");
+$GLOBALS["ngrams"]['ky'] = array("ын ", "ан ", " жа", "ен ", "да ", " та", "ар ", "ин ", " ка", "ары", " ал", " ба", " би", "лар", " бо", " кы", "ала", "н к", " са", "нда", "ган", "тар", " де", "анд", "н б", " ке", "ард", "мен", "н т", "ара", "нын", " да", " ме", "кыр", " че", "н а", "ры ", " ко", "ген", "дар", "кен", "кта", "уу ", "ене", "ери", " ша", "алы", "ат ", "на ", " кө", " эм", "аты", "дан", "деп", "дын", "еп ", "нен", "рын", " бе", "кан", "луу", "ргы", "тан", "шай", "ырг", "үн ", " ар", " ма", "агы", "акт", "аны", "гы ", "гыз", "ды ", "рда", "ай ", "бир", "бол", "ер ", "н с", "нды", "ун ", "ча ", "ынд", "а к", "ага", "айл", "ана", "ап ", "га ", "лге", "нча", "п к", "рды", "туу", "ыны", " ан", " өз", "ама", "ата", "дин", "йт ", "лга", "лоо", "оо ", "ри ", "тин", "ыз ", "ып ", "өрү", " па", " эк", "а б", "алг", "асы", "ашт", "биз", "кел", "кте", "тал", " не", " су", "акы", "ент", "инд", "ир ", "кал", "н д", "нде", "ого", "онд", "оюн", "р б", "р м", "ран", "сал", "ста", "сы ", "ура", "ыгы", " аш", " ми", " сы", " ту", "ал ", "арт", "бор", "елг", "ени", "ет ", "жат", "йло", "кар", "н м", "огу", "п а", "п ж", "р э", "сын", "ык ", "юнч", " бу", " ур", "а а", "ак ", "алд", "алу", "бар", "бер", "бою", "ге ", "дон", "еги", "ект", "ефт", "из ", "кат", "лды", "н ч", "н э", "н ө", "ндо", "неф", "он ", "сат", "тор", "ты ", "уда", "ул ", "ула", "ууд", "ы б", "ы ж", "ы к", "ыл ", "ына", "эке", "ясы", " ат", " до", " жы", " со", " чы", "аас", "айт", "аст", "баа", "баш", "гар", "гын", "дө ", "е б", "ек ", "жыл", "и б", "ик ", "ияс", "кыз", "лда", "лык", "мда", "н ж", "нди", "ни ", "нин", "орд", "рдо", "сто", "та ", "тер", "тти", "тур", "тын", "уп ", "ушу", "фти", "ыкт", "үп ", "өн ", " ай", " бү", " ич", " иш", " мо", " пр", " ре", " өк", " өт", "а д", "а у", "а э", "айм", "амд", "атт", "бек", "бул", "гол", "дег", "еге", "ейт", "еле", "енд", "жак", "и к", "ини", "ири", "йма", "кто", "лик", "мак", "мес", "н у", "н ш", "нтт", "ол ", "оло", "пар", "рак", "рүү", "сыр", "ти ", "тик", "тта", "төр", "у ж", "у с", "шка", "ы м", "ызы", "ылд", "эме", "үрү", "өлү", "өтө", " же", " тү", " эл", " өн", "а ж", "ады");
+$GLOBALS["ngrams"]['la'] = array("um ", "us ", "ut ", "et ", "is ", " et", " in", " qu", "tur", " pr", "est", "tio", " au", "am ", "em ", "aut", " di", "ent", "in ", "dic", "t e", " es", "ur ", "ati", "ion", "st ", " ut", "ae ", "qua", " de", "nt ", " su", " si", "itu", "unt", "rum", "ia ", "es ", "ter", " re", "nti", "rae", "s e", "qui", "io ", "pro", "it ", "per", "ita", "one", "ici", "ius", " co", "t d", "bus", "pra", "m e", " no", "edi", "tia", "ue ", "ibu", " se", " ad", "er ", " fi", "ili", "que", "t i", "de ", "oru", " te", "ali", " pe", "aed", "cit", "m d", "t s", "tat", "tem", "tis", "t p", "sti", "te ", "cum", "ere", "ium", " ex", "rat", "ta ", "con", "cti", "oni", "ra ", "s i", " cu", " sa", "eni", "nis", "nte", "eri", "omi", "re ", "s a", "min", "os ", "ti ", "uer", " ma", " ue", "m s", "nem", "t m", " mo", " po", " ui", "gen", "ict", "m i", "ris", "s s", "t a", "uae", " do", "m a", "t c", " ge", "as ", "e i", "e p", "ne ", " ca", "ine", "quo", "s p", " al", "e e", "ntu", "ro ", "tri", "tus", "uit", "atu", "ini", "iqu", "m p", "ost", "res", "ura", " ac", " fu", "a e", "ant", "nes", "nim", "sun", "tra", "e a", "s d", " pa", " uo", "ecu", " om", " tu", "ad ", "cut", "omn", "s q", " ei", "ex ", "icu", "tor", "uid", " ip", " me", "e s", "era", "eru", "iam", "ide", "ips", " iu", "a s", "do ", "e d", "eiu", "ica", "im ", "m c", "m u", "tiu", " ho", "cat", "ist", "nat", "on ", "pti", "reg", "rit", "s t", "sic", "spe", " en", " sp", "dis", "eli", "liq", "lis", "men", "mus", "num", "pos", "sio", " an", " gr", "abi", "acc", "ect", "ri ", "uan", " le", "ecc", "ete", "gra", "non", "se ", "uen", "uis", " fa", " tr", "ate", "e c", "fil", "na ", "ni ", "pul", "s f", "ui ", "at ", "cce", "dam", "i e", "ina", "leg", "nos", "ori", "pec", "rop", "sta", "uia", "ene", "iue", "iui", "siu", "t t", "t u", "tib", "tit", " da", " ne", "a d", "and", "ege", "equ", "hom", "imu", "lor", "m m", "mni", "ndo", "ner", "o e", "r e", "sit", "tum", "utu", "a p", "bis", "bit", "cer", "cta", "dom", "fut", "i s", "ign", "int", "mod", "ndu", "nit", "rib", "rti", "tas", "und", " ab", "err", "ers", "ite", "iti", "m t", "o p");
+$GLOBALS["ngrams"]['lt'] = array("as ", " pa", " ka", "ai ", "us ", "os ", "is ", " ne", " ir", "ir ", "ti ", " pr", "aus", "ini", "s p", "pas", "ių ", " ta", " vi", "iau", " ko", " su", "kai", "o p", "usi", " sa", "vo ", "tai", "ali", "tų ", "io ", "jo ", "s k", "sta", "iai", " bu", " nu", "ius", "mo ", " po", "ien", "s s", "tas", " me", "uvo", "kad", " iš", " la", "to ", "ais", "ie ", "kur", "uri", " ku", "ijo", "čia", "au ", "met", "je ", " va", "ad ", " ap", "and", " gr", " ti", "kal", "asi", "i p", "iči", "s i", "s v", "ink", "o n", "ės ", "buv", "s a", " ga", "aip", "avi", "mas", "pri", "tik", " re", "etu", "jos", " da", "ent", "oli", "par", "ant", "ara", "tar", "ama", "gal", "imo", "išk", "o s", " at", " be", " į ", "min", "tin", " tu", "s n", " jo", "dar", "ip ", "rei", " te", "dži", "kas", "nin", "tei", "vie", " li", " se", "cij", "gar", "lai", "art", "lau", "ras", "no ", "o k", "tą ", " ar", "ėjo", "vič", "iga", "pra", "vis", " na", "men", "oki", "raš", "s t", "iet", "ika", "int", "kom", "tam", "aug", "avo", "rie", "s b", " st", "eim", "ko ", "nus", "pol", "ria", "sau", "api", "me ", "ne ", "sik", " ši", "i n", "ia ", "ici", "oja", "sak", "sti", "ui ", "ame", "lie", "o t", "pie", "čiu", " di", " pe", "gri", "ios", "lia", "lin", "s d", "s g", "ta ", "uot", " ja", " už", "aut", "i s", "ino", "mą ", "oje", "rav", "dėl", "nti", "o a", "toj", "ėl ", " to", " vy", "ar ", "ina", "lic", "o v", "sei", "su ", " mi", " pi", "din", "iš ", "lan", "si ", "tus", " ba", "asa", "ata", "kla", "omi", "tat", " an", " ji", "als", "ena", "jų ", "nuo", "per", "rig", "s m", "val", "yta", "čio", " ra", "i k", "lik", "net", "nė ", "tis", "tuo", "yti", "ęs ", "ų s", "ada", "ari", "do ", "eik", "eis", "ist", "lst", "ma ", "nes", "sav", "sio", "tau", " ki", "aik", "aud", "ies", "ori", "s r", "ska", " ge", "ast", "eig", "et ", "iam", "isa", "mis", "nam", "ome", "žia", "aba", "aul", "ikr", "ką ", "nta", "ra ", "tur", " ma", "die", "ei ", "i t", "nas", "rin", "sto", "tie", "tuv", "vos", "ų p", " dė", "are", "ats", "enė", "ili", "ima", "kar", "ms ", "nia", "r p", "rod", "s l", " o ", "e p", "es ", "ide", "ik ", "ja ");
+$GLOBALS["ngrams"]['lv'] = array("as ", " la", " pa", " ne", "es ", " un", "un ", " ka", " va", "ar ", "s p", " ar", " vi", "is ", "ai ", " no", "ja ", "ija", "iem", "em ", "tu ", "tie", "vie", "lat", "aks", "ien", "kst", "ies", "s a", "rak", "atv", "tvi", " ja", " pi", "ka ", " ir", "ir ", "ta ", " sa", "ts ", " kā", "ās ", " ti", "ot ", "s n", " ie", " ta", "arī", "par", "pie", " pr", "kā ", " at", " ra", "am ", "inā", "tā ", " iz", "jas", "lai", " na", "aut", "ieš", "s s", " ap", " ko", " st", "iek", "iet", "jau", "us ", "rī ", "tik", "ība", "na ", " ga", "cij", "s i", " uz", "jum", "s v", "ms ", "var", " ku", " ma", "jā ", "sta", "s u", " tā", "die", "kai", "kas", "ska", " ci", " da", "kur", "lie", "tas", "a p", "est", "stā", "šan", "nes", "nie", "s d", "s m", "val", " di", " es", " re", "no ", "to ", "umu", "vai", "ši ", " vē", "kum", "nu ", "rie", "s t", "ām ", "ad ", "et ", "mu ", "s l", " be", "aud", "tur", "vij", "viņ", "āju", "bas", "gad", "i n", "ika", "os ", "a v", "not", "oti", "sts", "aik", "u a", "ā a", "āk ", " to", "ied", "stu", "ti ", "u p", "vēl", "āci", " šo", "gi ", "ko ", "pro", "s r", "tāj", "u s", "u v", "vis", "aun", "ks ", "str", "zin", "a a", "adī", "da ", "dar", "ena", "ici", "kra", "nas", "stī", "šu ", " mē", "a n", "eci", "i s", "ie ", "iņa", "ju ", "las", "r t", "ums", "šie", "bu ", "cit", "i a", "ina", "ma ", "pus", "ra ", " au", " se", " sl", "a s", "ais", "eši", "iec", "iku", "pār", "s b", "s k", "sot", "ādā", " in", " li", " tr", "ana", "eso", "ikr", "man", "ne ", "u k", " tu", "an ", "av ", "bet", "būt", "im ", "isk", "līd", "nav", "ras", "ri ", "s g", "sti", "īdz", " ai", "arb", "cin", "das", "ent", "gal", "i p", "lik", "mā ", "nek", "pat", "rēt", "si ", "tra", "uši", "vei", " br", " pu", " sk", "als", "ama", "edz", "eka", "ešu", "ieg", "jis", "kam", "lst", "nāk", "oli", "pre", "pēc", "rot", "tās", "usi", "ēl ", "ēs ", " bi", " de", " me", " pā", "a i", "aid", "ajā", "ikt", "kat", "lic", "lod", "mi ", "ni ", "pri", "rād", "rīg", "sim", "trā", "u l", "uto", "uz ", "ēc ", "ītā", " ce", " jā", " sv", "a t", "aga", "aiz", "atu", "ba ", "cie", "du ", "dzi", "dzī");
+$GLOBALS["ngrams"]['mk'] = array("на ", " на", "та ", "ата", "ија", " пр", "то ", "ја ", " за", "а н", " и ", "а с", "те ", "ите", " ко", "от ", " де", " по", "а д", "во ", "за ", " во", " од", " се", " не", "се ", " до", "а в", "ка ", "ање", "а п", "о п", "ува", "циј", "а о", "ици", "ето", "о н", "ани", "ни ", " вл", "дек", "ека", "њет", "ќе ", " е ", "а з", "а и", "ат ", "вла", "го ", "е н", "од ", "пре", " го", " да", " ма", " ре", " ќе", "али", "и д", "и н", "иот", "нат", "ово", " па", " ра", " со", "ове", "пра", "што", "ње ", "а е", "да ", "дат", "дон", "е в", "е д", "е з", "е с", "кон", "нит", "но ", "они", "ото", "пар", "при", "ста", "т н", " шт", "а к", "аци", "ва ", "вањ", "е п", "ени", "ла ", "лад", "мак", "нес", "нос", "про", "рен", "јат", " ин", " ме", " то", "а г", "а м", "а р", "аке", "ако", "вор", "гов", "едо", "ена", "и и", "ира", "кед", "не ", "ниц", "ниј", "ост", "ра ", "рат", "ред", "ска", "тен", " ка", " сп", " ја", "а т", "аде", "арт", "е г", "е и", "кат", "лас", "нио", "о с", "ри ", " ба", " би", "ава", "ате", "вни", "д н", "ден", "дов", "држ", "дув", "е о", "ен ", "ере", "ери", "и п", "и с", "ина", "кој", "нци", "о м", "о о", "одн", "пор", "ски", "спо", "ств", "сти", "тво", "ти ", " об", " ов", "а б", "алн", "ара", "бар", "е к", "ед ", "ент", "еѓу", "и о", "ии ", "меѓ", "о д", "оја", "пот", "раз", "раш", "спр", "сто", "т д", "ци ", " бе", " гр", " др", " из", " ст", "аа ", "бид", "вед", "гла", "еко", "енд", "есе", "етс", "зац", "и т", "иза", "инс", "ист", "ки ", "ков", "кол", "ку ", "лиц", "о з", "о и", "ова", "олк", "оре", "ори", "под", "рањ", "реф", "ржа", "ров", "рти", "со ", "тор", "фер", "цен", "цит", " а ", " вр", " гл", " дп", " мо", " ни", " но", " оп", " от", "а ќ", "або", "ада", "аса", "аша", "ба ", "бот", "ваа", "ват", "вот", "ги ", "гра", "де ", "дин", "дум", "евр", "еду", "ено", "ера", "ес ", "ење", "же ", "зак", "и в", "ила", "иту", "коа", "кои", "лан", "лку", "лож", "мот", "нду", "нст", "о в", "оа ", "оал", "обр", "ов ", "ови", "овн", "ои ", "ор ", "орм", "ој ", "рет", "сед", "ст ", "тер", "тиј", "тоа", "фор", "ции", "ѓу ", " ал", " ве", " вм", " ги", " ду");
+$GLOBALS["ngrams"]['mn'] = array("ын ", " ба", "йн ", "бай", "ийн", "уул", " ул", "улс", "ан ", " ха", "ний", "н х", "гаа", "сын", "ий ", "лсы", " бо", "й б", "эн ", "ах ", "бол", "ол ", "н б", "оло", " хэ", "онг", "гол", "гуу", "нго", "ыг ", "жил", " мо", "лаг", "лла", "мон", " тє", " ху", "айд", "ны ", "он ", "сан", "хий", " аж", " ор", "л у", "н т", "улг", "айг", "длы", "йг ", " за", "дэс", "н а", "ндэ", "ула", "ээ ", "ага", "ийг", "vй ", "аа ", "й а", "лын", "н з", " аю", " зє", "аар", "ад ", "ар ", "гvй", "зєв", "ажи", "ал ", "аюу", "г х", "лгv", "лж ", "сни", "эсн", "юул", "йдл", "лыг", "нхи", "ууд", "хам", " нэ", " са", "гий", "лах", "лєл", "рєн", "єгч", " та", "илл", "лий", "лэх", "рий", "эх ", " ер", " эр", "влє", "ерє", "ийл", "лон", "лєг", "євл", "єнх", " хо", "ари", "их ", "хан", "эр ", "єн ", "vvл", "ж б", "тэй", "х х", "эрх", " vн", " нь", "vнд", "алт", "йлє", "нь ", "тєр", " га", " су", "аан", "даа", "илц", "йгу", "л а", "лаа", "н н", "руу", "эй ", " то", "н с", "рил", "єри", "ааг", "гч ", "лээ", "н о", "рэг", "суу", "эрэ", "їїл", " yн", " бу", " дэ", " ол", " ту", " ши", "yнд", "аши", "г т", "иг ", "йл ", "хар", "шин", "эг ", "єр ", " их", " хє", " хї", "ам ", "анг", "ин ", "йга", "лса", "н v", "н е", "нал", "нд ", "хуу", "цаа", "эд ", "ээр", "єл ", "vйл", "ада", "айн", "ала", "амт", "гах", "д х", "дал", "зар", "л б", "лан", "н д", "сэн", "улл", "х б", "хэр", " бv", " да", " зо", "vрэ", "аад", "гээ", "лэн", "н и", "н э", "нга", "нэ ", "тал", "тын", "хур", "эл ", " на", " ни", " он", "vлэ", "аг ", "аж ", "ай ", "ата", "бар", "г б", "гад", "гїй", "й х", "лт ", "н м", "на ", "оро", "уль", "чин", "эж ", "энэ", "ээд", "їй ", "їлэ", " би", " тэ", " эн", "аны", "дий", "дээ", "лал", "лга", "лд ", "лог", "ль ", "н у", "н ї", "р б", "рал", "сон", "тай", "удл", "элт", "эрг", "єлє", " vй", " в ", " гэ", " хv", "ара", "бvр", "д н", "д о", "л х", "лс ", "лты", "н г", "нэг", "огт", "олы", "оёр", "р т", "рээ", "тав", "тог", "уур", "хоё", "хэл", "хээ", "элэ", "ёр ", " ав", " ас", " аш", " ду", " со", " чи", " эв", " єр", "аал", "алд", "амж", "анд", "асу", "вэр", "г у", "двэ", "жvv", "лца", "лэл");
+$GLOBALS["ngrams"]['nb'] = array("er ", "en ", "et ", " de", "det", " i ", "for", "il ", " fo", " me", "ing", "om ", " ha", " og", "ter", " er", " ti", " st", "og ", "til", "ne ", " vi", "re ", " en", " se", "te ", "or ", "de ", "kke", "ke ", "ar ", "ng ", "r s", "ene", " so", "e s", "der", "an ", "som", "ste", "at ", "ed ", "r i", " av", " in", "men", " at", " ko", " på", "har", " si", "ere", "på ", "nde", "and", "els", "ett", "tte", "lig", "t s", "den", "t i", "ikk", "med", "n s", "rt ", "ser", "ska", "t e", "ker", "sen", "av ", "ler", "r a", "ten", "e f", "r e", "r t", "ede", "ig ", " re", "han", "lle", "ner", " bl", " fr", "le ", " ve", "e t", "lan", "mme", "nge", " be", " ik", " om", " å ", "ell", "sel", "sta", "ver", " et", " sk", "nte", "one", "ore", "r d", "ske", " an", " la", "del", "gen", "nin", "r f", "r v", "se ", " po", "ir ", "jon", "mer", "nen", "omm", "sjo", " fl", " sa", "ern", "kom", "r m", "r o", "ren", "vil", "ale", "es ", "n a", "t f", " le", "bli", "e e", "e i", "e v", "het", "ye ", " ir", "al ", "e o", "ide", "iti", "lit", "nne", "ran", "t o", "tal", "tat", "tt ", " ka", "ans", "asj", "ge ", "inn", "kon", "lse", "pet", "t d", "vi ", " ut", "ent", "eri", "oli", "r p", "ret", "ris", "sto", "str", "t a", " ga", "all", "ape", "g s", "ill", "ira", "kap", "nn ", "opp", "r h", "rin", " br", " op", "e m", "ert", "ger", "ion", "kal", "lsk", "nes", " gj", " mi", " pr", "ang", "e h", "e r", "elt", "enn", "i s", "ist", "jen", "kan", "lt ", "nal", "res", "tor", "ass", "dre", "e b", "e p", "mel", "n t", "nse", "ort", "per", "reg", "sje", "t p", "t v", " hv", " nå", " va", "ann", "ato", "e a", "est", "ise", "isk", "oil", "ord", "pol", "ra ", "rak", "sse", "toi", " gr", "ak ", "eg ", "ele", "g a", "ige", "igh", "m e", "n f", "n v", "ndr", "nsk", "rer", "t m", "und", "var", "år ", " he", " no", " ny", "end", "ete", "fly", "g i", "ghe", "ier", "ind", "int", "lin", "n d", "n p", "rne", "sak", "sie", "t b", "tid", " al", " pa", " tr", "ag ", "dig", "e d", "e k", "ess", "hol", "i d", "lag", "led", "n e", "n i", "n o", "pri", "r b", "st ", " fe", " li", " ry", "air", "ake", "d s", "eas", "egi");
+$GLOBALS["ngrams"]['ne'] = array("को ", "का ", "मा ", "हरु", " ने", "नेप", "पाल", "ेपा", " सम", "ले ", " प्", "प्र", "कार", "ा स", "एको", " भए", " छ ", " भा", "्रम", " गर", "रुक", " र ", "भार", "ारत", " का", " वि", "भएक", "ाली", "ली ", "ा प", "ीहर", "ार्", "ो छ", "ना ", "रु ", "ालक", "्या", " बा", "एका", "ने ", "न्त", "ा ब", "ाको", "ार ", "ा भ", "ाहर", "्रो", "क्ष", "न् ", "ारी", " नि", "ा न", "ी स", " डु", "क्र", "जना", "यो ", "ा छ", "ेवा", "्ता", " रा", "त्य", "न्द", "हुन", "ा क", "ामा", "ी न", "्दा", " से", "छन्", "म्ब", "रोत", "सेव", "स्त", "स्र", "ेका", "्त ", " बी", " हु", "क्त", "त्र", "रत ", "र्न", "र्य", "ा र", "ाका", "ुको", " एक", " सं", " सु", "बीब", "बीस", "लको", "स्य", "ीबी", "ीसी", "ेको", "ो स", "्यक", " छन", " जन", " बि", " मु", " स्", "गर्", "ताह", "न्ध", "बार", "मन्", "मस्", "रुल", "लाई", "ा व", "ाई ", "ाल ", "िका", " त्", " मा", " यस", " रु", "ताक", "बन्", "र ब", "रण ", "रुप", "रेक", "ष्ट", "सम्", "सी ", "ाएक", "ुका", "ुक्", " अध", " अन", " तथ", " थि", " दे", " पर", " बै", "तथा", "ता ", "दा ", "द्द", "नी ", "बाट", "यक्", "री ", "रीह", "र्म", "लका", "समस", "ा अ", "ा ए", "ाट ", "िय ", "ो प", "ो म", "्न ", "्ने", "्षा", " पा", " यो", " हा", "अधि", "डुव", "त भ", "त स", "था ", "धिक", "पमा", "बैठ", "मुद", "या ", "युक", "र न", "रति", "वान", "सार", "ा आ", "ा ज", "ा ह", "ुद्", "ुपम", "ुले", "ुवा", "ैठक", "ो ब", "्तर", "्य ", "्यस", " क्", " मन", " रह", "चार", "तिय", "दै ", "निर", "नु ", "पर्", "रक्", "र्द", "समा", "सुर", "ाउन", "ान ", "ानम", "ारण", "ाले", "ि ब", "ियो", "ुन्", "ुरक", "्त्", "्बन", "्रा", "्ष ", " आर", " जल", " बे", " या", " सा", "आएक", "एक ", "कर्", "जलस", "णका", "त र", "द्र", "धान", "धि ", "नका", "नमा", "नि ", "ममा", "रम ", "रहे", "राज", "लस्", "ला ", "वार", "सका", "हिल", "हेक", "ा त", "ारे", "िन्", "िस्", "े स", "ो न", "ो र", "ोत ", "्धि", "्मी", "्रस", " दु", " पन", " बत", " बन", " भन", "ंयु", "आरम", "खि ", "ण्ड", "तका", "ताल", "दी ", "देख", "निय", "पनि", "प्त", "बता", "मी ", "म्भ", "र स", "रम्", "लमा", "विश", "षाक", "संय", "ा ड", "ा म", "ानक", "ालम", "ि भ", "ित ", "ी प", "ी र", "ु भ", "ुने", "े ग", "ेखि", "ेर ", "ो भ", "ो व", "ो ह", "्भ ", "्र ", " ता", " नम", " ना");
+$GLOBALS["ngrams"]['nl'] = array("en ", "de ", " de", "et ", "an ", " he", "er ", " va", "n d", "van", "een", "het", " ge", "oor", " ee", "der", " en", "ij ", "aar", "gen", "te ", "ver", " in", " me", "aan", "den", " we", "at ", "in ", " da", " te", "eer", "nde", "ter", "ste", "n v", " vo", " zi", "ing", "n h", "voo", "is ", " op", "tie", " aa", "ede", "erd", "ers", " be", "eme", "ten", "ken", "n e", " ni", " ve", "ent", "ijn", "jn ", "mee", "iet", "n w", "ng ", "nie", " is", "cht", "dat", "ere", "ie ", "ijk", "n b", "rde", "ar ", "e b", "e a", "met", "t d", "el ", "ond", "t h", " al", "e w", "op ", "ren", " di", " on", "al ", "and", "bij", "zij", " bi", " hi", " wi", "or ", "r d", "t v", " wa", "e h", "lle", "rt ", "ang", "hij", "men", "n a", "n z", "rs ", " om", "e o", "e v", "end", "est", "n t", "par", " pa", " pr", " ze", "e g", "e p", "n p", "ord", "oud", "raa", "sch", "t e", "ege", "ich", "ien", "aat", "ek ", "len", "n m", "nge", "nt ", "ove", "rd ", "wer", " ma", " mi", "daa", "e k", "lij", "mer", "n g", "n o", "om ", "sen", "t b", "wij", " ho", "e m", "ele", "gem", "heb", "pen", "ude", " bo", " ja", "die", "e e", "eli", "erk", "le ", "pro", "rij", " er", " za", "e d", "ens", "ind", "ke ", "n k", "nd ", "nen", "nte", "r h", "s d", "s e", "t z", " b ", " co", " ik", " ko", " ov", "eke", "hou", "ik ", "iti", "lan", "ns ", "t g", "t m", " do", " le", " zo", "ams", "e z", "g v", "it ", "je ", "ls ", "maa", "n i", "nke", "rke", "uit", " ha", " ka", " mo", " re", " st", " to", "age", "als", "ark", "art", "ben", "e r", "e s", "ert", "eze", "ht ", "ijd", "lem", "r v", "rte", "t p", "zeg", "zic", "aak", "aal", "ag ", "ale", "bbe", "ch ", "e t", "ebb", "erz", "ft ", "ge ", "led", "mst", "n n", "oek", "r i", "t o", "t w", "tel", "tte", "uur", "we ", "zit", " af", " li", " ui", "ak ", "all", "aut", "doo", "e i", "ene", "erg", "ete", "ges", "hee", "jaa", "jke", "kee", "kel", "kom", "lee", "moe", "n s", "ort", "rec", "s o", "s v", "teg", "tij", "ven", "waa", "wel", " an", " au", " bu", " gr", " pl", " ti", "'' ", "ade", "dag", "e l", "ech", "eel", "eft", "ger", "gt ", "ig ", "itt", "j d", "ppe", "rda");
+$GLOBALS["ngrams"]['nr'] = array("oku", "la ", "nga", "a n", " ng", "na ", "ama", "a i", "ko ", " uk", "ele", "lo ", "ela", "ang", "a u", "a k", "uku", "aba", " ku", "wa ", "enz", "lel", "ho ", "ni ", "ngo", "ath", "pha", "eth", "kha", "ana", "isa", "nge", " na", "o n", "tho", "e n", "the", "ha ", "esi", "nye", "kwe", "tjh", " kw", "ise", " um", "a a", " ne", "le ", "hla", "a e", "lan", "ben", "ndl", " no", "imi", "und", "ung", "thi", "nzi", "ye ", "isi", "uth", "o e", "ebe", "het", "kut", "and", "sa ", "elo", "fun", "eko", "seb", "ban", "ulu", "aka", "eli", "wen", "e i", " am", "eni", "ba ", "we ", "nel", " we", "kuf", "lwa", "i n", " is", "zi ", " lo", "kwa", "lok", "elw", "gok", "ona", "lek", "hi ", "li ", "gan", "bon", " ii", "ing", "ka ", "o i", "akh", "ane", "thu", "ula", "kel", "mth", " im", "ga ", " le", "nda", "fan", "nok", "i k", "end", "si ", "o w", "aph", "hat", "e u", "ala", "kub", "lun", "ikh", "o l", "ezi", "a l", "o u", "sis", "nam", "emi", " ab", "hul", "kus", " wo", "sek", "azi", "kho", "iin", "i u", "asi", "lol", "ini", "uph", "uhl", "khu", "no ", "o y", "ako", "a b", "i e", "o k", "i l", " be", "mal", " ye", "i i", "nde", "iph", "mel", "eke", "tha", "kun", "ngi", "e k", "eng", "o s", " yo", "so ", "ma ", "mkh", "jha", "isw", "lwe", " ez", "di ", "a w", "e a", "kul", "uny", "ume", "za ", "any", "ahl", "kuh", "een", " si", "ili", "itj", "zok", "ihl", " es", "ke ", "hlo", "hak", "phe", "lul", "dle", "luk", "da ", "eka", "amb", " se", "zis", "mbi", "hon", "dla", "aku", "jen", "zin", " ba", "ham", "i a", " bo", "o a", "ali", "use", "ile", "sik", "han", "wok", "okh", "hlu", "nya", "sit", "ani", "kuz", "o o", "ufa", "swa", "ind", "zak", "nis", "lis", "gab", "mi ", " em", " ko", "ano", " el", "hwa", "ufu", "a y", "wo ", " in", "lim", "tlo", "kat", "wak", "kan", "thw", "o z", "ith", "ndi", "yok", "yo ", "mit", "mis", "abo", "eku", "hab", "iny", "nan", "eze", "khe", "alo", "lu ", "man", "he ", "ezo", "kup", "ubu", " zo", "gam", "hel", "wan", "omb", "amk", "nza", "ola", "hum", "kuk", "du ", " la", "kom", "i y", "obu", "i b", "odu", "okw", "gap", " ka", "be ", " il", "alu", "atj", "e b");
+$GLOBALS["ngrams"]['nso'] = array("go ", " go", " le", " a ", "le ", " di", "a g", "ya ", "lo ", " ya", "a m", "ka ", " ka", "la ", " t ", "o y", "a t", "a k", "ba ", "et ", "wa ", " mo", " e ", "a b", " se", " ba", " ma", " bo", "e g", "t a", " o ", "a l", "o t", "na ", "o l", "a d", "elo", "di ", "a s", "o g", "o k", "ele", "o a", "ng ", "t e", "o b", "mo ", "e t", "e m", "ego", "eo ", "e l", "ngw", "se ", "e b", "kgo", "ela", " wa", " ga", "e k", "ago", "o m", " kg", "ga ", "dit", "olo", "t h", "e d", "o d", " ye", "ane", "lel", "we ", " tl", "thu", "ona", " th", "t w", "hut", "ana", "tla", "wan", "aba", "ola", " me", "gwa", "re ", "ong", "t o", "lao", "e s", "o s", "a y", "alo", "set", "a p", "i a", "eng", "a a", "o e", "tho", " ke", "gwe", " ha", "hlo", "edi", " la", "ao ", " ts", "aka", "hla", "ala", "swa", " we", " bj", "o o", "gor", "aga", "hab", "gob", "let", "ke ", "dik", "sa ", " i ", "oba", " hl", "the", "dir", "a n", "ith", "bja", "ye ", "no ", " sa", "mol", "lwa", "ti ", "man", "ole", "e e", "tse", "o w", "ore", "to ", "at ", "eth", "e y", "kan", "tsh", "gon", "net", "ano", "kar", "ge ", "ho ", "lok", " sw", " na", "i b", "dip", "i o", "oka", " ge", " om", "ko ", "emo", "pel", "nt ", "e a", "mel", "leg", "tlh", "me ", "ete", "phe", "a e", "o n", "o i", "wal", "oko", "nya", "bol", "odi", "weg", "te ", "e n", "ta ", "any", "yeo", "kga", "pol", "ang", "ri ", "it ", "uto", " mm", "iti", "are", "o f", "ha ", "gat", "oth", "ika", "o h", " it", "she", "ath", "ale", "iri", "pha", "ahl", " te", "ohl", "tha", " re", "bon", "lha", " ph", "din", " pe", "ro ", "mi ", "omi", "i t", " fa", "aro", "ase", "i l", "ne ", "lal", "ogo", "kol", " wo", "t i", "omo", " be", "mog", "mok", "len", "ile", "lwe", "ma ", "uta", "nse", "amo", "a o", " fe", "okg", "ja ", "pan", "nag", "ekg", "i i", "apa", "get", "lon", "ra ", "aem", " yo", "atl", "tlo", "kel", "tel", " kh", " po", "e o", "a w", "ent", "i e", "bo ", "gan", "het", "mal", "a f", "otl", "uti", "oga", "sen", "kwa", "mae", "eka", "mme", "kge", "jal", "a r", "ing", "lek", "sep", "lag", "ofe", "wag", "g y", "rol", "epe", "eko", "bok", "o p", "adi", "log");
+$GLOBALS["ngrams"]['pl'] = array("ie ", "nie", "em ", " ni", " po", " pr", "dzi", " na", "że ", "rze", "na ", "łem", "wie", " w ", " że", "go ", " by", "prz", "owa", "ię ", " do", " si", "owi", " pa", " za", "ch ", "ego", "ał ", "się", "ej ", "wał", "ym ", "ani", "ałe", "to ", " i ", " to", " te", "e p", " je", " z ", "czy", "był", "pan", "sta", "kie", " ja", "do ", " ch", " cz", " wi", "iał", "a p", "pow", " mi", "li ", "eni", "zie", " ta", " wa", "ło ", "ać ", "dy ", "ak ", "e w", " a ", " od", " st", "nia", "rzy", "ied", " kt", "odz", "cie", "cze", "ia ", "iel", "któ", "o p", "tór", "ści", " sp", " wy", "jak", "tak", "zy ", " mo", "ałę", "pro", "ski", "tem", "łęs", " tr", "e m", "jes", "my ", " ro", "edz", "eli", "iej", " rz", "a n", "ale", "an ", "e s", "est", "le ", "o s", "i p", "ki ", " co", "ada", "czn", "e t", "e z", "ent", "ny ", "pre", "rzą", "y s", " ko", " o ", "ach", "am ", "e n", "o t", "oli", "pod", "zia", " go", " ka", "by ", "ieg", "ier", "noś", "roz", "spo", "ych", "ząd", " mn", "acz", "adz", "bie", "cho", "mni", "o n", "ost", "pra", "ze ", "ła ", " so", "a m", "cza", "iem", "ić ", "obi", "ył ", "yło", " mu", " mó", "a t", "acj", "ci ", "e b", "ich", "kan", "mi ", "mie", "ośc", "row", "zen", "zyd", " al", " re", "a w", "den", "edy", "ił ", "ko ", "o w", "rac", "śmy", " ma", " ra", " sz", " ty", "e j", "isk", "ji ", "ka ", "m s", "no ", "o z", "rez", "wa ", "ów ", "łow", "ść ", " ob", "ech", "ecz", "ezy", "i w", "ja ", "kon", "mów", "ne ", "ni ", "now", "nym", "pol", "pot", "yde", " dl", " sy", "a s", "aki", "ali", "dla", "icz", "ku ", "ocz", "st ", "str", "szy", "trz", "wia", "y p", "za ", " wt", "chc", "esz", "iec", "im ", "la ", "o m", "sa ", "wać", "y n", "zac", "zec", " gd", "a z", "ard", "co ", "dar", "e r", "ien", "m n", "m w", "mia", "moż", "raw", "rdz", "tan", "ted", "teg", "wił", "wte", "y z", "zna", "zło", "a r", "awi", "bar", "cji", "czą", "dow", "eż ", "gdy", "iek", "je ", "o d", "tał", "wal", "wsz", "zed", "ówi", "ęsa", " ba", " lu", " wo", "aln", "arn", "ba ", "dzo", "e c", "hod", "igi", "lig", "m p", "myś", "o c", "oni", "rel", "sku", "ste", "y w", "yst", "z w");
+$GLOBALS["ngrams"]['ps'] = array(" د ", "اؤ ", " اؤ", "نو ", "ې د", "ره ", " په", "نه ", "چې ", " چې", "په ", "ه د", "ته ", "و ا", "ونو", "و د", " او", "انو", "ونه", "ه ک", " دا", "ه ا", "دې ", "ښې ", " کې", "ان ", "لو ", "هم ", "و م", "کښې", "ه م", "ى ا", " نو", " ته", " کښ", "رون", "کې ", "ده ", "له ", "به ", "رو ", " هم", "ه و", "وى ", "او ", "تون", "دا ", " کو", " کړ", "قام", " تر", "ران", "ه پ", "ې و", "ې پ", " به", " خو", "تو ", "د د", "د ا", "ه ت", "و پ", "يا ", " خپ", " دو", " را", " مش", " پر", "ارو", "رې ", "م د", "مشر", " شو", " ور", "ار ", "دى ", " اد", " دى", " مو", "د پ", "لي ", "و ک", " مق", " يو", "ؤ د", "خپل", "سره", "ه چ", "ور ", " تا", " دې", " رو", " سر", " مل", " کا", "ؤ ا", "اره", "برو", "مه ", "ه ب", "و ت", "پښت", " با", " دغ", " قب", " له", " وا", " پا", " پښ", "د م", "د ه", "لې ", "مات", "مو ", "ه ه", "وي ", "ې ب", "ې ک", " ده", " قا", "ال ", "اما", "د ن", "قبر", "ه ن", "پار", " اث", " بي", " لا", " لر", "اثا", "د خ", "دار", "ريخ", "شرا", "مقا", "نۍ ", "ه ر", "ه ل", "ولو", "يو ", "کوم", " دد", " لو", " مح", " مر", " وو", "اتو", "اري", "الو", "اند", "خان", "د ت", "سې ", "لى ", "نور", "و ل", "ي چ", "ړي ", "ښتو", "ې ل", " جو", " سي", "ام ", "بان", "تار", "تر ", "ثار", "خو ", "دو ", "ر ک", "ل د", "مون", "ندې", "و ن", "ول ", "وه ", "ى و", "ي د", "ې ا", "ې ت", "ې ي", " حک", " خب", " نه", " پو", "ا د", "تې ", "جوړ", "حکم", "حکو", "خبر", "دان", "ر د", "غه ", "قاف", "محک", "وال", "ومت", "ويل", "ى د", "ى م", "يره", "پر ", "کول", "ې ه", " تي", " خا", " وک", " يا", " ځا", "ؤ ق", "انۍ", "بى ", "غو ", "ه خ", "و ب", "ودا", "يدو", "ړې ", "کال", " بر", " قد", " مي", " وي", " کر", "ؤ م", "ات ", "ايي", "تى ", "تيا", "تير", "خوا", "دغو", "دم ", "ديم", "ر و", "قدي", "م خ", "مان", "مې ", "نيو", "نږ ", "ه ي", "و س", "و چ", "وان", "ورو", "ونږ", "پور", "ړه ", "ړو ", "ۍ د", "ې ن", " اه", " زي", " سو", " شي", " هر", " هغ", " ښا", "اتل", "اق ", "اني", "بري", "بې ", "ت ا", "د ب", "د س", "ر م", "رى ", "عرا", "لان", "مى ", "نى ", "و خ", "وئ ", "ورک", "ورې", "ون ", "وکړ", "ى چ", "يمه", "يې ", "ښتن", "که ", "کړي", "ې خ", "ے ش", " تح", " تو", " در", " دپ", " صو", " عر", " ول", " يؤ", " پۀ", " څو", "ا ا");
+$GLOBALS["ngrams"]['pt'] = array("de ", " de", "os ", "as ", "que", " co", "ão ", "o d", " qu", "ue ", " a ", "do ", "ent", " se", "a d", "s d", "e a", "es ", " pr", "ra ", "da ", " es", " pa", "to ", " o ", "em ", "con", "o p", " do", "est", "nte", "ção", " da", " re", "ma ", "par", " te", "ara", "ida", " e ", "ade", "is ", " um", " po", "a a", "a p", "dad", "no ", "te ", " no", "açã", "pro", "al ", "com", "e d", "s a", " as", "a c", "er ", "men", "s e", "ais", "nto", "res", "a s", "ado", "ist", "s p", "tem", "e c", "e s", "ia ", "o s", "o a", "o c", "e p", "sta", "ta ", "tra", "ura", " di", " pe", "ar ", "e e", "ser", "uma", "mos", "se ", " ca", "o e", " na", "a e", "des", "ont", "por", " in", " ma", "ect", "o q", "ria", "s c", "ste", "ver", "cia", "dos", "ica", "str", " ao", " em", "das", "e t", "ito", "iza", "pre", "tos", " nã", "ada", "não", "ess", "eve", "or ", "ran", "s n", "s t", "tur", " ac", " fa", "a r", "ens", "eri", "na ", "sso", " si", " é ", "bra", "esp", "mo ", "nos", "ro ", "um ", "a n", "ao ", "ico", "liz", "min", "o n", "ons", "pri", "ten", "tic", "ões", " tr", "a m", "aga", "e n", "ili", "ime", "m a", "nci", "nha", "nta", "spe", "tiv", "am ", "ano", "arc", "ass", "cer", "e o", "ece", "emo", "ga ", "o m", "rag", "so ", "são", " au", " os", " sa", "ali", "ca ", "ema", "emp", "ici", "ido", "inh", "iss", "l d", "la ", "lic", "m c", "mai", "onc", "pec", "ram", "s q", " ci", " en", " fo", "a o", "ame", "car", "co ", "der", "eir", "ho ", "io ", "om ", "ora", "r a", "sen", "ter", " br", " ex", "a u", "cul", "dev", "e u", "ha ", "mpr", "nce", "oca", "ove", "rio", "s o", "sa ", "sem", "tes", "uni", "ven", "zaç", "çõe", " ad", " al", " an", " mi", " mo", " ve", " à ", "a i", "a q", "ala", "amo", "bli", "cen", "col", "cos", "cto", "e m", "e v", "ede", "gás", "ias", "ita", "iva", "ndo", "o t", "ore", "r d", "ral", "rea", "s f", "sid", "tro", "vel", "vid", "ás ", " ap", " ar", " ce", " ou", " pú", " so", " vi", "a f", "act", "arr", "bil", "cam", "e f", "e i", "el ", "for", "lem", "lid", "lo ", "m d", "mar", "nde", "o o", "omo", "ort", "per", "púb", "r u", "rei", "rem", "ros", "rre", "ssi");
+$GLOBALS["ngrams"]['pt_BR'] = array("eq ", "ent", " en", "q e", "q i", "g e", "g i", "ng ", " id", "ida", "nte", "te ", " es", " in", "ade", "ag ", "dad", "de ", "ia ", "ing", " br", " sa", "est", "inq", "lin", "mo ", "nq ", "o a", "seq", " co", " li", " ni", " o ", "a a", "a c", "ado", "asi", "bra", "dor", "iq ", "nta", "o b", "or ", "q n", "ras", "sil", "str", "ta ", "tre", "us ", " a ", " ag", " an", " ca", " e ", " eq", " g ", " i ", " ir", " nc", " q ", " se", " ve", "ant", "ar ", "cia", "con", "e a", "eir", "el ", "ig ", "ili", "imo", "io ", "ir ", "nci", "o t", "ro ", "vel", " ap", " bo", " de", " fr", " tr", "a b", "a e", "a g", "a v", "apo", "as ", "bus", "ca ", "cet", "cin", "des", "e b", "e s", "eta", "fre", "i a", "ibu", "il ", "iro", "la ", "liq", "nib", "nti", "o c", "o q", "os ", "ra ", "re ", "req", "s a", "s s", "san", "sim", "tar", "to ", "ult", " ba", " ci", " el", " em", " fi", " gr", " gu", " ia", " mu", " pe", " po", " re", " ri", " si", " su", " te", " vi", "a o", "a s", "abe", "alc", "and", "ara", "arg", "ari", "ben", "boc", "car", "co ", "do ", "e f", "e g", "e l", "e o", "em ", "emo", "en ", "es ", "esp", "exe", "fic", "g n", "g s", "gra", "gua", "ias", "ica", "idi", "ila", "ile", "inh", "l b", "l e", "lei", "loq", "mos", "mul", "nad", "nio", "nt ", "nto", "o g", "o r", "oce", "ont", "oq ", "pos", "q v", "r b", "r e", "r i", "r s", "rad", "ran", "rem", "rg ", "ria", "rio", "s e", "s p", "sta", "sti", "tig", "til", "tra", "ua ", "ue ", "va ", "xeq", " ' ", " ab", " ad", " ae", " al", " am", " aq", " ar", " b ", " bi", " bl", " bu", " cc", " ch", " di", " et", " ex", " fa", " ic", " il", " im", " is", " it", " ll", " m ", " me", " na", " ne", " ng", " nu", " ob", " ou", " pi", " qu", " ss", " st", " ti", " ub", " un", " v ", " x ", "' c", "a d", "a f", "a i", "a n", "a p", "a t", "abr", "aci", "ad ", "ada", "adr", "aer", "afe", "alv", "amb", "amp", "an ", "ana", "ang", "anh", "ani", "ano", "anq", "apa", "aq ", "ati", "ato", "azi", "b n", "ban", "bar", "big", "bil", "biq", "bli", "blu", "bon", "bre", "bri", "bse", "buc", "c f", "c i", "cad", "caf", "cag", "cal", "can", "cc ");
+$GLOBALS["ngrams"]['pt_PT'] = array("equ", "ent", "que", "qui", "gui", "uen", " li", "ngu", "qu ", "uid", " co", " ve", "de ", "gue", "ida", "nte", "o a", "a a", "ade", "dad", "el ", "ing", "mo ", "nqu", "nta", "seq", "u n", "vel", " de", " o ", " se", "a c", "ado", "ar ", "est", "ia ", "inq", "io ", "iqu", "lin", "o c", "o p", "ort", "por", "ta ", "te ", " ag", " eq", " nc", " pi", " po", " sa", "a d", "a e", "ant", "as ", "ca ", "cia", "des", "do ", "gu ", "imo", "l p", "nci", "ro ", "rtu", "str", "tug", "u s", "ues", "ui ", " a ", " an", " ap", " ba", " bi", " ca", " fr", " gu", " in", " pe", " qu", "agu", "apa", "con", "dor", "e f", "e g", "eir", "fre", "ho ", "i a", "ica", "igu", "iro", "liq", "nti", "o b", "o l", "o s", "or ", "r o", "ra ", "req", "s c", "sim", "tar", "to ", "ue ", "uin", "ult", " ci", " en", " ho", " mu", " ni", " re", " s ", " si", " su", "a s", "a v", "abe", "ag ", "al ", "and", "anh", "apo", "ata", "ban", "ben", "bic", "boi", "cap", "car", "cin", "co ", "com", "cto", "dei", "e b", "e o", "e s", "eca", "en ", "er ", "es ", "exe", "fic", "for", "gal", "gra", "ias", "ich", "ico", "idi", "ili", "ir ", "ira", "isb", "la ", "lis", "mbo", "mul", "na ", "nho", "nio", "nt ", "o q", "o r", "o t", "oc ", "oio", "omb", "oo ", "os ", "par", "pe ", "r b", "r e", "r s", "ran", "re ", "rec", "s a", "s s", "san", "sbo", "so ", "sta", "tan", "tra", "tre", "u v", "uga", "ugu", "xeq", " ab", " ad", " al", " am", " aq", " ar", " au", " b ", " bo", " c ", " ch", " ct", " cu", " el", " es", " ex", " fa", " fi", " ga", " gr", " id", " ir", " ne", " ng", " nu", " ob", " oo", " pa", " ps", " pt", " r ", " ra", " ri", " ss", " st", " ta", " te", " tr", " ub", " un", " vi", " vo", "a f", "a i", "a l", "a m", "a o", "a r", "ach", "aci", "act", "ad ", "afa", "age", "agr", "alf", "alh", "am ", "amb", "ami", "ana", "ang", "anq", "aqu", "ara", "arb", "arc", "arg", "ari", "arr", "asa", "ati", "aut", "azi", "b n", "bar", "bat", "ber", "big", "bil", "biq", "bli", "boa", "boe", "bor", "bse", "c i", "c l", "c p", "cad", "cam", "cas", "ch ", "cha", "che", "chi", "cio", "coc", "coi", "cou", "ctr", "cue", "cul");
+$GLOBALS["ngrams"]['ro'] = array(" de", " în", "de ", " a ", "ul ", " co", "în ", "re ", "e d", "ea ", " di", " pr", "le ", "şi ", "are", "at ", "con", "ui ", " şi", "i d", "ii ", " cu", "e a", "lui", "ern", "te ", "cu ", " la", "a c", "că ", "din", "e c", "or ", "ulu", "ne ", "ter", "la ", "să ", "tat", "tre", " ac", " să", "est", "st ", "tă ", " ca", " ma", " pe", "cur", "ist", "mân", "a d", "i c", "nat", " ce", "i a", "ia ", "in ", "scu", " mi", "ato", "aţi", "ie ", " re", " se", "a a", "int", "ntr", "tru", "uri", "ă a", " fo", " pa", "ate", "ini", "tul", "ent", "min", "pre", "pro", "a p", "e p", "e s", "ei ", "nă ", "par", "rna", "rul", "tor", " in", " ro", " tr", " un", "al ", "ale", "art", "ce ", "e e", "e î", "fos", "ita", "nte", "omâ", "ost", "rom", "ru ", "str", "ver", " ex", " na", "a f", "lor", "nis", "rea", "rit", " al", " eu", " no", "ace", "cer", "ile", "nal", "pri", "ri ", "sta", "ste", "ţie", " au", " da", " ju", " po", "ar ", "au ", "ele", "ere", "eri", "ina", "n a", "n c", "res", "se ", "t a", "tea", " că", " do", " fi", "a s", "ată", "com", "e ş", "eur", "guv", "i s", "ice", "ili", "na ", "rec", "rep", "ril", "rne", "rti", "uro", "uve", "ă p", " ar", " o ", " su", " vi", "dec", "dre", "oar", "ons", "pe ", "rii", " ad", " ge", "a m", "a r", "ain", "ali", "car", "cat", "ecu", "ene", "ept", "ext", "ilo", "iu ", "n p", "ori", "sec", "u p", "une", "ă c", "şti", "ţia", " ch", " gu", "ai ", "ani", "cea", "e f", "isc", "l a", "lic", "liu", "mar", "nic", "nt ", "nul", "ris", "t c", "t p", "tic", "tid", "u a", "ucr", " as", " dr", " fa", " nu", " pu", " to", "cra", "dis", "enţ", "esc", "gen", "it ", "ivi", "l d", "n d", "nd ", "nu ", "ond", "pen", "ral", "riv", "rte", "sti", "t d", "ta ", "to ", "uni", "xte", "ând", "îns", "ă s", " bl", " st", " uc", "a b", "a i", "a l", "air", "ast", "bla", "bri", "che", "duc", "dul", "e m", "eas", "edi", "esp", "i l", "i p", "ica", "ică", "ir ", "iun", "jud", "lai", "lul", "mai", "men", "ni ", "pus", "put", "ra ", "rai", "rop", "sil", "ti ", "tra", "u s", "ua ", "ude", "urs", "ân ", "înt", "ţă ", " lu", " mo", " s ", " sa", " sc", "a u", "an ", "atu");
+$GLOBALS["ngrams"]['ru'] = array(" на", " пр", "то ", " не", "ли ", " по", "но ", " в ", "на ", "ть ", "не ", " и ", " ко", "ом ", "про", " то", "их ", " ка", "ать", "ото", " за", "ие ", "ова", "тел", "тор", " де", "ой ", "сти", " от", "ах ", "ми ", "стр", " бе", " во", " ра", "ая ", "ват", "ей ", "ет ", "же ", "иче", "ия ", "ов ", "сто", " об", "вер", "го ", "и в", "и п", "и с", "ии ", "ист", "о в", "ост", "тра", " те", "ели", "ере", "кот", "льн", "ник", "нти", "о с", "рор", "ств", "чес", " бо", " ве", " да", " ин", " но", " с ", " со", " сп", " ст", " чт", "али", "ами", "вид", "дет", "е н", "ель", "еск", "ест", "зал", "и н", "ива", "кон", "ого", "одн", "ожн", "оль", "ори", "ров", "ско", "ся ", "тер", "что", " мо", " са", " эт", "ант", "все", "ерр", "есл", "иде", "ина", "ино", "иро", "ите", "ка ", "ко ", "кол", "ком", "ла ", "ния", "о т", "оло", "ран", "ред", "сь ", "тив", "тич", "ых ", " ви", " вс", " го", " ма", " сл", "ако", "ани", "аст", "без", "дел", "е д", "е п", "ем ", "жно", "и д", "ика", "каз", "как", "ки ", "нос", "о н", "опа", "при", "рро", "ски", "ти ", "тов", "ые ", " вы", " до", " ме", " ни", " од", " ро", " св", " чи", "а н", "ает", "аза", "ате", "бес", "в п", "ва ", "е в", "е м", "е с", "ез ", "ени", "за ", "зна", "ини", "кам", "ках", "кто", "лов", "мер", "мож", "нал", "ниц", "ны ", "ным", "ора", "оро", "от ", "пор", "рав", "рес", "рис", "рос", "ска", "т н", "том", "чит", "шко", " бы", " о ", " тр", " уж", " чу", " шк", "а б", "а в", "а р", "аби", "ала", "ало", "аль", "анн", "ати", "бин", "вес", "вно", "во ", "вши", "дал", "дат", "дно", "е з", "его", "еле", "енн", "ент", "ете", "и о", "или", "ись", "ит ", "ици", "ков", "лен", "льк", "мен", "мы ", "нет", "ни ", "нны", "ног", "ной", "ном", "о п", "обн", "ове", "овн", "оры", "пер", "по ", "пра", "пре", "раз", "роп", "ры ", "се ", "сли", "сов", "тре", "тся", "уро", "цел", "чно", "ь в", "ько", "ьно", "это", "ют ", "я н", " ан", " ес", " же", " из", " кт", " ми", " мы", " пе", " се", " це", "а м", "а п", "а т", "авш", "аже", "ак ", "ал ", "але", "ане", "ачи", "ают", "бна", "бол", "бы ", "в и", "в с", "ван", "гра", "даж", "ден", "е к");
+$GLOBALS["ngrams"]['sk'] = array(" pr", " po", " ne", " a ", "ch ", " na", " je", "ní ", "je ", " do", "na ", "ova", " v ", "to ", "ho ", "ou ", " to", "ick", "ter", "že ", " st", " za", "ost", "ých", " se", "pro", " te", "e s", " že", "a p", " kt", "pre", " by", " o ", "se ", "kon", " př", "a s", "né ", "ně ", "sti", "ako", "ist", "mu ", "ame", "ent", "ky ", "la ", "pod", " ve", " ob", "om ", "vat", " ko", "sta", "em ", "le ", "a v", "by ", "e p", "ko ", "eri", "kte", "sa ", "ého", "e v", "mer", "tel", " ak", " sv", " zá", "hla", "las", "lo ", " ta", "a n", "ej ", "li ", "ne ", " sa", "ak ", "ani", "ate", "ia ", "sou", " so", "ení", "ie ", " re", "ce ", "e n", "ori", "tic", " vy", "a t", "ké ", "nos", "o s", "str", "ti ", "uje", " sp", "lov", "o p", "oli", "ová", " ná", "ale", "den", "e o", "ku ", "val", " am", " ro", " si", "nie", "pol", "tra", " al", "ali", "o v", "tor", " mo", " ni", "ci ", "o n", "ím ", " le", " pa", " s ", "al ", "ati", "ero", "ove", "rov", "ván", "ích", " ja", " z ", "cké", "e z", " od", "byl", "de ", "dob", "nep", "pra", "ric", "spo", "tak", " vš", "a a", "e t", "lit", "me ", "nej", "no ", "nýc", "o t", "a j", "e a", "en ", "est", "jí ", "mi ", "slo", "stá", "u v", "for", "nou", "pos", "pře", "si ", "tom", " vl", "a z", "ly ", "orm", "ris", "za ", "zák", " k ", "at ", "cký", "dno", "dos", "dy ", "jak", "kov", "ny ", "res", "ror", "sto", "van", " op", "da ", "do ", "e j", "hod", "len", "ný ", "o z", "poz", "pri", "ran", "u s", " ab", "aj ", "ast", "it ", "kto", "o o", "oby", "odo", "u p", "va ", "ání", "í p", "ým ", " in", " mi", "ať ", "dov", "ka ", "nsk", "áln", " an", " bu", " sl", " tr", "e m", "ech", "edn", "i n", "kýc", "níc", "ov ", "pří", "í a", " aj", " bo", "a d", "ide", "o a", "o d", "och", "pov", "svo", "é s", " kd", " vo", " vý", "bud", "ich", "il ", "ili", "ni ", "ním", "od ", "osl", "ouh", "rav", "roz", "st ", "stv", "tu ", "u a", "vál", "y s", "í s", "í v", " hl", " li", " me", "a m", "e b", "h s", "i p", "i s", "iti", "lád", "nem", "nov", "opo", "uhl", "eno", "ens", "men", "nes", "obo", "te ", "ved", "vlá", "y n", " ma", " mu", " vá", "bez", "byv", "cho");
+$GLOBALS["ngrams"]['sl'] = array("je ", " pr", " po", " je", " v ", " za", " na", "pre", "da ", " da", "ki ", "ti ", "ja ", "ne ", " in", "in ", "li ", "no ", "na ", "ni ", " bi", "jo ", " ne", "nje", "e p", "i p", "pri", "o p", "red", " do", "anj", "em ", "ih ", " bo", " ki", " iz", " se", " so", "al ", " de", "e v", "i s", "ko ", "bil", "ira", "ove", " br", " ob", "e b", "i n", "ova", "se ", "za ", "la ", " ja", "ati", "so ", "ter", " ta", "a s", "del", "e d", " dr", " od", "a n", "ar ", "jal", "ji ", "rit", " ka", " ko", " pa", "a b", "ani", "e s", "er ", "ili", "lov", "o v", "tov", " ir", " ni", " vo", "a j", "bi ", "bri", "iti", "let", "o n", "tan", "še ", " le", " te", "eni", "eri", "ita", "kat", "por", "pro", "ali", "ke ", "oli", "ov ", "pra", "ri ", "uar", "ve ", " to", "a i", "a v", "ako", "arj", "ate", "di ", "do ", "ga ", "le ", "lo ", "mer", "o s", "oda", "oro", "pod", " ma", " mo", " si", "a p", "bod", "e n", "ega", "ju ", "ka ", "lje", "rav", "ta ", "a o", "e t", "e z", "i d", "i v", "ila", "lit", "nih", "odo", "sti", "to ", "var", "ved", "vol", " la", " no", " vs", "a d", "agu", "aja", "dej", "dnj", "eda", "gov", "gua", "jag", "jem", "kon", "ku ", "nij", "omo", "oči", "pov", "rak", "rja", "sta", "tev", "a t", "aj ", "ed ", "eja", "ent", "ev ", "i i", "i o", "ijo", "ist", "ost", "ske", "str", " ra", " s ", " tr", " še", "arn", "bo ", "drž", "i j", "ilo", "izv", "jen", "lja", "nsk", "o d", "o i", "om ", "ora", "ovo", "raz", "rža", "tak", "va ", "ven", "žav", " me", " če", "ame", "avi", "e i", "e o", "eka", "gre", "i t", "ija", "il ", "ite", "kra", "lju", "mor", "nik", "o t", "obi", "odn", "ran", "re ", "sto", "stv", "udi", "v i", "van", " am", " sp", " st", " tu", " ve", " že", "ajo", "ale", "apo", "dal", "dru", "e j", "edn", "ejo", "elo", "est", "etj", "eva", "iji", "ik ", "im ", "itv", "mob", "nap", "nek", "pol", "pos", "rat", "ski", "tič", "tom", "ton", "tra", "tud", "tve", "v b", "vil", "vse", "čit", " av", " gr", "a z", "ans", "ast", "avt", "dan", "e m", "eds", "for", "i z", "kot", "mi ", "nim", "o b", "o o", "od ", "odl", "oiz", "ot ", "par", "pot", "rje", "roi", "tem", "val");
+$GLOBALS["ngrams"]['so'] = array("ka ", "ay ", "da ", " ay", "aal", "oo ", "aan", " ka", "an ", "in ", " in", "ada", "maa", "aba", " so", "ali", "bad", "add", "soo", " na", "aha", "ku ", "ta ", " wa", "yo ", "a s", "oma", "yaa", " ba", " ku", " la", " oo", "iya", "sha", "a a", "dda", "nab", "nta", " da", " ma", "nka", "uu ", "y i", "aya", "ha ", "raa", " dh", " qa", "a k", "ala", "baa", "doo", "had", "liy", "oom", " ha", " sh", "a d", "a i", "a n", "aar", "ee ", "ey ", "y k", "ya ", " ee", " iy", "aa ", "aaq", "gaa", "lam", " bu", "a b", "a m", "ad ", "aga", "ama", "iyo", "la ", "a c", "a l", "een", "int", "she", "wax", "yee", " si", " uu", "a h", "aas", "alk", "dha", "gu ", "hee", "ii ", "ira", "mad", "o a", "o k", "qay", " ah", " ca", " wu", "ank", "ash", "axa", "eed", "en ", "ga ", "haa", "n a", "n s", "naa", "nay", "o d", "taa", "u b", "uxu", "wux", "xuu", " ci", " do", " ho", " ta", "a g", "a u", "ana", "ayo", "dhi", "iin", "lag", "lin", "lka", "o i", "san", "u s", "una", "uun", " ga", " xa", " xu", "aab", "abt", "aq ", "aqa", "ara", "arl", "caa", "cir", "eeg", "eel", "isa", "kal", "lah", "ney", "qaa", "rla", "sad", "sii", "u d", "wad", " ad", " ar", " di", " jo", " ra", " sa", " u ", " yi", "a j", "a q", "aad", "aat", "aay", "ah ", "ale", "amk", "ari", "as ", "aye", "bus", "dal", "ddu", "dii", "du ", "duu", "ed ", "ege", "gey", "hay", "hii", "ida", "ine", "joo", "laa", "lay", "mar", "mee", "n b", "n d", "n m", "no ", "o b", "o l", "oog", "oon", "rga", "sh ", "sid", "u q", "unk", "ush", "xa ", "y d", " bi", " gu", " is", " ke", " lo", " me", " mu", " qo", " ug", "a e", "a o", "a w", "adi", "ado", "agu", "al ", "ant", "ark", "asa", "awi", "bta", "bul", "d a", "dag", "dan", "do ", "e s", "gal", "gay", "guu", "h e", "hal", "iga", "ihi", "iri", "iye", "ken", "lad", "lid", "lsh", "mag", "mun", "n h", "n i", "na ", "o n", "o w", "ood", "oor", "ora", "qab", "qor", "rab", "rit", "rta", "s o", "sab", "ska", "to ", "u a", "u h", "u u", "ud ", "ugu", "uls", "uud", "waa", "xus", "y b", "y q", "y s", "yad", "yay", "yih", " aa", " bo", " br", " go", " ji", " mi", " of", " ti", " um", " wi", " xo", "a x");
+$GLOBALS["ngrams"]['sq'] = array("të ", " të", "në ", "për", " pë", " e ", "sht", " në", " sh", "se ", "et ", "ë s", "ë t", " se", "he ", "jë ", "ër ", "dhe", " pa", "ë n", "ë p", " që", " dh", "një", "ë m", " nj", "ësh", "in ", " me", "që ", " po", "e n", "e t", "ish", "më ", "së ", "me ", "htë", " ka", " si", "e k", "e p", " i ", "anë", "ar ", " nu", "und", "ve ", " ës", "e s", " më", "nuk", "par", "uar", "uk ", "jo ", "rë ", "ta ", "ë f", "en ", "it ", "min", "het", "n e", "ri ", "shq", "ë d", " do", " nd", "sh ", "ën ", "atë", "hqi", "ist", "ë q", " gj", " ng", " th", "a n", "do ", "end", "imi", "ndi", "r t", "rat", "ë b", "ëri", " mu", "art", "ash", "qip", " ko", "e m", "edh", "eri", "je ", "ka ", "nga", "si ", "te ", "ë k", "ësi", " ma", " ti", "eve", "hje", "ira", "mun", "on ", "po ", "re ", " pr", "im ", "lit", "o t", "ur ", "ë e", "ë v", "ët ", " ku", " së", "e d", "es ", "ga ", "iti", "jet", "ndë", "oli", "shi", "tje", " bë", " z ", "gje", "kan", "shk", "ënd", "ës ", " de", " kj", " ru", " vi", "ara", "gov", "kjo", "or ", "r p", "rto", "rug", "tet", "ugo", "ali", "arr", "at ", "d t", "ht ", "i p", "ipë", "izi", "jnë", "n n", "ohe", "shu", "shë", "t e", "tik", "a e", "arë", "etë", "hum", "nd ", "ndr", "osh", "ova", "rim", "tos", "va ", " fa", " fi", "a s", "hen", "i n", "mar", "ndo", "por", "ris", "sa ", "sis", "tës", "umë", "viz", "zit", " di", " mb", "aj ", "ana", "ata", "dër", "e a", "esh", "ime", "jes", "lar", "n s", "nte", "pol", "r n", "ran", "res", "rrë", "tar", "ë a", "ë i", " at", " jo", " kë", " re", "a k", "ai ", "akt", "hë ", "hën", "i i", "i m", "ia ", "men", "nis", "shm", "str", "t k", "t n", "t s", "ë g", "ërk", "ëve", " ai", " ci", " ed", " ja", " kr", " qe", " ta", " ve", "a p", "cil", "el ", "erë", "gji", "hte", "i t", "jen", "jit", "k d", "mën", "n t", "nyr", "ori", "pas", "ra ", "rie", "rës", "tor", "uaj", "yre", "ëm ", "ëny", " ar", " du", " ga", " je", "dës", "e e", "e z", "ha ", "hme", "ika", "ini", "ite", "ith", "koh", "kra", "ku ", "lim", "lis", "qën", "rën", "s s", "t d", "t t", "tir", "tën", "ver", "ë j", " ba", " in", " tr", " zg", "a a", "a m", "a t", "abr");
+$GLOBALS["ngrams"]['sr'] = array(" на", " је", " по", "је ", " и ", " не", " пр", "га ", " св", "ог ", "а с", "их ", "на ", "кој", "ога", " у ", "а п", "не ", "ни ", "ти ", " да", "ом ", " ве", " ср", "и с", "ско", " об", "а н", "да ", "е н", "но ", "ног", "о ј", "ој ", " за", "ва ", "е с", "и п", "ма ", "ник", "обр", "ова", " ко", "а и", "диј", "е п", "ка ", "ко ", "ког", "ост", "све", "ств", "сти", "тра", "еди", "има", "пок", "пра", "раз", "те ", " бо", " ви", " са", "аво", "бра", "гос", "е и", "ели", "ени", "за ", "ики", "ио ", "пре", "рав", "рад", "у с", "ју ", "ња ", " би", " до", " ст", "аст", "бој", "ебо", "и н", "им ", "ку ", "лан", "неб", "ово", "ого", "осл", "ојш", "пед", "стр", "час", " го", " кр", " мо", " чл", "а м", "а о", "ако", "ача", "вел", "вет", "вог", "еда", "ист", "ити", "ије", "око", "сло", "срб", "чла", " бе", " ос", " от", " ре", " се", "а в", "ан ", "бог", "бро", "вен", "гра", "е о", "ика", "ија", "ких", "ком", "ли ", "ну ", "ота", "ојн", "под", "рбс", "ред", "рој", "са ", "сни", "тач", "тва", "ја ", "ји ", " ка", " ов", " тр", "а ј", "ави", "аз ", "ано", "био", "вик", "во ", "гов", "дни", "е ч", "его", "и о", "ива", "иво", "ик ", "ине", "ини", "ипе", "кип", "лик", "ло ", "наш", "нос", "о т", "од ", "оди", "она", "оји", "поч", "про", "ра ", "рис", "род", "рст", "се ", "спо", "ста", "тић", "у д", "у н", "у о", "чин", "ша ", "јед", "јни", "ће ", " м ", " ме", " ни", " он", " па", " сл", " те", "а у", "ава", "аве", "авн", "ана", "ао ", "ати", "аци", "ају", "ања", "бск", "вор", "вос", "вск", "дин", "е у", "едн", "ези", "ека", "ено", "ето", "ења", "жив", "и г", "и и", "и к", "и т", "ику", "ичк", "ки ", "крс", "ла ", "лав", "лит", "ме ", "мен", "нац", "о н", "о п", "о у", "одн", "оли", "орн", "осн", "осп", "оче", "пск", "реч", "рпс", "сво", "ски", "сла", "срп", "су ", "та ", "тав", "тве", "у б", "јез", "ћи ", " ен", " жи", " им", " му", " од", " су", " та", " хр", " ча", " шт", " ње", "а д", "а з", "а к", "а т", "аду", "ало", "ани", "асо", "ван", "вач", "вањ", "вед", "ви ", "вно", "вот", "вој", "ву ", "доб", "дру", "дсе", "ду ", "е б", "е д", "е м", "ем ", "ема", "ент", "енц");
+$GLOBALS["ngrams"]['ss'] = array(" ku", " le", "la ", "eku", "a k", "nga", " ng", "a n", "nge", "a l", "lo ", " ne", "eti", "kwe", "ndz", "e n", "o l", " lo", "ela", "ema", "ent", "si ", " kw", "tsi", "i l", "wa ", "lel", "kut", "e k", "und", "ni ", "elo", "fun", "esi", " si", "ele", "tin", "tfo", " ti", "le ", "kha", "tse", "e l", "pha", "ung", "i k", " em", "ti ", "sa ", " um", "isa", "eli", "ndl", "ing", "set", "we ", "ise", "na ", "ang", "etf", "khe", "and", "o n", " we", "nti", "nye", "tfu", "ben", "a e", "uts", "let", "dza", "imi", "sek", "ko ", "lok", "eni", "ye ", "ba ", "nkh", "ebe", "alo", "o k", "lan", "ga ", "aba", "seb", " ye", "he ", "lwa", "kel", " te", " la", "kus", "wem", "ati", "ikh", "nek", "ala", "kuf", "i n", "oku", "ats", "mts", "hla", "wen", "a t", " na", "gek", "uhl", "kub", "ngu", "ka ", "aka", "fut", "kan", "kwa", " li", "kuc", "onk", "ban", "ana", "ulu", " se", " im", "akh", "ume", "a i", "les", "tim", "ula", "ini", "lwe", "za ", "fo ", "hul", " no", "han", "li ", "iph", "a s", "tis", "khu", "ta ", "dzi", "be ", "emi", "ma ", "end", "o t", "eke", "a u", " ka", "ane", "lek", "mel", "elw", "kun", "sis", "lon", "utf", "any", "kho", "kul", "hlo", " ba", "ufu", "aph", "lun", "e s", "hal", "ind", "isw", "o s", "use", "ekw", "me ", "ndv", "eng", "uph", "hat", "ne ", "so ", "lul", "nom", "te ", "lol", "awu", "nel", "lu ", "ha ", "wat", "men", "ete", " lw", "nem", "ako", "zin", "kuh", "sha", "bha", "gab", " in", "ale", "mis", "tem", "e e", "o e", "e t", "wek", "dze", "ome", "wel", " lu", "emb", "nis", " ek", "tsa", "u l", "o y", "dle", "ute", "len", "swa", "phe", "mkh", "ntf", "uke", "sit", "iny", "e i", "wo ", "ani", "phi", "wet", "sin", "nhl", "mal", "mba", "mfu", "fu ", "lab", "sik", "taw", "no ", "hle", "e u", "eki", "ase", "ali", "ulw", "ve ", "eka", "zel", "nta", "bon", "tek", "bo ", "sig", "ama", "ile", "ule", "tfw", "mph", "uma", "kup", "emt", "asi", "dlu", "ish", "umt", "gen", "o w", "ike", "iga", "hak", "abe", "net", "gan", "kis", "nde", "ngi", "ukh", "bek", "mo ", "phu", "sel", "elu", "i t", "ant", "dvo", "a y", "vo ", "hum", "lis", "dla", "gam", "ive", "jen", "ket");
+$GLOBALS["ngrams"]['st'] = array("ng ", "ho ", " le", "le ", " ho", " ts", "a m", "sa ", "la ", " ka", "a h", " di", "ya ", "ka ", " ya", "a t", "eng", "ets", " ba", " mo", "a l", " se", "lo ", " bo", "wa ", "tsa", "a b", "na ", "ba ", " e ", " a ", "a k", " ma", "ang", "tse", "se ", "o t", "a d", "a s", "ha ", "so ", "o l", "e h", "o y", "e t", "tla", "tsh", "olo", "e l", "e m", "o b", "o e", "seb", "ebe", "ela", "thu", "ele", "e k", "ana", "e b", " th", " ha", "tso", "o a", "o k", " wa", "kgo", "tsw", "tho", "o h", "ong", " la", "hut", "dit", "ane", " me", "a e", " tl", "ola", "edi", "elo", "di ", "ona", " ke", "wan", " o ", "a p", "apa", "tjh", "hlo", " sa", "she", "let", "aba", "lok", "lao", "eo ", "a a", "o s", "man", "to ", " hl", "a n", "isa", "e d", "swe", "set", "pa ", " na", "o m", "g l", "het", " kg", "got", "aha", "eth", "re ", "e e", "jha", "phe", "lan", "otl", "g k", "lek", "its", "ekg", "sen", "ao ", "dis", "g m", "oth", "e a", "ith", "hla", "e s", "ke ", "mol", "pel", "g h", "hab", "bet", "san", "ats", "mo ", "lwa", "we ", "ala", "len", "nts", "dip", "kap", "iso", " mm", "uto", "alo", "e n", "si ", "ta ", "o w", "emo", "swa", "tsi", "oke", "bed", "the", " ph", "a y", "wen", "ken", "ena", "hwa", "ne ", "ore", "atl", "ano", "hel", "mot", "bo ", "g t", "i b", "kga", "hor", "ngo", "nan", "no ", "o n", "tlh", "shw", "kel", "pha", "etj", "bon", "ell", "g s", "gol", "tha", "ale", "dik", "kol", "bak", " nt", "ika", "o d", " te", "ohl", "g y", " lo", "ti ", "his", "ile", "g b", "oko", " et", "han", "a o", "mat", "oho", "odi", "lel", "mel", "din", "kar", "o o", "uo ", "mon", "hah", "te ", "me ", " it", "o f", "nen", "heb", "ing", "bol", "bel", "hle", "puo", "lal", "tlo", "hal", "oph", "eba", "hat", "heo", "aro", "bat", "ko ", "ban", "leh", "o i", "ole", "tle", " fe", "kge", "pan", "ake", "g e", "aka", "eko", " pe", "rik", "e y", "mme", "ama", "lha", "eha", " fa", "ebo", "moh", "mae", "ete", "aem", "ots", "ahi", "o p", "uta", "okg", "ntl", "pal", "get", "i l", "e f", "oka", "sep", "lat", "ahl", "bot", "ese", "lah", "lon", "akg", "a f", " pu", "ase", "g a", "mor", "kan", "nah", "boh", "e p");
+$GLOBALS["ngrams"]['sv'] = array("en ", " de", "et ", "er ", "tt ", "om ", "för", "ar ", "de ", "att", " fö", "ing", " in", " at", " i ", "det", "ch ", "an ", "gen", " an", "t s", "som", "te ", " oc", "ter", " ha", "lle", "och", " sk", " so", "ra ", "r a", " me", "var", "nde", "är ", " ko", "on ", "ans", "int", "n s", "na ", " en", " fr", " på", " st", " va", "and", "nte", "på ", "ska", "ta ", " vi", "der", "äll", "örs", " om", "da ", "kri", "ka ", "nst", " ho", "as ", "stä", "r d", "t f", "upp", " be", "nge", "r s", "tal", "täl", "ör ", " av", "ger", "ill", "ng ", "e s", "ekt", "ade", "era", "ers", "har", "ll ", "lld", "rin", "rna", "säk", "und", "inn", "lig", "ns ", " ma", " pr", " up", "age", "av ", "iva", "kti", "lda", "orn", "son", "ts ", "tta", "äkr", " sj", " ti", "avt", "ber", "els", "eta", "kol", "men", "n d", "t k", "vta", "år ", "juk", "man", "n f", "nin", "r i", "rsä", "sju", "sso", " är", "a s", "ach", "ag ", "bac", "den", "ett", "fte", "hor", "nba", "oll", "rnb", "ste", "til", " ef", " si", "a a", "e h", "ed ", "eft", "ga ", "ig ", "it ", "ler", "med", "n i", "nd ", "så ", "tiv", " bl", " et", " fi", " sä", "at ", "des", "e a", "gar", "get", "lan", "lss", "ost", "r b", "r e", "re ", "ret", "sta", "t i", " ge", " he", " re", "a f", "all", "bos", "ets", "lek", "let", "ner", "nna", "nne", "r f", "rit", "s s", "sen", "sto", "tor", "vav", "ygg", " ka", " så", " tr", " ut", "ad ", "al ", "are", "e o", "gon", "kom", "n a", "n h", "nga", "r h", "ren", "t d", "tag", "tar", "tre", "ätt", " få", " hä", " se", "a d", "a i", "a p", "ale", "ann", "ara", "byg", "gt ", "han", "igt", "kan", "la ", "n o", "nom", "nsk", "omm", "r k", "r p", "r v", "s f", "s k", "t a", "t p", "ver", " bo", " br", " ku", " nå", "a b", "a e", "del", "ens", "es ", "fin", "ige", "m s", "n p", "någ", "or ", "r o", "rbe", "rs ", "rt ", "s a", "s n", "skr", "t o", "ten", "tio", "ven", " al", " ja", " p ", " r ", " sa", "a h", "bet", "cke", "dra", "e f", "e i", "eda", "eno", "erä", "ess", "ion", "jag", "m f", "ne ", "nns", "pro", "r t", "rar", "riv", "rät", "t e", "t t", "ust", "vad", "öre", " ar", " by", " kr", " mi", "arb");
+$GLOBALS["ngrams"]['sw'] = array(" wa", "wa ", "a k", "a m", " ku", " ya", "a w", "ya ", "ni ", " ma", "ka ", "a u", "na ", "za ", "ia ", " na", "ika", "ma ", "ali", "a n", " am", "ili", "kwa", " kw", "ini", " ha", "ame", "ana", "i n", " za", "a h", "ema", "i m", "i y", "kuw", "la ", "o w", "a y", "ata", "sem", " la", "ati", "chi", "i w", "uwa", "aki", "li ", "eka", "ira", " nc", "a s", "iki", "kat", "nch", " ka", " ki", "a b", "aji", "amb", "ra ", "ri ", "rik", "ada", "mat", "mba", "mes", "yo ", "zi ", "da ", "hi ", "i k", "ja ", "kut", "tek", "wan", " bi", "a a", "aka", "ao ", "asi", "cha", "ese", "eza", "ke ", "moj", "oja", " hi", "a z", "end", "ha ", "ji ", "mu ", "shi", "wat", " bw", "ake", "ara", "bw ", "i h", "imb", "tik", "wak", "wal", " hu", " mi", " mk", " ni", " ra", " um", "a l", "ate", "esh", "ina", "ish", "kim", "o k", " ir", "a i", "ala", "ani", "aq ", "azi", "hin", "i a", "idi", "ima", "ita", "rai", "raq", "sha", " ms", " se", "afr", "ama", "ano", "ea ", "ele", "fri", "go ", "i i", "ifa", "iwa", "iyo", "kus", "lia", "lio", "maj", "mku", "no ", "tan", "uli", "uta", "wen", " al", "a j", "aad", "aid", "ari", "awa", "ba ", "fa ", "nde", "nge", "nya", "o y", "u w", "ua ", "umo", "waz", "ye ", " ut", " vi", "a d", "a t", "aif", "di ", "ere", "ing", "kin", "nda", "o n", "oa ", "tai", "toa", "usa", "uto", "was", "yak", "zo ", " ji", " mw", "a p", "aia", "amu", "ang", "bik", "bo ", "del", "e w", "ene", "eng", "ich", "iri", "iti", "ito", "ki ", "kir", "ko ", "kuu", "mar", "mbo", "mil", "ngi", "ngo", "o l", "ong", "si ", "ta ", "tak", "u y", "umu", "usi", "uu ", "wam", " af", " ba", " li", " si", " zi", "a v", "ami", "atu", "awi", "eri", "fan", "fur", "ger", "i z", "isi", "izo", "lea", "mbi", "mwa", "nye", "o h", "o m", "oni", "rez", "saa", "ser", "sin", "tat", "tis", "tu ", "uin", "uki", "ur ", "wi ", "yar", " da", " en", " mp", " ny", " ta", " ul", " we", "a c", "a f", "ais", "apo", "ayo", "bar", "dhi", "e a", "eke", "eny", "eon", "hai", "han", "hiy", "hur", "i s", "imw", "kal", "kwe", "lak", "lam", "mak", "msa", "ne ", "ngu", "ru ", "sal", "swa", "te ", "ti ", "uku", "uma", "una", "uru");
+$GLOBALS["ngrams"]['tl'] = array("ng ", "ang", " na", " sa", "an ", "nan", "sa ", "na ", " ma", " ca", "ay ", "n g", " an", "ong", " ga", "at ", " pa", "ala", " si", "a n", "ga ", "g n", "g m", "ito", "g c", "man", "san", "g s", "ing", "to ", "ila", "ina", " di", " ta", "aga", "iya", "aca", "g t", " at", "aya", "ama", "lan", "a a", "qui", "a c", "a s", "nag", " ba", "g i", "tan", "'t ", " cu", "aua", "g p", " ni", "os ", "'y ", "a m", " n ", "la ", " la", "o n", "yan", " ay", "usa", "cay", "on ", "ya ", " it", "al ", "apa", "ata", "t n", "uan", "aha", "asa", "pag", " gu", "g l", "di ", "mag", "aba", "g a", "ara", "a p", "in ", "ana", "it ", "si ", "cus", "g b", "uin", "a t", "as ", "n n", "hin", " hi", "a't", "ali", " bu", "gan", "uma", "a d", "agc", "aqu", "g d", " tu", "aon", "ari", "cas", "i n", "niy", "pin", "a i", "gca", "siy", "a'y", "yao", "ag ", "ca ", "han", "ili", "pan", "sin", "ual", "n s", "nam", " lu", "can", "dit", "gui", "y n", "gal", "hat", "nal", " is", "bag", "fra", " fr", " su", "a l", " co", "ani", " bi", " da", "alo", "isa", "ita", "may", "o s", "sil", "una", " in", " pi", "l n", "nil", "o a", "pat", "sac", "t s", " ua", "agu", "ail", "bin", "dal", "g h", "ndi", "oon", "ua ", " ha", "ind", "ran", "s n", "tin", "ulo", "eng", "g f", "ini", "lah", "lo ", "rai", "rin", "ton", "g u", "inu", "lon", "o'y", "t a", " ar", "a b", "ad ", "bay", "cal", "gya", "ile", "mat", "n a", "pau", "ra ", "tay", "y m", "ant", "ban", "i m", "nas", "nay", "no ", "sti", " ti", "ags", "g g", "ta ", "uit", "uno", " ib", " ya", "a u", "abi", "ati", "cap", "ig ", "is ", "la'", " do", " pu", "api", "ayo", "gos", "gul", "lal", "tag", "til", "tun", "y c", "y s", "yon", "ano", "bur", "iba", "isi", "lam", "nac", "nat", "ni ", "nto", "od ", "pa ", "rgo", "urg", " m ", "adr", "ast", "cag", "gay", "gsi", "i p", "ino", "len", "lin", "m g", "mar", "nah", "to'", " de", "a h", "cat", "cau", "con", "iqu", "lac", "mab", "min", "og ", "par", "sal", " za", "ao ", "doo", "ipi", "nod", "nte", "uha", "ula", " re", "ill", "lit", "mac", "nit", "o't", "or ", "ora", "sum", "y p", " al", " mi", " um", "aco", "ada", "agd", "cab");
+$GLOBALS["ngrams"]['tlh'] = array("tlh", "e' ", "gh ", "i' ", " 'e", "u' ", " vi", "atl", "a' ", " gh", "ej ", " ho", " ch", " mu", " tl", "nga", "mey", "wi'", "be'", "an ", "ch ", "gan", "chu", "lh ", "ing", "'e'", "hin", "jat", "lhi", " da", " ja", "o' ", "ugh", "aq ", "cha", " po", "ey ", " 'a", " je", "'ej", " pa", "ng ", "ad ", " qa", "oh ", "eh ", "ah ", "gha", "je ", " lu", "hol", "aw'", " ji", "ong", "pu'", "aj ", "vad", "w' ", "' j", "ha'", "is ", "tah", "' '", "ang", "h '", "pon", "am ", "law", "mo'", "qu'", "hbe", "ol ", "vam", "agh", "mu'", "ahv", "bej", "ogh", "uch", "' v", "ach", "hug", " lo", " qu", "cho", "hva", "ij ", " la", "lu'", "vis", " ne", " pu", " so", " ta", " va", "'ac", "di'", "hu'", "lah", "moh", " 'o", "' m", "daq", "hah", "n h", "neh", "u'm", "ay'", "gho", "h v", "meh", "oy ", " ma", " nu", "'me", "el ", " ba", " be", " de", " ng", "' t", "h d", "hvi", "oq ", " wa", "' l", "'wi", "hme", "li'", "uq ", " bo", "bog", "del", "h p", "h t", "ich", "vil", " qe", " wi", "ahb", "ban", "eng", "haq", "hoh", "ov ", "viq", " ha", " ti", "' n", "' p", "'a'", "hwi", "igh", "lo'", "y' ", " du", " no", " yu", "'mo", "'va", "daj", "das", "egh", "hom", "muc", "om ", "otl", "us ", " bi", " tu", "' h", "chm", "h q", "hov", "nis", "qar", "uj ", "' q", "'ch", "h m", "hmo", "jih", "par", "wij", " hu", "' d", "'a ", "etl", "h g", "h j", "h l", "lod", "maq", "och", "wa'", "yuq", " di", " le", " pe", " ya", "'di", "che", "ech", "ih ", "ija", "in ", "j '", "j m", "lhw", "pa'", " 'i", " mi", " qi", " ro", " ru", "'be", "anp", "ghi", "ghu", "h b", "hay", "hch", "iq ", "npu", "od ", "paq", "qay", "rda", "soh", " do", " me", " qo", " sa", "' c", "' g", "' s", "'lu", "aml", "ard", "as ", "d p", "gme", "h n", "hta", "i'v", "j j", "jij", "len", "ngm", "qan", "qme", "vaj", "wiv", " mo", " ni", "'la", "'pu", "'qu", "ar ", "arm", "dwi", "g p", "ghd", "h c", "ham", "hla", "hqu", "ilo", "iqa", "iqi", "j p", "j t", "j v", "lad", "lho", "mar", "mug", "pus", "q s", "q t", "rgh", "rma", "sov", "ta'", "tin", "tu'", "u'd", "vet", "yli", "yu'", " to", "'oh", "aqq", "art", "at ", "ayl", "ayt", "et ", "haj", "har");
+$GLOBALS["ngrams"]['tn'] = array(" di", " le", "go ", "le ", " go", "ng ", " ts", "ya ", " ya", "sa ", "tlh", " mo", " bo", "a m", "lo ", "tsa", " e ", "o t", "a b", "wa ", " ka", "a k", "a t", "ka ", "a g", "eng", "olo", "o y", "la ", " a ", "a d", "ets", "mo ", "se ", " tl", " ba", "tsh", " ma", "ba ", "a l", "tse", "so ", "na ", "elo", " se", "ele", "e d", "o l", "lho", "e t", "di ", "e g", " kg", "dit", "kgo", "o k", "ang", "lha", "e m", "e e", "we ", "ane", "o m", "e k", "e l", "ong", "set", "wan", "ela", "tso", "tla", "o d", "e b", "ola", "ngw", "gwe", "o b", "aba", "atl", "a p", " o ", "a a", "o a", "otl", "a s", "o e", "dir", "thu", "ga ", " ga", "shw", "ots", "aka", "hab", "hwa", "aga", "o g", "gan", "tsw", "ana", "mol", " ke", "hut", " me", "ona", "lel", "its", "lao", "kga", "dik", "got", " fa", "let", " wa", "ose", "no ", "t h", "swe", "edi", "ats", "a n", "e s", "oko", "oth", "kwa", "kar", " th", "a e", "ala", "tir", "o n", "dip", "isa", "gat", "ti ", "ano", "bot", " nn", " ha", "len", "alo", "any", "aro", "iti", "iri", "o s", "sen", "net", "ke ", "ho ", "mai", "ika", "eka", "to ", "ith", "re ", "g m", "hat", "bo ", "g l", "et ", "emo", "ama", "iso", "rol", "fa ", "iwa", "kan", "she", "si ", "ao ", "g k", "wen", "lol", "o o", "bos", "itl", "a y", "the", "lwa", "e n", " la", "ore", " mm", "ko ", "tha", "e a", "eo ", "lhe", "bol", "ha ", " po", "isi", "i b", "lan", " na", "i t", "ale", "ne ", "gon", "ris", "ira", "bon", " sa", "g y", "g g", "pha", "oga", "mel", "ro ", "gol", "o w", " kw", "i l", " ti", "tlo", "log", "por", " ja", "a f", " ne", "hok", "lot", " pu", "e y", "uto", "g t", "hom", "okg", " ko", "o f", "ame", "gor", "ta ", " pe", "nts", " kh", "tho", "gel", "adi", "are", "ete", "ase", "mon", "heo", "oro", "omo", "nen", "nel", "ile", "nng", "ntl", "abo", "ogo", "ara", "nse", "ego", "hel", "uo ", "mog", "san", "ula", "rag", "kol", "te ", "etl", "bat", " te", "puo", "amo", "ofe", "lat", "ati", "ole", "rab", "tsi", "iro", "man", "ael", "ega", "lwe", "ra ", "din", "tle", "sek", "ing", "yo ", "a o", " re", "aot", "uso", "o r", "ere", "jwa", "aem", "lam", "lek", " jw", "gwa", "mok");
+$GLOBALS["ngrams"]['tr'] = array("lar", "en ", "ler", "an ", "in ", " bi", " ya", "eri", "de ", " ka", "ir ", "arı", " ba", " de", " ha", "ın ", "ara", "bir", " ve", " sa", "ile", "le ", "nde", "da ", " bu", "ana", "ini", "ını", "er ", "ve ", " yı", "lma", "yıl", " ol", "ar ", "n b", "nda", "aya", "li ", "ası", " ge", "ind", "n k", "esi", "lan", "nla", "ak ", "anı", "eni", "ni ", "nı ", "rın", "san", " ko", " ye", "maz", "baş", "ili", "rin", "alı", "az ", "hal", "ınd", " da", " gü", "ele", "ılm", "ığı", "eki", "gün", "i b", "içi", "den", "kar", "si ", " il", "e y", "na ", "yor", "ek ", "n s", " iç", "bu ", "e b", "im ", "ki ", "len", "ri ", "sın", " so", "ün ", " ta", "nin", "iği", "tan", "yan", " si", "nat", "nın", "kan", "rı ", "çin", "ğı ", "eli", "n a", "ır ", " an", "ine", "n y", "ola", " ar", "al ", "e s", "lik", "n d", "sin", " al", " dü", "anl", "ne ", "ya ", "ım ", "ına", " be", "ada", "ala", "ama", "ilm", "or ", "sı ", "yen", " me", "atı", "di ", "eti", "ken", "la ", "lı ", "oru", " gö", " in", "and", "e d", "men", "un ", "öne", "a d", "at ", "e a", "e g", "yar", " ku", "ayı", "dan", "edi", "iri", "ünü", "ği ", "ılı", "eme", "eği", "i k", "i y", "ıla", " ça", "a y", "alk", "dı ", "ede", "el ", "ndı", "ra ", "üne", " sü", "dır", "e k", "ere", "ik ", "imi", "işi", "mas", "n h", "sür", "yle", " ad", " fi", " gi", " se", "a k", "arl", "aşı", "iyo", "kla", "lığ", "nem", "ney", "rme", "ste", "tı ", "unl", "ver", " sı", " te", " to", "a s", "aşk", "ekl", "end", "kal", "liğ", "min", "tır", "ulu", "unu", "yap", "ye ", "ı i", "şka", "ştı", " bü", " ke", " ki", "ard", "art", "aşa", "n i", "ndi", "ti ", "top", "ı b", " va", " ön", "aki", "cak", "ey ", "fil", "isi", "kle", "kur", "man", "nce", "nle", "nun", "rak", "ık ", " en", " yo", "a g", "lis", "mak", "n g", "tir", "yas", " iş", " yö", "ale", "bil", "bul", "et ", "i d", "iye", "kil", "ma ", "n e", "n t", "nu ", "olu", "rla", "te ", "yön", "çık", " ay", " mü", " ço", " çı", "a a", "a b", "ata", "der", "gel", "i g", "i i", "ill", "ist", "ldı", "lu ", "mek", "mle", "n ç", "onu", "opl", "ran", "rat", "rdı", "rke", "siy", "son", "ta ", "tçı", "tın");
+$GLOBALS["ngrams"]['ts'] = array(" ku", "ku ", "na ", "ka ", "wa ", "a n", " sw", "a m", "ya ", "a k", " ti", "swi", "hi ", "la ", " ya", " le", " hi", "a t", "a v", " va", "ni ", " na", "ndz", " ma", "a h", " xi", "a s", "i n", "ele", "i k", "ana", "a l", "nga", "lo ", "va ", "le ", "aka", "ela", "irh", "eka", " vu", "iwa", "a x", " ka", "yi ", " wa", "isa", "sa ", "ko ", "ta ", "ga ", "wu ", "wi ", "tir", " ek", " mi", " ni", "o y", "elo", "awu", "isi", "swa", "i t", "hla", "a e", " ta", " ng", " la", "a y", "ri ", "eri", " ri", "rhi", "eke", "umb", "u t", "ndl", " yi", "lan", "i v", "esw", "mbe", "i l", "a r", "e k", "ang", "les", "ula", "ti ", "yon", "o w", "ona", "law", "xa ", "nel", "yo ", "lel", "iko", " lo", "amb", " a ", "i y", " xa", "ane", "wan", "i s", "ond", "fan", "end", "i h", "o l", "u k", "mbi", "n'w", "ke ", "dyo", " fa", "lam", "nhl", "o s", "ong", "no ", " ko", "u n", " ha", "ho ", "oko", "u h", "i m", "o n", " yo", "ngu", "o k", "u y", "ati", "u l", "van", "ulu", "and", "mba", "kum", "u v", "wo ", "be ", "ha ", "riw", "dza", "si ", " en", "o h", " hl", "o t", "eyi", " nt", "ila", "lok", "dzi", "nge", " mu", "ala", "to ", "a w", " by", "arh", "aku", "tsa", "wak", "rho", "'wa", " nd", "min", "lav", "tim", "ley", "tik", "dle", "tin", "mat", "ler", "let", "sel", "his", "mel", "lu ", "ika", "a a", "ngo", "eng", "o x", " nk", "amu", "siw", "ani", "eni", "ma ", " nh", "mi ", "swo", "eti", "tan", "mo ", "ham", "iwe", " kh", "han", "lek", "nti", "ung", "hak", "dzo", "ete", " ts", "ava", "hu ", "fum", "kar", "vul", " wu", "kul", "und", "i x", "nhu", "yis", "xik", "bis", "xi ", "e y", "ra ", "hle", " hu", "wek", "ano", "yen", "a d", "sis", "olo", "pfu", "i w", "nyi", "e n", "so ", "ki ", "fun", "iso", "tsh", "kon", "nku", "hel", "i b", "e h", "ari", "imi", "i e", "ind", "vum", "nts", "ime", "kom", "mfu", "ise", " mf", "hin", "dla", "vut", "gan", "i r", "ban", "bya", "mil", "int", "ats", " dy", "u s", "e x", "ile", "kel", "kwa", " no", "i f", "asi", "za ", "uri", "o m", "rha", "e l", "in'", "eta", "von", "i a", "kho", " wo", "iki", " ra", "u e", "o e", "zo ", "yin", "ink", "any", "ket");
+$GLOBALS["ngrams"]['uk'] = array(" на", " за", "ння", "ня ", "на ", " пр", "ого", "го ", "ськ", " по", " у ", "від", "ере", " мі", " не", "их ", "ть ", "пер", " ві", "ів ", " пе", " що", "льн", "ми ", "ні ", "не ", "ти ", "ати", "енн", "міс", "пра", "ува", "ник", "про", "рав", "івн", " та", "буд", "влі", "рів", " ко", " рі", "аль", "но ", "ому", "що ", " ви", "му ", "рев", "ся ", "інн", " до", " уп", "авл", "анн", "ком", "ли ", "лін", "ног", "упр", " бу", " з ", " ро", "за ", "и н", "нов", "оро", "ост", "ста", "ті ", "ють", " мо", " ні", " як", "бор", "ва ", "ван", "ень", "и п", "нь ", "ові", "рон", "сті", "та ", "у в", "ько", "іст", " в ", " ре", "до ", "е п", "заб", "ий ", "нсь", "о в", "о п", "при", "і п", " ку", " пі", " сп", "а п", "або", "анс", "аці", "ват", "вни", "и в", "ими", "ка ", "нен", "ніч", "она", "ої ", "пов", "ьки", "ьно", "ізн", "ічн", " ав", " ма", " ор", " су", " чи", " ін", "а з", "ам ", "ає ", "вне", "вто", "дом", "ент", "жит", "зни", "им ", "итл", "ла ", "них", "ниц", "ова", "ови", "ом ", "пор", "тьс", "у р", "ься", "ідо", "іль", "ісь", " ва", " ді", " жи", " че", " і ", "а в", "а н", "али", "вез", "вно", "еве", "езе", "зен", "ицт", "ки ", "ких", "кон", "ку ", "лас", "ля ", "мож", "нач", "ним", "ної", "о б", "ову", "оди", "ою ", "ро ", "рок", "сно", "спо", "так", "тва", "ту ", "у п", "цтв", "ьни", "я з", "і м", "ії ", " вс", " гр", " де", " но", " па", " се", " ук", " їх", "а о", "авт", "аст", "ают", "вар", "ден", "ди ", "ду ", "зна", "и з", "ико", "ися", "ити", "ког", "мен", "ном", "ну ", "о н", "о с", "обу", "ово", "пла", "ран", "рив", "роб", "ска", "тан", "тим", "тис", "то ", "тра", "удо", "чин", "чни", "і в", "ію ", " а ", " во", " да", " кв", " ме", " об", " ск", " ти", " фі", " є ", "а р", "а с", "а у", "ак ", "ані", "арт", "асн", "в у", "вик", "віз", "дов", "дпо", "дів", "еві", "енс", "же ", "и м", "и с", "ика", "ичн", "кі ", "ків", "між", "нан", "нос", "о у", "обл", "одн", "ок ", "оло", "отр", "рен", "рим", "роз", "сь ", "сі ", "тла", "тів", "у з", "уго", "уді", "чи ", "ше ", "я н", "я у", "ідп", "ій ", "іна", "ія ", " ка", " ни", " ос", " си", " то", " тр", " уг");
+$GLOBALS["ngrams"]['ur'] = array("یں ", " کی", "کے ", " کے", "نے ", " کہ", "ے ک", "کی ", "میں", " می", "ہے ", "وں ", "کہ ", " ہے", "ان ", "ہیں", "ور ", " کو", "یا ", " ان", " نے", "سے ", " سے", " کر", "ستا", " او", "اور", "تان", "ر ک", "ی ک", " اس", "ے ا", " پا", " ہو", " پر", "رف ", " کا", "ا ک", "ی ا", " ہی", "در ", "کو ", " ای", "ں ک", " مش", " مل", "ات ", "صدر", "اکس", "شرف", "مشر", "پاک", "کست", "ی م", " دی", " صد", " یہ", "ا ہ", "ن ک", "وال", "یہ ", "ے و", " بھ", " دو", "اس ", "ر ا", "نہی", "کا ", "ے س", "ئی ", "ہ ا", "یت ", "ے ہ", "ت ک", " سا", "لے ", "ہا ", "ے ب", " وا", "ار ", "نی ", "کہا", "ی ہ", "ے م", " سی", " لی", "انہ", "انی", "ر م", "ر پ", "ریت", "ن م", "ھا ", "یر ", " جا", " جن", "ئے ", "پر ", "ں ن", "ہ ک", "ی و", "ے د", " تو", " تھ", " گی", "ایک", "ل ک", "نا ", "کر ", "ں م", "یک ", " با", "ا ت", "دی ", "ن س", "کیا", "یوں", "ے ج", "ال ", "تو ", "ں ا", "ے پ", " چا", "ام ", "بھی", "تی ", "تے ", "دوس", "س ک", "ملک", "ن ا", "ہور", "یے ", " مو", " وک", "ائی", "ارت", "الے", "بھا", "ردی", "ری ", "وہ ", "ویز", "ں د", "ھی ", "ی س", " رہ", " من", " نہ", " ور", " وہ", " ہن", "ا ا", "است", "ت ا", "ت پ", "د ک", "ز م", "ند ", "ورد", "وکل", "گی ", "گیا", "ہ پ", "یز ", "ے ت", " اع", " اپ", " جس", " جم", " جو", " سر", "اپن", "اکث", "تھا", "ثری", "دیا", "ر د", "رت ", "روی", "سی ", "ملا", "ندو", "وست", "پرو", "چاہ", "کثر", "کلا", "ہ ہ", "ہند", "ہو ", "ے ل", " اک", " دا", " سن", " وز", " پی", "ا چ", "اء ", "اتھ", "اقا", "اہ ", "تھ ", "دو ", "ر ب", "روا", "رے ", "سات", "ف ک", "قات", "لا ", "لاء", "م م", "م ک", "من ", "نوں", "و ا", "کرن", "ں ہ", "ھار", "ہوئ", "ہی ", "یش ", " ام", " لا", " مس", " پو", " پہ", "انے", "ت م", "ت ہ", "ج ک", "دون", "زیر", "س س", "ش ک", "ف ن", "ل ہ", "لاق", "لی ", "وری", "وزی", "ونو", "کھن", "گا ", "ں س", "ں گ", "ھنے", "ھے ", "ہ ب", "ہ ج", "ہر ", "ی آ", "ی پ", " حا", " وف", " گا", "ا ج", "ا گ", "اد ", "ادی", "اعظ", "اہت", "جس ", "جمہ", "جو ", "ر س", "ر ہ", "رنے", "س م", "سا ", "سند", "سنگ", "ظم ", "عظم", "ل م", "لیے", "مل ", "موہ", "مہو", "نگھ", "و ص", "ورٹ", "وہن", "کن ", "گھ ", "گے ", "ں ج", "ں و", "ں ی", "ہ د", "ہن ", "ہوں", "ے ح", "ے گ", "ے ی", " اگ", " بع", " رو", " شا");
+$GLOBALS["ngrams"]['uz'] = array("ан ", "ган", "лар", "га ", "нг ", "инг", "нин", "да ", "ни ", "ида", "ари", "ига", "ини", "ар ", "ди ", " би", "ани", " бо", "дан", "лга", " ҳа", " ва", " са", "ги ", "ила", "н б", "и б", " кў", " та", "ир ", " ма", "ага", "ала", "бир", "ри ", "тга", "лан", "лик", "а к", "аги", "ати", "та ", "ади", "даг", "рга", " йи", " ми", " па", " бў", " қа", " қи", "а б", "илл", "ли ", "аси", "и т", "ик ", "или", "лла", "ард", "вчи", "ва ", "иб ", "ири", "лиг", "нга", "ран", " ке", " ўз", "а с", "ахт", "бўл", "иги", "кўр", "рда", "рни", "са ", " бе", " бу", " да", " жа", "а т", "ази", "ери", "и а", "илг", "йил", "ман", "пах", "рид", "ти ", "увч", "хта", " не", " со", " уч", "айт", "лли", "тла", " ай", " фр", " эт", " ҳо", "а қ", "али", "аро", "бер", "бил", "бор", "ими", "ист", "он ", "рин", "тер", "тил", "ун ", "фра", "қил", " ба", " ол", "анс", "ефт", "зир", "кат", "мил", "неф", "саг", "чи ", "ўра", " на", " те", " эн", "а э", "ам ", "арн", "ат ", "иш ", "ма ", "нла", "рли", "чил", "шга", " иш", " му", " ўқ", "ара", "ваз", "и у", "иқ ", "моқ", "рим", "учу", "чун", "ши ", "энг", "қув", "ҳам", " сў", " ши", "бар", "бек", "дам", "и ҳ", "иши", "лад", "оли", "олл", "ори", "оқд", "р б", "ра ", "рла", "уни", "фт ", "ўлг", "ўқу", " де", " ка", " қў", "а ў", "аба", "амм", "атл", "б к", "бош", "збе", "и в", "им ", "ин ", "ишл", "лаб", "лей", "мин", "н д", "нда", "оқ ", "р м", "рил", "сид", "тал", "тан", "тид", "тон", "ўзб", " ам", " ки", "а ҳ", "анг", "анд", "арт", "аёт", "дир", "ент", "и д", "и м", "и о", "и э", "иро", "йти", "нсу", "оди", "ор ", "си ", "тиш", "тоб", "эти", "қар", "қда", " бл", " ге", " до", " ду", " но", " пр", " ра", " фо", " қо", "а м", "а о", "айд", "ало", "ама", "бле", "г н", "дол", "ейр", "ек ", "ерг", "жар", "зид", "и к", "и ф", "ий ", "ило", "лди", "либ", "лин", "ми ", "мма", "н в", "н к", "н ў", "н ҳ", "ози", "ора", "оси", "рас", "риш", "рка", "роқ", "сто", "тин", "хат", "шир", " ав", " рў", " ту", " ўт", "а п", "авт", "ада", "аза", "анл", "б б", "бой", "бу ", "вто", "г э", "гин", "дар", "ден", "дун", "иде", "ион", "ирл", "ишг", "йха", "кел", "кўп", "лио");
+$GLOBALS["ngrams"]['ve'] = array("ha ", " vh", "a m", "na ", " u ", "a n", "tsh", "wa ", "a u", " na", "nga", "vha", " ts", " dz", " kh", "dza", "a v", "ya ", " ya", "a t", "ho ", "la ", " zw", " mu", "edz", "vhu", "ga ", "shi", "za ", "a k", " ng", "kha", " ma", "hum", "ne ", " nd", "o n", "lo ", "dzi", "shu", " ha", "a d", "o y", "nda", "ele", "zwi", "aho", "ang", "no ", " a ", "ela", "a z", "hu ", "sha", "i n", " wa", "ana", "hi ", "kan", "o d", "ano", "a h", "zwa", " th", " mi", "gan", "a l", "sa ", "han", "di ", "u t", "and", "ndi", "yo ", "the", "do ", "ri ", "vho", "ni ", "ka ", "uri", "si ", "o t", "mbe", "o w", "ane", "we ", "zo ", "i t", "e n", "i h", "she", "ush", "o k", "zi ", "da ", "a a", "thu", " la", "a p", "zan", " i ", "a s", "lwa", "ula", "i d", "aka", " do", "mis", "hed", "ita", "li ", " hu", "iwa", " lu", "i v", "he ", " ka", "elo", "so ", "amb", "avh", " sh", "o v", "i k", "lel", "u v", "dzo", "u s", " fh", "mo ", "nwe", "o l", "umi", "wah", "isi", "hel", "a i", "vel", "adz", "tan", "i m", "ath", "thi", "wi ", " ur", "hat", "ine", "le ", "vhe", "any", "a y", "hon", "isa", "ala", "o a", "alu", "udi", "umb", " bv", "ash", " te", " li", "lus", "nya", "has", "led", "swa", "hus", "o i", "umo", "one", "nde", "tha", " it", "kho", "ngo", "mus", "hak", "e y", "ea ", "ivh", "o m", "u n", "hin", "tho", "mut", "ayo", "fhi", " sa", "tel", "hul", "hun", "ulo", "ith", "ma ", " yo", "lan", "e v", " ph", "go ", "i a", "o u", "hud", " pf", "uka", "zhi", "uvh", "dzw", "ing", "elw", "ila", "wo ", "mbo", "u d", "ite", "isw", "asi", "e k", "ndu", "fhe", "o h", "mel", "u b", "ika", "bo ", "gud", "dzh", "kon", "ifh", " ta", "e d", "uth", " ho", "i z", "wan", "ulu", "mad", "inw", "oth", "ani", "dis", "wit", "ou ", "bve", "ets", "u i", "adi", "e m", "fha", "nah", "dal", "win", " si", "sho", " in", "yam", "lay", "eka", "a f", "i u", "end", "i y", "alo", "i l", "uso", "mul", "ta ", "del", "u k", " mb", "pha", " di", "dad", "ali", "o s", "pfu", "khw", "e a", " ko", " ne", "hen", "mas", "ume", "ini", "ish", "udz", "ira", "oni", "luk", "nel", "iso", "mba", "dzu", "hom", "i s", "zwo", "ngu", "ara", "unz");
+$GLOBALS["ngrams"]['xh'] = array("la ", " ku", "lo ", "nga", "a k", " ng", "oku", " kw", " uk", "a n", "uku", "ye ", "a i", "yo ", "ela", "ele", "a u", "nye", "we ", "wa ", "ama", "e n", "ise", "aba", "ba ", "ho ", "enz", "o n", "ngo", "kub", "nge", "ath", "fun", "o e", "lel", "ung", "uba", "ko ", "elo", "ezi", "o k", "the", "kwa", "na ", "kwe", "ang", "e i", "le ", "ka ", "esi", "o y", " na", "e k", "eth", "pha", " in", "kun", "nzi", "and", "ni ", "ban", " ye", " no", "lwa", "lun", " ok", "any", "zi ", "li ", " ne", "ulu", "a e", "eli", "gok", "o l", "ebe", "und", "isa", "seb", "ndo", " ez", "tho", "o i", "do ", "ben", "ing", "kwi", "ndl", "uny", "ala", "a a", "eyo", "e u", "kan", " ab", "thi", "i k", "i n", "o u", "o z", "elw", "sa ", "sek", "ayo", "het", "o o", "eka", " um", "hi ", "bo ", "so ", "isi", "wen", "lwe", "aph", "a l", "ya ", "eko", "ana", " yo", "kuf", "ini", "imi", "ali", "ha ", "awu", "wan", "ent", "uth", "tha", "za ", "ula", "kho", " ii", "ane", "e a", "iso", "uph", " le", "ile", "zin", "nts", " si", "eng", "nok", "ong", "hla", "zwe", " el", "oka", "eki", "lis", "azi", " lo", "tsh", " am", "ufu", "ant", "isw", "o a", "ngu", "o s", " ba", "int", "eni", "une", "wul", "hul", "sel", "i e", "use", "lan", "ke ", "nis", "emi", " li", " is", "iph", " im", "a o", "aka", "mfu", " zi", "ink", "mal", "ley", "man", "nya", "nek", "akh", "ume", " ko", "alo", "tu ", "i u", "ntu", "izw", "kel", "izi", "i i", "si ", "gan", "ase", "ind", "i a", "ndi", "nel", "alu", "sis", "ubo", "kut", "mth", "kus", "lek", "mis", "nde", " zo", " we", "ani", "ga ", "iko", "siz", "no ", "phu", "e e", "hon", "ond", "ne ", "ith", "kul", "gam", "gen", "pho", " iz", "phe", "hat", "khu", "iin", "han", "zo ", "lu ", "ulo", "nda", "qo ", "zik", "hel", "o m", " lw", "zis", "dle", "uhl", "men", "olo", "mel", "del", "nza", "oko", "okw", "olu", "kuk", "nte", "swa", "law", "enk", " ya", "i y", "gaq", "sha", "aqo", "e l", "ikh", "nkq", "ule", " ka", "onk", "thu", "wo ", "bon", "kup", "qub", "a y", "kqu", "dla", " es", "he ", "ano", "lum", "be ", "iga", " ze", "o w", "aku", "mga", "nke", "te ", " ol", "ze ", "kum", "emf", "esh");
+$GLOBALS["ngrams"]['zu'] = array("oku", "la ", "nga", " ng", "a n", " ku", "a k", "thi", " uk", "ezi", "e n", "uku", "le ", "lo ", "hi ", "wa ", " no", "a u", "ela", "we ", "a i", "ni ", "ele", "zin", "uth", "ama", "elo", "pha", "ing", "aba", "ath", "and", "enz", "eth", "esi", "ma ", "lel", " um", " ka", "the", "ung", "nge", "ngo", "tho", "nye", "kwe", "eni", "izi", "ye ", " kw", "ndl", "ho ", "a e", "na ", "zi ", "het", "kan", "e u", "e i", "und", "ise", "isi", "nda", "kha", "ba ", "i k", "nom", "fun", " ez", " iz", "ke ", "ben", "o e", "isa", "zwe", "kel", "ka ", "aka", "nzi", "o n", "e k", "oma", "kwa", " ne", "any", "ang", "hla", "i u", "mth", "kub", "o k", "ana", "ane", "ikh", "ebe", "kut", "ha ", " is", "azi", "ulu", "seb", "ala", "onk", "ban", "i e", "azw", "wen", " ab", "han", "a a", "i n", "imi", "lan", "hat", "lwa", " na", "ini", "akh", "li ", "ngu", "nke", "nok", "ume", "eke", "elw", "yo ", "aph", "kus", " es", " ok", "iph", " im", "mel", "i i", " lo", " in", " am", "kho", "za ", "gok", "sek", "lun", "kun", "lwe", "sha", "sik", "kuf", "hak", "a y", "thu", "sa ", "o u", "khu", "ayo", "hul", "e a", "ali", "eng", "lu ", "ne ", " ko", "eli", "uba", "dle", "e e", "ith", " yo", "a l", "nel", "mis", " si", "kul", "a o", "sis", "lok", "gen", "o z", "i a", "emi", "uma", "eka", "alo", "man", "isw", "tha", "o i", "lon", "so ", "uph", "uhl", "ntu", "zim", "mal", "ind", "wez", " ba", "o o", " yi", " we", "ula", "phe", "o y", "ile", "o l", "wo ", "wel", "ga ", "tu ", "hle", "okw", "fan", " le", "kaz", "ase", "ani", "nde", "bo ", "ngi", "ule", " em", "men", "iny", "amb", "mbi", "gan", "ifu", "o s", "ant", "hel", "ika", "ona", "i l", "fut", " fu", "ze ", "u a", "nhl", "nin", " zo", "end", "sig", "u k", "gab", "ufa", "ish", "ush", "kuz", "no ", "gam", "kuh", " ye", "nya", "nez", "zis", "dlu", "kat", "dla", "tsh", " se", "ike", "kuq", "gu ", "osi", "swa", "lul", " zi", "ima", "e l", "kup", "mo ", "nza", "asi", "ko ", "kum", "lek", "she", "umt", "uny", "yok", "wan", "wam", "ame", "ong", "lis", "mkh", "ahl", "ale", "use", "o a", "alu", "gap", "si ", "hlo", "nje", "omt", "o w", "okh", "he ", "kom", "i s");
+
+/**
+ * Lister les ngrams contenus dans un texte
+ * @param string $string
+ * @param int $ng_number
+ * @param int $ng_max_chars
+ * @return array
+ */
+function createNGrams($string, $ng_number = 300, $ng_max_chars = 4){
+
+	// Attention: $string n'est pas un mot, mais le texte complet
+	// On va le couper pour éviter les timeout, 
+	// mais il faut qu'il reste suffisamment long pour que la détection reste qualitative
+	// Au passage: on fait les calculs en multibyte.
+	$string = mb_substr($string, 0, 5000, "utf-8");
+
+	// Attention: il faut traiter les chaines en utf-8 !!!
+	//iterate over each word, each character, all possible n-grams
+	$word = " " . $string . " ";
+	$length = mb_strlen($word, "utf-8");
+	for ($pos = 0; $pos<$length; $pos++){ //start position within word
+		$chars = 3;
+		if (($pos+$chars)<$length){ //if not beyond end of word
+			$array_ngram[] = mb_substr($word, $pos, $chars, "utf-8");
+		}
+	}
+	//count-> value(frequency, int)... key(ngram, string)
+	$ng_frequency = array_count_values($array_ngram);
+	//sort array by value(frequency) desc
+	arsort($ng_frequency);
+	//use only top frequent ngrams
+	$most_frequent = array_slice($ng_frequency, 0, $ng_number);
+	$sub_ng = array();
+	foreach ($most_frequent as $ng => $number_frequencey){
+		$sub_ng[] = $ng;
+	}
+
+	return $sub_ng;
+}
+
+
+/**
+ * Trouver la langue la/les langues plausibles en fonction des ngrams trouves dans le texte et des ngrams possibles
+ * @param array $sub_ng
+ *   jeu de Ngrams trouves dans le texte
+ * @param array $lm_ng
+ *   jeu de Ngrams possibles
+ * @param int $max_delta
+ * @return string
+ */
+function compareNGrams($sub_ng, $lm_ng, $max_delta = 140000){
+	foreach ($lm_ng as $lm_basename => $language){
+		$delta = 0;
+		//compare each ngram of input text to current lm-array
+		foreach ($sub_ng as $key => $existing_ngram){
+			//match
+			if (in_array($existing_ngram, $language)){
+				$delta += abs($key-array_search($existing_ngram, $language));
+				//no match
+			} else {
+				$delta += 400;
+			}
+			//abort: this language already differs too much
+			if ($delta>$max_delta){
+				break;
+			}
+		} // End comparison with current language
+		//include only non-aborted languages in result array
+		if ($delta<($max_delta-400)){
+			$result[$lm_basename] = $delta;
+		}
+	} //End comparison all languages
+	if (!isset($result)){
+		$result = '';
+	} else {
+		asort($result);
+	}
+	return $result;
+}
+
+/**
+ * Retourne la proportion de texte qui n'est pas dans la plage utf cherchee
+ * @param string $texte
+ * @param string $plage
+ * @return float
+ */
+function tester_plage_utf($texte, $plage){
+
+	$total = mb_strlen($texte, "UTF-8");
+
+	$test = mb_strlen(
+		preg_replace("/" . $plage . "/ui", "", $texte),
+		"UTF-8"
+	);
+//	echo "<h4>".($test / $total)."<h4> ";
+	return ($test/$total);
+}
+
+/**
+ * Reduire le jeu de langue possibles en fonction des plages utf8 utilisees dans le texte
+ * @param string $texte
+ * @return array|bool|string
+ */
+function detecter_plages_utf($texte){
+
+	if (tester_plage_utf($texte, "[\x{0041}-\x{024F}\x{1E00}-\x{1EFF}]")<0.5){
+		// Latin
+		return array("fr", "en", "de", "it", "es", 'af', 'br', 'ca', 'ceb', "da", "fi", "nl", "nr", "pt", "pt_BR", "pt_PT", "sk", "ha", "haw", "hr", "pl", "cs", "az", "cy", "et", "ro", "eu", "hu", "id", "is", "la", "lt", "lv", "nb", "nso", "sl", "so", "sq", "ss", "st", "sv", "sw", "tl", "tlh", "tn", "tr", "ts", "ve", "xh", "zu");
+	} else if (tester_plage_utf($texte, "[\x{0400}-\x{0523}]")<0.5){
+		// Cyrillique
+		return array("ru", "bg", "kk", "uk", "ky", "mn", "uz", "mk", "sr");
+	} else if (tester_plage_utf($texte, "[\x{0370}-\x{03ff}\x{1F00}-\x{1FFE}]")<0.5){
+		// Grec/Copte
+		return "el";
+	} else if (tester_plage_utf($texte, "[\x{0530}-\x{058A}]")<0.5){
+		// Armenien
+		return "hy";
+	} else if (tester_plage_utf($texte, "[\x{0590}-\x{05F4}]")<0.5){
+		// Hebreux
+		return "he";
+	} else if (tester_plage_utf($texte, "[\x{0600}-\x{077F}]")<0.5){
+		// Arabe-farsi-pachtoune-urdu
+		return array("ar", "fa", "ps", "ur");
+	} else if (tester_plage_utf($texte, "[\x{3040}-\x{30FF}]")<0.7){
+		// Japonais (hiragana / katakana)
+		return "ja";
+	} else if (tester_plage_utf($texte, "[\x{4E00}-\x{9FBB}\x{4E00}–\x{9FBF}]")<0.7){
+		// Chinois
+		return "zh";
+	} else if (tester_plage_utf($texte, "[\x{0E00}-\x{0E5B}]")<0.5){
+		// Thai
+		return "th";
+	} else if (tester_plage_utf($texte, "[\x{1100}-\x{11F8}\x{3130}-\x{318E}\x{AC00}-\x{D7A3}]")<0.5){
+		// Hangul  - Koreen
+		return "ko";
+	}
+
+	return false;
+}
+
+
+/**
+ * Detecter langue
+ *
+ * Premiere passe: detecter dans quel alphabet le texte est écrit
+ * ce qui permet de limiter le nombre de réponse
+ * (par exemple: des caractères «arabes» ne peuvent être que de l'arabe, du farsi, du pachtourne ou du urdu)
+ * Deuxieme passe: faire un test classique sur les trigrams (uniquement sur les langues possibles de la première passe)
+ *
+ * @param string $texte
+ * @return bool|string
+ */
+function _detecter_langue($texte){
+	$texte = strip_tags($texte);
+	$texte = str_replace("’", "'", $texte);
+	$texte = str_replace("\"", " ", $texte);
+
+	// Si les fonctions mb_ ne sont pas disponibles
+	// ou si texte trop court, impossible de détecter la langue
+	if ( !function_exists('mb_strlen')
+	  OR !function_exists('mb_substr')
+	  OR mb_strlen($texte, "utf-8")<6 ){
+		return false;
+	}
+
+	$possibles = detecter_plages_utf($texte);
+
+	if (!$possibles){
+		return false;
+	} else if (!is_array($possibles)){
+		return $possibles;
+	} else {
+		$ngrams = array();
+		foreach ($possibles as $lang){
+			$ngrams[$lang] = $GLOBALS["ngrams"][$lang];
+		}
+	}
+
+	$sub_ng = createNGrams($texte);
+	$result_array = compareNGrams($sub_ng, $ngrams, 140000);
+
+//	print_r($result_array);
+
+	$lang = false;
+	if (is_array($result_array)) {
+		foreach ($result_array as $lang => $score) {
+			if ($lang) {
+				break;
+			}
+		}
+	}
+	return $lang;
+}
diff --git a/design_system_dependences/nospam/v2.4.4/inc/nospam.php b/design_system_dependences/nospam/v2.4.4/inc/nospam.php
new file mode 100644
index 0000000000000000000000000000000000000000..40a2f840d62725c1a13c5003cc5740e3a6be3669
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/inc/nospam.php
@@ -0,0 +1,336 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Recuperer le HTML a afficher pour faire confirmer une action par l'utilisateur a son insu
+ * (antispam qui declenche l'action uniquement si l'utilisateur charge les ressources de la page apres le POST du formulaire)
+ *
+ * @param string $function
+ * @param string $description
+ * @param array $arguments
+ * @param string $file
+ * @param null $time
+ * @param string $method
+ * @return string
+ */
+function nospam_confirm_action_html(
+	$function,
+	$description,
+	$arguments = array(),
+	$file = '',
+	$time = null,
+	$method = 'script') {
+
+	include_spip('action/nospam_confirm_action');
+	return nospam_confirm_action_prepare($function, $description, $arguments, $file, $time, $method);
+}
+
+
+/**
+ * Calculer un hash qui represente l'utilisateur
+ * @return string
+ */
+function nospam_hash_env() {
+	static $res ='';
+	if ($res) {
+		return $res;
+	}
+	$ip = explode('.', $GLOBALS['ip']);
+	array_pop($ip);
+	$ip = implode('.', $ip).'.xxx';
+	$res = md5($ip. (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''));
+	#spip_log("jeton $res pour ".$ip. $_SERVER['HTTP_USER_AGENT'],"jetons");
+	return $res;
+}
+
+
+/**
+ * Est-ce qu'on suspecte cet utilisateur d'etre un bot ?
+ * @return bool
+ */
+function nospam_may_be_bot() {
+	if (defined('_IS_BOT') and _IS_BOT) {
+		return true;
+	}
+	if (!isset($_SERVER['HTTP_USER_AGENT']) or !strlen($_SERVER['HTTP_USER_AGENT'])) {
+		return true;
+	}
+
+	if (preg_match(','
+	. implode ('|', array(
+		// mots generiques supplementaires
+		'curl',
+		'python-requests',
+	)) . ',i', $_SERVER['HTTP_USER_AGENT'])) {
+		return true;
+	}
+	return false;
+}
+
+/**
+ * Calcule une cle de jeton pour un formulaire
+ *
+ * @param string $form
+ *   nom du formulaire
+ * @param string $qui
+ *   identifiant du visiteur a qui est attribue le jeton
+ * @return string
+ *   cle calculee
+ */
+function nospam_creer_jeton($form, $qui = null) {
+	$time = date('Y-m-d-H',$_SERVER['REQUEST_TIME']);
+	if (is_null($qui)) {
+		if (isset($GLOBALS['visiteur_session']['id_auteur']) and intval($GLOBALS['visiteur_session']['id_auteur'])) {
+			$qui = ':'.$GLOBALS['visiteur_session']['id_auteur'].':'.$GLOBALS['visiteur_session']['nom'];
+		} elseif (!defined('_IS_BOT') or !_IS_BOT) { // pas de jeton pour les bots qui n'ont rien d'interessant a poster
+			$qui = nospam_hash_env();
+		}
+	}
+	include_spip('inc/securiser_action');
+	// le jeton prend en compte l'heure et l'identite de l'internaute
+	return calculer_cle_action("jeton$form$time$qui");
+}
+
+/**
+ * Verifie une cle de jeton pour un formulaire
+ *
+ * @param string $jeton
+ *   cle recue
+ * @param string $form nom du formulaire
+ *   nom du formulaire
+ * @param string $qui
+ *   identifiant du visiteur a qui est attribue le jeton
+ * @return bool cle correcte ?
+ */
+function nospam_verifier_jeton($jeton, $form, $qui = null) {
+	$time = $_SERVER['REQUEST_TIME'];
+	$time_old = date('Y-m-d-H', $time-3600);
+	$time = date('Y-m-d-H', $time);
+
+	if (is_null($qui)) {
+		if (isset($GLOBALS['visiteur_session']['id_auteur']) and intval($GLOBALS['visiteur_session']['id_auteur'])) {
+			$qui = ':'.$GLOBALS['visiteur_session']['id_auteur'].':'.$GLOBALS['visiteur_session']['nom'];
+		} else {
+			$qui = nospam_hash_env();
+		}
+	}
+
+	$ok = (verifier_cle_action("jeton$form$time$qui", $jeton)
+			or verifier_cle_action("jeton$form$time_old$qui", $jeton));
+	#if (!$ok)
+	#	spip_log("Erreur form:$form qui:$qui agent:".$_SERVER['HTTP_USER_AGENT']." ip:".$GLOBALS['ip'],'fauxjeton');
+	return $ok;
+}
+
+
+/**
+ * Compte le nombre de caracteres d'une chaine,
+ * mais en supprimant tous les liens
+ * (qu'ils soient ou non ecrits en raccourcis SPIP)
+ * ainsi que tous les espaces en trop
+ *
+ * @param string $texte
+ *   texte d'entree
+ * @param bool $propre
+ *   passer le texte dans propre ou non
+ * @return int
+ *   compte du texte nettoye
+ */
+function nospam_compter_caracteres_utiles($texte, $propre = true) {
+	include_spip('inc/charsets');
+	if ($propre) {
+		$texte = propre($texte);
+	}
+	$u = $GLOBALS['meta']['pcre_u'];
+	// regarder si il y a du contenu en dehors des liens !
+	$texte = PtoBR($texte);
+	$texte = preg_replace(",<a.*</a>,{$u}Uims", '', $texte);
+	// \W matche tous les caracteres non ascii apres 0x80
+	// et vide donc les chaines constitues de caracteres unicodes uniquement
+	// on remplace par un match qui elimine uniquement
+	// les non \w  et les non unicodes
+	$texte = trim(preg_replace(",[^\w\x80-\xFF]+,ims", ' ', $texte));
+
+	// on utilise spip_strlen pour compter la longueur correcte
+	// pour les chaines unicodes
+	return spip_strlen($texte);
+}
+
+
+/**
+ * Retourne un tableau d'analyse du texte transmis
+ * Cette analyse concerne principalement des statistiques sur les liens
+ *
+ * @param string $texte texte d'entree
+ * @return array rapport d'analyse
+ */
+function nospam_analyser_spams($texte) {
+	$infos = array(
+		'caracteres_utiles' => 0, // nombre de caracteres sans les liens
+		'nombre_liens' => 0, // nombre de liens
+		'caracteres_texte_lien_min' => 0, // nombre de caracteres du plus petit titre de lien
+		'contenu_cache' => false, // du contenu est caché en CSS ?
+	);
+
+	if (!$texte) {
+		return $infos;
+	}
+
+	// on travaille d'abord sur le texte 'brut' tel que saisi par
+	// l'utilisateur pour ne pas avoir les class= et style= que spip ajoute
+	// sur les raccourcis.
+
+	// on ne tient pas compte des blocs <code> et <cadre> ni de leurs contenus
+	include_spip('inc/texte_mini');
+	if (!function_exists('echappe_html')) { // SPIP 2.x
+		include_spip('inc/texte');
+	}
+	$texte_humain = echappe_html($texte);
+	// on repère dans ce qui reste la présence de style= ou class= qui peuvent
+	// servir à masquer du contenu
+	// les spammeurs utilisent le laxisme des navigateurs pour envoyer aussi style =
+	// soyons donc mefiant
+	// (mais en enlevant le base64 !)
+	$texte_humain = str_replace('class="base64"', '', $texte_humain);
+	$hidden = ',(<(img|object)|\s(?:style|class)\s*=[^>]+>),UimsS';
+	if (preg_match($hidden, $texte_humain)) {
+		// suspicion de spam
+		$infos['contenu_cache'] = true;
+	}
+
+	include_spip('inc/texte');
+	$texte = propre($texte);
+
+	// caracteres_utiles
+	$infos['caracteres_utiles'] = nospam_compter_caracteres_utiles($texte, false);
+
+	// nombre de liens
+	$liens = array_filter(extraire_balises($texte, 'a'), 'nospam_pas_lien_ancre');
+	$infos['nombre_liens'] = count($liens);
+	$infos['liens'] = $liens;
+
+	// taille du titre de lien minimum
+	if (count($liens)) {
+		// supprimer_tags() s'applique a tout le tableau,
+		// mais attention a verifier dans le temps que ca continue a fonctionner
+		# $titres_liens = array_map('supprimer_tags', $liens);
+		$titres_liens = supprimer_tags($liens);
+		$titres_liens = array_map('strlen', $titres_liens);
+		$infos['caracteres_texte_lien_min'] = min($titres_liens);
+	}
+	return $infos;
+}
+
+/**
+ * Vérifier si un lien est *n'est pas* une ancre : dans ce cas, ne pas le compte (ici, fonction de filtre de tableau)
+ * Cette analyse concerne principalement des statistiques sur les liens
+ *
+ * @param string $texte lien
+ * @return boolean : true ->
+ */
+function nospam_pas_lien_ancre($texte) {
+	return substr(extraire_attribut($texte, 'href'), 0, 1) == '#' ? false : true;
+}
+
+/**
+ * Compare les domaines des liens fournis avec la presence dans la base
+ *
+ * @param array $liens
+ *   liste des liens html
+ * @param int $seuil
+ *   seuil de detection de presence : nombre d'enregistrement qui ont deja un lien avec le meme domaine
+ * @param string $table
+ *   table sql
+ * @param array $champs
+ *   champs a prendre en compte dans la detection
+ * @param null|string $condstatut
+ *   condition sur le statut='spam' pour ne regarder que les enregistrement en statut spam
+ * @return bool
+ */
+function nospam_rechercher_presence_liens_spammes($liens, $seuil, $table, $champs, $condstatut = null) {
+	include_spip('inc/filtres');
+
+	if (is_null($condstatut)) {
+		$condstatut = 'statut='.sql_quote('spam');
+	}
+	if ($condstatut) {
+		$condstatut = "$condstatut AND ";
+	}
+
+	// limiter la recherche au mois precedent
+	$trouver_table = charger_fonction('trouver_table', 'base');
+	if ($desc = $trouver_table($table)
+		and isset($desc['date'])) {
+		$depuis = date('Y-m-d H:i:s', strtotime('-1 month'));
+		$condstatut .= $desc['date'].'>'.sql_quote($depuis).' AND ';
+	}
+
+	// Ne pas prendre en compte les liens sur les domaines explicitement autorisés
+	// Il ne faut ni http(s):// ni www dedans, juste le NDD (et éventuellement un sous domaine)
+	if (defined('NOSPAM_DOMAINES_AMIS') and NOSPAM_DOMAINES_AMIS) {
+		$amis = explode(',', NOSPAM_DOMAINES_AMIS);
+		$amis = array_filter(array_map('trim', $amis));
+	} else {
+		$amis = array();
+	}
+
+	foreach (array($GLOBALS['meta']['adresse_site'],url_de_base()) as $a) {
+		$host = parse_url($a, PHP_URL_HOST);
+		if ($host) {
+			$host = explode('.', $host);
+			$amis[] = implode('.', array_slice($host, -2));
+		}
+	}
+
+	if (count($amis)) {
+		$amis = array_unique($amis);
+		$amis = array_map('preg_quote', $amis);
+		$amis = '/('.implode('|', $amis).')$/';
+		spip_log("domaines whitelist pour les liens spams : $amis", 'nospam');
+	} else {
+		$amis = '';
+	}
+
+	$hosts = array();
+	foreach ($liens as $lien) {
+		$url = extraire_attribut($lien, 'href');
+		if ($parse = parse_url($url)
+		  and !empty($parse['host'])
+		  and (!$amis or !preg_match($amis, $parse['host']))) {
+			$hosts[] = $parse['host'];
+		}
+	}
+
+	$hosts = array_unique($hosts);
+	$hosts = array_filter($hosts);
+
+	// pour chaque host figurant dans un lien, regarder si on a pas deja eu des spams avec ce meme host
+	// auquel cas on refuse poliment le message
+	foreach ($hosts as $h) {
+		$like = ' LIKE '.sql_quote("%$h%");
+		$where = $condstatut . '('.implode("$like OR ", $champs)."$like)";
+		if (($n=sql_countsel($table, $where))>=$seuil) {
+			// loger les 10 premiers messages concernes pour aider le webmestre
+			$_id = id_table_objet($table);
+			$all = sql_allfetsel($_id, $table, $where, '', '', '0,10');
+			if (function_exists('array_column')) {
+				$all = array_column($all, $_id);
+			} else {
+				$all = array_map('reset', $all);
+			}
+			spip_log("$n liens trouves $like dans table $table (".implode(',', $all).') [champs '.implode(',', $champs).']', 'nospam');
+			return $h;
+		}
+	}
+	return false;
+}
diff --git a/design_system_dependences/nospam/v2.4.4/inc/nospam_encrypt.php b/design_system_dependences/nospam/v2.4.4/inc/nospam_encrypt.php
new file mode 100644
index 0000000000000000000000000000000000000000..b58c97f94dd507adc7cdf85441e4f5648531f259
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/inc/nospam_encrypt.php
@@ -0,0 +1,287 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Calculer une cle prive utilisee pour encoder les names des formulaires
+ * pour etre non predictible,
+ * on utilise un jeton fourni, le path du fichier qui depend du serveur et le secret_du_site()
+ *
+ * @param $jeton
+ * @return string
+ */
+function nospam_private_key($jeton) {
+	static $private_key = [];
+
+	if (empty($private_key[$jeton])) {
+		if (!function_exists('secret_du_site')) {
+			include_spip('inc/securiser_action');
+		}
+
+		$pk = $jeton . ":" . __FILE__ . ":" . secret_du_site();
+
+		if (function_exists('sha1'))
+			$pk = sha1($pk);
+		else
+			$pk = md5($pk);
+		$private_key[$jeton] = pack("H*", $pk);
+	}
+
+	return $private_key[$jeton];
+}
+
+/**
+ * Encoder un name avec un jeton
+ * les names que l'on encode sont prefixes de xx_ avant encodage pour permettre une verif apres decodage
+ * le name encode est lui prefixe de x_, pour eviter d'essayer de decoder brutalement tous les name
+ *
+ * @param string $name
+ * @param string $jeton
+ * @return string
+ */
+function nospam_name_encode($name, $jeton = "") {
+	static $private_key = array();
+	static $encoded = array();
+	if (isset($encoded[$jeton][$name])) {
+		return $encoded[$jeton][$name];
+	}
+
+	if (!$name) {
+		return $name;
+	}
+
+	if (!isset($private_key[$jeton])) {
+		$private_key[$jeton] = nospam_private_key($jeton);
+		if (!function_exists('_xor'))
+			include_spip("inc/filtres");
+	}
+
+	$cname = _xor("xx_$name", $private_key[$jeton]);
+	$cname = base64_encode($cname);
+	$cname = "x_" . rtrim(strtr(base64_encode($cname), '+/', '-_'), '=');
+	return $encoded[$jeton][$name] = $cname;
+}
+
+
+/**
+ * Decoder un name a partir d'un jeton
+ *
+ * @param string $name
+ * @param string $jeton
+ * @return string
+ */
+function nospam_name_decode($name, $jeton = "") {
+	static $private_key = array();
+	static $decoded = array();
+
+	if (isset($decoded[$jeton][$name])) {
+		return $decoded[$jeton][$name];
+	}
+
+	if (!$name) return $name;
+	if (strncmp($name, "x_", 2) !== 0) return $name;
+	if (!isset($private_key[$jeton])) {
+		$private_key[$jeton] = nospam_private_key($jeton);
+		if (!function_exists('_xor'))
+			include_spip("inc/filtres");
+	}
+
+	$cname = substr($name, 2);
+	$cname = base64_decode(str_pad(strtr($cname, '-_', '+/'), strlen($cname) % 4, '=', STR_PAD_RIGHT));
+	$cname = base64_decode($cname);
+	$cname = _xor($cname, $private_key[$jeton]);
+	// si ce n'etait pas un name encode, on retourne le name d'origine
+	if (strncmp($cname, "xx_", 3) !== 0) {
+		spip_log("decodage $name avec jeton $jeton errone ($cname)", 'nospam' . _LOG_ERREUR);
+		return $decoded[$jeton][$name] = $name;
+	}
+
+	return $decoded[$jeton][$name] = substr($cname, 3);
+}
+
+
+/**
+ * encrypter tous les names d'un form
+ * @param string $form
+ * @param bool $preserve_sessions_name
+ *   si false les name commencant par session_ seront aussi encode
+ * @param null|string $jeton
+ * @param string $isbot
+ * @return mixed
+ */
+function nospam_encrypt_form_names($form, $preserve_sessions_name = true, $jeton = null, $isbot = false) {
+	// recuperer toutes les balises input, textarea, select
+	$balises = array_merge(extraire_balises($form, 'input'));
+	foreach ($balises as $k => $b) {
+		if (in_array(extraire_attribut($b, "type"), array("hidden", "file")))
+			unset($balises[$k]);
+	}
+	$balises = array_merge($balises,
+		extraire_balises($form, 'textarea'),
+		extraire_balises($form, 'select'));
+
+	if (is_null($jeton)) {
+		$jeton = "";
+		if (preg_match(",<input type='hidden' name='_jeton' value='([^>]*)' />,Uims", $form, $m))
+			$jeton = $m[1];
+	}
+
+	foreach ($balises as $k => $b) {
+		if ($name = extraire_attribut($b, "name")
+			AND (!$preserve_sessions_name or strncmp($name, "session_", 8) !== 0)) {
+			// cas des truc[chose] : on ne brouille que truc
+			$crypted_name = explode("[", $name);
+			$crypted_name[0] = nospam_name_encode($crypted_name[0], $jeton);
+			$crypted_name = implode("[", $crypted_name);
+			$b_e = inserer_attribut($b, "name", $crypted_name);
+			$form = str_replace($b, $b_e, $form);
+		}
+	}
+
+	if ($isbot) {
+		$form = str_replace(nospam_encrypt_html_hidden(), nospam_encrypt_html_checkbox(), $form);
+	}
+
+	return $form;
+}
+
+function nospam_encrypt_html_hidden() {
+	return "<input type='hidden' name='_nospam_encrypt' value='1' />";
+}
+function nospam_encrypt_html_checkbox() {
+	return "<label class='check_if_nobot'><input type='checkbox' name='_nospam_encrypt' value='1' /> " . _T('nospam:label_je_ne_suis_pas_un_robot') . "</label>";
+}
+
+/**
+ * Verifier/preparer les valeurs sur un formulaire crypte
+ * injecte un _encrypt en hidden, et gere le cas particulier ou l'on cohabite avec les fonctions autosave
+ * @param $valeurs
+ * @param $args
+ * @return array
+ */
+function nospam_encrypt_check_valeurs($valeurs, $args) {
+	$valeurs['_hidden'] .= nospam_encrypt_html_hidden();
+	// recuperer les autosave encryptes si possible
+	if (is_array($valeurs)
+		AND isset($valeurs['_autosave_id'])
+		AND $cle_autosave = $valeurs['_autosave_id']
+		AND include_spip("inc/cvt_autosave")
+		AND function_exists("autosave_clean_value")) {
+
+		$je_suis_poste = $args['je_suis_poste'];
+
+		$cle_autosave = serialize($cle_autosave);
+		$cle_autosave = $args['form'] . "_" . md5($cle_autosave);
+
+		// si on a un backup en session et qu'on est au premier chargement, non poste
+		// on restitue les donnees
+		if (isset($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave])
+			AND !$je_suis_poste) {
+			parse_str($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave], $vars);
+			if (isset($vars['_jeton'])
+				AND $jeton = (string)$vars['_jeton']) {
+				foreach ($vars as $name => $val) {
+					if (($dname = nospam_name_decode($name, $jeton)) !== $name
+						AND isset($valeurs[$dname]))
+						$valeurs[$dname] = (is_string($val) ? autosave_clean_value($val) : array_map('autosave_clean_value', $val));
+				}
+			}
+		}
+	}
+
+	return $valeurs;
+}
+
+/**
+ * Decrypter les name d'un POST (idempotent)
+ *
+ * @param $form
+ *   optionel, on peut se reposer sur formulaire_action pour avoir le nom du form
+ * @return bool|string
+ *   string : message d'erreur
+ *   bool : indique si des names ont ete decodes ou non
+ */
+function nospam_encrypt_decrypt_post($form=null) {
+	if (is_null($form)) {
+		$form = _request('formulaire_action');
+		if (!$form) {
+			spip_log("SPAM_ENCRYPT_NAME active mais pas de formulaire_action pour  utiliser nospam_encrypt_decrypt_post", 'nospam' . _LOG_INFO_IMPORTANTE);
+			#$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
+			#spip_log("Suspect SPAMMEUR (_nospam_encrypt) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
+			return _T('nospam:erreur_jeton');
+		}
+	}
+
+	// si l'encrypt a ete active depuis l'affichage initial de ce form, on rebalance l'erreur technique
+	// pour reforcer un POST
+	// si pas de _nospam_encrypt poste, on refuse la saisie => erreur
+	if (!_request('_nospam_encrypt')) {
+		spip_log("SPAM_ENCRYPT_NAME active mais _nospam_encrypt manquant sur formulaire $form", 'nospam' . _LOG_INFO_IMPORTANTE);
+		$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
+		spip_log("Suspect SPAMMEUR (_nospam_encrypt) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
+		return _T('nospam:erreur_jeton');
+	}
+	if (!$jeton = _request('_jeton')){
+		spip_log("SPAM_ENCRYPT_NAME active mais _jeton manquant sur formulaire $form", 'nospam' . _LOG_INFO_IMPORTANTE);
+		$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
+		spip_log("Suspect SPAMMEUR (_jeton) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
+		return _T('nospam:erreur_jeton');
+	}
+
+	if (!is_scalar($jeton) or !($jeton = (string) $jeton)) {
+		spip_log("SPAM_ENCRYPT_NAME active mais _jeton malformé ou corrompu sur formulaire $form", 'nospam' . _LOG_INFO_IMPORTANTE);
+		$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
+		spip_log("Suspect SPAMMEUR (_jeton) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
+		return _T('nospam:erreur_jeton');
+	}
+
+	$re_verifier = false;
+	foreach ($_POST as $k => $v) {
+		$kd = nospam_name_decode($k, $jeton);
+		if ($kd !== $k and _request($kd) !== $v) {
+			nospam_encrypt_posted($form, $kd, $v);
+			$re_verifier = true;
+		}
+	}
+
+	if ($re_verifier){
+		return true;
+	}
+
+	return false;
+}
+
+/**
+ * Lister les valeurs que l'on a bien recue cryptees pour un formulaire donne
+ * Permet aux formulaires de verifier qu'une valeur critique n'a pas ete postee en clair par un spammeur
+ * * si $key et $value sont fournies, peuple le tableau et fait un set_request en meme temps
+ * @param string $form
+ * @param string $key
+ * @param mixed $value
+ * @return array
+ *   liste des valeurs postees pour ce formulaire
+ */
+function nospam_encrypt_posted($form, $key = null, $value = null) {
+	static $posted = [];
+
+	if (!is_null($key)) {
+		if (!isset($posted[$form])) {
+			$posted[$form] = [];
+		}
+
+		$posted[$form][$key] = $value;
+		set_request($key, $value);
+	}
+
+	return isset($posted[$form]) ? $posted[$form] : [];
+}
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/inclure/nobot.html b/design_system_dependences/nospam/v2.4.4/inclure/nobot.html
new file mode 100644
index 0000000000000000000000000000000000000000..5960e5690d43f124a03e20c0a991587c9d83a92c
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/inclure/nobot.html
@@ -0,0 +1,5 @@
+[(#REM) Piege a robots spammeurs ]
+<[(#ENV{div,'div'})] class="editer saisie_session_email" style="display: none;">
+	<label for="give_me_your_email"><:antispam_champ_vide:></label>
+	<input type="text" class="text email" name="email_nobot" id="give_me_your_email" value="#ENV{email_nobot}" size="10" />
+</[(#ENV{div,'div'})]>
diff --git a/design_system_dependences/nospam/v2.4.4/install.log b/design_system_dependences/nospam/v2.4.4/install.log
new file mode 100644
index 0000000000000000000000000000000000000000..b9729d304c2f6e194a1f1b10a4ce04785c9996bf
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/install.log
@@ -0,0 +1,3 @@
+installation: charger_plugin
+date: 2024-01-16T13:05:55Z
+source: ../tmp/cache/chargeur/v2.4.4-635e01fc-nospam-f85e8-v2.4.3.zip
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam.xml b/design_system_dependences/nospam/v2.4.4/lang/nospam.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c6d5586425a96e6c865b5745b22e9bb9fe8294e6
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam.xml
@@ -0,0 +1,44 @@
+<traduction
+	module="nospam"
+	id="nospam--nospam-ac484"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/nospam.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=ar" total="13" traduits="5" relire="0" modifs="0" nouveaux="8" pourcent="38.46">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+	</langue>
+	<langue code="de" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=de" total="13" traduits="10" relire="0" modifs="0" nouveaux="3" pourcent="76.92">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=en" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Benitron" lien="https://trad.spip.net/auteur/benitron" />
+		<traducteur nom="BoOz" lien="https://trad.spip.net/auteur/booz" />
+		<traducteur nom="jack31" lien="https://trad.spip.net/auteur/jack31" />
+		<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=es" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cerezo" lien="https://trad.spip.net/auteur/cerezo" />
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+	</langue>
+	<langue code="fa" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=fa" total="13" traduits="5" relire="0" modifs="0" nouveaux="8" pourcent="38.46">
+		<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=fr" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=fr_tu" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cerf" lien="https://trad.spip.net/auteur/cerf" />
+		<traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" />
+	</langue>
+	<langue code="it" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=it" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=nl" total="13" traduits="13" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=pt_br" total="13" traduits="10" relire="0" modifs="0" nouveaux="3" pourcent="76.92">
+		<traducteur nom="filipaun" lien="https://trad.spip.net/auteur/filipaun" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/nospam?lang_cible=sk" total="13" traduits="10" relire="0" modifs="0" nouveaux="3" pourcent="76.92">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_ar.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2ef1870b5fff968954b500066163c1a83d8af5f
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_ar.php
@@ -0,0 +1,20 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_jeton' => 'غير قادر على مراعاة رسالتك. أشكركم للإعادة !',
+	'erreur_spam' => 'غير قادر على الأخذ في الاعتبار لرسالتك !',
+	'erreur_spam_doublon' => 'وجود رسالة مماثلة !',
+	'erreur_spam_ip' => 'تعليقات كثيرة جدا هي على حساب الجودة !',
+
+	// F
+	'forum_saisie_texte_info' => 'لتنسيق رسالتك، لا تدعم هذه الاستمارة الا اختصارات SPIP مثل <code>[-&gt;url] {{أسود}} {مائل}&lt;quote&gt; &lt;رموز برمجية&gt;</code> &lt;إطار&gt;</cadre> وعلامات HTML كـ<code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. لإنشاء فقرات، يكفي ترك أسطر فارغة.'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_de.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..50b55cfbbb430fcc7b28caf46bdd95417f247948
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_de.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Bilder sowie die HTML-Attribute <tt>class</tt> und <tt>style</tt> sind verboten.',
+	'erreur_blacklist' => 'Sie wurden auf die Schwarze Liste gesetzt und können keine Beiträge posten..',
+	'erreur_jeton' => 'Ihr Beitrag konnte nicht verarbeitet werden. Bitte posten Sie ihn erneut!',
+	'erreur_spam' => 'Ihr Beitrag kann nicht berücksichtigt werden!',
+	'erreur_spam_doublon' => 'Es existiert bereits ein identischer Beitrag !',
+	'erreur_spam_ip' => 'Zuviele Kommentare sind nicht gut für die Qualität!',
+	'erreur_url_deja_spammee' => 'Dieser Beitrag enthält zuviele Links, die wie SPAM aussehen. Bitte entfernen.',
+
+	// F
+	'forum_saisie_texte_info' => 'Zur Formatierung Ihres Beitrag stehen Ihnen nur folgende SPIP-Tags zur Verfügung: <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> sowie als HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>.',
+
+	// I
+	'info_ip_suspecte' => 'Ihre IP-Adresse setht unter SPAM-Verdacht. Bitte bestätign Sie Ihre guten Absichten.',
+
+	// L
+	'label_message_licite' => 'Dies ist kein mißbräuchlicher Beitrag.'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_en.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fc4588b7c9e405d19013ac9bab58b5a49dc2c65
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_en.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'It is not possible to insert images or use the html attributes <tt>class</tt> or <tt>style</tt>',
+	'erreur_blacklist' => 'You have been blacklisted, you can not post messages anymore.',
+	'erreur_jeton' => 'Unable to process your message. Thank you for resubmitting.',
+	'erreur_spam' => 'Unable to process your message!',
+	'erreur_spam_doublon' => 'An identical message already exists!',
+	'erreur_spam_ip' => 'Too many comments detrimental to the quality!',
+	'erreur_url_deja_spammee' => 'This message contains suspicious links that look like SPAM. Thanks to delete them.',
+
+	// F
+	'forum_saisie_texte_info' => 'For the formatting of your message, this form only accepts SPIP shortcuts <code>[-&gt;url] {{bold}} {italic} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> et le code HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. To create paragraphs, simply leave blank lines.',
+
+	// I
+	'info_alt_antispam' => 'Silent Antispam - no content displayed ',
+	'info_ip_suspecte' => 'Your IP address is suspected to send SPAMs. Thank you to confirm your are not doing so.',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'I’m not a robot. ',
+	'label_message_licite' => 'This is not an abusive post',
+	'libelle_je_ne_suis_pas_un_robot' => 'Click to confirm that you are not a robot '
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_es.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ad09ece4d82f94f553ec78650e1c7814e706430
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_es.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'No está permitido insertar imágenes ni el uso de atributos html <tt>class</tt> ou <tt>style</tt>',
+	'erreur_blacklist' => 'Usted ha sido metido en lista negra, no puede enviar más mensaje.',
+	'erreur_jeton' => 'Su mensaje no ha sido tomado en cuenta. ¡Gracias por enviarlo de nuevo!',
+	'erreur_spam' => '¡Imposible tomar en cuenta su mensaje!',
+	'erreur_spam_doublon' => '¡Un mensaje idéntico ya existe!',
+	'erreur_spam_ip' => '¡Demasiados comentarios perjudiciales para la calidad!',
+	'erreur_url_deja_spammee' => 'Este mensaje contiene enlaces sospechos de ser SPAM. Gracias por eliminarlos.',
+
+	// F
+	'forum_saisie_texte_info' => 'Para aplicar el formato de su mensaje, este formulario no acepta más que los atajos SPIP <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> et le code HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Para crear párrafos, deje simplemente una línea vacía entre los mismos.',
+
+	// I
+	'info_alt_antispam' => 'Antispam silencioso: no se muestra contenido',
+	'info_ip_suspecte' => 'Su dirección IP es sospechosa de generar SPAM. Gracias por confirmar sus buenas intenciones. ',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'No soy un robot',
+	'label_message_licite' => 'Éste no es un mensaje abusivo',
+	'libelle_je_ne_suis_pas_un_robot' => 'Haz clic para confirmar que no eres un robot'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_fa.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..e06a5502cfac01f8f68ab0749de966880f2db92a
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_fa.php
@@ -0,0 +1,20 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_jeton' => 'روي پيام شما نمي‌توان حساب كرد. ممنون مكرر فرماييد!',
+	'erreur_spam' => 'نمي‌توان روي پيام شما حساب كرد!',
+	'erreur_spam_doublon' => 'يك پيام شناخته شده موجود است!',
+	'erreur_spam_ip' => 'نظرات زيادي به زيان كيفيت!',
+
+	// F
+	'forum_saisie_texte_info' => 'اين فرم ميان‌ برهاي اسپيپ  <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code>و  كد اچ.تي.ام.ال را <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code> مي‌پذيرد . براي ساختن پارگراف فقط يك سطر خالي بگذاريد. '
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_fr.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1cfaec88d89db05af9490612f8ae175f9a34054
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_fr.php
@@ -0,0 +1,30 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/nospam.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Il n’est pas permis d’insérer des images ni d’utiliser les attributs html <tt>class</tt> ou <tt>style</tt>',
+	'erreur_blacklist' => 'Vous avez été mis sur liste noire, vous ne pouvez plus poster de message.',
+	'erreur_jeton' => 'Impossible de prendre en compte votre message. Merci de le soumettre à nouveau !',
+	'erreur_spam' => 'Impossible de prendre en compte votre message !',
+	'erreur_spam_doublon' => 'Un message identique existe déjà !',
+	'erreur_spam_ip' => 'Trop de commentaires nuit à la qualité !',
+	'erreur_url_deja_spammee' => 'Ce message contient des liens suspects qui ressemblent à du SPAM. Merci de les retirer.',
+
+	// F
+	'forum_saisie_texte_info' => 'Pour la mise en forme de votre message, ce formulaire n’accepte que les raccourcis SPIP <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> et le code HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Pour créer des paragraphes, laissez simplement des lignes vides.',
+
+	// I
+	'info_alt_antispam' => 'Antispam silencieux - aucun contenu affiché',
+	'info_ip_suspecte' => 'Votre adresse IP est suspectée de procéder à du SPAM. Merci de confirmer votre bonne intention.',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'Je ne suis pas un robot',
+	'label_message_licite' => 'Ceci n’est pas un message abusif',
+	'libelle_je_ne_suis_pas_un_robot' => 'Cliquez pour confirmer que vous n’êtes pas un robot'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_fr_tu.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_fr_tu.php
new file mode 100644
index 0000000000000000000000000000000000000000..51844d854f30ac49d652a3297d7dd436f48854bd
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_fr_tu.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Il n’est pas permis d’insérer des images ni d’utiliser les attributs html <tt>class</tt> ou <tt>style</tt>',
+	'erreur_blacklist' => 'Tu as été mis sur liste noire, tu ne peux plus poster de message.',
+	'erreur_jeton' => 'Impossible de prendre en compte votre message. Merci de le soumettre à nouveau !',
+	'erreur_spam' => 'Impossible de prendre en compte ton message !',
+	'erreur_spam_doublon' => 'Un message identique existe déjà !',
+	'erreur_spam_ip' => 'Trop de commentaires nuit à la qualité !',
+	'erreur_url_deja_spammee' => 'Ce message contient des liens suspects qui ressemblent à du SPAM. Merci de les retirer.',
+
+	// F
+	'forum_saisie_texte_info' => 'Pour la mise en forme de ton message, ce formulaire n’accepte que les raccourcis SPIP <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> et le code HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Pour créer des paragraphes, laisse simplement des lignes vides.',
+
+	// I
+	'info_alt_antispam' => 'Antispam silencieux - aucun contenu affiché',
+	'info_ip_suspecte' => 'Ton adresse IP est suspectée de procéder à du SPAM. Merci de confirmer ta bonne intention.',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'Je ne suis pas un robot',
+	'label_message_licite' => 'Ceci n’est pas un message abusif',
+	'libelle_je_ne_suis_pas_un_robot' => 'Cliques pour confirmer que tu n’es pas un robot'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_it.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_it.php
new file mode 100644
index 0000000000000000000000000000000000000000..7883a6545d159a9dbf0182490e73c34962cb6d25
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_it.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Non è permesso l’inserimento di immagini ne l’utilizzo degli attributi html <tt>class</tt> o <tt>style</tt>',
+	'erreur_blacklist' => 'Sei stato inserito nella lista nera, non puoi più postare messaggi.',
+	'erreur_jeton' => 'Impossibile prendere in considerazione il tuo messaggio; si prega di inviarlo nuovamente!',
+	'erreur_spam' => 'Impossibile prendere in considerazione il tuo messaggio!',
+	'erreur_spam_doublon' => 'Esiste già un messaggio identico!',
+	'erreur_spam_ip' => 'Troppi commenti danneggiano la qualità!',
+	'erreur_url_deja_spammee' => 'Questo messaggio contiene collegamenti sospetti che sembrano SPAM. Si prega di rimuoverli.',
+
+	// F
+	'forum_saisie_texte_info' => 'Per formattare il tuo messaggio, questo modulo accetta solo le scorciatoie SPIP <code>[-&gt;url] {{gras}} {italique} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> ed il codice HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Per creare paragrafi, lascia semplicemente le righe vuote.',
+
+	// I
+	'info_alt_antispam' => 'Antispam silenzioso - nessun contenuto visualizzato',
+	'info_ip_suspecte' => 'Il tuo indirizzo IP è sospettato di diffusione di SPAM. Per favore conferma le tue buone intenzioni.',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'Non sono un robot',
+	'label_message_licite' => 'Questo non è un messaggio offensivo',
+	'libelle_je_ne_suis_pas_un_robot' => 'Clicca per confermare di non essere un robot'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_nl.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb5c3d6d5a7c2816376d38ec2d34e9fd9df0ec2c
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_nl.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'HTML-attributen <tt>class</tt> of <tt>style</tt> zijn niet toegestaan!',
+	'erreur_blacklist' => 'U staat op de zwarte lijst en mag geen verdere berichten plaatsen.',
+	'erreur_jeton' => 'Dit bericht kan niet worden aanvaard. Voer het nogmaals in!',
+	'erreur_spam' => 'Dit bericht kan niet worden aanvaard!',
+	'erreur_spam_doublon' => 'Er bestaat al een identiek bericht!',
+	'erreur_spam_ip' => 'Te veel opmerkingen zijn nadelig voor de kwaliteit!',
+	'erreur_url_deja_spammee' => 'Dit bericht bevat koppelingen die op SPAM lijken. Verwijder ze aub.',
+
+	// F
+	'forum_saisie_texte_info' => 'Dit formulier accepteert alleen SPIP code <code>[-&gt;url] {{vet}} {cursief} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> en HTML code <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Op paragrafen aan te maken, kun je gewoon een paar regels leeg laten.',
+
+	// I
+	'info_alt_antispam' => 'Stille antispam - geen weergave van inhoud',
+	'info_ip_suspecte' => 'Uw IP-adres wordt ervan verdacht SPAM te verzenden. Laat uw goede bedoelingen blijken.',
+
+	// L
+	'label_je_ne_suis_pas_un_robot' => 'Ik ben geen robot',
+	'label_message_licite' => 'Dit is geen verkeerd bericht',
+	'libelle_je_ne_suis_pas_un_robot' => 'Klik om aan te geven dat je geen robot bent'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_pt_br.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..eab13ded73b2ca7ebf147d020c0715ce5edce9ed
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_pt_br.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Não é permitido inserir figuras nem utilizar atributos html <tt>class</tt> ou <tt>style</tt>',
+	'erreur_blacklist' => 'Você foi colocado na lista negra, você não pode mais postar mensagens.',
+	'erreur_jeton' => 'Impossível levar em conta a sua mensagem. Tente novamente!',
+	'erreur_spam' => 'Impossível levar em conta a sua mensagem!',
+	'erreur_spam_doublon' => 'Uma mensagem idêntica já existe!',
+	'erreur_spam_ip' => 'Muitos comentários prejudicam a qualidade!',
+	'erreur_url_deja_spammee' => 'Esta mensagem contem links suspeitos que se parecem com SPAM. Obrigado de os retirar.',
+
+	// F
+	'forum_saisie_texte_info' => 'Para a formatação da sua mensagem, este formulário aceita apenas os atalhos SPIP <code>[-&gt;url] {{negrito}} {itálico} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> e o código HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Para criar parágrafos , deixe simplesmente linhas vazias.',
+
+	// I
+	'info_ip_suspecte' => 'Seu endereço IP é suspeito de realizar SPAM. Obrigado de confirmar a sua boa intenção.',
+
+	// L
+	'label_message_licite' => 'Esta mensagem não é abusiva'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/nospam_sk.php b/design_system_dependences/nospam/v2.4.4/lang/nospam_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..07e079b796d1d54d7f0625d485177faab03e845d
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/nospam_sk.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/nospam?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'erreur_attributs_html_interdits' => 'Nie je povolené vkladať obrázky ani používať atribúty html <tt>class</tt> alebo <tt>style</tt>',
+	'erreur_blacklist' => 'Zaradili vás na čiernu listinu, nemôžete posielať správy.',
+	'erreur_jeton' => 'Vaša správa sa nedá posúdiť. Ďakujeme vám, že ju pošlete znova.',
+	'erreur_spam' => 'Vaša správa sa nedá posúdiť.',
+	'erreur_spam_doublon' => 'Rovnaká správa už existuje!',
+	'erreur_spam_ip' => 'Príliš veľa komentárov znižuje kvalitu!',
+	'erreur_url_deja_spammee' => 'V tejto správe sú podozrivé odkazy, ktoré vyzerajú ako spam. Ďakujeme vám za ich odstránenie.',
+
+	// F
+	'forum_saisie_texte_info' => 'Na formátovanie správy tento formulár akceptuje iba skratky SPIPu <code>[-&gt;url] {{tučné}} {kurzíva} &lt;quote&gt; &lt;code&gt;</code> &lt;cadre&gt;</cadre> a kód HTML <code>&lt;q&gt; &lt;del&gt; &lt;ins&gt;</code>. Ak chcete robiť odseky, jednoducho vynechajte niekoľko prázdnych riadkov.',
+
+	// I
+	'info_ip_suspecte' => 'Vaša IP adresa je podozrivá z vytvárania SPAMU. Ďakujeme, že potvrdíte svoj dobrý úmysel.',
+
+	// L
+	'label_message_licite' => 'Toto nie je nevhodná správa'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam.xml b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fd78d8077173ec8e968ec76c96b088be5689def8
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam.xml
@@ -0,0 +1,36 @@
+<traduction
+	module="paquet-nospam"
+	id="paquet-nospam--nospam-ac484"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/nospam.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=ar" />
+	<langue code="de" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=de">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=en" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=es" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cerezo" lien="https://trad.spip.net/auteur/cerezo" />
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=fr" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=fr_tu" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cerf" lien="https://trad.spip.net/auteur/cerf" />
+		<traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" />
+	</langue>
+	<langue code="it" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=it" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=nl" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=pt_br" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=sk">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_ar.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..4137d374354c8d039c7881e032169f7a69e0085d
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_ar.php
@@ -0,0 +1,14 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'توقف المتطفل! فلتر البريد المزعج في الرسائل ، دون ازعاج لمستخدم صادق.' # MODIF
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_de.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..27436f9a956edf54a25dc90e31804435b700db3a
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_de.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'SPAM stoppen! Ein Filter ohne Nebenwirkungen für ehrliche Nutzer.', # MODIF
+	'nospam_slogan' => 'Begrenzt das SPAM-Risiko in Foren' # MODIF
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_en.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..b23b3f27152ddbac13a3692d9e5ee810521d25e2
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_en.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Stop spam! Filter spam in messages, without nuisance to honest users.',
+	'nospam_slogan' => 'Reduce the risk of spams in the forums'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_es.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..732be7131ff6004829c011f702b01484ecfbefd5
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_es.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => '¡Deja de mandar spam! Filtra el spam en los formularios sin perjudicar a los usuarios honestos.',
+	'nospam_slogan' => 'Limita el riesgo de spams en los foros'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..b678b60acafd74d104d9ae760a9a3ad5fe8e564e
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr.php
@@ -0,0 +1,13 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/nospam.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Halte au spam ! Filtrez les spams dans les formulaires, sans nuisance pour les utilisateurs honnêtes.',
+	'nospam_slogan' => 'Limiter le risque de spams dans les formulaires'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr_tu.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr_tu.php
new file mode 100644
index 0000000000000000000000000000000000000000..4babba0f0c68dd8e9894456f862ebc860dadd15d
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_fr_tu.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Halte au spam ! Filtre les spams dans les formulaires, sans nuisance pour les utilisateurs honnêtes.',
+	'nospam_slogan' => 'Limiter le risque de spams dans les formulaires'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_it.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_it.php
new file mode 100644
index 0000000000000000000000000000000000000000..203bcb65da70cbea8f52e64c2247b0dc6de7af42
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_it.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Ferma lo spam! Filtra lo spam nei messaggi, senza infastidire gli utenti onesti',
+	'nospam_slogan' => 'Limita il rischio spam all’interno dei forum'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_nl.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..db5969b07149d1582f41347843a5a0769740db20
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_nl.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Stop SPAM! Filter berichten in formulieren zonder oprechte gebruikers ermee lastig te vallen.',
+	'nospam_slogan' => 'Beperk het risico van SPAM in formulieren'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_pt_br.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0da6bfacc8bbc6cac425d984ad5116b630bb86e
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_pt_br.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Basta de spam! Filtre os spams nos formulários, sem incomodar os usuários legítimos.',
+	'nospam_slogan' => 'Limitar o risco de spams nos formulários'
+);
diff --git a/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_sk.php b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..598bede9cca93c901474daf0af1ea1a5cbd6ace2
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/lang/paquet-nospam_sk.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-nospam?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// N
+	'nospam_description' => 'Zastavte spam! Filtrujte spam v príspevkoch bez toho, aby ste si pohnevali čestných používateľov.', # MODIF
+	'nospam_slogan' => 'Obmedzí nebezpečenstvo spamov v diskusných fórach' # MODIF
+);
diff --git a/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_ecrire_auteur.php b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_ecrire_auteur.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1b99ea5932b14efc4cfcf43cb0998fa75a15012
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_ecrire_auteur.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Verification supplementaire antispam sur le formulaire_ecrire_auteur
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_verifier_formulaire_ecrire_auteur_dist($flux){
+	$form = $flux['args']['form'];
+	if (!isset($flux['data']['texte_message_auteur'])){
+		include_spip("inc/nospam");
+		include_spip("inc/texte");
+		// regarder si il y a du contenu en dehors des liens !
+		$texte_message_auteur = _request('texte_message_auteur');
+		$caracteres = nospam_compter_caracteres_utiles($texte_message_auteur);
+		if ($caracteres < 10){
+			$flux['data']['texte_message_auteur'] = _T('forum:forum_attention_dix_caracteres');
+			unset($flux['data']['previsu']);
+		}
+		// on analyse le sujet
+		$infos_sujet = nospam_analyser_spams(_request('sujet_message_auteur'));
+		// si un lien dans le sujet = spam !
+		if ($infos_sujet['nombre_liens'] > 0){
+			$flux['data']['sujet_message_auteur'] = _T('nospam:erreur_spam');
+			unset($flux['data']['previsu']);
+		}
+
+		// on analyse le texte
+		$infos_texte = nospam_analyser_spams($texte_message_auteur);
+		if ($infos_texte['nombre_liens'] > 0) {
+			// si un lien a un titre de moins de 3 caracteres = spam !
+			if ($infos_texte['caracteres_texte_lien_min'] < 3) {
+				$flux['data']['texte_message_auteur'] = _T('nospam:erreur_spam');
+			}
+			// si le texte contient plus de trois liens = spam !
+			if ($infos_texte['nombre_liens'] >= 3)
+				$flux['data']['texte_message_auteur'] = _T('nospam:erreur_spam');
+		}
+	}
+
+	return $flux;
+}
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_forum.php b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_forum.php
new file mode 100644
index 0000000000000000000000000000000000000000..02aaaef261a991f01a0d9789d614af290c5a24e8
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_forum.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Verification supplementaire antispam sur le formulaire_forum
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_verifier_formulaire_forum_dist($flux){
+	$form = $flux['args']['form'];
+	if (!isset($flux['data']['texte'])
+		AND $GLOBALS['meta']['forums_texte'] == 'oui'){
+
+		$texte = _request('texte');
+		include_spip("inc/nospam");
+		// regarder si il y a du contenu en dehors des liens !
+		$caracteres = nospam_compter_caracteres_utiles($texte);
+		$min_length = (defined('_FORUM_LONGUEUR_MINI') ? _FORUM_LONGUEUR_MINI : 10);
+		if ($caracteres < $min_length){
+			$flux['data']['texte'] = _T('forum:forum_attention_dix_caracteres');
+		}
+
+		// regarder si il y a du contenu cache
+		if (!isset($flux['data']['texte'])){
+			$infos = nospam_analyser_spams($texte);
+			if (isset($infos['contenu_cache']) AND $infos['contenu_cache']){
+				$flux['data']['texte'] = _T('nospam:erreur_attributs_html_interdits');
+			}
+		}
+
+		// regarder si il y a des liens deja references par des spammeurs
+		if (!isset($flux['data']['texte'])
+		  AND isset($infos['liens'])
+		  AND count($infos['liens'])){
+
+
+			if ($h = nospam_rechercher_presence_liens_spammes($infos['liens'],_SPAM_URL_MAX_OCCURENCES,'spip_forum',array('texte'))){
+				spip_log("Refus message de forum qui contient un lien vers $h","nospam");
+				$flux['data']['texte'] = _T('nospam:erreur_url_deja_spammee');
+			}
+		}
+
+		// on prend en compte la checkbox de confirmation
+		// si le flag en session est bien leve
+		if (_request('notabuse')){
+			session_start();
+			if ($_SESSION['notabuse_check']){
+				unset($_SESSION['notabuse_check']);
+				$_SESSION['notabuse_checked'] = true;
+				// on leve une globale pour la fin de ce hit, a toute fin utile (puisque plus rien en $_SESSION)
+				$GLOBALS['notabuse_checked'] = true;
+			}
+		}
+		if (!count($flux['data'])){
+			if (nospam_check_ip_status($GLOBALS['ip'])!=='ok'){
+				session_start();
+				if (!empty($_SESSION['notabuse_checked'])) {
+					// ok on retire de la session le check qui ne sert qu'une fois
+					unset($_SESSION['notabuse_checked']);
+					// et on laisse passer
+				} else {
+					$flux['data']['texte'] = _T('nospam:info_ip_suspecte')."<br />
+					<span class='choix'>
+					<input type='checkbox' name='notabuse' value='1' id='notabuse'/> <label for='notabuse'>"
+					._T('nospam:label_message_licite')."</label>
+					</span>";
+					$_SESSION['notabuse_check'] = true;
+					spip_log("notabuse_check sur IP ".$GLOBALS['ip'],"nospam");
+				}
+			}
+		}
+
+
+		// si il y a une erreur, pas de previsu, on reste bloque a la premiere etape
+		if (isset($flux['data']['texte'])){
+			unset($flux['data']['previsu']);
+		}
+		// sinon, si on est au moment du post final (confirmation apres previsu => pas de previsu ni d'erreur)
+		// on calcule la "popuparlite de post"
+		elseif(!count($flux['data'])) {
+			$now = $_SERVER['REQUEST_TIME'];
+			// calculer la "popularite" des POST forums et forums avec liens
+			if (!isset($GLOBALS['meta']['nospam_pop_forum_post'])) $GLOBALS['meta']['nospam_pop_forum_post'] = 0;
+			if (!isset($GLOBALS['meta']['nospam_pop_forum_postwlink'])) $GLOBALS['meta']['nospam_pop_forum_postwlink'] = 0;
+			if (!isset($GLOBALS['meta']['nospam_pop_date'])) $GLOBALS['meta']['nospam_pop_date'] = date('Y-m-d H:i:s',$now);
+
+			$duree = max($now-strtotime($GLOBALS['meta']['nospam_pop_date']),1);
+			list($a,$b) = nospam_popularite_constantes($duree);
+			spip_log("Pop forum : $duree, $a, $b","nospam");
+			// decrementer
+			if ($duree>1800){
+				$GLOBALS['meta']['nospam_pop_date'] = date('Y-m-d H:i:s',$now);
+				$GLOBALS['meta']['nospam_pop_forum_post'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_post'])*$a,2);
+				$GLOBALS['meta']['nospam_pop_forum_postwlink'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_postwlink'])*$a,2);
+				spip_log("Pop Decremente : ".$GLOBALS['meta']['nospam_pop_forum_post'].", ".$GLOBALS['meta']['nospam_pop_forum_postwlink'],"nospam");
+			}
+			// incrementer
+			$GLOBALS['meta']['nospam_pop_forum_post']=round(floatval($GLOBALS['meta']['nospam_pop_forum_post'])+$b,2);
+			if (isset($infos['liens']) AND count($infos['liens'])){
+				$GLOBALS['meta']['nospam_pop_forum_postwlink']=round(floatval($GLOBALS['meta']['nospam_pop_forum_postwlink'])+$b,2);
+			}
+			ecrire_meta("nospam_pop_forum_post",$GLOBALS['meta']['nospam_pop_forum_post']);
+			ecrire_meta("nospam_pop_forum_postwlink",$GLOBALS['meta']['nospam_pop_forum_postwlink']);
+			ecrire_meta("nospam_pop_date",$GLOBALS['meta']['nospam_pop_date']);
+			spip_log("Pop Incremente : ".$GLOBALS['meta']['nospam_pop_forum_post'].", ".$GLOBALS['meta']['nospam_pop_forum_postwlink'],"nospam");
+		}
+	}
+
+	return $flux;
+}
+
+//
+// Popularite, modele logarithmique
+//
+function nospam_popularite_constantes($duree){
+	// duree de demi-vie d'une visite dans le calcul de la popularite (en jours)
+	$demivie = 0.5;
+	// periode de reference en jours
+	$periode = 1;
+	// $a est le coefficient d'amortissement depuis la derniere mesure
+	$a = pow(2, - $duree / ($demivie * 24 * 3600));
+	// $b est la constante multiplicative permettant d'avoir
+	// une visite par jour (periode de reference) = un point de popularite
+	// (en regime stationnaire)
+	// or, magie des maths, ca vaut log(2) * duree journee/demi-vie
+	// si la demi-vie n'est pas trop proche de la seconde ;)
+	$b = log(2) * $periode / $demivie;
+
+	return array($a,$b);
+}
diff --git a/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_signature.php b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_signature.php
new file mode 100644
index 0000000000000000000000000000000000000000..4232e95c822ec0e9be6c7c86049a204245313b7d
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/nospam/verifier_formulaire_signature.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Verification supplementaire antispam sur le formulaire_signature
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_verifier_formulaire_signature_dist($flux){
+	$form = $flux['args']['form'];
+	$id_article = $flux['args']['args'][0];
+	$row = sql_fetsel('*', 'spip_petitions', "id_article=".intval($id_article));
+	if ((!isset($flux['data']['message'])) && ($row['message']  == "oui")){
+		include_spip("inc/nospam");
+		include_spip("inc/texte");
+		// regarder si il y a du contenu en dehors des liens !
+		$message = _request('message');
+		// on analyse le texte
+		$infos_texte = nospam_analyser_spams($message);
+		if ($infos_texte['nombre_liens'] > 0) {
+			// si un lien a un titre de moins de 3 caracteres = spam !
+			if ($infos_texte['caracteres_texte_lien_min'] < 3) {
+				$flux['data']['message_erreur'] = _T('nospam:erreur_spam');
+			}
+			// si le texte contient plus de trois liens = spam !
+			if ($infos_texte['nombre_liens'] >= 2)
+				$flux['data']['message_erreur'] = _T('nospam:erreur_spam');
+		}
+	}
+	// S'il y a un lien dans le champ session_nom => spam
+	if (!isset($flux['data']['session_nom'])){
+		include_spip("inc/nospam");
+		$infos_texte = nospam_analyser_spams(_request('session_nom'));
+		if ($infos_texte['nombre_liens'] > 0) {
+			$flux['data']['message_erreur'] = _T('nospam:erreur_spam');
+			spip_log("Lien dans le champ session_nom ".$flux['data']['message_erreur'],'nospam');
+		}
+	}
+	return $flux;
+}
\ No newline at end of file
diff --git a/design_system_dependences/nospam/v2.4.4/nospam_pipelines.php b/design_system_dependences/nospam/v2.4.4/nospam_pipelines.php
new file mode 100644
index 0000000000000000000000000000000000000000..56fc7046321d5990999a1e5d0a9bbe42656399af
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/nospam_pipelines.php
@@ -0,0 +1,523 @@
+<?php
+/**
+ * Plugin No-SPAM
+ * (c) 2008-2019 Cedric Morin Yterium&Nursit
+ * Licence GPL
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+if (!defined('_SPAM_URL_MAX_OCCURENCES')) define('_SPAM_URL_MAX_OCCURENCES', 3);
+if (!defined('_SPAM_ENCRYPT_NAME')) define('_SPAM_ENCRYPT_NAME', false);
+
+/**
+ * Lister les formulaires a prendre en charge contre le SPAM
+ * pour verifier le nobot et le jeton sur un formulaire, l'ajouter a cette liste
+ * par le pipeline nospam_lister_formulaires
+ * @return array
+ */
+function nospam_lister_formulaires() {
+	if (!isset($GLOBALS['formulaires_no_spam']))
+		$GLOBALS['formulaires_no_spam'] = array();
+	$formulaires = array_merge($GLOBALS['formulaires_no_spam'], array('inscription', 'forum', 'ecrire_auteur', 'signature', 'recommander', 'newsletter_subscribe', 'newsletter_unsubscribe'));
+	return pipeline('nospam_lister_formulaires', $formulaires);
+}
+
+/**
+ * Ajouter le champ de formulaire 'nobot' au besoin
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_formulaire_fond($flux) {
+	// determiner le nom du formulaire
+	$form = $flux['args']['form'];
+	if (in_array($form, nospam_lister_formulaires())
+		or !empty($flux['args']['contexte']['_nospam_encrypt'])) {
+		// on ajoute le champ 'nobot' si pas present dans le formulaire
+		nospam_inserer_nobot($flux['data'], $flux['args']['contexte']);
+	}
+	return $flux;
+}
+
+/**
+ * Inserer un champ nobot au hasard dans le form
+ * et crypter tous les name
+ * @param string $texte
+ * @param array $args
+ */
+function nospam_inserer_nobot(&$texte, $args) {
+	if ((false === strpos($texte, 'name="email_nobot"'))
+		AND (false !== $pos = strpos($texte, '</form>'))
+	) {
+		// essayer de s'inserer au hasard entre 2 div/li du form
+		if (preg_match_all(",<(div|li)\b[^>]*class=['\"]editer[^>]*,ims", $texte, $m)
+			AND $i = rand(0, count($m[0]) - 1)
+			AND $p = strpos($texte, $m[0][$i])) {
+			$nobot = recuperer_fond("inclure/nobot", array('email_nobot' => '', 'div' => $m[1][$i]));
+			$texte = substr_replace($texte, $nobot, $p, 0);
+		} // et sinon a la fin juste avant la(les) balise(s) </form>
+		else {
+			$nobot = recuperer_fond("inclure/nobot", array('email_nobot' => ''));
+			$texte = str_replace('</form>', $nobot . '</form>', $texte);
+		}
+	}
+	if (_SPAM_ENCRYPT_NAME
+		or (isset($args['_nospam_encrypt']) and $args['_nospam_encrypt'])) {
+		include_spip('inc/nospam_encrypt');
+		$texte = nospam_encrypt_form_names(
+			$texte,
+			(isset($args['_nospam_encrypt']) and $args['_nospam_encrypt'] === 'all') ? false : true,
+			null,
+			isset($args['_nospam_may_be_bot']) ? $args['_nospam_may_be_bot'] : false
+		);
+	}
+}
+
+
+/**
+ * Ajouter un jeton temporaire lie a l'heure et a l'IP pour limiter la reutilisation possible du formulaire
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_formulaire_charger($flux) {
+	$form = $flux['args']['form'];
+	if ($flux['data']
+		AND is_array($flux['data'])
+		AND (in_array($form, nospam_lister_formulaires()) or !empty($flux['data']['_nospam_encrypt']))
+	) {
+		include_spip("inc/nospam");
+		$jeton = nospam_creer_jeton($form);
+		if (!isset($flux['data']['_hidden'])) {
+			$flux['data']['_hidden'] = "";
+		}
+		$flux['data']['_hidden'] .= "<input type='hidden' name='_jeton' value='$jeton' />";
+		//$flux['data']['_jeton'] = $jeton;
+
+		if (_SPAM_ENCRYPT_NAME
+			or (isset($flux['data']['_nospam_encrypt']) and $flux['data']['_nospam_encrypt'])) {
+			include_spip('inc/nospam_encrypt');
+			$flux['data'] = nospam_encrypt_check_valeurs($flux['data'], $flux['args']);
+			// si on suspecte que c'est un bot on va lui faire cocher une case
+			if (nospam_may_be_bot()) {
+				$flux['data']['_nospam_may_be_bot'] = 1;
+			}
+		}
+	}
+	return $flux;
+}
+
+/**
+ * Decrypter le POST avant appel des verifier si besoin
+ * Si on est appelé ici (SPIP >3.1.5) ça permet d'arriver dans le verifier() avec des name decryptés
+ * et de pas rejouer 2 fois le verifier(), ce qui est plus safe
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_formulaire_receptionner($flux){
+	$form = $flux['args']['form'];
+
+	// y a-t-il des names encryptes a decrypter ?
+	if (_SPAM_ENCRYPT_NAME or _request('_nospam_encrypt')){
+		include_spip("inc/nospam");
+		include_spip("inc/nospam_encrypt");
+
+		// y a-t-il des names encryptes a decrypter ?
+		// si oui on les decrypte avant execution de verifier
+		include_spip("inc/nospam_encrypt");
+		$res = nospam_encrypt_decrypt_post($form);
+
+		// rien a faire selon le resultat, c'est de toute façon rejoué dans verifier() qui catchera les erreurs si besoin
+	}
+
+	return $flux;
+}
+
+/**
+ * Verifier le jeton temporaire lie a l'heure et a l'IP pour limiter la reutilisation possible du formulaire
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_formulaire_verifier($flux) {
+	$form = $flux['args']['form'];
+	if (in_array($form, nospam_lister_formulaires()) or _request('_nospam_encrypt')) {
+		include_spip("inc/nospam");
+
+		$erreur = '';
+		// y a-t-il (encore) des names encryptes a decrypter ?
+		// - soit nospam_formulaire_receptionner() a fait le job et rien a faire ici (retour false)
+		// - soit il y a eu une erreur lors de nospam_formulaire_receptionner() et on va la retrouver ici
+		// - soit on est en SPIP < 3.1.5 et on les decrypte puis on relance la verif complete ()
+		//   - au second coup de verifier() on ne fait rien car nospam_formulaire_receptionner() renvoie false
+		if (_SPAM_ENCRYPT_NAME or _request('_nospam_encrypt')) {
+			include_spip("inc/nospam_encrypt");
+			$res = nospam_encrypt_decrypt_post($form);
+
+			if (is_string($res)) {
+				$erreur = $res;
+			}
+			// si on a decode des champs, il faut relancer toute la chaine de verification et sortir
+			elseif ($res) {
+				$verifier = charger_fonction("verifier", "formulaires/$form/", true);
+				$flux['data'] = pipeline(
+					'formulaire_verifier',
+					array(
+						'args' => array('form' => $form, 'args' => $flux['args']['args']),
+						'data' => $verifier ? call_user_func_array($verifier, $flux['args']['args']) : array())
+				);
+				return $flux;
+			}
+		}
+
+		// pas la peine si on a deja une erreur
+		if (!$erreur) {
+			$jeton = _request('_jeton');
+			if (_request('nobot') // trop facile !
+				OR _request('email_nobot')
+				OR (!nospam_verifier_jeton($jeton, $form))
+			) {
+				if (_request('email_nobot')) {
+					spip_log("form $form:email_nobot rempli: " . _request('email_nobot'), 'nospam' . _LOG_INFO_IMPORTANTE);
+					$erreur = _T('nospam:erreur_jeton');
+				}
+				elseif (_request('nobot')) {
+					spip_log("form $form:nobot rempli: " . _request('email_nobot'), 'nospam' . _LOG_INFO_IMPORTANTE);
+					$erreur = _T('nospam:erreur_jeton');
+				}
+				elseif(!nospam_verifier_jeton($jeton, $form)) {
+					spip_log("form $form:jeton incorrect: $jeton", 'nospam' . _LOG_INFO_IMPORTANTE);
+					#spip_log('pas de jeton pour '.var_export($flux,true),'nospam' . _LOG_DEBUG);
+					$erreur = _T('nospam:erreur_jeton');
+				}
+			}
+		}
+
+		if ($erreur) {
+			if (!isset($flux['data']['message_erreur'])) {
+				$flux['data']['message_erreur'] = '';
+			}
+			$flux['data']['message_erreur'] .= $erreur;
+
+			if ($form === 'forum') {
+				unset($flux['data']['previsu']);
+			}
+		}
+
+
+		// pas la peine de filtrer les contenus postés par un admin
+		if (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut'] !== '0minirezo') {
+			if ($verifier_formulaire = charger_fonction("verifier_formulaire_$form", "nospam", true)) {
+				$flux = $verifier_formulaire($flux);
+				// recuperation de la liste des IPs blacklist/greylist
+				// async si on renvoie la previsu ou si erreur
+				$async = false;
+				if (count($flux['data']))
+					$async = true;
+				nospam_update_ip_list($async);
+			}
+		}
+	}
+	return $flux;
+}
+
+/**
+ * Au moment de decider du statut d'un forum,
+ * quelques verifications et une moderation si necessaire !
+ *
+ * @param array $flux
+ * @return array
+ */
+function nospam_pre_edition($flux) {
+	if ($flux['args']['table'] == 'spip_forum'
+		AND $flux['args']['action'] == 'instituer'
+	) {
+
+		// ne pas publier automatiquement certains messages suspects ...
+		// sauf si le posteur a de toute facon le pouvoir de moderer et de se publier
+		include_spip('inc/autoriser');
+		if (
+			!empty($flux['data']['statut'])
+			and in_array($flux['data']['statut'], array('prop', 'publie'))
+			and (!isset($GLOBALS['visiteur_session']['statut']) OR !autoriser('modererforum'))
+		) {
+			// verifier le status de cette IP
+			nospam_check_ip_status($GLOBALS['ip']);
+
+			$email = strlen($flux['data']['email_auteur']) ? " OR email_auteur=" . sql_quote($flux['data']['email_auteur']) : "";
+			$spammeur_connu = (!isset($GLOBALS['visiteur_session']['statut'])
+				AND (
+					isset($GLOBALS['ip_greylist'][$GLOBALS['ip']])
+					OR isset($GLOBALS['ip_blacklist'][$GLOBALS['ip']])
+					OR sql_countsel('spip_forum', '(ip=' . sql_quote($GLOBALS['ip']) . "$email) AND statut='spam'") > 0
+				)
+			);
+
+			// activer aussi le flag spammeur connu en cas de flood, meme si aucune detection spam jusqu'ici
+			// on sera plus severe sur les liens dans ce cas
+			// cas du spammeur qui envoie que des messages a 3 liens a haute frequence (passe a travers tous les filtres)
+			// au bout du 5e message en <10min ou 10e en <30min on va moderer tout message avec un lien
+			if (!$spammeur_connu) {
+				if (($nb = sql_countsel('spip_forum', '(ip=' . sql_quote($GLOBALS['ip']) . $email . ') AND ' . nospam_sql_date_proche('date_heure', '-30', 'minute'))) >= 7) {
+					spip_log("[Flood] $nb message pour (ip=" . $GLOBALS['ip'] . "$email) dans les 30 dernieres minutes", 'nospam');
+					$spammeur_connu = true;
+				}
+			}
+			if (!$spammeur_connu) {
+				if (($nb = sql_countsel('spip_forum', '(ip=' . sql_quote($GLOBALS['ip']) . $email . ') AND ' . nospam_sql_date_proche('date_heure', '-10', 'minute'))) >= 3) {
+					spip_log("[Flood] $nb message pour (ip=" . $GLOBALS['ip'] . "$email) dans les 10 dernieres minutes", 'nospam');
+					$spammeur_connu = true;
+				}
+			}
+
+			$lang_suspecte = false;
+			// si c'est un spammeur connu,
+			// verifier que cette ip n'en est pas a son N-ieme spam en peu de temps
+			// a partir d'un moment on refuse carrement le spam massif, le posteur devra attendre pour reposter
+			if ($spammeur_connu) {
+				// plus de 30 spams dans les dernieres 2h, faut se calmer ...
+				// ou plus de 10 spams dans la dernieres 1h, faut se calmer ...
+				// ou IP blacklistee et plus de 5 messages prop/spam dans les dernieres 48h, faut se calmer ...
+				if (
+					(isset($GLOBALS['ip_blacklist'][$GLOBALS['ip']])
+						AND ($nb = sql_countsel('spip_forum', sql_in('statut', array('spam')) . ' AND (ip=' . sql_quote($GLOBALS['ip']) . ') AND ' . nospam_sql_date_proche('date_heure', '-48', 'hour'))) >= 5
+						AND $h = 48
+					)
+					OR
+					(($nb = sql_countsel('spip_forum', 'statut=\'spam\' AND (ip=' . sql_quote($GLOBALS['ip']) . $email . ') AND ' . nospam_sql_date_proche('date_heure', '-120', 'minute'))) >= 30
+						AND $h = 2)
+					OR
+					(($nb = sql_countsel('spip_forum', 'statut=\'spam\' AND (ip=' . sql_quote($GLOBALS['ip']) . $email . ') AND ' . nospam_sql_date_proche('date_heure', '-60', 'minute'))) >= 10
+						AND $h = 1)
+				) {
+					$flux['data']['statut'] = ''; // on n'en veut pas !
+					spip_log("[Refuse] $nb spam pour (ip=" . $GLOBALS['ip'] . "$email) dans les $h dernieres heures", 'nospam');
+					return $flux;
+				}
+				spip_log("POST *suspect* spammeur_connu", "nospam");
+			}
+			// sinon regarder si l'objet a une langue, et si le post est dans la meme langue ou non
+			// en cas de langue differente, on se mefie
+			else {
+				$lang_objet = ($GLOBALS['spip_lang'] ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']);
+				if ($flux['data']['objet']) {
+					$table = table_objet_sql($flux['data']['objet']);
+					$trouver_table = charger_fonction("trouver_table", "base");
+					if ($desc = $trouver_table($table)
+						AND isset($desc['field']['lang'])) {
+						$primary = id_table_objet($flux['data']['objet']);
+						$lang_objet = sql_getfetsel("lang", $table, "$primary=" . intval($flux['data']['id_objet']));
+					}
+				}
+				include_spip("inc/detecter_langue");
+				$lang_post = _detecter_langue($flux['data']['texte']);
+				if ($lang_post !== $lang_objet)
+					$lang_suspecte = true;
+				spip_log("POST " . ($lang_suspecte ? "*suspect* " : "") . "en langue [$lang_post] sur $primary=" . $flux['data']['id_objet'] . " en langue [$lang_objet]", "nospam");
+			}
+
+			// si c'est un message bourre de liens, on le modere
+			// le seuil varie selon le champ et le fait que le spammeur est deja connu ou non
+			$seuils = array(
+				// seuils par defaut
+				0 => array(
+					0 => array(1 => 'prop', 3 => 'spam'), // seuils par defaut
+					'url_site' => array(2 => 'spam'), // 2 liens dans le champ url, c'est vraiment louche
+					'texte' => array(4 => 'prop', 20 => 'spam') // pour le champ texte
+				),
+				// seuils severises pour les suspects : modere en prop des qu'il y a un lien, spam si plus de 5
+				'suspect' => array(
+					0 => array(1 => 'spam'),
+					'url_site' => array(2 => 'spam'), // 2 liens dans le champ url, c'est vraiment louche
+					'texte' => array(1 => 'prop', 5 => 'spam')
+				),
+				// seuils pour les blacklist : si pas de lien on passe en prop par precaution, sinon en spam
+				'blacklist' => array(
+					0 => array(1 => 'spam'),
+					'url_site' => array(2 => 'spam'), // 2 liens dans le champ url, c'est vraiment louche
+					'texte' => array(0 => 'prop', 1 => 'spam')
+				)
+			);
+
+			$seuils = isset($GLOBALS['ip_blacklist'][$GLOBALS['ip']]) ? $seuils['blacklist'] : (($spammeur_connu OR $lang_suspecte) ? $seuils['suspect'] : $seuils[0]);
+			include_spip("inc/nospam"); // pour nospam_analyser_spams()
+			foreach ($flux['data'] as $champ => $valeur) {
+				$infos = nospam_analyser_spams($valeur);
+				if ($infos['contenu_cache']) {
+					// s'il y a du contenu caché avec des styles => spam direct
+					$flux['data']['statut'] = 'spam';
+					spip_log("\t" . $flux['data']['auteur'] . "\t" . $GLOBALS['ip'] . "\t" . "requalifié en spam car contenu cache", 'nospam');
+				} elseif ($infos['nombre_liens'] > 0) {
+					// si un lien a un titre de moins de 3 caracteres, c'est louche...
+					if ($infos['caracteres_texte_lien_min'] < 3) {
+						$flux['data']['statut'] = 'prop'; // en dur en attendant une idee plus generique
+						spip_log("\t" . $flux['data']['auteur'] . "\t" . $GLOBALS['ip'] . "\t" . "requalifié en prop car moins de 3car hors liens", 'nospam');
+					}
+
+					if (isset($seuils[$champ]))
+						$seuil = $seuils[$champ];
+					else
+						$seuil = $seuils[0];
+
+					foreach ($seuil as $s => $stat)
+						if ($infos['nombre_liens'] >= $s) {
+							$flux['data']['statut'] = $stat;
+							spip_log("\t" . $flux['data']['auteur'] . "\t" . $GLOBALS['ip'] . "\t" . "requalifié en " . $stat . " car nombre_liens >= " . $s, 'nospam');
+						}
+
+					if ($flux['data']['statut'] != 'spam') {
+						$champs = array_unique(array('texte', $champ));
+						if ($h = nospam_rechercher_presence_liens_spammes($infos['liens'], _SPAM_URL_MAX_OCCURENCES, 'spip_forum', $champs)) {
+							$flux['data']['statut'] = 'spam';
+							spip_log("\t" . $flux['data']['auteur'] . "\t" . $GLOBALS['ip'] . "\t" . "requalifié en spam car lien $h deja dans un spam", 'nospam');
+						}
+					}
+				}
+			}
+
+
+			// verifier qu'un message identique n'a pas ete publie il y a peu
+			if ($flux['data']['statut'] != 'spam') {
+				if (sql_countsel('spip_forum', 'texte=' . sql_quote($flux['data']['texte']) . " AND statut IN ('publie','off','spam')") > 0) {
+					$flux['data']['statut'] = 'spam';
+					spip_log("\t" . $flux['data']['auteur'] . "\t" . $GLOBALS['ip'] . "\t" . "requalifié en spam car message identique deja existant", 'nospam');
+				}
+			}
+			// verifier que cette ip n'en est pas a son N-ieme post en peu de temps
+			// plus de 5 messages en 5 minutes c'est suspect ...
+			if ($flux['data']['statut'] != 'spam') {
+				if (($nb = sql_countsel('spip_forum', 'ip=' . sql_quote($GLOBALS['ip']) . ' AND ' . nospam_sql_date_proche('date_heure', '-5', 'minute'))) >= 5) {
+					$flux['data']['statut'] = 'spam';
+					spip_log("[Flood2] $nb message pour (ip=" . $GLOBALS['ip'] . "$email) dans les 5 dernieres minutes : requalif en spam", 'nospam');
+				}
+			}
+		}
+	}
+	return $flux;
+}
+
+/**
+ * @param $champ
+ * @param $interval
+ * @param $unite
+ * @return string
+ */
+function nospam_sql_date_proche($champ, $interval, $unite) {
+	if (function_exists("sql_date_proche"))
+		return sql_date_proche($champ, $interval, $unite);
+
+	return '('
+		. $champ
+		. (($interval <= 0) ? '>' : '<')
+		. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
+		. '('
+		. sql_quote(date('Y-m-d H:i:s'))
+		. ', INTERVAL '
+		. (($interval > 0) ? $interval : (0 - $interval))
+		. ' '
+		. $unite
+		. '))';
+}
+
+
+/**
+ * Fermer la connexion pour que le visiteur n'attende pas apres le curl sur nospam.spip.net
+ * @param $content
+ * @return mixed
+ */
+function nospam_flush_close($content) {
+	header("Content-Length: " . ($l = ob_get_length()));
+	header("Connection: close");
+	return $content;
+}
+
+/**
+ * Flusher et lancer l'update de la liste des ip
+ */
+function nospam_flush_and_update() {
+	chdir(_ROOT_CWD); // securite en cas de register_shutdown_function
+	// forcer le flush des tampons pas envoyes (declenche le content-length/conection:close envoye dans cache_cool_flush)
+	$flush_level = ob_get_level();
+	while ($flush_level--) ob_end_flush();
+	flush();
+	if (function_exists('fastcgi_finish_request'))
+		fastcgi_finish_request();
+	nospam_update_ip_list();
+}
+
+if (!defined('_NOSPAM_IP_LIST_CACHE')) define('_NOSPAM_IP_LIST_CACHE', 3600);
+
+/**
+ * Recuperer la liste des IP black ou grey sur nospam.spip.net
+ * si on a pas une liste a jour
+ * et la stocker dans un fichier
+ * @param bool $async
+ */
+function nospam_update_ip_list($async = false) {
+	$file = _DIR_TMP . "nospam_ip_list.txt";
+	if (file_exists($file) AND filemtime($file) > time() - _NOSPAM_IP_LIST_CACHE)
+		return;
+	spip_log("nospam_update_ip_list:$async", "nospam");
+
+	if ($async) {
+		// indiquer de fermer la connexion dans la foulee
+		// pour faire le hit de recuperation async hors temps d'attente
+		ob_start("nospam_flush_close");
+		register_shutdown_function("nospam_flush_and_update");
+		return;
+	}
+
+	// on fait d'abord un touch car si le recuperer_url echoue (hebergeurs qui interdisent)
+	// on ne veut pas recommencer plein de fois de suite
+	@touch($file);
+	$url_api = "http://nospam.spip.net/spamsignal.api/list";
+	include_spip("inc/distant");
+	include_spip("inc/json");
+	$res = recuperer_url($url_api);
+	$res = isset($res['page']) ? $res['page'] : null;
+	if (!$res AND file_exists($f = _DIR_TMP . "spamsignal-api-list.txt"))
+		lire_fichier($f, $res);
+	if ($res
+		AND function_exists("json_decode")
+		AND $liste = json_decode($res, true)) {
+		ecrire_fichier($file, serialize($liste));
+	}
+}
+
+/**
+ * Verifier le status d'une IP et la noter dans la globale ip_blacklist ou ip_greylist si c'est une IP louche
+ * @param $ip
+ * @return string
+ *   ok|grey|black
+ */
+function nospam_check_ip_status($ip) {
+	$file = _DIR_TMP . "nospam_ip_list.txt";
+	if (!file_exists($file) OR filemtime($file) < time() - 2 * _NOSPAM_IP_LIST_CACHE)
+		return;
+
+	lire_fichier($file, $liste);
+	spip_log("nospam_check_ip_status:$ip", "nospam");
+	if ($liste = unserialize($liste)) {
+		#spip_log($liste,"nospam");
+		$now = date('Y-m-d H:i:s');
+		$ip_family = preg_replace(",([.:])[^.:]+$,", "$1*", $ip);
+		spip_log("ip $ip famille $ip_family", "nospam");
+		foreach (array("blacklist", "greylist") AS $l) {
+			if (isset($liste[$l][$ip])
+				AND $liste[$l][$ip] > $now) {
+				$GLOBALS['ip_' . $l][$ip] = true;
+				spip_log("$ip ajoute a ip_$l", "nospam");
+				return ($l == "blacklist" ? "black" : "grey");
+			}
+			if (isset($liste[$l][$ip_family])
+				AND $liste[$l][$ip_family] > $now) {
+				$GLOBALS['ip_' . $l][$ip] = true;
+				spip_log("$ip ajoute a ip_$l (famille $ip_family)", "nospam");
+				return ($l == "blacklist" ? "black" : "grey");
+			}
+		}
+	}
+	return "ok";
+}
diff --git a/design_system_dependences/nospam/v2.4.4/paquet.xml b/design_system_dependences/nospam/v2.4.4/paquet.xml
new file mode 100644
index 0000000000000000000000000000000000000000..09918c4999be83a545df2c020edb180418facb70
--- /dev/null
+++ b/design_system_dependences/nospam/v2.4.4/paquet.xml
@@ -0,0 +1,26 @@
+<paquet
+	prefix="nospam"
+	categorie="performance"
+	version="2.4.4"
+	etat="stable"
+	compatibilite="[3.1.0;4.2.*]"
+	logo="images/nospam-64.png"
+	documentation="https://contrib.spip.net/NoSPAM,1165"
+>
+
+	<nom>NoSPAM</nom>
+	<!-- Limiter le risque de spams dans les forums -->
+
+	<auteur lien="https://www.yterium.net">Yterium</auteur>
+
+	<copyright>2008</copyright>
+
+	<licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
+
+	<pipeline nom="pre_edition" inclure="nospam_pipelines.php" />
+	<pipeline nom="formulaire_fond" inclure="nospam_pipelines.php" />
+	<pipeline nom="formulaire_charger" inclure="nospam_pipelines.php" />
+	<pipeline nom="formulaire_receptionner" inclure="nospam_pipelines.php" />
+	<pipeline nom="formulaire_verifier" inclure="nospam_pipelines.php" />
+	<pipeline nom="nospam_lister_formulaires" action="" />
+</paquet>
diff --git a/design_system_dependences/pages/.ok b/design_system_dependences/pages/.ok
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/pages/v2.0.1/CHANGELOG.md b/design_system_dependences/pages/v2.0.1/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..22ffcf92d8d4902668ecebaba8272c8b3787a661
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Changelog
+
+## 2.0.1 - 2024-01-06
+
+### Fixed
+
+- #12 Correction de l’ergonomie du bouton pour changer l'identifiant de la page
+
+### Added
+
+- Ajout d'un CHANGELOG et d'un README
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/README.md b/design_system_dependences/pages/v2.0.1/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..054d6c344d20cd03fd920fa486d3a6fe1a216e52
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/README.md
@@ -0,0 +1,7 @@
+# Pages uniques
+
+Ce plugin permet de créer des articles qui ne sont pas rattachés à des rubriques.
+
+## Documentation
+
+https://contrib.spip.net/2923
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/action/generer_pages_uniques_utiles.php b/design_system_dependences/pages/v2.0.1/action/generer_pages_uniques_utiles.php
new file mode 100644
index 0000000000000000000000000000000000000000..f466a8e050074f9c21ea5c7c8b059c807a052cec
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/action/generer_pages_uniques_utiles.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Action : générer des pages uniques utiles
+ *
+ * Ne génère QUE les pages déclarées via le pipeline pages_uniques_utiles.
+ *
+ * @plugin     Pages
+ * @copyright  2013-2019
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Pipelines
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function action_generer_pages_uniques_utiles_dist($arg = null) {
+	include_spip('pages_fonctions');
+	include_spip('action/editer_objet');
+
+	if (is_null($arg)) {
+		$securiser_action = charger_fonction('securiser_action', 'inc');
+		$arg = $securiser_action();
+	}
+
+	$page = trim($arg);
+	$pages_utiles = pages_uniques_utiles();
+
+	// S'il y a un identifiant précis on ne garde que celui-là
+	if ($page) {
+		$pages_utiles = array_intersect_key($pages_utiles, array($page => 'oui'));
+	}
+
+	// On génère chaque page qui reste
+	foreach ($pages_utiles as $page => $titre) {
+		$set = array(
+			'page'  => $page,
+			'titre' => $titre,
+		);
+		objet_inserer('article', -1, $set);
+	}
+}
diff --git a/design_system_dependences/pages/v2.0.1/base/pages_tables.php b/design_system_dependences/pages/v2.0.1/base/pages_tables.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f509f1ca41548dc41e325628a268f2f51ff9300
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/base/pages_tables.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Déclarer le champ supplémentaire sur spip_articles
+ *
+ * @plugin     Pages Uniques
+ * @copyright  2013
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Pipelines
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function pages_declarer_tables_objets_sql($tables) {
+	$tables['spip_articles']['field']['page'] = "VARCHAR(255) DEFAULT '' NOT NULL";
+	return $tables;
+}
diff --git a/design_system_dependences/pages/v2.0.1/content/articles-resume.html b/design_system_dependences/pages/v2.0.1/content/articles-resume.html
new file mode 100644
index 0000000000000000000000000000000000000000..3f6f251c03d4c3d7612d36eb4ba6858d310c498a
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/content/articles-resume.html
@@ -0,0 +1,12 @@
+<B_articles>
+<div class="liste resume articles">
+	#ANCRE_PAGINATION
+	<h2 class="h2">[(#ENV{titre,<:derniers_articles:>})]</h2>
+	<ul class="liste-items">
+		<BOUCLE_articles(ARTICLES){id_rubrique?} {id_rubrique >= 0} {!par date} {pagination #ENV{nb,5}}>
+		#INCLURE{fond=inclure/article-resume,id_article}
+		</BOUCLE_articles>
+	</ul>
+	[<nav class="pagination">(#PAGINATION)</nav>]
+</div>
+</B_articles>
diff --git a/design_system_dependences/pages/v2.0.1/demo/inc-articles.html b/design_system_dependences/pages/v2.0.1/demo/inc-articles.html
new file mode 100644
index 0000000000000000000000000000000000000000..f7cbd774a09838be2faae8532b3dc34c478a8cb8
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/demo/inc-articles.html
@@ -0,0 +1,10 @@
+<B_articles>
+<ul>
+<BOUCLE_articles(ARTICLES) {id_article?}{id_rubrique?}{where?}{statut?}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_articles>
+</ul>
+</B_articles>
+	<p>Aucun article</p>
+<//B_articles>
+<br />
diff --git a/design_system_dependences/pages/v2.0.1/demo/inc-pages.html b/design_system_dependences/pages/v2.0.1/demo/inc-pages.html
new file mode 100644
index 0000000000000000000000000000000000000000..5ca36b6c92c6baef8e79edc25e5298931b73ff12
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/demo/inc-pages.html
@@ -0,0 +1,11 @@
+<B_articles>
+    Parametre type_de_page = #ENV{type_de_page}<br />
+<ul>
+<BOUCLE_articles(ARTICLES) {page=#ENV{type_de_page}}{statut?}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_articles>
+</ul>
+</B_articles>
+	<p>Aucun article</p>
+<//B_articles>
+<br />
diff --git a/design_system_dependences/pages/v2.0.1/demo/pages.html b/design_system_dependences/pages/v2.0.1/demo/pages.html
new file mode 100644
index 0000000000000000000000000000000000000000..99f7965a0a9b9cd22b9426b9bc6e94e8663e3993
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/demo/pages.html
@@ -0,0 +1,137 @@
+<h1>BOUCLES ARTICLES AVEC INCLURE inc-pages</h1>
+<h2>BOUCLE -> article : inclure type_de_page=mentions_legales</h2>
+<INCLURE{fond=demo/inc-pages,
+    type_de_page=mentions_legales,
+	env} />
+<br />
+
+
+<h1>BOUCLES PAGES UNIQUES</h1>
+<h2>BOUCLE_p1(ARTICLES) {page=mentions_legales}{id_rubrique=-1}</h2>
+<B_p1>
+<ul>
+<BOUCLE_p1(ARTICLES) {page=mentions_legales}{id_rubrique=-1}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p1>
+</ul>
+</B_p1>
+	<p>Aucun article</p>
+<//B_p1>
+<br />
+
+<h2>BOUCLE_p2(ARTICLES) {page?}</h2>
+<B_p2>
+<ul>
+<BOUCLE_p2(ARTICLES) {page?}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p2>
+</ul>
+</B_p2>
+	<p>Aucun article</p>
+<//B_p2>
+<br />
+
+<h2>BOUCLE_p3(ARTICLES) {page}</h2>
+<B_p3>
+<ul>
+<BOUCLE_p3(ARTICLES) {page}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p3>
+</ul>
+</B_p3>
+	<p>Aucun article</p>
+<//B_p3>
+<br />
+
+<h2>BOUCLE_p4(ARTICLES){id_rubrique<0}</h2>
+<B_p4>
+<ul>
+<BOUCLE_p4(ARTICLES){id_rubrique<0}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p4>
+</ul>
+</B_p4>
+	<p>Aucun article</p>
+<//B_p4>
+<br />
+
+<h2>BOUCLE_p5(ARTICLES){id_rubrique=-1}</h2>
+<B_p5>
+<ul>
+<BOUCLE_p5(ARTICLES){id_rubrique=-1}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p5>
+</ul>
+</B_p5>
+	<p>Aucun article</p>
+<//B_p5>
+<br />
+
+<h2>BOUCLE_p6(ARTICLES){id_rubrique=-1}{statut?}</h2>
+<B_p6>
+<ul>
+<BOUCLE_p6(ARTICLES){id_rubrique=-1}{statut?}>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_p6>
+</ul>
+</B_p6>
+	<p>Aucun article</p>
+<//B_p6>
+<br />
+
+
+<h1>BOUCLES ARTICLES SANS INCLURE</h1>
+<h2>BOUCLE_a1(ARTICLES)</h2>
+<B_a1>
+<ul>
+<BOUCLE_a1(ARTICLES)>
+	<li>=> #ID_ARTICLE - #TITRE \(#STATUT\)</li>
+</BOUCLE_a1>
+</ul>
+</B_a1>
+	<p>Aucun article</p>
+<//B_a1>
+<br />
+
+<h2>BOUCLE_a2(ARTICLES){id_rubrique=2}</h2>
+<B_a2>
+<ul>
+<BOUCLE_a2(ARTICLES){id_rubrique=2}>
+	<li>=> #ID_ARTICLE - #TITRE</li>
+</BOUCLE_a2>
+</ul>
+</B_a2>
+	<p>Aucun article</p>
+<//B_a2>
+<br />
+
+<h2>BOUCLE_a2(ARTICLES){page=''}</h2>
+<B_a3>
+<ul>
+<BOUCLE_a3(ARTICLES){page=''}>
+	<li>=> #ID_ARTICLE - #TITRE</li>
+</BOUCLE_a3>
+</ul>
+</B_a3>
+	<p>Aucun article</p>
+<//B_a3>
+<br />
+
+
+<h1>BOUCLES ARTICLES AVEC INCLURE inc-articles</h1>
+<h2>BOUCLE -> article : inclure rubrique=1</h2>
+<INCLURE{fond=demo/inc-articles,
+	id_rubrique=1,
+	env} />
+<br />
+
+<h2>BOUCLE -> article : inclure rubrique=2</h2>
+<INCLURE{fond=demo/inc-articles,
+	id_rubrique=2,
+	env} />
+<br />
+
+<h2>BOUCLE -> article : aucun parametre</h2>
+<INCLURE{fond=demo/inc-articles,
+	env} />
+<br />
diff --git a/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.html b/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..000611540736624b5f2eef5e4ae500083967a5e2
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.html
@@ -0,0 +1,40 @@
+<div class="formulaire_spip formulaire_dater formulaire_#FORM formulaire_#FORM-#ENV{objet}-#ENV{id,nouveau}">
+	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+	[(#ENV{editable})
+	<form method='post' action='#ENV{action}'><div>
+		[(#REM) declarer les hidden qui declencheront le service du formulaire
+		parametre : url d'action ]
+		#ACTION_FORMULAIRE{#ENV{action}}
+	]
+		<ul class="editer-groupe">
+			#SET{name,champ_page} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{obli,''}
+			<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+				<label for="champ_#GET{name}"><:pages:label_champ_page:></label>
+				[<span class="erreur_message">(#GET{erreurs})</span>]
+				<span[ (#ENV{#GET{name}}|oui)class="affiche"][(#ENV{_saisie_en_cours}|oui)style="display:none;"]>
+					[(#ENV{#GET{name}}|sinon{<em><:pagesbis:info_aucun_champ_page:></em>})]
+				</span>
+	[(#ENV{editable})
+				<span class="toggle_box_link"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>
+					<a href="#" class="btn btn_secondaire btn_mini"
+						onclick="var f=jQuery(this).parents('form').eq(0);f.find('li .input').show('fast').siblings('span').hide('fast');f.find('.boutons').show('fast');f.find('input.page').eq(0).focus();return false;"><:bouton_changer:></a>
+				</span>
+				<span class="input"[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
+					<input type="text" class="text page" name="#GET{name}" id="champ_#GET{name}" value="#ENV{#GET{name}}" size="40"/>
+				</span>
+	]
+			</li>
+		</ul>
+	[(#ENV{editable})
+	[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+	<!--extra-->
+	<p class='boutons'[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
+			<span class='image_loading'>&nbsp;</span>
+			<input type='submit' class='over' name='changer' value='<:bouton_changer:>' />
+			<input type='submit' class='submit' name='annuler' value='<:bouton_annuler:>' />
+			<input type='submit' class='submit' name='changer' value='<:bouton_changer:>' />
+		</p>
+	</div></form>
+	]
+</div>
diff --git a/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.php b/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.php
new file mode 100644
index 0000000000000000000000000000000000000000..fcca1309ec428992f2d6b8d5e89a73f2b2ffa1db
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/formulaires/editer_identifiant_page.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Editer l'identifiant page d'un article
+ *
+ * @plugin     Pages Uniques
+ * @copyright  2013
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Formulaires
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function formulaires_editer_identifiant_page_charger($id_article, $retour = '') {
+	$valeurs = array();
+	$valeurs['champ_page'] = generer_info_entite($id_article, 'article', 'page');
+	$valeurs['_saisie_en_cours'] = (_request('champ_page') !== null);
+	return $valeurs;
+}
+
+/**
+ * Identifier le formulaire en faisant abstraction des parametres qui
+ * ne representent pas l'objet edite
+ */
+function formulaires_editer_identifiant_page_identifier_dist($id_article, $retour = '') {
+	return serialize(array('article', $id_article));
+}
+
+/**
+ * Verification avant traitement
+ *
+ * @param integer $id_article
+ * @param string $retour
+ * @return array Tableau des erreurs
+ */
+function formulaires_editer_identifiant_page_verifier_dist($id_article, $retour = '') {
+	$erreurs = array();
+	return $erreurs;
+}
+
+/**
+ * Traitement
+ *
+ * @param integer $id_article
+ * @param string $retour
+ * @return array
+ */
+function formulaires_editer_identifiant_page_traiter_dist($id_article, $retour = '') {
+	$res = array();
+	if (
+		_request('changer')
+		and $page = _request('champ_page')
+	) {
+		include_spip('action/editer_objet');
+		objet_modifier('article', $id_article, array('page' => $page));
+	}
+
+	set_request('champ_page');
+	$res['editable'] = true;
+	if ($retour) {
+		$res['redirect'] = $retour;
+	}
+
+	return $res;
+}
diff --git a/design_system_dependences/pages/v2.0.1/formulaires/selecteur/navigateur.html b/design_system_dependences/pages/v2.0.1/formulaires/selecteur/navigateur.html
new file mode 100644
index 0000000000000000000000000000000000000000..954cdb1d3641cd2805a23ba87a16d5063ebf1b1a
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/formulaires/selecteur/navigateur.html
@@ -0,0 +1,38 @@
+[(#REM)
+
+	Navigateur du sélecteur de rubrique (ancien sélecteur)
+	
+	Paramètres :
+	-* id_r int l'id_rubrique en cours;
+	-* limite_branche int l'id_rubrique de la branche sur laquelle on force la sélection
+
+]#SET{titre_branche,''}
+<BOUCLE_branche(RUBRIQUES){id_rubrique=#ENV{limite_branche}}{statut?}>
+[(#SET{titre_branche,[(#TITRE)]})]
+[(#SET{rubriques_branche,#ARRAY})]<BOUCLE_rubriques_branches(RUBRIQUES){branche}{exclus}{statut?}>#SET{rubriques_branche,#GET{rubriques_branche}|push{#ID_RUBRIQUE}}</BOUCLE_rubriques_branches>
+</BOUCLE_branche>
+<BOUCLE_rub(RUBRIQUES){id_rubrique=#ENV{id_r,#ENV{id_rubrique}}}{statut?}>
+	<div class='chemin'>
+		[(#ENV{limite_branche}|non)<a href='[(#SELF|parametre_url{id_r,0})]' class='ajax'><:info_racine_site:></a>]
+		<BOUCLE_chemin(HIERARCHIE){id_rubrique}{id_rubrique != #ENV{id_r}}{statut?}>[(#ENV{limite_branche}|et{#COMPTEUR_BOUCLE|=={1}}|?{'',<span class="sep"> &gt; </span>})]<a href='[(#SELF|parametre_url{id_r,#ID_RUBRIQUE})]' class='ajax'>#TITRE</a></BOUCLE_chemin>[(#ENV{limite_branche}|=={#ID_RUBRIQUE}|?{'',<span class="sep"> &gt; </span>})]<strong class='on'>#TITRE</strong>
+	</div>#SET{n,0}
+	<B_contenu>
+	[(#REM) afficher la racine si la profondeur le permet]
+	[(#ENV{limite_branche}|non)
+	[(#GRAND_TOTAL|<{#TOTAL_BOUCLE}|oui)
+	<div class='frame[ total_(#GRAND_TOTAL|max{#TOTAL_BOUCLE|moins{1}})] frame_0'><h2>[<a(#ENV{rubriques,0}|oui) href='#' onclick="jQuery(this).item_pick('rubrique|0','#ENV{name,id_item}','<:info_racine_site|texte_script|attribut_html:>','rubrique');return false;"
+><img class='add' src='#CHEMIN_IMAGE{ajouter-16.png}' alt='' /></a>]<:info_racine_site:></h2>
+	[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=0}{env})]
+	[(#ENV{articles,0}|oui) [(#INCLURE{fond=formulaires/selecteur/inc-nav-articles}{id_rubrique=-1}{id_article}{env})] ]</div>]]
+	<BOUCLE_contenu(HIERARCHIE){id_rubrique}{tout}{n-4,4}>#SET{n,0}
+	<div class='frame[ total_(#GRAND_TOTAL|min{#TOTAL_BOUCLE|moins{1}})][ frame_(#COMPTEUR_BOUCLE|moins{#GRAND_TOTAL|plus{1}|max{#TOTAL_BOUCLE}}|plus{#TOTAL_BOUCLE})]'>[(#ID_RUBRIQUE|=={#ENV{limite_branche}}|non)<a
+	href='[(#SELF|parametre_url{id_r,#_rub:ID_PARENT|?{#_rub:ID_PARENT,racine}})]' class='frame_close ajax'><img src='#CHEMIN_IMAGE{fermer-16}' alt='fermer' width="16" height="16" /></a>]
+	<h2>[(#ID_RUBRIQUE|=={#ENV{limite_branche}}|?{#TITRE,<a class='ajax' href='[(#SELF|parametre_url{id_r,#ID_RUBRIQUE})]'>#TITRE</a>})]</h2>
+	[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique}{env})]
+	[(#ENV{articles,0}|oui) [(#INCLURE{fond=formulaires/selecteur/inc-nav-articles}{id_rubrique}{id_article}{env})] ]
+	</div>
+	</BOUCLE_contenu>
+</BOUCLE_rub>
+<div class='chemin'><strong class='on'>[(#GET{titre_branche,<:info_racine_site:>})]</strong></div>
+<div class='frame total_0 frame_0'><h2>[(#GET{titre_branche,<:info_racine_site:>})]</h2>[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=#ENV{limite_branche,0}}{env})][(#ENV{articles,0}|oui) [(#INCLURE{fond=formulaires/selecteur/inc-nav-articles}{id_rubrique=-1}{id_article}{env})] ]</div>
+<//B_rub>
diff --git a/design_system_dependences/pages/v2.0.1/images/page-128.png b/design_system_dependences/pages/v2.0.1/images/page-128.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ca2ace11cf56dbb388b701299b412bc9e8d806f
Binary files /dev/null and b/design_system_dependences/pages/v2.0.1/images/page-128.png differ
diff --git a/design_system_dependences/pages/v2.0.1/images/page-xx.svg b/design_system_dependences/pages/v2.0.1/images/page-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5be1f7e15f3b88c67ed988152012251a12e96e8b
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/images/page-xx.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M44.9 9.3H12.2v45.3h39.7V17.5z"/>
+  <path fill="#1d83d4" d="M42.1 3.7h-5.5v21.2h20.8v-5.5L42.1 3.7zm0 15.7v-7.5l7.5 7.5h-7.5z" />
+  <path fill="#666" d="M51.9 24.9v29.8H12.2V9.3h24.4V3.7H9.3C7.7 3.7 6.5 5 6.5 6.5v51c0 1.6 1.3 2.8 2.8 2.8h45.3c1.6 0 2.8-1.3 2.8-2.8V24.8l-5.5.1z" />
+</svg>
diff --git a/design_system_dependences/pages/v2.0.1/install.log b/design_system_dependences/pages/v2.0.1/install.log
new file mode 100644
index 0000000000000000000000000000000000000000..797ba9df59c18ff2f717f1cefb5e89b2b777ba8e
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/install.log
@@ -0,0 +1,3 @@
+installation: charger_plugin
+date: 2024-01-16T13:05:56Z
+source: ../tmp/cache/chargeur/v2.0.1-6225d406-pages-70f6d-v2.0.1.zip
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages.xml b/design_system_dependences/pages/v2.0.1/lang/pages.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd1273f52da516c9ddeb538e6258fa0912d2df65
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages.xml
@@ -0,0 +1,39 @@
+<traduction
+	module="pages"
+	id="pages--pages-080a7"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/pages.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/pages?lang_cible=ar" total="18" traduits="6" relire="0" modifs="2" nouveaux="10" pourcent="33.33">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+	</langue>
+	<langue code="de" url="https://trad.spip.net/tradlang_module/pages?lang_cible=de" total="18" traduits="12" relire="0" modifs="0" nouveaux="6" pourcent="66.67">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/pages?lang_cible=en" total="18" traduits="18" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+		<traducteur nom="jack31" lien="https://trad.spip.net/auteur/jack31" />
+		<traducteur nom="tcharlss" lien="https://trad.spip.net/auteur/drbouvierleduc" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/pages?lang_cible=es" total="18" traduits="12" relire="0" modifs="0" nouveaux="6" pourcent="66.67">
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+	</langue>
+	<langue code="fa" url="https://trad.spip.net/tradlang_module/pages?lang_cible=fa" total="18" traduits="6" relire="0" modifs="2" nouveaux="10" pourcent="33.33">
+		<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/pages?lang_cible=fr" total="18" traduits="18" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/pages?lang_cible=nl" total="18" traduits="16" relire="0" modifs="0" nouveaux="2" pourcent="88.89">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/pages?lang_cible=pt_br" total="18" traduits="12" relire="0" modifs="0" nouveaux="6" pourcent="66.67">
+		<traducteur nom="placido" lien="https://trad.spip.net/auteur/placido" />
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="ru" url="https://trad.spip.net/tradlang_module/pages?lang_cible=ru" total="18" traduits="6" relire="0" modifs="2" nouveaux="10" pourcent="33.33">
+		<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/pages?lang_cible=sk" total="18" traduits="12" relire="0" modifs="0" nouveaux="6" pourcent="66.67">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_ar.php b/design_system_dependences/pages/v2.0.1/lang/pages_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..e493c7d9ade5465e0a1ca84944fd3412aced5999
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_ar.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'لا توجد صفحات في هذه اللحظة.', # MODIF
+
+	// C
+	'convertir_article' => 'تحويل الى مقال',
+	'convertir_page' => 'تحويل الى صفحة',
+	'creer_page' => 'إنشاء صفحة جديدة',
+
+	// M
+	'modifier_page' => 'تغيير الصفحة :', # MODIF
+
+	// P
+	'pages_uniques' => 'صفحات فريدة',
+
+	// T
+	'titre_page' => 'صفحة',
+	'toutes_les_pages' => 'كل الصفحات'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_de.php b/design_system_dependences/pages/v2.0.1/lang/pages_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5a973a46efcde791e1c98b2a791aae8e8a8deff
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_de.php
@@ -0,0 +1,37 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Noch keine Einzelseite vorhanden',
+
+	// C
+	'convertir_article' => 'In Artikel umwandeln',
+	'convertir_page' => 'In Einzelseite umwandeln',
+	'creer_page' => 'Neue Einzelseite anlegen',
+
+	// E
+	'erreur_champ_page_doublon' => 'Diese ID existiert bereits',
+	'erreur_champ_page_format' => 'Nur kleine alphanumerische Zeichen sowie "_" ',
+	'erreur_champ_page_taille' => 'Maximal 255 Zeichen',
+
+	// L
+	'label_champ_page' => 'Einzelseite:',
+
+	// M
+	'modifier_page' => 'Seite bearbeiten:',
+
+	// P
+	'pages_uniques' => 'Einzelseiten',
+
+	// T
+	'titre_page' => 'Einzelseite',
+	'toutes_les_pages' => 'Alle Seiten'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_en.php b/design_system_dependences/pages/v2.0.1/lang/pages_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..617f2bddc43c1933009c823710704fb0b1cfa1b5
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_en.php
@@ -0,0 +1,47 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'There are no pages at the moment.',
+
+	// B
+	'bouton_generer_page_utile' => 'Create the <strong>@titre@ page (<em>@page@</em>)</strong>',
+	'bouton_generer_pages_utiles' => 'Create <em>all</em> the useful pages',
+
+	// C
+	'convertir_article' => 'Convert to an article',
+	'convertir_page' => 'Convert to a page',
+	'creer_page' => 'Create a new page',
+
+	// E
+	'erreur_champ_page_doublon' => 'That ID is already in use',
+	'erreur_champ_page_format' => 'Lowercase alphanumerical characters or "_" only',
+	'erreur_champ_page_taille' => 'Up to 255 characters max',
+	'explication_pages_utiles' => 'Current templates can use the following pages',
+
+	// I
+	'info_page_unique' => 'One page ',
+	'info_pages_uniques' => '@nb@ pages',
+
+	// L
+	'label_champ_page' => 'Page :',
+
+	// M
+	'modifier_page' => 'Edit page:',
+
+	// P
+	'pages_uniques' => 'Unique pages',
+
+	// T
+	'titre_page' => 'Page',
+	'titre_pages_utiles' => 'Useful pages',
+	'toutes_les_pages' => 'All pages'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_es.php b/design_system_dependences/pages/v2.0.1/lang/pages_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb4bdaf54b3c87607d410a76e62aec1498c0d6de
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_es.php
@@ -0,0 +1,37 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'No hay ninguna página por el momento.',
+
+	// C
+	'convertir_article' => 'Convertir en artículo',
+	'convertir_page' => 'Convertir en página',
+	'creer_page' => 'Crear una nueva página',
+
+	// E
+	'erreur_champ_page_doublon' => 'Este identificador ya existe',
+	'erreur_champ_page_format' => 'Caracteres alfanuméricos en minúsculas o "_" únicamente',
+	'erreur_champ_page_taille' => '255 caracteres máximo',
+
+	// L
+	'label_champ_page' => 'Página:',
+
+	// M
+	'modifier_page' => 'Modificar la página:',
+
+	// P
+	'pages_uniques' => 'Páginas únicas',
+
+	// T
+	'titre_page' => 'Página',
+	'toutes_les_pages' => 'Todas las páginas'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_fa.php b/design_system_dependences/pages/v2.0.1/lang/pages_fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..f10b1e0d00e837d609ed360b935a9011de54742a
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_fa.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => ' براي الأن هيچ صفحه‌ي نيست', # MODIF
+
+	// C
+	'convertir_article' => 'تبديل به يك مقاله',
+	'convertir_page' => 'تبديل به يك صفحه',
+	'creer_page' => 'آفرينش يك صفحه‌ي نو',
+
+	// M
+	'modifier_page' => 'اصلاح صفحه: ', # MODIF
+
+	// P
+	'pages_uniques' => 'صفحه‌هاي تك',
+
+	// T
+	'titre_page' => 'صفحه',
+	'toutes_les_pages' => 'تمام صفه‌ها'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_fr.php b/design_system_dependences/pages/v2.0.1/lang/pages_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..918c5ef7fc8436ae07ac160cadee1040475a031d
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_fr.php
@@ -0,0 +1,45 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/pages.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Il n’y a aucune page pour l’instant.',
+
+	// B
+	'bouton_generer_page_utile' => 'Créer la page <strong>@titre@ (<em>@page@</em>)</strong>',
+	'bouton_generer_pages_utiles' => 'Créer <em>toutes</em> les pages utiles',
+
+	// C
+	'convertir_article' => 'Convertir en article',
+	'convertir_page' => 'Convertir en page',
+	'creer_page' => 'Créer une nouvelle page',
+
+	// E
+	'erreur_champ_page_doublon' => 'Cet identifiant existe déjà',
+	'erreur_champ_page_format' => 'Charactères alphanumériques en minuscules ou "_" uniquement',
+	'erreur_champ_page_taille' => '255 charactères maximum',
+	'explication_pages_utiles' => 'Les squelettes actuels du site peuvent utiliser les pages suivantes.',
+
+	// I
+	'info_page_unique' => 'Une page',
+	'info_pages_uniques' => '@nb@ pages',
+
+	// L
+	'label_champ_page' => 'Page :',
+
+	// M
+	'modifier_page' => 'Modifier la page :',
+
+	// P
+	'pages_uniques' => 'Pages uniques',
+
+	// T
+	'titre_page' => 'Page',
+	'titre_pages_utiles' => 'Pages utiles',
+	'toutes_les_pages' => 'Toutes les pages'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_nl.php b/design_system_dependences/pages/v2.0.1/lang/pages_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..c499ae878a8007991e7aedb39212d7a56646f5e4
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_nl.php
@@ -0,0 +1,43 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Er is momenteel geen enkele bladzijde.',
+
+	// B
+	'bouton_generer_page_utile' => 'Maak pagina <strong>@titre@ (<em>@page@</em>)</strong>',
+	'bouton_generer_pages_utiles' => 'Maak<em>alle</em> les pagina’s nuttig',
+
+	// C
+	'convertir_article' => 'In een artikel omzetten',
+	'convertir_page' => 'In een bladzijde omzetten',
+	'creer_page' => 'Een nieuwe bladzijde maken',
+
+	// E
+	'erreur_champ_page_doublon' => 'Deze identificatie bestaat al',
+	'erreur_champ_page_format' => 'Uitsluitend kleine letters, cijfers of "_"',
+	'erreur_champ_page_taille' => 'maximaal 255 tekens',
+	'explication_pages_utiles' => 'De huidige skeletten van de site kunnen de volgende pagina’s gebruiken.',
+
+	// L
+	'label_champ_page' => 'Bladzijde:',
+
+	// M
+	'modifier_page' => 'Aanpassen van bladzijde:',
+
+	// P
+	'pages_uniques' => 'Unieke bladzijdes',
+
+	// T
+	'titre_page' => 'Bladzijde',
+	'titre_pages_utiles' => 'Nuttige pagina’s',
+	'toutes_les_pages' => 'Alle bladzijdes'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_pt_br.php b/design_system_dependences/pages/v2.0.1/lang/pages_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..21a1dbd47aa0685107967980bfede57294c560d1
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_pt_br.php
@@ -0,0 +1,37 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Nehuma página, ainda.',
+
+	// C
+	'convertir_article' => 'Converter em matéria',
+	'convertir_page' => 'Converter em página',
+	'creer_page' => 'Criar uma nova página',
+
+	// E
+	'erreur_champ_page_doublon' => 'Este identificador já existe',
+	'erreur_champ_page_format' => 'Apenas caractéres alfanuméricos em minúsculas ou "_"',
+	'erreur_champ_page_taille' => 'Máximo de 255 caracteres',
+
+	// L
+	'label_champ_page' => 'Página:',
+
+	// M
+	'modifier_page' => 'Alterar a página:',
+
+	// P
+	'pages_uniques' => 'Páginas únicas',
+
+	// T
+	'titre_page' => 'Página',
+	'toutes_les_pages' => 'Todas as páginas'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_ru.php b/design_system_dependences/pages/v2.0.1/lang/pages_ru.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb6e00a5a4edc0064b4c68abe2afe1f8c49871c1
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_ru.php
@@ -0,0 +1,29 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Пока нет страниц.', # MODIF
+
+	// C
+	'convertir_article' => 'Преобразовать в статью',
+	'convertir_page' => 'Преобразовать в страницу',
+	'creer_page' => 'Новая страница',
+
+	// M
+	'modifier_page' => 'Изменить страницу:', # MODIF
+
+	// P
+	'pages_uniques' => 'Отдельные страницы',
+
+	// T
+	'titre_page' => 'Страница',
+	'toutes_les_pages' => 'Все страницы'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/pages_sk.php b/design_system_dependences/pages/v2.0.1/lang/pages_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..7210cca143eac5923864df0131c3c494a9b0af30
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/pages_sk.php
@@ -0,0 +1,37 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/pages?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'aucune_page' => 'Momentálne tu nie je žiadna stránka.',
+
+	// C
+	'convertir_article' => 'Zmeniť na článok',
+	'convertir_page' => 'Zmeniť na stránku',
+	'creer_page' => 'Vytvoriť novú stránku',
+
+	// E
+	'erreur_champ_page_doublon' => 'Tento identifikátor už existuje',
+	'erreur_champ_page_format' => 'Malé písmená alebo jeden "_"',
+	'erreur_champ_page_taille' => 'Maximum je 255 znakov',
+
+	// L
+	'label_champ_page' => 'Stránka:',
+
+	// M
+	'modifier_page' => 'Upraviť stránku:',
+
+	// P
+	'pages_uniques' => 'Jedinečné stránky',
+
+	// T
+	'titre_page' => 'Stránka',
+	'toutes_les_pages' => 'Všetky stránky'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages.xml b/design_system_dependences/pages/v2.0.1/lang/paquet-pages.xml
new file mode 100644
index 0000000000000000000000000000000000000000..34d5763c011be835272f41152ab168d7192c845d
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages.xml
@@ -0,0 +1,35 @@
+<traduction
+	module="paquet-pages"
+	id="paquet-pages--pages-080a7"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/pages.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=ar" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="de" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=de" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=en" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="es" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=es" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+	</langue>
+	<langue code="fa" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=fa" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=fr" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="it" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=it" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=nl" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=pt_br" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="ru" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=ru" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=sk" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ar.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..2aedda95843e0e619c5732affad4e04cff1f163f
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ar.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'هذا البرنامج المساعد يسمح لك إنشاء صفحات من البنود التي لا ترتبط بأي تسلسل معين. بيد أنها قد تترافق مع اسم القالب
+يأذن للإنشاء صفحة من المعلومات القانونية ، من نحن ، اتصال ، وما إلى ذلك.
+',
+	'pages_slogan' => ' '
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_de.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..13764480dc9fea1dad5bdb24c884bd027cab50c1
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_de.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Dieses Plugin ermöglicht es, Artikel zu erstellen, die mit keiner bestimmen Hierarchie verbunden sind.
+Sie können hingegen mit dem Namen eines Skeletts verknüpft werden.
+Das ist besonders für Impressumsseiten etc. nützlich.',
+	'pages_slogan' => 'Seiten ohne Rubrik'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_en.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf32c9af31150efcbcd7d2061a1b454d20855bb3
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_en.php
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'This plugin allows you to create pages of articles that are not linked to any particular hierarchy.
+However they may be associated with a name template.
+This allows the creation of pages of legal information, about, contact, etc..
+',
+	'pages_slogan' => 'Unlinked pages'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_es.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..10b9a953120f889f750c972900a05ed840cac13e
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_es.php
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Este plugin permite crear páginas de artículos que no están asociadas a ninguna jerarquía particular.
+Por contra, pueden asociarse a un nombre de esqueleto. Ello permite crear páginas de aviso legal, acerca de, contacto, etc.',
+	'pages_slogan' => 'Páginas sin sección'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fa.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f063cc4d6fa6c5cac035ecbec4a28b201713c68
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fa.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'اين پلاگين اجازه‌ي ايجاد صفحه‌هاي مقاله‌هايي را مي‌دهد كه به هيچ سلسله مراتبي متكي نيستند. 
+در عضو مي‌توانند به نام يك اسلكت مرتبط شوند. 
+اين پلاگين اجازه‌ي ايجاد صفحه‌هايي مانند اطلاعات حقوقي، در باره‌ي ما، تماس با ما و غيره را خواهد داد.',
+	'pages_slogan' => 'صفحه‌هاي بدون بخش'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fr.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..535efbacd503e4add8a9f84a76df5ee36e771ed4
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_fr.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/pages.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Ce plugin permet de créer des pages d’articles qui ne sont reliées à aucune hiérarchie particulière.
+En revanche elles peuvent être associées à un nom de squelette.
+Cela permet notamment de créer des pages de notice légale, d’à-propos, de contact, etc.',
+	'pages_slogan' => 'Des pages sans rubrique'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_it.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_it.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0c1907bb19c6cfdb39d17003ddbf1f2a8d948f1
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_it.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Questo plugin ti consente di creare articoli che non sono collegate a nessuna particolare gerarchia.
+Tuttavia, possono essere associati ad un nome template.
+Ciò consente di creare pagine di avviso legale, informazioni, contatti, ecc.',
+	'pages_slogan' => 'Pagine senza rubrica'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_nl.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fba8db3620f3f1b3eb158e8d87c8d214315954d
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_nl.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Met deze plugin kun je bladzijdes met artikelen maken die niet in de hiërarchie van de site zijn opgenomen.
+Ze kunnen worden gekoppeld aan de naam van een skelet.
+Op deze manier kunnen bladzijdes zoals wettelijke vermeldingen, contactinformatie, disclaimers, enz. worden gemaakt.',
+	'pages_slogan' => 'Bladzijdes zonder rubriek'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_pt_br.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..13e9028d259005deec0bb2203fe4003bc5065367
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_pt_br.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Este plugin permite criar páginas de matérias que não estejam vinculadas a nenhuma hierarquia específica.
+Em contrapartida, elas podem ser associadas a um nome de template.
+Isto permite, por exemplo, a criação de páginas de aviso legal, sobre o site, contato etc.',
+	'pages_slogan' => 'Páginas sem seção'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ru.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ru.php
new file mode 100644
index 0000000000000000000000000000000000000000..45f601b857608796e779c8ec0c84d49b68e48444
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_ru.php
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Данный плагин позволяет создавать отдельные страницы вне любых разделов сайта. Это отличное решения для размещения контактной информации, условий и правил использования, а так же для любой информации, которая логически не встраивается в структуру сайта.
+Cela permet notamment de créer des pages de notice légale, d’à-propos, de contact, etc.',
+	'pages_slogan' => 'Отдельные страницы'
+);
diff --git a/design_system_dependences/pages/v2.0.1/lang/paquet-pages_sk.php b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..35965d7b3a8737c393307ef53b6e7ff2e152e047
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/lang/paquet-pages_sk.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-pages?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// P
+	'pages_description' => 'Tento zásuvný modul vám umožňuje vytvárať stránky s článkami, ktoré nemajú žiadnu konkrétnu hierarchickú štruktúru.
+Môžete ich však prepojiť s názvom šablóny.
+To vám umožňuje vytvárať stránky s informáciami právneho charakteru, časové osi, zmluvy, a i.',
+	'pages_slogan' => 'Stránky bez rubriky'
+);
diff --git a/design_system_dependences/pages/v2.0.1/page.svg b/design_system_dependences/pages/v2.0.1/page.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5be1f7e15f3b88c67ed988152012251a12e96e8b
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/page.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M44.9 9.3H12.2v45.3h39.7V17.5z"/>
+  <path fill="#1d83d4" d="M42.1 3.7h-5.5v21.2h20.8v-5.5L42.1 3.7zm0 15.7v-7.5l7.5 7.5h-7.5z" />
+  <path fill="#666" d="M51.9 24.9v29.8H12.2V9.3h24.4V3.7H9.3C7.7 3.7 6.5 5 6.5 6.5v51c0 1.6 1.3 2.8 2.8 2.8h45.3c1.6 0 2.8-1.3 2.8-2.8V24.8l-5.5.1z" />
+</svg>
diff --git a/design_system_dependences/pages/v2.0.1/pages_administrations.php b/design_system_dependences/pages/v2.0.1/pages_administrations.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d3566fe80a4a17aae5199b907ca4859faa1b846
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/pages_administrations.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Fichier gérant l'installation et désinstallation du plugin Pages Uniques
+ *
+ * @plugin     Pages
+ * @copyright  2013
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Installation
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Fonction d'installation et de mise à jour du plugin
+ *
+ * @param string $nom_meta_base_version
+ *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
+ * @param string $version_cible
+ *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
+ * @return void
+**/
+function pages_upgrade($nom_meta_base_version, $version_cible) {
+	$maj = array();
+
+	$maj['create'] = array(
+		array('maj_tables', 'spip_articles')
+	);
+	$maj['1.0.1'] = array(
+		array('sql_alter', "TABLE spip_articles CHANGE page page VARCHAR(255) DEFAULT '' NOT NULL"),
+	);
+
+	include_spip('base/upgrade');
+	maj_plugin($nom_meta_base_version, $version_cible, $maj);
+}
+
+
+/**
+ * Fonction de désinstallation du plugin
+ * Supprimer la colonne 'page' du plugin
+ *
+ * TODO : que deviennent les article avec un id_rubrique=-1 ? Ne faut-il pas les traiter ?
+ *
+ * @param string $nom_meta_base_version
+ *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
+ * @return void
+**/
+function pages_vider_tables($nom_meta_base_version) {
+	sql_alter('TABLE spip_articles DROP page');
+	effacer_meta($nom_meta_base_version);
+}
diff --git a/design_system_dependences/pages/v2.0.1/pages_autorisations.php b/design_system_dependences/pages/v2.0.1/pages_autorisations.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f6220ab5401c58bf34b8c7ac0b7da22f900b270
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/pages_autorisations.php
@@ -0,0 +1,205 @@
+<?php
+/**
+ * Fonction pour le pipeline, n'a rien a effectuer
+ *
+ * @return
+ */
+function pages_autoriser() {
+}
+
+
+/* ----------------------- AUTORISATIONS DE L'OBJET PAGE UNIQUE ----------------------- */
+
+/**
+ * Autorisation de créer un page unique.
+ *
+ * Cette page unique peut être créée soit à partir de rien
+ * soit en convertissant un article existant.
+ * Par défaut seuls les administrateurs complets sont autorisés.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ * @return
+ */
+function autoriser_page_creer_dist($faire, $type, $id, $qui, $opt) {
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	$autoriser = pages_autorisation_defaut_dist($qui);
+
+	return $autoriser;
+}
+
+/**
+ * Autorisation de modifier une page unique existante.
+ *
+ * Cette page peut être modifiée soit au travers du formulaire d'édition
+ * soit en convertissant une page en article éditorial.
+ * Par défaut seuls les administrateurs complets sont autorisés.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ * @return
+ */
+function autoriser_page_modifier_dist($faire, $type, $id, $qui, $opt) {
+
+	$autoriser = false;
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	if ($id_article = intval($id)) {
+		$autoriser = pages_autorisation_defaut_dist($qui);
+	}
+
+	return $autoriser;
+}
+
+
+/**
+ * Autorisation d'afficher une page unique.
+ *
+ * Par défaut seuls les administrateurs complets sont autorisés.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ * @return
+ */
+function autoriser_page_voir_dist($faire, $type, $id, $qui, $opt) {
+
+	$autoriser = false;
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	if ($id_article = intval($id)) {
+		$autoriser = pages_autorisation_defaut_dist($qui);
+	}
+
+	return $autoriser;
+}
+
+
+/**
+ * Autorisation d'afficher la liste des pages uniques.
+ *
+ * Par défaut seuls les administrateurs complets sont autorisés.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ * @return
+ */
+function autoriser_pages_voir_dist($faire, $type, $id, $qui, $opt) {
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	$autoriser = pages_autorisation_defaut_dist($qui);
+
+	return $autoriser;
+}
+
+
+/**
+ * Autorisation d'accéder à la liste des pages uniques.
+ *
+ * Cette autorisation coîncide avec l'autorisation pages_voir.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ * @return
+ */
+function autoriser_pages_menu_dist($faire, $type, $id, $qui, $opt) {
+
+	// Conditions :
+	// - l'auteur connecté doit posséder l'autorisation pages_voir
+	$autoriser = autoriser('voir', '_pages', $id, $qui, $opt);
+
+	return $autoriser;
+}
+
+/**
+ * Autorisation d'afficher le bouton créer une page unique inclus
+ * dans la barre des outils rapides .
+ *
+ * Cette autorisation coîncide avec l'autorisation page_creer.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ *
+*@return
+ */
+function autoriser_pagecreer_menu_dist($faire, $type, $id, $qui, $opt) {
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	$autoriser = autoriser('creer', 'page', $id, $qui, $opt);
+
+	return $autoriser;
+}
+
+/**
+ * Autorisation d'afficher le bouton "convertir en page unique" et "convertir en article"
+ *
+ * Par défaut seuls les administrateurs complets sont autorisés.
+ *
+ * @param object $faire
+ * @param object $type
+ * @param object $id
+ * @param object $qui
+ * @param object $opt
+ *
+*@return
+ */
+function autoriser_page_convertir_dist($faire, $type, $id, $qui, $opt) {
+
+	// Conditions :
+	// - l'auteur connecté est un administrateur complet
+	$autoriser = pages_autorisation_defaut_dist($qui);
+
+	return $autoriser;
+}
+
+
+function pages_autorisation_defaut_dist($qui) {
+	return (($qui['statut'] == '0minirezo')
+			and !$qui['restreint']);
+}
+
+/**
+ * Autorisation de créer un article dans une rubrique $id
+ *
+ * Il faut pouvoir voir la rubrique et pouvoir créer un article…
+ * y compris tant qu'il n'y a pas de rubrique (pour une page unique)
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+if (!function_exists('autoriser_rubrique_creerarticledans')) {
+	function autoriser_rubrique_creerarticledans($faire, $type, $id, $qui, $opt) {
+		return
+			(($id == -1) and pages_autorisation_defaut_dist($qui))
+			OR ($id
+			and autoriser('voir', 'rubrique', $id)
+			and autoriser('creer', 'article'));
+	}
+}
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/pages_fonctions.php b/design_system_dependences/pages/v2.0.1/pages_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb5ee4a66d621f7607c068f585f37cf0f8a015a6
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/pages_fonctions.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * D�claration des filtres et balises
+ *
+ * @plugin     Pages
+ * @copyright  2013
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Pipelines
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+
+// https://code.spip.net/@balise_URL_ARTICLE_dist
+function balise_URL_PAGE_UNIQUE_dist($p) {
+
+	$_id = interprete_argument_balise(1, $p);
+	if (!$_id) {
+		$msg = array('zbug_balise_sans_argument', array('balise' => ' URL_PAGE_UNIQUE'));
+		erreur_squelette($msg, $p);
+		$p->interdire_scripts = false;
+		return $p;
+	}
+
+	if (!function_exists('generer_generer_url_arg')) {
+		include_spip('balise/url_');
+	}
+
+	$_id = "sql_getfetsel('id_article','spip_articles','page='.sql_quote($_id))";
+	$p->code = generer_generer_url_arg('article', $p, $_id);
+	if (!$p->etoile) {
+		$p->code = "vider_url($p->code)";
+	}
+	$p->interdire_scripts = false;
+	return $p;
+}
+
+
+/**
+ * Lister les pages uniques utiles qui ne sont pas encore créées
+ *
+ * Cette liste est complétée par les plugins tiers au moyen du pipeline pages_uniques_utiles.
+ *
+ * @uses pages_uniques_utiles()
+ * @return array
+ *     Tableau associatif : page => titre
+ */
+function pages_uniques_utiles() {
+
+	if (
+		$pages_utiles = pipeline('pages_uniques_utiles', array())
+		and is_array($pages_utiles)
+	) {
+		include_spip('base/abstract_sql');
+		foreach ($pages_utiles as $page => $titre) {
+			// Si la page existe déjà, on la vire
+			if (sql_countsel('spip_articles', 'page = '.sql_quote($page))) {
+				unset($pages_utiles[$page]);
+			}
+		}
+	}
+
+	return $pages_utiles;
+}
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/pages_pipelines.php b/design_system_dependences/pages/v2.0.1/pages_pipelines.php
new file mode 100644
index 0000000000000000000000000000000000000000..a084b459a871b41006cd80406ac592a0bf61841c
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/pages_pipelines.php
@@ -0,0 +1,461 @@
+<?php
+/**
+ * Déclaration des pipelines utilisés par le plugin
+ *
+ * @plugin     Pages
+ * @copyright  2013
+ * @author     RastaPopoulos
+ * @licence    GNU/GPL
+ * @package    SPIP\Pages\Pipelines
+ * @link       https://contrib.spip.net/Pages-uniques
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+// Change l'entête du formulaire des articles pour montrer que c'est une page
+function pages_affiche_milieu_ajouter_page($flux) {
+	if ($flux['args']['exec'] == 'article_edit') {
+		include_spip('base/abstract_sql');
+		if (
+			_request('modele') == 'page'
+			or
+			(
+				isset($flux['args']['id_article'])
+				and ($id_article = $flux['args']['id_article']) > 0
+				and (sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
+			)
+		) {
+			//On force l'id parent à -1
+			//Par principe une page nouvelle ou existante est dans la rubrique parent -1
+			$cherche = "/(<input[^>]*name=('|\")id_parent[^>]*>)/is";
+			if (!preg_match($cherche, $flux['data'])) {
+				$cherche = "/(<input[^>]*name=('|\")id_rubrique[^>]*>)/is";
+				$remplace = "$1<input type=\"hidden\" name=\"id_parent\" value=\"-1\" />\n";
+				$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
+			}
+
+			// On cherche et remplace l'entete de la page : "modifier la page"
+			$cherche = "/(<div[^>]*class=('|\")entete-formulaire.*<\/span>).*?(<h1>.*?<\/h1>.*?<\/div>)/is";
+			$surtitre = _T('pages:modifier_page');
+			$remplace = "$1$surtitre$3";
+			$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
+
+			// Si c'est une nouvelle page, on remplace le lien de retour dans l'entete
+			if (_request('new') == 'oui') {
+				$cherche = "/(<span[^>]*class=(?:'|\")icone[^'\"]*retour[^'\"]*(?:'|\")>"
+							. "<a[^>]*href=(?:'|\"))[^'\"]*('|\")/is";
+				$retour = generer_url_ecrire('pages_tous');
+				$remplace = "$1$retour$2";
+				$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
+			}
+		}
+	}
+
+	return $flux;
+}
+
+
+/**
+ * Saisie de l'identifiant de la page sur la fiche d'une page
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte du pipeline modifié
+ */
+function pages_affiche_milieu_identifiant($flux) {
+	$texte = '';
+	$e = trouver_objet_exec($flux['args']['exec']);
+
+	// Si on est sur la fiche d'un article...
+	if ($e and !$e['edition'] and $e['type']=='article') {
+		include_spip('base/abstract_sql');
+		$id_article = isset($flux['args'][$e['id_table_objet']]) ? $flux['args'][$e['id_table_objet']] : false;
+		// ... et s'il s'agit d'une page
+		if (
+			_request('modele') == 'page'
+			or
+			(
+				intval($id_article) > 0
+				and
+				(sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
+			)
+		) {
+			$texte .= recuperer_fond(
+				'prive/objets/editer/identifiant_page',
+				array('id_article' => $id_article),
+				array('ajax' => true)
+			);
+		}
+	}
+
+	if ($texte) {
+		if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
+			$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
+		} else {
+			$flux['data'] .= $texte;
+		}
+	}
+
+	return $flux;
+}
+
+
+// Vérifier que la page n'est pas vide
+function pages_formulaire_charger($flux) {
+	// Si on est dans l'édition d'un article
+	if (is_array($flux) and is_array($flux['data']) and $flux['args']['form'] == 'editer_article') {
+		// Si on est dans un article de modele page
+		if (_request('modele') == 'page' or ($flux['data']['page'] and _request('modele') != 'article')) {
+			$flux['data']['modele'] = 'page';
+			$flux['data']['champ_page'] = $flux['data']['page'];
+		}
+		unset($flux['data']['page']);
+	}
+
+	return $flux;
+}
+
+
+/**
+ * Vérifications de l'identifiant d'une page
+ *
+ * L'identifiant doit être unique, sauf en cas de traduction
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte du pipeline modifié
+ */
+function pages_formulaire_verifier($flux) {
+	// Si on est dans l'édition d'un article/page ou dans le formulaire d'édition d'un identifiant page
+	if (
+		is_array($flux)
+		and (
+			( $flux['args']['form'] == 'editer_article' and _request('modele') == 'page' )
+			or $flux['args']['form'] == 'editer_identifiant_page'
+		)
+	) {
+		$erreur = '';
+		$page = _request('champ_page');
+		$page = strtolower($page);
+		$page = preg_replace(',\\s+,', '_', $page);
+		set_request('champ_page', $page);
+		$id_page = $flux['args']['args'][0];
+		// champ vide
+		$lang = sql_getfetsel('lang', 'spip_articles', 'id_article='.intval($id_page));
+		if (!$lang) {
+			$lang = $GLOBALS['spip_lang'];
+		}
+		if (!$page) {
+			$erreur .= _T('info_obligatoire');
+		} elseif (strlen($page) > 255) {
+			 $erreur = _T('pages:erreur_champ_page_taille');
+		} elseif (!preg_match('/^[a-z0-9_]+$/', $page)) {
+			// format : charactères alphanumériques en minuscules ou "_"
+			 $erreur = _T('pages:erreur_champ_page_format');
+		// doublon ?
+		} elseif (sql_countsel('spip_articles', array(
+				'page=' . sql_quote($page),
+				'id_article != ' . intval($id_page),
+				'lang = ' . sql_quote($lang),
+				'statut != ' .sql_quote("poubelle")))
+		) {
+			$erreur = _T('pages:erreur_champ_page_doublon');
+		}
+
+		if ($erreur) {
+			if (!isset($flux['data']['champ_page'])) {
+				$flux['data']['champ_page'] = '';
+			}
+			$flux['data']['champ_page'] .= $erreur;
+		}
+	}
+	return $flux;
+}
+
+
+/**
+ * Insertion dans le pipeline editer_contenu_objet (SPIP)
+ *
+ * Sur les articles considérés comme pages uniques, on remplace l'élément de choix de rubriques par :
+ * -* un input hidden id_rubrique et id_parent avec pour valeur -1
+ * -* un input hidden modele avec comme valeur "page"
+ * -* un champ d'édition de l'identifiant de la page unique
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte du pipeline modifié
+ */
+function pages_editer_contenu_objet($flux) {
+	$args = $flux['args'];
+	if ($args['type'] == 'article' && isset($args['contexte']['modele']) && $args['contexte']['modele'] == 'page') {
+		$erreurs = $args['contexte']['erreurs'];
+		// On cherche et remplace l'édition de la rubrique
+		$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_parent.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
+		$remplace = '<\\2 class="editer editer_page obligatoire' . (empty($erreurs['champ_page']) ? '' : ' erreur') . '">';
+		$remplace .= '<input type="hidden" name="id_parent" value="-1" />';
+		$remplace .= '<input type="hidden" name="id_rubrique" value="-1" />';
+		$remplace .= '<input type="hidden" name="modele" value="page" />';
+		$remplace .= '<label for="id_page">'._T('pages:titre_page').'</label>';
+		if (!empty($erreurs['champ_page'])) {
+			$remplace .= '<span class="erreur_message">' . $erreurs['champ_page'] . '</span>';
+		}
+
+		if (!empty($args['contexte']['champ_page'])) {
+			$value = $args['contexte']['champ_page'];
+		} elseif (!empty($args['contexte']['page'])) {
+			$value = $args['contexte']['page'];
+		} else {
+			$value = '';
+		}
+
+		$remplace .= '<input type="text" class="text" name="champ_page" id="id_page" value="'.$value.'" />';
+		$remplace .= '</\\2> \\3';
+		if (preg_match($cherche, $flux['data'], $m)) {
+			$flux['data'] = preg_replace($cherche, $remplace, $flux['data'], 1);
+			// si on a polyhierarchie, on a un second editer_parents, supprimons en conservant bien l'ouverture du 'editer' suivant
+			$flux['data'] = preg_replace($cherche, '\\3', $flux['data']);
+		} else {
+			$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_soustitre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
+			if (preg_match($cherche, $flux['data'])) {
+				$flux['data'] = preg_replace($cherche,'$1'.$remplace, $flux['data']);
+			} else {
+				$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_titre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
+				$flux['data'] = preg_replace($cherche, '$1'.$remplace, $flux['data']);
+			}
+		}
+	}
+	return $flux;
+}
+
+/**
+ * Insertion dans le pipeline pre_edition (SPIP)
+ *
+ * Si on édite un article :
+ * - Si on récupère un champ "champ_page" dans les _request() et qu'il est différent de "article",
+ * on transforme l'article en page unique, id_rubrique devient -1
+ * - Si on ne récupère pas de champ_page et que id_parent est supérieur à 0, on le passe en article et on vide
+ * son champ page pour pouvoir réaliser le processus inverse dans le futur
+ *
+ * @param array $flux Le contexte du pipeline
+ * @return array $flux Le contexte modifié
+ */
+function pages_pre_edition_ajouter_page($flux) {
+	if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article') {
+		if ((($page = _request('champ_page')) != '') and ($page != 'article')) {
+			/**
+			 * On ajoute le "champ_page" du formulaire qui deviendra "page" dans la table
+			 * On force l'id_rubrique à -1
+			 */
+			$flux['data']['page'] = $page;
+			$flux['data']['id_rubrique'] = '-1';
+			$flux['data']['id_secteur'] = '0';
+		}
+		/**
+		 * si l'id_parent est supérieur à 0 on que l'on ne récupère pas de champ_page,
+		 * on pense à vider le champ "page", pour pouvoir revenir après coup en page
+		 */
+		if (!_request('champ_page') && (_request('id_parent') > 0)) {
+			$flux['data']['page'] = '';
+		}
+	}
+	return $flux;
+}
+
+/**
+ * Insertion dans le pipeline boite_infos (SPIP)
+ *
+ * Ajouter un lien pour transformer un article éditorial en page ou inversement
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte modifié
+ */
+function pages_boite_infos($flux) {
+	if ($flux['args']['type'] == 'article') {
+		include_spip('inc/presentation');
+		if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '') {
+			if (autoriser('creer', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
+				$flux['data'] .= icone_horizontale(_T('pages:convertir_page'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'page'), 'page');
+			}
+		} else {
+			if (autoriser('modifier', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
+				$flux['data'] .= icone_horizontale(_T('pages:convertir_article'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'article'), 'article');
+			}
+		}
+	}
+	return $flux;
+}
+
+
+/**
+ * Insertion dans le pipeline affiche_hierarchie (SPIP)
+ * Pour les pages, faire pointer la racine vers la liste des pages au lieux des rubriques
+ * Pour savoir si on se trouve sur une page, on vérifie que le champ "page" existe, faute de mieux
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte modifié
+ */
+function pages_affiche_hierarchie($flux) {
+	$objet = $flux['args']['objet'];
+	$id_article = $flux['args']['id_objet'];
+	if (
+		$objet == 'article'
+		and sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article))
+	) {
+		$cherche = '<a href="'. generer_url_ecrire('rubriques') . '">' . _T('info_racine_site') . '</a>';
+		$remplace = '<a href="'. generer_url_ecrire('pages') . '">' . _T('pages:pages_uniques') . '</a>';
+		$flux['data'] = str_replace($cherche, $remplace, $flux['data']);
+	}
+	return $flux;
+}
+
+
+/**
+ * Insertion dans le pipeline pre_boucle (SPIP)
+ * Pour les listes d'articles purement éditoriaux, il faut exclure les pages uniques afin d'éviter la confusion des genres
+ * ainsi que les liens vers des pages parfois inaccessibles en fonction de l'autorisation de l'auteur.
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte modifié
+ */
+function pages_pre_boucle($boucle) {
+	// On ne s'intéresse qu'à la boucle ARTICLES
+	if ($boucle->type_requete == 'articles' and empty($boucle->modificateur['tout'])) {
+		// On n'insère le filtre {id_rubriques>0} pour exclure les pages uniques que si aucune des conditions
+		// suivantes n'est vérifiée:
+		// - pas de critère page autre que {page=''}
+		// - pas de critère explicite {id_rubrique=-1} ou {id_rubrique<0}
+		// - pas de critère {id_rubrique?} pour lequel l'environnement renvoie -1 pour l'id de la rubrique
+		// pas de critère {id_article=XX} ou {id_article} ou {id_article?}
+		$boucle_articles = true;
+		$critere_page = false;
+
+		// On cherche les critères id_rubrique, id_article ou page
+		foreach ($boucle->criteres as $_critere) {
+			if ($_critere->op == 'page' and !$_critere->not) { // {page} ou {page?} mais pas {!page}
+				// On considère qu'on cherche toujours des pages uniques donc on force le filtre id_rubrique=-1
+				$boucle_articles = false;
+				$critere_page = true;
+				break;
+			}
+			// Aucun filtre du tout quand on cherche des traductions
+			elseif ($_critere->op == 'traduction' or $_critere->op == 'origine_traduction') {
+				$boucle_articles = false;
+				break;
+			}
+			elseif (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'page') { // {page=x}
+				if (
+					($_critere->op == '=')
+					and ($_critere->param[1][0]->texte == '')
+					and empty($_critere->param[1][1])
+					or $_critere->not
+				) {
+					// On veut exclure explicitement les pages
+					break;
+				} else {
+					// on désigne bien des pages par leur champ 'page'
+					$boucle_articles = false;
+					$critere_page = true;
+					break;
+				}
+			}
+			elseif (($_critere->op == 'id_article') // {id_article} ou {id_article?}
+				or (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_article')) { // {id_article=x}
+				// On pointe sur un article précis, il est donc inutile de rajouter un test sur la rubrique
+				// Pour le critère {id_article?} on considère que pour sélectionner des pages uniques
+				// ou des articles éditoriaux on doit préciser le critère {id_rubrique}
+				$boucle_articles = false;
+			}
+			elseif (((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique=-1}
+					and ($_critere->op == '=')
+					and ($_critere->param[1][0]->texte == '-1'))
+					or ((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique<0}
+					and ($_critere->op == '<')
+					and ($_critere->param[1][0]->texte == '0'))) {
+				// On cherche explicitement des pages uniques
+				$boucle_articles = false;
+				break;
+			}
+			elseif (($_critere->op == 'id_rubrique')) {
+				// On connait pas à ce stade la valeur de id_rubrique qui est passé dans le env.
+				// Aussi, on créer une condition where qui se compile différemment suivant la valeur de l'id_rubrique.
+				// En fait, il suffit de tester si l'id_rubrique est null. Dans ce cas il faut bien rajouter id_rubrique>0
+				// pour éliminer les pages uniques.
+				$boucle_articles = false;
+				$env_id = "\$Pile[0]['id_rubrique']";
+				$boucle->where[] =
+					array("'?'", "(isset($env_id)?(is_array($env_id)?count($env_id):strlen($env_id)):'')", "''", "'articles.id_rubrique>0'");
+				break;
+			}
+		}
+
+		// Si on est en présence d'une boucle article purement éditoriale, on ajoute le filtre id_rubrique>0
+		if ($boucle_articles) {
+			$boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
+		}
+
+		// Si on est en présence d'un critère {page} quelconque, on force le filtre id_rubrique=-1
+		if ($critere_page) {
+			$boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
+		}
+	}
+
+	return $boucle;
+}
+
+/**
+ * On cherche s'il existe un squelette article-NOMDELAPAGE pour l'utiliser en priorité
+ *
+ * @param array $flux
+ * 		Le contexte du pipeline
+ * @return array $flux
+ * 		Le contexte modifié
+ */
+function pages_styliser($flux) {
+	$bloc_principal = '';
+
+	// Quand il y a Z, on cherche le bloc principal
+	if (defined('_DIR_PLUGIN_ZCORE')) {
+		if (!function_exists("z_blocs")) {
+			$styliser_par_z = charger_fonction('styliser_par_z', 'public');
+		}
+		$z_blocs = z_blocs(test_espace_prive());
+		$bloc_principal = reset($z_blocs) . '/';
+	}
+
+	// Si c'est un article de type page et qu'il existe un squelette du bon nom
+	if (
+		$flux['args']['fond'] == $bloc_principal . 'article'
+		and $contexte = (isset($flux['args']['contexte']) ? $flux['args']['contexte'] : $GLOBALS['contexte'])
+		and isset($contexte['id_article'])
+		and $id_article = intval($contexte['id_article'])
+		and $page = sql_getfetsel('page', 'spip_articles', 'id_article = ' . $id_article)
+		and $ext = $flux['args']['ext']
+		and $f = find_in_path($bloc_principal."article=$page.$ext")
+	) {
+		$flux['data'] = substr($f, 0, - strlen(".$ext"));
+	}
+
+	return $flux;
+}
+
+function pages_rechercher_liste_des_champs($liste) {
+	$page = array();
+	// On rajoute le champ page pour la table articles pour permettre de chercher sur ce champ
+	$liste['article']['page'] = 8;
+	// Et on crée une fausse table 'pages' pour que la page de recherche appelle le squelette
+	// prive/squelettes/contenu/pages.html
+	$page = $liste['article'];
+	$liste['page'] = $page;
+	return $liste;
+}
diff --git a/design_system_dependences/pages/v2.0.1/paquet.xml b/design_system_dependences/pages/v2.0.1/paquet.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d76e2fb27c7b08db4c99b1e337f7db676dd8f061
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/paquet.xml
@@ -0,0 +1,41 @@
+<paquet
+	prefix="pages"
+	categorie="divers"
+	version="2.0.1"
+	etat="stable"
+	compatibilite="[4.0.0;4.2.*]"
+	logo="page.svg"
+	documentation="https://contrib.spip.net/Pages-uniques"
+	schema="1.0.1"
+>
+
+	<nom>Pages</nom>
+	<!-- Gestion des pages sans rubrique -->
+
+	<auteur>RastaPopoulos</auteur>
+	<auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
+
+	<licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL v3</licence>
+
+	<pipeline nom="declarer_tables_objets_sql" inclure="base/pages_tables.php" />
+	<pipeline nom="affiche_milieu" action="affiche_milieu_ajouter_page" inclure="pages_pipelines.php" />
+	<pipeline nom="affiche_milieu" action="affiche_milieu_identifiant" inclure="pages_pipelines.php" />
+	<pipeline nom="boite_infos" inclure="pages_pipelines.php" />
+	<pipeline nom="affiche_hierarchie" inclure="pages_pipelines.php" />
+	<pipeline nom="formulaire_charger" inclure="pages_pipelines.php" />
+	<pipeline nom="formulaire_verifier" inclure="pages_pipelines.php" />
+	<pipeline nom="editer_contenu_objet" inclure="pages_pipelines.php" />
+	<pipeline nom="pre_edition" action="pre_edition_ajouter_page" inclure="pages_pipelines.php" />
+	<pipeline nom="autoriser" inclure="pages_autorisations.php" />
+	<pipeline nom="pre_boucle" inclure="pages_pipelines.php" />
+	<pipeline nom="styliser" inclure="pages_pipelines.php" />
+	<pipeline nom="rechercher_liste_des_champs" inclure="pages_pipelines.php" />
+
+	<!-- Déclaration des pipelines du plugin -->
+	<pipeline nom="pages_uniques_utiles" action="" />
+
+	<utilise nom="polyhier" compatibilite="[2.0.1;]" />
+
+	<menu nom="pages" titre="pages:pages_uniques" parent="menu_edition" icone="images/page-16.png" />
+	<menu nom="page_creer" titre="pages:creer_page" parent="outils_rapides" icone="images/page-new-16.png" action="article_edit" parametres="new=oui&amp;modele=page&amp;id_rubrique=-1" />
+</paquet>
diff --git a/design_system_dependences/pages/v2.0.1/prive/objets/editer/identifiant_page.html b/design_system_dependences/pages/v2.0.1/prive/objets/editer/identifiant_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..7b912a45ad7cb974ed44bc9300c4ba9954a6ca9e
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/objets/editer/identifiant_page.html
@@ -0,0 +1,3 @@
+<div class="ajax">
+	#FORMULAIRE_EDITER_IDENTIFIANT_PAGE{#ENV{id_article}}
+</div>
diff --git a/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages.html b/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages.html
new file mode 100644
index 0000000000000000000000000000000000000000..521646a77ea32c84bf457cba858233a1a51c7232
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages.html
@@ -0,0 +1,46 @@
+[(#SET{defaut_tri,#ARRAY{
+	date,#ENV{date_sens,-1},
+	num titre,1,
+	id_article,1,
+	points,-1
+}|defaut_tri_defined})
+]<B_liste_art>
+#ANCRE_PAGINATION
+<div class="liste-objets articles">
+<table class='spip liste'>
+[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{pages:info_page_unique,pages:info_pages_uniques}})</strong></caption>]
+	<thead>
+		<tr class='first_row'>
+			<th class='statut' scope='col'>[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
+			<th class='titre principale' scope='col' colspan='2'>[(#TRI{num titre,<:info_titre:>,ajax})]</th>
+			<th class='auteur' scope='col'><:auteur:></th>
+			<th class='date secondaire' scope='col'>[(#TRI{date,<:date:>,ajax})]</th>
+			<th class='id' scope='col'>[(#TRI{id_article,<:info_numero_abbreviation:>,ajax})]</th>
+		</tr>
+	</thead>
+	<tbody>
+	<BOUCLE_liste_art(ARTICLES){id_rubrique<0}{id_article?}{id_rubrique?}{id_mot?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,date}|defaut_tri_par{#GET{defaut_tri}},#GET{defaut_tri},session_liste_art}{par titre}{pagination #ENV{nb,10}}{!lang_select}>
+		[(#LANG|changer_typo)]
+		<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
+			<td class='statut'>[(#STATUT|puce_statut{article,#ID_ARTICLE,#ID_RUBRIQUE})]</td>
+			<td class='titre principale'[(#LOGO_ARTICLE_NORMAL|non)colspan='2']><a href="[(#ID_ARTICLE|generer_url_entite{article})]"
+						[hreflang="(#ENV{lang}|=={#LANG}|non|?{#LANG})"]
+						title="<:info_numero_abbreviation|attribut_html:> #ID_ARTICLE">[<span
+						class="surtitre">(#SURTITRE|image_reduire{150,70})</span>][(#RANG). ]<strong>#TITRE</strong>[ <small>((#PAGE))</small>][<span class="soustitre">(#SOUSTITRE)</span>]</a></td>
+			[<td class='logo'>(#LOGO_ARTICLE_NORMAL|image_reduire{90,70})</td>]
+			<td class='auteur'><div class="inner"><BOUCLE_auteurs(AUTEURS){id_article}{', '}><a href="[(#ID_AUTEUR|generer_url_entite{auteur})]">#NOM</a></BOUCLE_auteurs></div></td>
+			<td class='date secondaire'>[<span title="[(#DATE|heures_minutes)]">(#DATE|affdate_jourcourt)</span>]</td>
+			<td class='id'>[(#AUTORISER{modifier,article,#ID_ARTICLE}|?{
+				<a href="[(#URL_ECRIRE{article_edit,id_article=#ID_ARTICLE})]">#ID_ARTICLE</a>,
+				#ID_ARTICLE
+			})]</td>
+		</tr>
+	</BOUCLE_liste_art>
+	[(#REM|changer_typo)]
+	</tbody>
+</table>
+[<nav class='pagination'>(#PAGINATION{#ENV{pagination,prive}})</nav>]
+</div>
+</B_liste_art>[
+<div class="liste-objets articles caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
+]<//B_liste_art>
diff --git a/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages_fonctions.php b/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4cc91ed9d3b1d3014f2462c8fc33c4e1580b800
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/objets/liste/pages_fonctions.php
@@ -0,0 +1,19 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('prive/objets/liste/articles_fonctions');
+
+if (!function_exists('defaut_tri_defined')) {
+	function defaut_tri_defined($defaut) {
+		return $defaut;
+	}
+}
+
+if (!function_exists('defaut_tri_par')) {
+	function defaut_tri_par($par, $defaut) {
+			return $par;
+	}
+}
diff --git a/design_system_dependences/pages/v2.0.1/prive/squelettes/contenu/pages.html b/design_system_dependences/pages/v2.0.1/prive/squelettes/contenu/pages.html
new file mode 100644
index 0000000000000000000000000000000000000000..de65774e03e2e06c85af054235b46d1f16aec627
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/squelettes/contenu/pages.html
@@ -0,0 +1,41 @@
+[(#AUTORISER{voir,_pages}|sinon_interdire_acces)]
+<h1 class="grostitre"><:pages:toutes_les_pages:></h1>
+
+#SET{statuts,#SESSION{statut}|statuts_articles_visibles}
+[(#ENV{id_auteur,''}|=={#SESSION{id_auteur}}|oui)
+	#SET{statuts,#GET{statuts}|array_merge{#LISTE{prepa}}}
+]
+<INCLURE{fond=prive/objets/liste/pages,
+	statut=#GET{statuts},
+	id_auteur=#ENV{id_auteur,''},
+	nb=30,
+	titre=<:pages:toutes_les_pages:>,
+	sinon=<:pages:aucune_page:>,
+	env,
+	ajax}>
+
+[(#AUTORISER{creer,page})
+	[(#URL_ECRIRE{article_edit}
+			|parametre_url{modele,page}
+			|parametre_url{new,oui}
+			|parametre_url{id_rubrique,-1}
+			|icone_verticale{<:pages:creer_page:>,page,new,right})]
+]
+
+[(#REM) Liste de pages utiles pas encore créées ]
+<B_pages_utiles>
+<h2><:pages:titre_pages_utiles:></h2>
+<p class="explication"><:pages:explication_pages_utiles:></p>
+<ul>
+	<BOUCLE_pages_utiles(DATA){source table,#VAL|pages_uniques_utiles}>
+	<li>
+		[(#BOUTON_ACTION{<:pages:bouton_generer_page_utile{titre=#VALEUR,page=#CLE}:>, #URL_ACTION_AUTEUR{generer_pages_uniques_utiles, #CLE, #SELF}})]
+	</li>
+	</BOUCLE_pages_utiles>
+	[(#TOTAL_BOUCLE|>{1}|oui)
+	<li class="tous">
+		[(#BOUTON_ACTION{<:pages:bouton_generer_pages_utiles:>, #URL_ACTION_AUTEUR{generer_pages_uniques_utiles, #VAL, #SELF}})]
+	</li>
+	]
+</ul>
+</B_pages_utiles>
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-new-xx.svg b/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-new-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a72596b17a2878302b669c6ef2e53b340156dc5e
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-new-xx.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M8.6 17.5v37.1h39.7V9.3H15.6l-7 8.2z"/>
+  <path fill="#1d83d4" d="M3.1 19.4v5.5h20.8V3.7h-5.5L3.1 19.4zm7.8 0l7.5-7.5v7.5h-7.5z"/>
+  <path fill="#666" d="M3.1 24.8v32.7c0 1.5 1.2 2.8 2.8 2.8h45.3c1.5 0 2.8-1.2 2.8-2.8v-51c0-1.5-1.2-2.8-2.8-2.8H23.9v5.6h24.4v45.4H8.6V24.9l-5.5-.1z"/>
+  <g transform="matrix(4 0 0 4 256 0)">
+    <circle fill="#4caf50" cx="-52" cy="4" r="4" />
+    <path fill="#fff" d="M-49.2 3.3c-.1-.1-.2-.1-.3-.1h-1.8V1.4c0-.1 0-.2-.1-.3 0-.1-.1-.1-.2-.1h-.8c-.1 0-.2 0-.3.1s-.1.2-.1.3v1.8h-1.8c-.1 0-.2 0-.3.1s-.1.2-.1.3v.8c0 .1 0 .2.1.3.1.1.2.1.3.1h1.8v1.8c0 .1 0 .2.1.3.1.1.2.1.3.1h.8c.1 0 .2 0 .3-.1s.1-.2.1-.3V4.8h1.8c.1 0 .2 0 .3-.1s.1-.2.1-.3v-.8c0-.1-.1-.2-.2-.3z"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-xx.svg b/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5be1f7e15f3b88c67ed988152012251a12e96e8b
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/prive/themes/spip/images/page-xx.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M44.9 9.3H12.2v45.3h39.7V17.5z"/>
+  <path fill="#1d83d4" d="M42.1 3.7h-5.5v21.2h20.8v-5.5L42.1 3.7zm0 15.7v-7.5l7.5 7.5h-7.5z" />
+  <path fill="#666" d="M51.9 24.9v29.8H12.2V9.3h24.4V3.7H9.3C7.7 3.7 6.5 5 6.5 6.5v51c0 1.6 1.3 2.8 2.8 2.8h45.3c1.6 0 2.8-1.3 2.8-2.8V24.8l-5.5.1z" />
+</svg>
diff --git a/design_system_dependences/pages/v2.0.1/saisies-vues/pages_uniques.html b/design_system_dependences/pages/v2.0.1/saisies-vues/pages_uniques.html
new file mode 100644
index 0000000000000000000000000000000000000000..4bf5b3138b00dab3c8e578a69eaf91295c4b8e6e
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/saisies-vues/pages_uniques.html
@@ -0,0 +1,5 @@
+<BOUCLE_article(ARTICLES){page=#ENV{valeur}}>
+<p>#TITRE (#PAGE)</p>
+</BOUCLE_article>
+<p><:saisies:vue_sans_reponse:></p>
+<//B_article>
\ No newline at end of file
diff --git a/design_system_dependences/pages/v2.0.1/saisies/pages_uniques.html b/design_system_dependences/pages/v2.0.1/saisies/pages_uniques.html
new file mode 100644
index 0000000000000000000000000000000000000000..b26c62944781fb8db210bd056649fbcc7a44f221
--- /dev/null
+++ b/design_system_dependences/pages/v2.0.1/saisies/pages_uniques.html
@@ -0,0 +1,19 @@
+[(#REM) 
+  Saisie permettant de sélectionner une page unique par son nom de page
+  
+  Parametres :
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  
+  Exemple d'appel :
+	[(#SAISIE{pages_uniques,nom,
+		label=<:plugin:label:>,
+	})] 
+]
+<select name="#ENV{nom}" id="champ_#ENV{nom}"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(ARTICLES){par titre}{id_rubrique<0}>
+	<option value="#PAGE" [(#PAGE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#TITRE (#PAGE)</option>
+</BOUCLE_selection>
+</select>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/.ok b/design_system_dependences/saisies/.ok
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/saisies/v5.2.0/.gitattributes b/design_system_dependences/saisies/v5.2.0/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..465b267480b1f09100a09841cff27afec2eadae1
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/.gitattributes
@@ -0,0 +1,2 @@
+/tests export-ignore
+/phpcs.xml.dist export-ignore
diff --git a/design_system_dependences/saisies/v5.2.0/.gitignore b/design_system_dependences/saisies/v5.2.0/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a82da7467efb5be26e6bbdf72aecee3e8a78be84
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/.gitignore
@@ -0,0 +1,7 @@
+/vendor/
+/composer.phar
+/composer.lock
+/.phpunit.cache
+/.php_cs.cache
+/.php_cs.txt
+/coverage
diff --git a/design_system_dependences/saisies/v5.2.0/CHANGELOG.md b/design_system_dependences/saisies/v5.2.0/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..08cd5b4b941d464a244a173f38d66095f3569b99
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/CHANGELOG.md
@@ -0,0 +1,270 @@
+# Changelog
+
+## 5.2.0 - 2023-12-30
+
+### Added
+
+- #373 Saisies `conteneur_inline` : 2 variantes des modes en ligne, pour prendre le plus de place (utilisé par défaut pour le constructeur)
+
+### Fixed
+- formidable/#192 Vue d'une saisie `conteneur_inline`: afficher les sous-saisies plutôt que rien
+
+## 5.1.0 - 2023-12-26
+
+### Added
+
+- #371 Pipeline `saisies_aide_memoire_inserer_debut`
+### Changed
+
+
+- `afficher_si` : mettre le contenu de l'écouteur JS dans un fonctions à part `afficher_si_onchange()`
+- `modeles/formulaire_aide_memoire` : renommage de l'option `pre_saisies` en `inserer_avant`, cette option prend désormais un texte arbitraire
+### Fixed
+
+- #366 Faire fonctionner correctement les tests `MATCH` et `!MATCH` des `afficher_si`
+- dans l'aide-mémoire, une seule liste `<dl>` pour toutes les saisies
+## 5.0.2 - 2023-11-21
+
+### Fixed
+
+- La saisie `champ` doit renvoyer un nom de saisie
+- Les clés dans la fonction `saisies_lister_champs_par_section()` doivent être les noms de saisies, pas des clés numériques
+## 5.0.1 - 2023-11-21
+
+### Fixed
+
+- #362 Retour des fieldsets pliables
+## 5.0.0 - 2023-11-21
+
+
+### Added
+
+- #98 Une saisie `conteneur_inline` permettant de justapoxer horizontalement plusieurs saisies
+- formidable/#179 Une saisie `champ` pour choisir un champ dans un formulaire (importée et debuguée depuis `formidable`)
+- formidable/#179 Fonction `saisies_saisie_est_avec_sous_saisies()` qui dit si la saisie peut contenir des sous-saisies.
+- formidable/#179 Fonction `saisies_saisie_est_labelisable()` qui dit si la saisie peut recevoir un label
+- formidable/#179 Fonction `saisies_saisie_est_champ()` qui dit si la saisie correspond à un champ au sens HTML
+- formidable/#179 Fonction `saisies_saisie_get_label()` pour trouver le label d'une saisie, ou équivalent
+- formidable/#179 Fonction `saisie_lister_champs_par_section()` pour lister les saisies de type `champ` en les regroupant selon la structure logique du formulaire. Plusieurs options possibles. Utilisée par la saisie `champ`.
+### Changed
+
+- #300 filtre `picker_selected_par_objet` renommé en `saisies_picker_selected_par_objet`
+- #300 fonction `afficher_si_parser_valeur_MATCH()` renommée `saisies_afficher_si_parser_valeur_MATCH()`
+
+### Deprecated
+
+- #300 balise `#DIV`, utiliser `<div>` directement
+- #300 filtre `|saisie_balise_structure_formulaire`, utiliser `<div>` directement
+- Fonction `saisie_verifier_gel_saisie()` depréciée, utiliser à la place `saisies_saisie_est_gelee()`
+
+### Removed
+
+- #172 Markup HTML: dans la saisie `fieldset`, suppression du `div.fieldset` autour du `fieldset` qui devient `fieldset.fieldset`
+- #300 balise `#GLOBAL`
+- #336 classes `.editer_odd` et `.editer_even` sur les conteneur des saisies, utiliser le sélecteur CSS `nt:child()` à la place
+- #342 option `tagfield` pour la saisie `fieldset`, la légende est désormais systématiquement mise dans `<legend>`
+- #341 pour la saisie `fieldset` options `icone` et `taille_icone`, insérer directement les icones dans l'option `label`
+
+## Unreleased
+
+### Fixed
+
+- #358 corriger la vue/la modification d'une saisie `choix_grille` lorsque l'option `multiple` a été activé _a posteriori_
+- #350 Pas d'attribut `size` par défaut pour les saisies `input` et `email`
+
+## 4.11.0 - 2023-10-22
+
+### Added
+
+- #239 Pouvoir préremplir un champ avec une valeur stockée en session
+- formidable/#176 Ajouter une classe `formulaire_multietapes` sur les formulaires multiétapes pour pouvoir les cibler en css
+#### Fixed
+
+- #343: Dans la vue d'un fieldset, encapsuler les champs pour retrouver une structure identique à la saisie dans un formulaire
+- #331 Multiétapes : ajuster dynamiquement le libellé des boutons précédents/suivants en fonction des `afficher_si`
+- #334 JS : calculer correctement le nombre d'étapes lorsqu'il n'y a pas d'`afficher_si` dans l'étape courante
+- #324 `afficher_si` sur saisie `hidden` : ne pas rendre visible le conteneur
+- #247 Constructeur : dans le menu déroulant pour déplacer une saisie, les saisies `explication` sont désormais décrites par leur titre ou à défaut le début de leur texte
+- #246 Lorsqu'on duplique une saisie, ne pas insérer un label contenant juste ' (copie)' si la saisie initiale n'a pas de label (cas de la saisie `explication` notamment)
+- #242 Constructeur de formulaire : lors du déplacement d'une saisie via le menu déroulant, se rendre ensuite au nouveau emplacement de la saisie.
+
+### Changed
+
+- #331 `saisies_determiner_deplacement_rapide()` peut recevoir les saisies déjà triées par étapes
+- #331 typage des fonctions `saisies_determiner_deplacement_rapide()`, `saisies_determiner_recul_rapide()` et `saisies_determiner_deplacement_rapide()`
+
+## 4.10.0 - 2023-09-30
+
+### Added
+
+- #170 : Pouvoir transformer les saisies explication en boite d'alerte (espace privé uniquement)
+
+### Fixed
+
+- #318 Saisie `case`: afficher la mention d'obligation à la fin du `label_case` si pas de `label`
+- `saisies_aplatir_chaine()` : tenir compte de la syntaxe `/*`
+- `saisies_lister_par_identifiant()` et `saisies_lister_par_nom()`: tenir compte de l'option `$avec_conteneur` pour les sous-saisies
+- `saisies_lister_disponibles_par_categories_usort()`: toujours travailler sur des titres translittérés
+- `saisies_normaliser_disable_choix()`: tenir compte du contenu vide entre virgules
+- `saisies_lister_disponibles_par_categories()` : faire fonctionner l'option `inclure_obsoletes`
+
+## 4.9.1 - 2023-08-14
+
+### Fixed
+
+- Ne pas provoquer de warning PHP sur `#SAISIE` lorsque pas d'erreur en jeu
+
+## 4.9.0 - 2023-08-13
+
+### Security
+
+- #261 Appliquer `interdire_scripts()` sur les message d'erreur
+
+### Added
+
+- #252 Fonction d'API `saisies_encapsuler_noms()`
+- #288 Fonction d'API `saisies_supprimer_sans_reponses()`
+- formidable/#156 Pouvoir faire facilement des vérifications de formulaire APRÈS la vérification des saisies individuelles
+### Fixed
+
+- #284 Mise à jour de la saisie `selecteur_lang` en uniformisant avec les autres sélections (option `intro_vide` notamment)
+- #262 Prendre en compte tout les statuts possible pour la saisie `statuts_auteur`
+- #245 Constructeur de formulaire fonctionnel sur petit écran
+- #45 Compatibilité des afficher_si avec `_SPAM_ENCRYPT_NAME` du plugin nospam
+
+## 4.8.0 - 2023-05-29
+
+### Added
+
+- Option `minlength` pour la saisie `input`
+
+### Fixed
+
+- #279 faire fonctionner correctement les tests d'inégalité en afficher_si lorsque les deux nombres n'ont pas le même nombre de caractère.
+- #274 Correction de cohérence JS/PHP pour un afficher_si court (`@champ@`) lorsque `@champ@` vaut `'0'` (string)
+
+## 4.7.1 - 2023-03-24
+
+### Fixed
+
+- yaml/#7 compatibilité avec le plugin `YAML` v3.0.3
+- #254 #259 #264 refaire fonctionner `_T_ou_typo()` en SPIP 4.2 et >
+- #258 permettre d'envoyer une valeur `0` ou `'0'` (mais pas `empty`) dans une saisie multivaluée (type `checkbox`)
+
+## 4.7.0 - 2023-01-07
+
+### Added
+
+- #123 Option `onglet_vertical` pour les `fieldsets` en `onglet` ; si un seul onglet est désigné comme vertical, tous les onglets le sont
+
+### Changed
+
+- #123 Dans un constructeur de formulaire, les onglets sont désormais verticaux
+- Dans un constructeur de formulaire, les options globales du formulaire sont en `pleine_largeur`
+
+### Fixed
+
+- auth_email/#1 Lorsqu'on a une erreur dans un ou plusieurs onglets, se rendre au premier onglet avec erreurs
+- #240 : Compatibilité entre les fieldset en onglets et `select2`
+
+## 4.6.1 - 2022-12-01
+
+
+### Added
+
+- #236 Ajout de la saisie `type_mime` (utilisé pour constructeur de formulaire) depuis CVT-Upload
+
+### Fixed
+
+- #236 Correction d'un bug sur constructeur de formulaire lorsque CVT-Upload n'est pas disponible
+- #236 Ne pas proposer la vérification `fichiers` pour des saisies non `fichiers`
+- #237 `saisie_transformer_option()` ajoute l'option si jamais elle est inexistante (bug introduit en v4.5.0)
+- #237 Constructeur de formulaire : toutes les saisies sont en pleine largeur (comportement qui avait été cassé en v4.5.0)
+- #237 `saisie_mapper_option()` ajoute l'option si jamais elle est inexistante
+- #238 Saisie `destinataires` : ne pas afficher de label si jamais tout est caché
+
+## 4.6.0 - 2022-11-21
+
+### Changed
+
+- Dans le constructeur de formulaires, on ne gère plus directement les exceptions de vérification pour la saisie `fichiers` du plugin CVT-Upload. On n'utilise à la place un pipeline `saisies_verifier_lister_disponibles`.
+### Fixed
+
+- #233 Lorsqu'un constructeur de formulaire ajoute ses propres fieldsets racine à la configuration d'une saisie, les afficher en onglet à côté des autres fieldset, pas en dessous
+- inserer_modeles/#12 Faire fonctionner la saisie `selecteur_documents` appelée au sein d'une modalbox
+- #226 Debug des `afficher_si` au chargement des pages qui chargent également du contenu/javascript en Ajax
+- cvt-upload/#12 Constructeur de formulaire : afficher les options de vérification pour la saisie fichier
+
+### Removed
+
+- La saisie `selecteur_documents` n'a plus besoin de `_modalbox_retour`
+
+## 4.5.2 - 2022-09-23
+
+### Fixed
+
+- #225 : un input avec une valeur 0 (ou '0') affichait une chaine vide : saisies_utf8_restaurer_planes() ne retourne plus une chaine vide
+
+## 4.5.1 - 2022-09-14
+
+### Fixed
+
+- Refait fonctionner la vérification de (certains) formulaires
+
+
+## 4.5.0 - 2022-09-11
+
+### Fixed
+
+- formidable/#120: Pour la saisie explication, seul le bouton d'affichage/masquage affiche/masque, pas les boutons du constructeur de formulaire.
+- #208 Générer une exception dans `saisies_lister_disponibles()` et `saisies_charger_infos()` si le plugin `YAML` n'est pas actif.
+- formidable_participation/#9 + #207 Dans l'espace privé, éviter les problèmes de marge supérieur lorsqu'un fieldset suit un élèment masqué par `afficher_si`.
+- #216 Eviter une rupture de compat brutal en v4 concernant l'emplacement de `nouveau_type_saisie` dans l'argument `$modifs` dans `saisie_modifier()`.
+
+### Added
+
+- #208 Tenir compte des options pour dev lorsqu'on nettoie l'environnement de `#GENERER_SAISIES`
+- #222 Nouvelle fonction `saisie_mapper_option()` pour appliquer une fonction de rappel sur une (ou plusieurs) options données d'un ensemble de saisies
+- #222 `saisie_transformer_option()` peut recevoir une liste d'options à modifier, plutôt qu'une option unique
+## 4.4.1 - 2022-06-06
+
+
+### Fixed
+
+- #206 Pour la saisie radio, si les clés sont des entiers, ne pas considérer que l'absence de valeur par défaut vaut valeur par défaut == 0
+- Correction de `selecteur_document.yaml` mal formaté
+
+## 4.4.0 - 2022-05-31
+
+### Added
+
+- #200 Ajout de `saisies_verifier_coherence_afficher_si()` (utilisable par les constructeurs de formulaire)
+- #171 Option de saisie `explication_apres`, pour insérer une explication après le champ, en plus ou à la place de l'explication avant
+- #171 Dans l'aide de saisies, les messages d'attention accolés aux options sont affichés
+- #185 Les emoji apparaissent sous la forme normale, et non pas la forme entité HTML, dans les saisies `textarea`  et `input`
+- #198 Ajout de quatre `trigger` Javascript sur les `afficher_si` :
+	* `afficher_si_visible_pre` (avant de rendre visible un champ);
+	* `afficher_si_visible_post` (après avoir rendu visible);
+	* `afficher_si_masque_pre` (avant de masquer un champ);
+	* `afficher_si_masque_post` (après avoir masqué un champ);
+
+### Changed
+
+- formidable/#70 Vue des `fieldset` : utiliser aussi un markup `fieldset`/`legend`, pour affichage correct dans les emails
+- #198 `afficher_si` : ne faire les actions de masquage/demasquage que si la saisie n'est pas déjà masquée/démasquée
+- #199 Constructeur de saisie : tout ce qui est `afficher_si` dans un
+onglet  `condition` à part
+- #188 Constructeur de formulaire : positionner l'écran sur la saisie en cours d'édition
+
+### Fixed
+
+- #196 Debug du constructeur de formulaire, qui ne doit pas proposer les saisies obsolètes, même aprés une première vérification de saisies
+- #198 Lors de l'édition d'un formulaire, les fieldsets ne sont pas mis en mode onglet
+- #198 Les fieldset en onglets restent à leur emplacement ; il est possible de mettre du contenu hors onglet entre deux fieldset
+- #194 La saisie `fieldset` n'hérite plus de l'`id` du formulaire
+- #193 Afficher correctement les erreurs des champs dont le nom est déclarée selon la syntaxe SPIP `cle/souscle/nom`
+- Le `describedby` d'un champ lorsque l'on a une erreur sur une saisie avec un `name` contenant des crochets est corrigé
+- #198 Les `afficher_si` fonctionnent désormais sur les onglets
+- #198 Attribut `aria-labelledby` correct sur les onglets
+- #180 Sous firefox : pouvoir sélectionner la barre de scroll pour les onglets horizontaux + ne pas la superposer avec la bordure des onglets
+- #166 Constructeur de formulaire : rendre visible les boutons d'action lorsqu'une saisie non `fieldset` suit un `fieldset`
diff --git a/design_system_dependences/saisies/v5.2.0/README.md b/design_system_dependences/saisies/v5.2.0/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e59c55ae56caa430658fe8c54fb2730157662d5d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/README.md
@@ -0,0 +1,15 @@
+# SAISIES
+
+Ce plugin permet de gérer des saisies de formulaire.
+
+Il propose notamment des mécanismes de vérifications automatique et d'affichage conditionnel.
+
+Documentation complète sur https://contrib.spip.net/Saisies.
+
+# Tests unitaires
+Pour executer avec PHPunit les tests unitaires
+
+
+1. `composer install` (la tout première fois)
+2. `vendor/bin/phpunit` pour faire tout les tests
+3. `XDEBUG_MODE=coverage vendor/bin/phpunit tests/ --coverage-html coverage` pour avoir un rapport de couverture, puis ouvrir `coverage/index.html` avec un navigateur.
diff --git a/design_system_dependences/saisies/v5.2.0/UPGRADE_5.0.md b/design_system_dependences/saisies/v5.2.0/UPGRADE_5.0.md
new file mode 100644
index 0000000000000000000000000000000000000000..001bff427e84d31a161a325e2e81c1c65eed9e84
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/UPGRADE_5.0.md
@@ -0,0 +1,32 @@
+# UPGRADE DE `saisies` 4.x à 5.0
+
+Ce fichier liste les points de surveillance lors du passage de la version 4 à la version 5 du plugin `saisies`.
+
+
+### Changement dans le balisage HTML
+
+- Dans la saisie `fieldset`, suppression du `div.fieldset` autour du `fieldset` qui devient `fieldset.fieldset`
+- Suppression des classes `.editer_odd` et `.editer_even` sur les conteneur des saisies, utiliser le sélecteur CSS `nt:child()` à la place
+
+### Fonctions et filtres renommés
+
+Ces fonctions et filtres sont à usage purement interne, toutetefois si vous les utilisiez malgrès tout, il faudra adapter votre code.
+
+- filtre `picker_selected_par_objet` renommé en `saisies_picker_selected_par_objet`
+- fonction `afficher_si_parser_valeur_MATCH()` renommée `saisies_afficher_si_parser_valeur_MATCH()`
+
+### Fonctionnalités dépréciées
+
+Ces fonctionnalités n'ont plus lieu d'être et seront supprimées en v6. Anticipez vos changement de code.
+
+- balise `#DIV`, utiliser `<div>` directement
+- filtre `|saisie_balise_structure_formulaire`, utiliser `<div>` directement
+- Dans la fonction `saisies_modifier()`, `nouveau_type_saisie` doit être appelé à la racine de `$modifs`. L\'appel dans `$options` est deprécié et sera supprimé en v6
+- Fonction `saisie_verifier_gel_saisie()` depréciée, utiliser à la place `saisies_saisie_est_gelee()`
+### Fonctionnalités supprimées
+
+Ces fonctionnalités correspondent à un état de l'art qui n'existe plus et sont supprimées directement.
+
+- balise `#GLOBAL`
+- option `tagfield` pour la saisie `fieldset`, la légende est désormais systématiquement mise dans `<legend>`
+- pour la saisie `fieldset` options `icone` et `taille_icone`, insérer directement les icones dans l'option `label`
diff --git a/design_system_dependences/saisies/v5.2.0/action/deplacer_saisie.php b/design_system_dependences/saisies/v5.2.0/action/deplacer_saisie.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d53e528e43be37da69c4dee44151acc941ce7ef
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/action/deplacer_saisie.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Gestion de l'action déplacer saisie.
+ *
+ * @package SPIP\Saisies\Action
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Action de déplacement de saisies dans le constructeur de formulaires
+ *
+ * @return void
+ **/
+function action_deplacer_saisie_dist() {
+	include_spip('inc/session');
+
+	$session 	 = _request('session');
+	$identifiant = _request('saisie');
+	$ou          = _request('ou');
+
+	// On récupère le formulaire à son état actuel
+	$formulaire_actuel = session_get($session);
+
+	if (!$formulaire_actuel) {
+		return '';
+	}
+
+	include_spip('inc/saisies');
+
+	$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
+	if (!isset($saisies_actuelles[$identifiant])) {
+		return '';
+	}
+
+	// tester @id et [@id] (fieldset)
+	if ($ou && !isset($saisies_actuelles[$ou]) && !isset($saisies_actuelles[ substr($ou, 1, -1) ])) {
+		return '';
+	}
+
+	// on deplace ou c'est demande...
+	$formulaire_actuel = saisies_deplacer($formulaire_actuel, $identifiant, $ou);
+
+	// On sauve tout ca
+	$formulaire_actuel = session_set($session, $formulaire_actuel);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/aide/saisies.html b/design_system_dependences/saisies/v5.2.0/aide/saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..ba1fc9ef3299680ce034c334979de4fb3cb99fd7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/aide/saisies.html
@@ -0,0 +1,13 @@
+[(#PLUGIN{yaml}|oui)
+<h1>Références complètes des saisies</h1>
+
+<p>Cette documentation a été générée à partir de la [v(#PLUGIN{saisies,version})] du plugin Saisies.</p>
+
+
+[(#ENV{format}|=={brut}|oui)<textarea style="width:100%; height:100%;">]
+[(#VAL|saisies_generer_aide)
+[(#ENV{format}|=={brut}|oui)</textarea>]
+]
+]
+[(#PLUGIN{yaml}|non)
+Activez le plugin YAML pour générer l'aide]
diff --git a/design_system_dependences/saisies/v5.2.0/balise/configurer_saisie.php b/design_system_dependences/saisies/v5.2.0/balise/configurer_saisie.php
new file mode 100644
index 0000000000000000000000000000000000000000..86f32716f9ed74fe270a9f1d3775526f4ac07700
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/balise/configurer_saisie.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Déclaration de la balise `#CONFIGURER_SAISIE`
+ *
+ * @package SPIP\Saisies\Balises
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Compile la balise `#CONFIGURER_SAISIE`
+ *
+ * @uses Pile::recuperer_et_supprimer_argument_balise()
+ * @uses Pile::creer_et_ajouter_argument_balise()
+ * @see balise_INCLURE_dist()
+ *
+ * @param Champ $p
+ * @return Champ
+ **/
+function balise_CONFIGURER_SAISIE_dist($p) {
+
+	// On recupere le premier argument : le nom de la saisie
+	$saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+
+	// On ajoute le squelette a inclure dans les parametres
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/configurer_saisie');
+
+	// On ajoute l'environnement
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+
+	// On ajoute le nom recupere
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'saisie', $saisie);
+
+	// On redirige vers la balise INCLURE
+	if (function_exists('balise_INCLURE')) {
+		return balise_INCLURE($p);
+	} else {
+		return balise_INCLURE_dist($p);
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/balise/generer_saisies.php b/design_system_dependences/saisies/v5.2.0/balise/generer_saisies.php
new file mode 100644
index 0000000000000000000000000000000000000000..41630a3c707172ce2b33727f04300d342551c1df
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/balise/generer_saisies.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Gestion de la balise `#GENERER_SAISIES`
+ *
+ * @package SPIP\Saisies\Balises
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Compile la balise `#GENERER_SAISIES` qui retourne le code HTML des saisies de formulaire,
+ * à partir du tableau des saisies transmises
+ *
+ * La balise accepte 1 paramètre qui est une liste de descriptions de saisies
+ * dont on veut générer le HTML affichant les champs du formulaires
+ *
+ * Cette balise est un raccourci :
+ * - `#GENERER_SAISIES{#TABLEAU_DE_SAISIES}` est équivalent à
+ * - `#INCLURE{fond=inclure/generer_saisies,env,saisies=#TABLEAU_DE_SAISIES}`
+ *
+ * @syntaxe `#GENERER_SAISIES{#TABLEAU_DE_SAISIES}`
+ * @uses Pile::recuperer_et_supprimer_argument_balise()
+ * @uses Pile::creer_et_ajouter_argument_balise()
+ * @see balise_INCLURE_dist()
+ *
+ * @param Champ $p
+ *     Pile au niveau de la balise
+ * @return Champ
+ *     Pile complété du code à générer
+ **/
+function balise_GENERER_SAISIES_dist($p) {
+
+	// On recupere le premier (et seul) argument : le tableau decrivant ce qu'on veut generer
+	$config = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+
+	// On ajoute le squelette a inclure dans les parametres
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/generer_saisies');
+
+	// On ajoute l'environnement
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+
+	// On ajoute le tableau recupere
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $config);
+
+	// On redirige vers la balise INCLURE
+	if (function_exists('balise_INCLURE')) {
+		return balise_INCLURE($p);
+	} else {
+		return balise_INCLURE_dist($p);
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/balise/saisie.php b/design_system_dependences/saisies/v5.2.0/balise/saisie.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf92e11cfe2854c5b2c1475f2312eac802f1d126
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/balise/saisie.php
@@ -0,0 +1,273 @@
+<?php
+
+/**
+ * Déclaration de la classe `Pile` et de la balise `#SAISIE`
+ *
+ * @package SPIP\Saisies\Balises
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+// pour ne pas interferer avec d'eventuelles futures fonctions du core
+// on met le tout dans une classe ; les fonctions sont autonomes.
+
+/**
+ * Conteneur pour modifier les arguments d'une balise SPIP (de classe Champ) à compiler
+ *
+ * @note
+ *     Ces fonctions visent à modifier l'AST (Arbre de Syntaxe Abstraite) issues
+ *     de l'analyse du squelette. Très utile pour créer des balises qui
+ *     transmettent des arguments supplémentaires automatiquement, à des balises
+ *     déjà existantes.
+ *     Voir un exemple d'utilisation dans `balise_SAISIE_dist()`.
+ *
+ * @note
+ *     Les arguments sont stockés sont dans l'entree 0 de la propriété `param`
+ *     dans l'objet Champ (représenté par `$p`), donc dans `$p->param[0]`.
+ *
+ *     `param[0][0]` vaut toujours '' (ou presque ?)
+ *
+ * @see balise_SAISIE_dist() Pour un exemple d'utilisation
+ **/
+class Pile {
+	/**
+	 * Récupère un argument de balise
+	 *
+	 * @param int $pos
+	 * @param Champ $p
+	 * @return mixed|null Élément de l'AST représentant l'argument s'il existe
+	 **/
+	public static function recuperer_argument_balise($pos, $p) {
+		if (!isset($p->param[0])) {
+			return null;
+		}
+		if (!isset($p->param[0][$pos])) {
+			return null;
+		}
+		return $p->param[0][$pos];
+	}
+
+	/**
+	 * Supprime un argument de balise
+	 *
+	 * @param int $pos
+	 * @param Champ $p
+	 * @return Champ
+	 **/
+	public static function supprimer_argument_balise($pos, $p) {
+		if (!isset($p->param[0])) {
+			return null;
+		}
+		if (!isset($p->param[0][$pos])) {
+			return null;
+		}
+		if ($pos == 0) {
+			array_shift($p->param[0]);
+		} else {
+			$debut = array_slice($p->param[0], 0, $pos);
+			$fin   = array_slice($p->param[0], $pos + 1);
+			$p->param[0] = array_merge($debut, $fin);
+		}
+		return $p;
+	}
+
+
+	/**
+	 * Retourne un argument de balise, et le supprime de la liste des arguments
+	 *
+	 * @uses Pile::recuperer_argument_balise()
+	 * @uses Pile::supprimer_argument_balise()
+	 *
+	 * @param int $pos
+	 * @param Champ $p
+	 * @return mixed|null Élément de l'AST représentant l'argument s'il existe
+	 **/
+	public static function recuperer_et_supprimer_argument_balise($pos, &$p) {
+		$arg = Pile::recuperer_argument_balise($pos, $p);
+		$p   = Pile::supprimer_argument_balise($pos, $p);
+		return $arg;
+	}
+
+
+	/**
+	 * Ajoute un argument de balise
+	 *
+	 * Empile l'argument à la suite des arguments déjà existants pour la balise
+	 *
+	 * @param mixed $element Élément de l'AST représentant l'argument à ajouter
+	 * @param Champ $p
+	 * @return Champ
+	 **/
+	public static function ajouter_argument_balise($element, $p) {
+
+		// Toujours un parametre 0 vide s'il n'existe pas.
+		if (!isset($p->param[0][0])) {
+			if (!isset($p->param[0])) {
+				$p->param[0] = [];
+			}
+			$p->param[0][0] = '';
+		}
+
+		$zero = array_shift($p->param[0]);
+		array_unshift($p->param[0], $element);
+		array_unshift($p->param[0], $zero);
+
+		return $p;
+	}
+
+
+	/**
+	 * Crée l'élément de l'AST représentant un argument de balise.
+	 *
+	 * @example
+	 *     ```
+	 *     $nom = Pile::creer_argument_balise(nom);           // {nom}
+	 *     $nom = Pile::creer_argument_balise(nom, 'coucou'); // {nom=coucou}
+	 *
+	 *     $balise = Pile::creer_balise('BALISE');
+	 *     $nom = Pile::creer_argument_balise(nom, $balise);  // {nom=#BALISE}
+	 *     ```
+	 *
+	 * @param string $nom
+	 *     Nom de l'argument
+	 * @param string|object $valeur
+	 *     Valeur de l'argument. Peut être une chaîne de caractère ou un autre élément d'AST
+	 * @return array
+	 **/
+	public static function creer_argument_balise($nom, $valeur = null) {
+		include_spip('public/interfaces');
+		$s = new Texte();
+		$s->texte = $nom;
+		$s->ligne = 0;
+
+		// si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres
+		if (is_object($valeur)) {
+			$valeur = [$valeur];
+		}
+
+		$res = null;
+
+		// {nom}
+		if (is_null($valeur)) {
+			$res = [$s];
+		} elseif (is_string($valeur)) {
+			// {nom=coucou}
+			$s->texte .= "=$valeur";
+			$res = [$s];
+		} elseif (is_array($valeur)) {
+			// {nom=#BALISE}
+			$s->texte .= '='; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :)
+			$res = array_merge([$s], $valeur);
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Crée et ajoute un argument à une balise
+	 *
+	 * @uses Pile::creer_argument_balise()
+	 * @uses Pile::ajouter_argument_balise()
+	 *
+	 * @param Champ $p
+	 * @param string $nom
+	 *     Nom de l'argument
+	 * @param string|object $valeur
+	 *     Valeur de l'argument. Peut être une chaîne de caractère ou un autre élément d'AST
+	 * @return Champ
+	 **/
+	public static function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) {
+		$new = Pile::creer_argument_balise($nom, $valeur);
+		return Pile::ajouter_argument_balise($new, $p);
+	}
+
+
+
+	/**
+	 * Crée l'AST d'une balise
+	 *
+	 * @example
+	 *     ```
+	 *     // Crée : #ENV*{titre}
+	 *     $titre = Pile::recuperer_argument_balise(1, $p); // $titre, 1er argument de la balise actuelle
+	 *     $env = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*'));
+	 *     ```
+	 *
+	 * @param string $nom
+	 *     Nom de la balise
+	 * @param array $opt
+	 *     Options (remplira les propriétés correspondantes de l'objet Champ)
+	 * @return Champ
+	 **/
+	public static function creer_balise($nom, $opt = []) {
+		include_spip('public/interfaces');
+		$b = new Champ();
+		$b->nom_champ = strtoupper($nom);
+		foreach ($opt as $o => $val) {
+			if (property_exists($b, $o)) {
+				if ($o == 'param') {
+					array_unshift($val, '');
+					$b->$o = [$val];
+				} else {
+					$b->$o = $val;
+				}
+			}
+		}
+		return $b;
+	}
+}
+
+
+
+/**
+ * Compile la balise `#SAISIE` qui retourne le code HTML de la saisie de formulaire indiquée.
+ *
+ * Cette balise incluera le squelette `saisies/_base.html` et lui-même `saisies/{type}.html`
+ *
+ * La balise `#SAISIE` est un raccourci pour une écriture plus compliquée de la balise `#INCLURE`.
+ * La balise calcule une série de paramètre récupérer et à transmettre à `#INCLURE`,
+ * en fonction des valeurs des 2 premiers paramètres transmis.
+ *
+ * Les autres arguments sont transmis tels quels à la balise `#INCLURE`.
+ *
+ * Ainsi `#SAISIE{input,nom,label=Nom,...}` exécutera l'équivalent de
+ * `#INCLURE{nom=nom,valeur=#ENV{nom},type_saisie=input,erreurs,fond=saisies/_base,label=Nom,...}`
+ *
+ * @syntaxe `#SAISIE{type,nom[,option=xx,...]}`
+ *
+ * @uses Pile::recuperer_et_supprimer_argument_balise()
+ * @uses Pile::creer_balise()
+ * @uses Pile::creer_et_ajouter_argument_balise()
+ * @see balise_INCLURE_dist()
+ *
+ * @param Champ $p
+ * @return Champ
+ */
+function balise_SAISIE_dist($p) {
+
+	// on recupere les parametres sans les traduire en code d'execution php
+	$type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $type
+	$titre       = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $titre
+
+	// creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
+	$env_titre   = Pile::creer_balise('ENV', ['param' => [$titre], 'etoile' => '*']); // #ENV*{titre}
+
+	// on modifie $p pour ajouter des arguments
+	// {nom=$titre, valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $titre);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_titre);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'erreurs');
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies/_base');
+
+	// on appelle la balise #INCLURE
+	// avec les arguments ajoutes
+	if (function_exists('balise_INCLURE')) {
+		return balise_INCLURE($p);
+	} else {
+		return balise_INCLURE_dist($p);
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/balise/voir_saisie.php b/design_system_dependences/saisies/v5.2.0/balise/voir_saisie.php
new file mode 100644
index 0000000000000000000000000000000000000000..fce6ee6cb750a802182ebf1ec1ca328d8a30535d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/balise/voir_saisie.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Déclaration de la balise `#VOIR_SAISIE`
+ *
+ * @package SPIP\Saisies\Balises
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Compile la balise `#VOIR_SAISIE` qui retourne le code HTML de la vue d'une saisie indiquée
+ *
+ * Cette balise incluera le squelette `saisies-vues/_base.html` et lui-même `saisies-vues/{type}.html`
+ *
+ * @syntaxe `#VOIR_SAISIE{type,nom[,option=valeur,...]}`
+ * @uses Pile::recuperer_et_supprimer_argument_balise()
+ * @uses Pile::creer_et_ajouter_argument_balise()
+ * @uses Pile::creer_balise()
+ * @see balise_INCLURE_dist()
+ *
+ * @param Champ $p
+ * @return Champ
+ */
+function balise_VOIR_SAISIE_dist($p) {
+
+	// on recupere les parametres sans les traduire en code d'execution php
+	$type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+	$nom         = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+
+	// creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
+	$env_nom   = Pile::creer_balise('ENV', ['param' => [$nom], 'etoile' => '*']); // #ENV*{nom}
+
+	// on modifie $p pour ajouter des arguments
+	// {nom=$nom, valeur=#ENV{$nom}, type_saisie=$type, fond=saisies/_base}
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $nom);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_nom);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies-vues/_base');
+
+	// on appelle la balise #INCLURE
+	// avec les arguments ajoutes
+	if (function_exists('balise_INCLURE')) {
+		return balise_INCLURE($p);
+	} else {
+		return balise_INCLURE_dist($p);
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/balise/voir_saisies.php b/design_system_dependences/saisies/v5.2.0/balise/voir_saisies.php
new file mode 100644
index 0000000000000000000000000000000000000000..86f6a742dee0b3906eddddf7bdb7e3d415e3a488
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/balise/voir_saisies.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Déclaration de la balise `#VOIR_SAISIES`
+ *
+ * @package SPIP\Saisies\Balises
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Compile la balise `#VOIR_SAISIES` qui retourne le code HTML des vues de formulaire,
+ * à partir du tableau des saisies transmises
+ *
+ * La balise accepte 2 paramètre :
+ *  - une liste de descriptions de saisies
+ *  dont on veut générer le HTML affichant les vues du formulaires
+ *  - un liste des valeurs
+ * Cette balise est un raccourcis :
+ * - `#VOIR_SAISIES{#TABLEAU_DE_SAISIES}` est équivalent à
+ * - `#INCLURE{fond=inclure/voir_saisies,env,saisies=#TABLEAU_DE_SAISIES,valeurs=#TABLEAU_DE_VALEURS}`
+ *
+ * @syntaxe `#VOIR_SAISIES{#TABLEAU_DE_SAISIES}`
+ * @uses Pile::recuperer_et_supprimer_argument_balise()
+ * @uses Pile::creer_et_ajouter_argument_balise()
+ * @see balise_INCLURE_dist()
+ *
+ * @param Champ $p
+ *     Pile au niveau de la balise
+ * @return Champ
+ *     Pile complété du code à générer
+ **/
+function balise_VOIR_SAISIES_dist($p) {
+
+	// On recupere les arguments : les tableaux decrivant ce qu'on veut generer + les reponses
+	$saisies = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+	$valeurs = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+
+	// On ajoute le squelette a inclure dans les parametres
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/voir_saisies');
+
+	// On ajoute l'environnement
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+
+	// On ajoute les tableaux recuperes
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $saisies);
+	$p = Pile::creer_et_ajouter_argument_balise($p, 'valeurs', $valeurs);
+
+	// On redirige vers la balise INCLURE
+	if (function_exists('balise_INCLURE')) {
+		return balise_INCLURE($p);
+	} else {
+		return balise_INCLURE_dist($p);
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/champs_extras/calculer_balise_lister_valeurs_choix_grille.php b/design_system_dependences/saisies/v5.2.0/champs_extras/calculer_balise_lister_valeurs_choix_grille.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c60cd43205937f42c979b7b1045dc01eba76397
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/champs_extras/calculer_balise_lister_valeurs_choix_grille.php
@@ -0,0 +1,46 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Déclaration de la balise LISTER_VALEURS pour la saisie `choix_grille`
+ * @param string $objet
+ *     Type d'objet
+ * @param string $colonne
+ *     Nom de la colonne SQL
+ * @param string $cles
+ *     Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours
+ * @return array|string vide
+ *		Tableau de type 'Clé de ligne|Valeur de ligne' => 'Ligne en valeur humaine|Valeur de ligne en humain'.
+ * Par ex 'Ligne1|Colonne1' => 'Ma première ligne|Ma première colonne'
+ **/
+function champs_extras_calculer_balise_LISTER_VALEURS_choix_grille($objet, $colonne, $cles) {
+	$options = calculer_balise_CHAMP_EXTRA($objet, $colonne);
+	if (isset($options['data_rows']) && isset($options['data_cols'])) {
+		$data_rows = saisies_chaine2tableau($options['data_rows']);
+		$data_cols = saisies_chaine2tableau($options['data_cols']);
+		$retour = [];
+		$valeurs = saisies_chaine2tableau($cles);
+		foreach ($valeurs as $cle => $valeur) {
+			if (is_array($valeur)) {
+				$colonne_humaine = join(
+					'|',
+					array_map(
+						function ($i) use ($data_cols) {
+							return $data_cols[$i];
+						},
+						$valeur
+					)
+				);
+				$retour["$cle|" . join('|', $valeur)] = $data_rows[$cle] . '|' . $colonne_humaine;
+			} else {
+				$retour["$cle|$valeur"] = $data_rows[$cle] . '|' . $data_cols[$valeur];
+			}
+		}
+		return $retour;
+	} else {
+		return '';
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/champs_extras/serialiser_choix_grille.php b/design_system_dependences/saisies/v5.2.0/champs_extras/serialiser_choix_grille.php
new file mode 100644
index 0000000000000000000000000000000000000000..96c2aece7c7e5d431ad133a7f6fbe058c1376817
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/champs_extras/serialiser_choix_grille.php
@@ -0,0 +1,18 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) { return;
+}
+
+/**
+ * Sérialise les réponses à un champ extra de type `choix_grille` pour encodage en base.
+ * @param array $extra
+ *     La valeur reçue en POST
+ * @param array $saisie
+ *     La description de la saisie
+ * @return string
+ *		 Forme serialisé, en l'occurence avec saisies_tableau2chaine
+ **/
+function champs_extras_serialiser_choix_grille($extra, $saisie) {
+	include_spip('inc/saisies');
+	return saisies_tableau2chaine($extra);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/composer.json b/design_system_dependences/saisies/v5.2.0/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..cf541183a5eb6ff460bd5a1d8cfb5e6dcf4b7019
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/composer.json
@@ -0,0 +1,11 @@
+{
+    "autoload-dev": {
+        "psr-4": {
+            "Spip\\Saisies\\Tests\\": "tests/"
+        }
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^10.1",
+        "symfony/yaml": "^6.2"
+    }
+}
diff --git a/design_system_dependences/saisies/v5.2.0/css/formulaires_constructeur.css b/design_system_dependences/saisies/v5.2.0/css/formulaires_constructeur.css
new file mode 100644
index 0000000000000000000000000000000000000000..49d67a0a20e9929362c2384fe0d63984ffb3c0fa
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/css/formulaires_constructeur.css
@@ -0,0 +1,317 @@
+/**
+ * Styles du constructeur de formulaires.
+ */
+
+
+/**
+ * Conteneur
+ */
+.formulaire_construire_formulaire {
+	--saisies-btn-padding-x: var(--spip-btn-padding-x);
+	--saisies-btn-padding-y: var(--spip-btn-padding-y);
+	--saisies-btn-fontsize: var(--spip-btn-font-size);
+	--saisies-btn-iconsize: 32px;
+	margin-left: calc(var(--spip-form-spacing-x) * -1);
+	margin-right: calc(var(--spip-form-spacing-x) * -1);
+}
+.formulaire_spip .formulaire_construire_formulaire {
+	border: none;
+	background: transparent;
+}
+
+
+/**
+ * Saisie en configuration, avec le formulaire inséré à la fin.
+ * Pour les fieldsets et conteneur_inline, c'est inséré après.
+ */
+.formulaire_construire_formulaire .en_configuration {
+	border: 3px solid var(--spip-color-theme) !important;
+	border-radius: var(--spip-form-border-radius);
+	padding-top: var(--spip-form-spacing-y);
+	padding-bottom: 0;
+	margin: calc(var(--spip-form-spacing-y) / 2) 0;
+	box-shadow: 0 0 2em var(--spip-color-theme-lightest); /* Pour faire « poper » la saisie */
+}
+.formulaire_construire_formulaire .avec_sous_saisies.en_configuration > *,
+.formulaire_construire_formulaire .avec_sous_saisies.en_configuration > .formulaire_configurer {
+	margin: 0;
+}
+
+
+/**
+ * Formulaire de configuration dans une saisie
+ */
+.formulaire_construire_formulaire .formulaire_configurer {
+	margin-top: var(--spip-form-spacing-y);
+	margin-left: calc(var(--spip-form-spacing-x) * -1);
+	margin-right: calc(var(--spip-form-spacing-x) * -1);
+	padding: 0;
+	border-top: 3px dashed var(--spip-color-theme-light);
+}
+.formulaire_construire_formulaire .editer.pleine_largeur .formulaire_configurer,
+.formulaire_construire_formulaire .avec_sous_saisies.editer:not(.en_configuration) .formulaire_configurer {
+	margin-left: calc(var(--spip-form-spacing-x) * -1);
+}
+@media (min-width: 580px) {
+	.formulaire_construire_formulaire .formulaire_configurer {
+		margin-left: calc((var(--spip-form-label-width) + (var(--spip-form-spacing-x) * 2)) * -1);
+	}
+	.formulaire_construire_formulaire .editer.long_label .formulaire_configurer {
+		margin-left: calc((var(--spip-form-label-long-width) + (var(--spip-form-spacing-x) * 2)) * -1);
+	}
+}
+.formulaire_construire_formulaire .formulaire_configurer > .editer-groupe {
+	margin-left: 0;
+	margin-right: 0;
+}
+/* onglets */
+.formulaire_construire_formulaire .formulaire_configurer .saisies-contenus-onglets > .fieldset {
+	padding-left: 0;
+}
+/* boutons  */
+.formulaire_construire_formulaire .formulaire_configurer .boutons {
+	margin: 0;
+}
+/*
+ * Saisies inline
+*/
+.formulaire_construire_formulaire .conteneur_inline:not(.en_configuration) .editer-groupe_inline{
+	border:1px dashed var(--spip-color-gray);
+	min-height:1em;
+	padding-top: var(--spip-form-spacing-y);
+	padding-bottom: calc(var(--spip-form-spacing-y) / 2);
+	column-gap: 0.5em;
+}
+.formulaire_construire_formulaire .editer-groupe_inline > .editer {
+	/* largeur minimale de la saisie = largeur du bloc de boutons d'actions
+	4 boutons avec une icone de 16px (1em) + padding de 0.25em */
+	min-width: calc(4em + 8 * 0.25em);
+}
+.formulaire_construire_formulaire .conteneur_inline > .actions,
+.formulaire_construire_formulaire .editer-groupe_inline > .editer .actions {
+	right: 0;
+	inset-inline-end: 0;
+}
+.formulaire_construire_formulaire .editer-groupe_inline > .editer .actions {
+	position: relative;
+	float: right;
+	top: unset;
+	right: unset;
+}
+.formulaire_construire_formulaire .editer-groupe_inline > .editer .actions img {
+	min-width: 1em;
+}
+.formulaire_construire_formulaire .editer-groupe_inline > .editer > .actions .btn,
+.formulaire_construire_formulaire .editer-groupe_inline > .editer > .actions button {
+	padding-left: 0.25em;
+	padding-right: 0.25em;
+}
+.formulaire_construire_formulaire.configurer_saisie .editer-groupe_inline {
+	display: block;/** Lorsqu'on configure une saisie au sein d'un conteneur_inline, la prendre en pleine largeur**/
+}
+.formulaire_construire_formulaire .conteneur_inline:not(.en_configuration) .editer-groupe_1ligne_colonnes {
+	overflow: scroll;
+}
+/**
+ * Fieldsets
+ * On ajoute une bordure pour mieux visualiser, il faut donc ajuster les marges et cie.
+ */
+.formulaire_construire_formulaire .avec_sous_saisies.configurable:not(.en_configuration).fieldset {
+	border: 1px dashed var(--spip-color-gray);
+	padding-top: 0 !important;
+}
+.formulaire_construire_formulaire .saisies_presentes fieldset.avec_sous_saisies  {
+	margin-left: 0;
+	margin-right: 0;
+}
+.formulaire_construire_formulaire .saisies_presentes  fieldset:not(.editer),
+.formulaire_construire_formulaire .saisies_presentes  fieldset.editer.pleine_largeur {
+	padding-left: var(--spip-form-spacing-x);
+	padding-right: var(--spip-form-spacing-x);
+}
+.formulaire_construire_formulaire .avec_sous_saisies.en_configuration {
+	padding-left:0!important;
+	padding-right:0!important;
+}
+.formulaire_construire_formulaire .avec_sous_saisies.en_configuration > legend {
+	margin: 0 var(--spip-form-spacing-x);
+}
+/* Ceux dans le form de config (nb : fieldsets 1er niveaux affichés sous forme d'onglets) */
+.formulaire_construire_formulaire .saisies_presentes .formulaire_configurer fieldset fieldset > .editer-groupe > .editer:first-child {
+	padding-top: 0;
+}
+.formulaire_construire_formulaire .saisies_presentes .formulaire_configurer .fieldset > fieldset {
+	padding-left: 0;
+	padding-right: 0;
+}
+
+/**
+ * Element en flex : non en veut pas
+**/
+.formulaire_construire_formulaire .en_configuration {
+	display: block!important;
+}
+/**
+ * Bouton de configuration des options globales
+ */
+.formulaire_construire_formulaire .actions-globales {
+	margin-top: var(--spip-form-spacing-y);
+}
+.formulaire_construire_formulaire .actions-globales .submit {
+	margin-bottom: 0; /* déjà la marge nécessaire via .editer-groupe + .editer */
+}
+.formulaire_construire_formulaire .actions-globales ~ .editer-groupe {
+	clear: both;
+}
+
+
+/**
+ * Boutons divers au début (réinitialiser, etc.)
+ */
+.formulaire_construire_formulaire .actions_formulaire {
+	margin: 0;
+	text-align: center;
+	border: 0;
+}
+.formulaire_construire_formulaire .actions_formulaire img {
+	vertical-align: middle;
+}
+
+
+/**
+ * Barre de boutons d'actions pour une saisie
+ */
+.formulaire_spip.formulaire_construire_formulaire .disabled{
+	/* Surcharger les réglages de spip en .formulaire_construire_formulaire .disabled
+	*/
+	opacity: 1;
+	pointer-events: inherit;
+}
+.formulaire_construire_formulaire .actionable {
+	padding-top: calc((var(--spip-form-spacing-y) / 2) + (16px + (var(--spip-btn-padding-y) * 2)))!important;
+	position: relative;
+}
+.formulaire_construire_formulaire .fieldset.actionable > .actions {
+	right: 0;
+}
+.formulaire_construire_formulaire .actions {
+	position: absolute;
+	top: calc(var(--spip-form-spacing-y) / 2);
+	right: var(--spip-form-spacing-x);
+	inset-inline-end: var(--spip-form-spacing-x);
+	display: flex;
+	justify-content: flex-end;
+	margin: 0;
+}
+/** Pour les saisies inline et fieldset, coller le bouton d'action à la ligne pointillé du haut
+ *
+**/
+.formulaire_construire_formulaire .conteneur_inline.actionable {
+	padding-top: 0!important;
+}
+.formulaire_construire_formulaire fieldset.fieldset  > .actions {
+	top: calc(var(--spip-form-input-padding-y) * -2 - 1em);
+}
+.formulaire_construire_formulaire .actions button,
+.formulaire_construire_formulaire .actions .btn {
+	cursor: pointer;
+	background-color: var(--spip-color-gray-lightest);
+	border: none;
+	margin: 0;
+}
+.formulaire_construire_formulaire .actions button:hover,
+.formulaire_construire_formulaire .actions .btn:hover {
+	background-color: var(--spip-color-gray-lighter);
+}
+.formulaire_construire_formulaire .actions .move {
+	cursor:move;
+}
+
+
+/**
+ * Groupes de boutons d'ajout de saisies
+ */
+.formulaire_construire_formulaire .fieldset_saisie_categorie legend.legend {
+	background-color: transparent;
+}
+.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
+	display: grid;
+	grid-template-columns: 1fr;
+	grid-gap: 1em;
+}
+@media (min-width: 580px) {
+	.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
+		grid-template-columns: repeat(2, 1fr);
+	}
+}
+@media (min-width: 960px) {
+	.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
+		grid-template-columns: repeat(3, 1fr);
+	}
+}
+
+
+/**
+ * Bouton d'ajout d'une saisie avec icône
+ */
+.formulaire_construire_formulaire .ajouter_saisie {
+	color: var(--spip-black, black);
+	padding: var(--saisies-btn-padding-y) var(--saisies-btn-padding-x);
+	padding-left: calc(var(--saisies-btn-iconsize) + (var(--saisies-btn-padding-x) * 2));
+	min-height: calc(var(--saisies-btn-iconsize) + (var(--saisies-btn-padding-y) * 2));
+	margin: 0;
+	border: 0;
+	background-color: var(--spip-color-gray-lightest);
+	background-size: auto var(--saisies-btn-iconsize);
+	background-repeat: no-repeat;
+	background-position: var(--spip-left) var(--saisies-btn-padding-x) center;
+	white-space: initial;
+	font-size: var(--saisies-btn-fontsize);
+	text-align: var(--spip-left);
+	justify-content: flex-start;
+}
+.formulaire_construire_formulaire .ajouter_saisie:hover {
+	background-color: var(--spip-color-gray-lighter);
+}
+.formulaire_construire_formulaire .ajouter_saisie img{
+	vertical-align:middle;
+}
+
+
+/**
+ * Divers
+ */
+
+/* Bitonio de sortable.js */
+.formulaire_construire_formulaire .sortable-ghost {
+	opacity: 0;
+}
+/* Labels */
+.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer label {
+	color: #666;
+	font-weight: normal;
+}
+.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer .obligatoire label {
+	color: black;
+	font-weight: bold;
+}
+/* ? */
+.formulaire_construire_formulaire .editer-groupe.formulaire_configurer-contenus {
+	padding: 0;
+}
+/* boutons */
+.formulaire_construire_formulaire .editer-groupe.en_configuration .boutons {
+	margin: 0.5em 0 0;
+}
+/* onglets */
+.formulaire_construire_formulaire .saisies-menu-onglets__items {
+	margin: 0;
+}
+/* Explication */
+.formulaire_construire_formulaire .editer.saisie_explication > .explication {
+	position: initial;
+}
+.formulaire_construire_formulaire .editer.hover {
+	background-color: transparent;
+}
+
diff --git a/design_system_dependences/saisies/v5.2.0/css/saisies.css b/design_system_dependences/saisies/v5.2.0/css/saisies.css
new file mode 100644
index 0000000000000000000000000000000000000000..9ec68f5659175626cf1153458cf10a895c956085
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/css/saisies.css
@@ -0,0 +1,234 @@
+/* Correction d'un bug de navigateur. On l'ajoute là pour tout le monde, c'est gentil. https://stackoverflow.com/a/17863685 */
+fieldset {
+	min-width:0;
+}
+
+fieldset.pliable > legend{
+	cursor:pointer;
+}
+
+
+fieldset.pliable:not(.plie) > legend:before{
+	content: 'â–¾ ';
+}
+
+fieldset.plie > legend:before{
+	content: 'â–¸ ';
+}
+
+[dir='rtl']  fieldset.plie > fieldset > legend:before{
+	content: 'â—‚ ';
+}
+
+/*date triple champs...
+	jour	mois	annee
+	/12/	/10/	/2010/
+*/
+.editer.saisie_date_jour_mois_annee .choix {
+	display: inline-block;
+	background-color:transparent;
+	padding:0;
+	border:0;
+}
+.saisie_date_jour_mois_annee .choix+.choix {margin-left:1em;}
+.saisie_date_jour_mois_annee .choix label{display:block; width:auto;}
+.saisie_date_jour_mois_annee .choix .text{width:auto;}
+
+
+/* avec crayons + formulaire de saisies, éviter un padding à gauche du label */
+.formulaire_crayon .editer-groupe .editer { padding-left:10px; }
+
+/* les étapes */
+.formulaire_spip .etapes__items {
+	list-style: none;
+}
+.formulaire_spip .etapes__item {
+	display: inline-block;
+}
+.formulaire_spip .etapes__item:not(:first-child):before {
+	content: ' → ';
+}
+
+/* Pour les saisies grilles, on s'arrange pour faire défiler si ça dépasse en largeur */
+.choix_grille_wrapper {
+	overflow-x: auto;
+}
+
+.formulaire_spip .choix-groupe {
+	border: none;
+	margin-top: 0;
+	margin-bottom: 0;
+	margin-left: 0;
+	padding: 0;
+}
+
+.formulaire_spip .choix-groupe label,
+.formulaire_spip .choix-groupe legend.label,
+.formulaire_spip .choix-groupe .editer-label {
+	float: none;
+	background-color: transparent;
+	margin-left: 0;
+	margin-bottom: 0.5em;
+	padding-left: 0;
+	padding-bottom: 0;
+	width: auto;
+}
+
+/* Base minimale des onglets des saisies fieldsets  */
+.saisies-menu-onglets {
+	border-bottom: 1px solid hsla(0, 0%, 0%, 0.15);
+}
+.saisies-menu-onglets__items {
+	display: -webkit-box;
+	display: -ms-flexbox;
+	display: flex;
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+.saisies-menu-onglets__item,
+.saisies-menu-onglets__lien {
+	display: -webkit-box;
+	display: -ms-flexbox;
+	display: flex;
+}
+.saisies-menu-onglets__lien {
+	-webkit-box-align: center;
+  -ms-flex-align: center;
+	align-items: center;
+	padding: 0.5em 1em;
+	text-decoration: none;
+}
+.saisies-menu-onglets__lien.actif {
+	font-weight: bold;
+}
+.saisies-contenus-onglets fieldset {
+	margin-top: 0; /* pour la dist */
+}
+
+.saisies-onglets-verticaux {
+	margin-bottom: calc(var(--spip-form-spacing-y) / 2);
+}
+.saisies-onglets-verticaux .saisies-menu-onglets {
+	width: 100%;
+}
+@media (min-width: 580px) {
+	.saisies-onglets-verticaux {
+		display: flex;
+		column-gap: var(--spip-form-spacing-x);
+		margin-bottom: calc(var(--spip-form-spacing-y) / 2);
+	}
+	.saisies-onglets-verticaux .saisies-menu-onglets {
+		max-width: 15em;
+		min-width: 15em;
+	}
+}
+
+
+.saisies-onglets-verticaux .saisies-contenus-onglets {
+	flex-basis: 100%;
+}
+.saisies-onglets-verticaux .saisies-menu-onglets__items {
+	flex-direction: column;
+}
+
+/*
+ * A supprimer après correction de https://git.spip.net/spip-contrib-extensions/select2/issues/4
+*/
+.saisies-onglets .select2-container {
+	width:100%!important;
+}
+
+
+.afficher_si_masque_chargement, .etapes__item.afficher_si_masque{
+  position: absolute!important;
+  width: 1px!important;
+  height: 1px!important;
+  padding: 0!important;
+  overflow: hidden!important;
+  clip: rect(0, 0, 0, 0)!important;
+  white-space: nowrap!important;
+  border: 0!important;
+}
+
+.champ.afficher {
+	margin-bottom: 1rem;
+}
+.champ.afficher p:last-child,
+#wysiwyg .champ.afficher p:last-child {
+	margin-bottom: 0;
+}
+
+.champ.afficher.saisie_fieldset fieldset > .fieldset_legend {
+	font-weight: 800;
+	font-size: 1.1em;
+	margin-left: 0;
+	margin-bottom: 1rem;
+}
+
+.champ.afficher.saisie_fieldset > .fieldset_valeurs {
+	padding-left: 1.5em;
+	border-left: 1px solid #E3E3E3;
+	border-radius: 12px;
+}
+/** Saisie groupe inline **/
+.editer-groupe_inline {
+	--gap: 1em;
+	display: flex;
+	flex-wrap: wrap;
+	align-items: flex-start;
+	column-gap: var(--gap);
+	padding: 0;
+	margin: 0;
+}
+/* label sur une seule ligne */
+.editer-groupe_inline > .editer:not(.en_configuration) {
+	margin-left: 0;
+	margin-right: 0;
+	flex-shrink: 0;
+	max-width: 100%;
+}
+/* label sur une seule ligne */
+.editer-groupe_inline > .editer:not(.en_configuration) > .editer-label {
+	display: block;
+	float: none;
+	padding-top: 0;
+	margin-left:0;
+}
+
+/* nombre de colonnes déterminé */
+@media (min-width: 580px) {
+	.formulaire_spip .editer-groupe_inline > .editer:not(.en_configuration) > .editer-label {
+		max-width: 100%;
+		padding-right: 0.5em;
+	}
+	.formulaire_spip .editer-groupe_2_colonnes {
+		--columns: 2;
+	}
+
+	.formulaire_spip .editer-groupe_3_colonnes > .editer {
+		--columns: 3;
+	}
+
+	.formulaire_spip .editer-groupe_4_colonnes > .editer {
+		--columns: 4;
+	}
+
+	.formulaire_spip .editer-groupe_2_colonnes > .editer:not(.en_configuration) ,
+	.formulaire_spip .editer-groupe_3_colonnes > .editer:not(.en_configuration) ,
+	.formulaire_spip .editer-groupe_4_colonnes > .editer:not(.en_configuration) {
+		width: calc((100% / var(--columns)) - var(--gap) + (var(--gap) / var(--columns)));
+	}
+
+	/* une seule ligne */
+	.formulaire_spip .editer-groupe_1ligne_colonnes,  .formulaire_spip .editer-groupe_1ligne_max_colonnes{
+		flex-wrap: nowrap;
+	}
+	.formulaire_spip .editer-groupe_1ligne_colonnes > .editer:not(.en_configuration), .formulaire_spip .editer-groupe_1ligne_max_colonnes > .editer:not(.en_configuration) {
+		flex-shrink: 1;
+		min-width: 8em;
+	}
+	.formulaire_spip .editer-groupe_1ligne_max_colonnes > .editer:not(.en_configuration), .formulaire_spip .editer-groupe_xlignes_max_colonnes > .editer:not(.en_configuration) {
+		flex-grow: 1;
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/demo/configurer_saisie.html b/design_system_dependences/saisies/v5.2.0/demo/configurer_saisie.html
new file mode 100644
index 0000000000000000000000000000000000000000..aa3cb376a0ddf41c346f6db83746df2f840834c3
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/configurer_saisie.html
@@ -0,0 +1,51 @@
+<html>
+<head>
+	<title>Test de configuration de saisie</title>
+	[<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
+	<style type="text/css">
+		.formulaire_spip{
+			width:40%;
+			border:1px solid black;
+			-moz-border-radius:10px;
+			-webkit-border-radius:10px;
+			border-radius:10px;
+		}
+		.formulaire_spip ul li{
+			padding:0.5em;
+		}
+		.formulaire_spip li.fieldset{
+			padding:0;
+		}
+		.formulaire_spip li.obligatoire{
+			background:#ffcfcf;
+		}
+		.formulaire_spip .fieldset .legend{
+			margin:0;
+			font-style:italic;
+		}
+	</style>
+</head>
+<body>
+	<h1>Test pour générer le formulaire de configuration d'une saisie</h1>
+	
+	<h2>Par defaut, sans configuration du nom du champ</h2>
+	<form class="formulaire_spip" action="#SELF" method="post">
+		<ul>
+			#CONFIGURER_SAISIE{#ENV{saisie, input}}
+			<li class="boutons">
+				<input type="submit" class="submit" />
+			</li>
+		</ul>
+	</form>
+	
+	<h2>En forçant la configuration du nom</h2>
+	<form class="formulaire_spip" action="#SELF" method="post">
+		<ul>
+			#CONFIGURER_SAISIE{#ENV{saisie, input}, avec_nom=oui}
+			<li class="boutons">
+				<input type="submit" class="submit" />
+			</li>
+		</ul>
+	</form>
+</body>
+</html>
diff --git a/design_system_dependences/saisies/v5.2.0/demo/generer_saisies.html b/design_system_dependences/saisies/v5.2.0/demo/generer_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..4398eb6a5e257fa4e658992b0e9fc8309dd64bfc
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/generer_saisies.html
@@ -0,0 +1,152 @@
+<html>
+<head>
+	<title>Test de génération de saisies</title>
+	[<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
+	<style type="text/css">
+		.formulaire_spip{
+			width:40%;
+			border:1px solid black;
+			-moz-border-radius:10px;
+			-webkit-border-radius:10px;
+			border-radius:10px;
+		}
+		.formulaire_spip ul li{
+			padding:0.5em;
+		}
+		.formulaire_spip li.fieldset{
+			padding:0;
+		}
+		.formulaire_spip li.obligatoire{
+			background:#ffcfcf;
+		}
+		.formulaire_spip .fieldset .legend{
+			margin:0;
+			font-style:italic;
+		}
+	</style>
+</head>
+<body>
+	<h1>Test pour générer des saisies à partir d'une description</h1>
+
+	<h2>Génération d'une seule saisie</h2>
+	#SET{champ,
+		#ARRAY{
+			saisie, input,
+			options, #ARRAY{
+				nom, test,
+				label, Une sorte de titre,
+				explication, Un sorte d'explication,
+				obligatoire, oui
+			}
+		}
+	}
+	<form class="formulaire_spip" action="#SELF" method="post">
+		<ul>
+			[(#GET{champ}|saisies_generer_html{#ENV**|unserialize})]
+			<li class="boutons">
+				<input type="submit" class="submit" />
+			</li>
+		</ul>
+	</form>
+
+	<h2>Génération complète du contenu (l'intérieur) d'un formulaire</h2>
+	#SET{saisies,
+		#ARRAY{
+			0,#ARRAY{
+				saisie, destinataires,
+				options, #ARRAY{
+					nom, destinataires,
+					label, Destinataires,
+					choix_destinataires, #ARRAY{0,1,1,2},
+					type_choix, plusieurs,
+					obligatoire, oui
+				}
+			},
+			1,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, prenom,
+					label, Prénom,
+				}
+			},
+			2,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, nom,
+					label, Nom,
+					obligatoire, oui
+				}
+			},
+			3,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, courriel,
+					label, Courriel,
+					obligatoire, oui
+				},
+				verifier, #ARRAY{
+					type, email
+				}
+			},
+			4,#ARRAY{
+				saisie, case,
+				options, #ARRAY{
+					nom, case,
+					label, Une sorte de case à cocher,
+					label_case, Check la vibes
+				}
+			},
+			5,#ARRAY{
+				saisie, fieldset,
+				options, #ARRAY{
+					nom, adresse,
+					label, Adresse
+				},
+				saisies, #ARRAY{
+					1,#ARRAY{
+						saisie, textarea,
+						options, #ARRAY{
+							nom, voie,
+							label, Voie,
+							obligatoire, non,
+						}
+					},
+					2,#ARRAY{
+						saisie, input,
+						options, #ARRAY{
+							nom, code_postal,
+							label, Code postal,
+							obligatoire, oui
+						}
+					},
+					3,#ARRAY{
+						saisie, input,
+						options, #ARRAY{
+							nom, ville,
+							label, Ville,
+							obligatoire, oui
+						}
+					}
+				}
+			},
+			6,#ARRAY{
+				saisie, oui_non,
+				options, #ARRAY{
+					nom, peutetre,
+					label, Tu veux ou tu veux pas ?,
+					obligatoire, oui,
+					info_obligatoire, " / obligatoire"
+				}
+			},
+		}
+	}
+	<form class="formulaire_spip" action="#SELF" method="post">
+		<ul>
+			#GENERER_SAISIES{#GET{saisies}}
+			<li class="boutons">
+				<input type="submit" class="submit" />
+			</li>
+		</ul>
+	</form>
+</body>
+</html>
diff --git a/design_system_dependences/saisies/v5.2.0/demo/page-saisies_cvt.html b/design_system_dependences/saisies/v5.2.0/demo/page-saisies_cvt.html
new file mode 100644
index 0000000000000000000000000000000000000000..3d7136ceb0cd688fdfaf17bc0a2006ca12540c0a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/page-saisies_cvt.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>Demo Saisies CVT</title>
+	<INCLURE{fond=inclure/head} />
+</head>
+<body>
+	<div class="page">
+		<h1>CVT automatique avec Saisies</h1>
+		<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
+
+		<div class="ajax">
+		#FORMULAIRE_SAISIES_CVT
+		</div>
+	</div>
+</body>
+</html>
diff --git a/design_system_dependences/saisies/v5.2.0/demo/saisie.html b/design_system_dependences/saisies/v5.2.0/demo/saisie.html
new file mode 100644
index 0000000000000000000000000000000000000000..62fb62badcd3de89695f144d2da94ff19c9c651c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/saisie.html
@@ -0,0 +1,18 @@
+Version PHP : <?php echo phpversion(); ?>
+
+
+<h1>Input</h1>
+[(#SAISIE{input,titre})]
+
+<h1>Textarea</h1>
+[(#SAISIE{textarea,texte})]
+
+<h1>Input obligatoire et label</h1>
+[(#SAISIE{input,titre,obligatoire=oui,label=Un vrai titre})]
+
+<h1>Sous saisie et label</h1>
+[(#SAISIE{input,saisie[sous],obligatoire=oui,label=Un sous-saisie})]
+
+
+<h1>Sous saisie (format HTML) et label</h1>
+[(#SAISIE{input,saisie/sous2,obligatoire=oui,label=Un sous-saisie})]
diff --git a/design_system_dependences/saisies/v5.2.0/demo/voir_saisie.html b/design_system_dependences/saisies/v5.2.0/demo/voir_saisie.html
new file mode 100644
index 0000000000000000000000000000000000000000..d72f830408fe55685af44d931e9af582c58aa3be
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/voir_saisie.html
@@ -0,0 +1,10 @@
+<h1>Input et label</h1>
+[(#VOIR_SAISIE{input,titre,label=Un vrai titre,valeur=TRUC})]
+
+<h1>Textarea</h1>
+[(#VOIR_SAISIE{textarea,texte,valeur=Un super long texte<br/>sur plusieurs ligne})]
+
+<h1>Destinataires</h1>
+[(#VOIR_SAISIE{destinataires,destinataires, label=Destinataires,valeur=#ARRAY{0,1,1,2}})]
+
+
diff --git a/design_system_dependences/saisies/v5.2.0/demo/voir_saisies.html b/design_system_dependences/saisies/v5.2.0/demo/voir_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..b0f4fa67144a3c24dbbdec414292a90b097b00de
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/demo/voir_saisies.html
@@ -0,0 +1,127 @@
+<html>
+<head>
+	<title>Test de génération des vues de saisies</title>
+	<INCLURE{fond=inclure/head} />
+</head>
+<body>
+<div class="page">
+	<h1>Générer des vues de saisie</h1>
+
+	#SET{saisies,
+		#ARRAY{
+			0,#ARRAY{
+				saisie, destinataires,
+				options, #ARRAY{
+					nom, destinataires,
+					label, Destinataires,
+					choix_destinataires, #ARRAY{0,1,1,2},
+					type_choix, plusieurs,
+					obligatoire, oui
+				}
+			},
+			1,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, prenom,
+					label, Prénom,
+				}
+			},
+			2,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, nom,
+					label, Nom,
+					obligatoire, oui
+				}
+			},
+			3,#ARRAY{
+				saisie, input,
+				options, #ARRAY{
+					nom, courriel,
+					label, Courriel,
+					obligatoire, oui
+				},
+				verifier, #ARRAY{
+					type, email
+				}
+			},
+			4,#ARRAY{
+				saisie, case,
+				options, #ARRAY{
+					nom, case,
+					label, Une sorte de case à cocher,
+					label_case, Check la vibes
+				}
+			},
+			5,#ARRAY{
+				saisie, fieldset,
+				options, #ARRAY{
+					nom, adresse,
+					label, Adresse
+				},
+				saisies, #ARRAY{
+					1,#ARRAY{
+						saisie, textarea,
+						options, #ARRAY{
+							nom, voie,
+							label, Voie,
+							obligatoire, non,
+							rows,2
+						}
+					},
+					2,#ARRAY{
+						saisie, input,
+						options, #ARRAY{
+							nom, code_postal,
+							label, Code postal,
+							obligatoire, oui
+						}
+					},
+					3,#ARRAY{
+						saisie, input,
+						options, #ARRAY{
+							nom, ville,
+							label, Ville,
+							obligatoire, oui
+						}
+					}
+				}
+			},
+			6,#ARRAY{
+				saisie, oui_non,
+				options, #ARRAY{
+					nom, peutetre,
+					label, Tu veux ou tu veux pas ?,
+					obligatoire, oui,
+					info_obligatoire, " / obligatoire"
+				}
+			},
+		}
+	}
+
+	<h2>Formulaire auquel on doit répondre</h2>
+	<div class="formulaire_spip">
+	#GENERER_SAISIES{#GET{saisies}}
+	</div>
+
+
+	#SET{valeurs,
+		#ARRAY{
+			case, on,
+			peutetre, '',
+			prenom, Jean-Paul,
+			code_postal, 22222,
+			nom, Fitousi,
+			ville, Deuville,
+			courriel, robert@menard.com,
+			destinataires, #ARRAY{1,1},
+			voie, 2 rue du Deux,
+		}
+	}
+
+	<h2>Réponse à ce formulaire</h2>
+	#VOIR_SAISIES{#GET{saisies}, #GET{valeurs}}
+	
+</div>
+</body>
+</html>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/configurer_saisies.html b/design_system_dependences/saisies/v5.2.0/formulaires/configurer_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/configurer_saisies.php b/design_system_dependences/saisies/v5.2.0/formulaires/configurer_saisies.php
new file mode 100644
index 0000000000000000000000000000000000000000..75b1e0b2b542ab0342b5ac4a1230548876b96ab2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/configurer_saisies.php
@@ -0,0 +1,23 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Saisies du formulaire de configuration de saisies
+ * @return array
+**/
+function formulaires_configurer_saisies_saisies_dist() {
+	return [
+		[
+			'saisie' => 'case',
+			'options' => [
+				'nom' => 'assets_global',
+				'label_case' => '<:saisies:assets_global:>',
+				'conteneur_class' => 'pleine_largeur',
+			]
+		]
+	];
+}
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.html b/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.html
new file mode 100644
index 0000000000000000000000000000000000000000..8387edb8c0d615529f018dcc0081c7d3d2b5ad51
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.html
@@ -0,0 +1,186 @@
+<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}[ (#ENV{formulaire_modifie}|oui) modifie][ (#ENV{_configurer_saisie})]">
+	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+	<p id="message_attention" class="message_reinitialiser reponse_formulaire reponse_formulaire_ok">#ENV*{_message_attention}</p>
+	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+	<BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
+	<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
+		[(#REM) declarer les hidden qui declencheront le service du formulaire
+		parametre : url d'action ]
+		#ACTION_FORMULAIRE{#ENV{action}}
+		<input type="submit" class="submit noscroll invisible" name="enregistrer" value="<:bouton_enregistrer:>" />
+
+		[(#ENV{_activer_options_globales}|oui)
+			[(#ENV{erreurs/configurer_globales}|non)
+			<div class="actions-globales float-end">
+				<button type="submit" class="submit btn_secondaire" name="configurer_globales" value="oui">
+					<:saisies:construire_configurer_globales_label:>
+				</button>
+			</div>
+			]
+			[(#ENV{erreurs/configurer_globales}|oui)
+			<div class="editer-groupe en_configuration">
+				#GENERER_SAISIES{#ENV{erreurs/configurer_globales}}
+
+				<div class="boutons">
+					<input type="hidden" name="enregistrer_globales" value="oui" />
+					<div class="groupe-btns">
+						<button type="submit" class="submit btn_secondaire noscroll" name="enregistrer_globales" value=""><:bouton_annuler:></button>
+						<input type="submit" class="submit noscroll" name="enregistrer" value="<:bouton_valider:>" />
+					</div>
+				</div>
+			</div>
+			]
+		]
+			<div id="reinitialiser" class="actions_formulaire">
+				<button type="submit" class="submit btn_secondaire" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
+					[(#CHEMIN_IMAGE{formulaire-action-reinitialiser-16.png}|balise_img{'','sp-icone'})]
+					<:saisies:construire_reinitialiser:>
+				</button>
+			</div>
+
+		<div class="editer-groupe saisies_presentes" id="sortable">
+
+			[(#REM)<!-- les choix de saisies -->]
+			<BOUCLE_contenu(DATA){source tableau, #ENV{_contenu}}>
+			[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+				[(#VALEUR**|construire_formulaire_generer_saisie_configurable{#ENV**|unserialize})]
+			]
+			</BOUCLE_contenu>
+			[(#ALERTE_MESSAGE{<:saisies:construire_aucun_champs:>})]
+			<//B_contenu>
+
+	</div>
+			<B_saisies_disponibles_par_categories>
+			<div class="editer haut saisies_disponibles" id="attrapable">
+				<h2><:saisies:construire_ajouter_champ:></h2>
+				<BOUCLE_saisies_disponibles_par_categories(DATA){source tableau, #ENV{_saisies_disponibles_par_categories}}>
+				<B_saisies_disponibles>
+				<div class="fieldset[ fieldset_saisie_categorie_(#CLE|saisie_nom2classe)] fieldset_saisie_categorie">
+				<fieldset>
+					<legend class="legend">#NOM</legend>
+					<div class="editer_groupe">
+						<BOUCLE_saisies_disponibles(DATA){source tableau, #SAISIES}>
+						<button type="submit" name="ajouter_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut-xx.svg}}))"]>
+							<span>#TITRE</span>
+						</button>
+						</BOUCLE_saisies_disponibles>
+					</div>
+				</fieldset>
+				</div>
+				</B_saisies_disponibles>
+				</BOUCLE_saisies_disponibles_par_categories>
+			</div>
+			</B_saisies_disponibles_par_categories>
+
+			<B_saisies_groupes_disponibles>
+			<div class="editer haut saisies_groupes_disponibles" id="attrapable_bis">
+				<label><:saisies:construire_ajouter_groupe:></label>
+				<BOUCLE_saisies_groupes_disponibles(DATA){source tableau, #ENV{_saisies_groupes_disponibles}}{par titre}>
+				<button type="submit" name="ajouter_groupe_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut-xx.svg}}))"]>
+					<span>#TITRE</span>
+				</button>
+				</BOUCLE_saisies_groupes_disponibles>
+			</div>
+			</B_saisies_groupes_disponibles>
+
+
+		[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+		<!--extra-->
+
+		<span class='image_loading'></span>
+	</div></form>
+
+	<style>
+		.message_reinitialiser,#reinitialiser {display: none}
+		.modifie .message_reinitialiser,.modifie #reinitialiser {display: block}
+	</style>
+	<script type="text/javascript">
+	(function($){
+
+		jQuery.getScript('[(#CHEMIN{prive/javascript/Sortable.js}|timestamp)]').done(function() {
+			var sortableOptions = {
+				group: {
+					name: "construire_formulaire",
+					pull: true,
+					put: true,
+				},
+				handle: '.deplacer_saisie',
+				onEnd: function(evt) {
+						$saisie = $(evt.item);
+						id = $saisie.data('id');
+						ou = $saisie.next().data('id');
+						if (!ou) {
+							// sinon dans le parent
+							ou = $saisie.closest('.avec_sous_saisies').data('id');
+							// Si jamais match lui-même, ca veut dire qu'on déplace un fieldest
+							if (ou == id) {
+								ou = $saisie.parents('.avec_sous_saisies').first().data("id");
+							}
+							if (ou) {
+								ou = '\[' + ou + '\]';
+							}
+						}
+						url = "#URL_ECRIRE";
+						$.get(url, {
+							session: '#ENV{_identifiant_session}',
+							action: 'deplacer_saisie',
+							saisie: id,
+							ou: ou
+						}, function() {
+							$('.formulaire_#ENV{form}').addClass('modifie').trigger('modifsaisies');
+						});
+					},
+					animation: 250,
+			};
+			containers = document.querySelectorAll("#sortable, #sortable .avec_sous_saisies .editer-groupe");
+			for (var i = 0; i < containers.length; i++) {
+				new Sortable(containers[i], sortableOptions);
+			}
+		});
+		/* enlever les required */
+		$('.formulaire_#FORM .editer.obligatoire').find('input, textarea, select').each(function(){
+			if ($(this).prop('required')) {
+				$(this).prop('required', false);
+			}
+		});
+
+		$('.formulaire_#FORM .configurable')
+			.hover(
+				function(){
+					$(this)
+						.addClass('hover')
+						.end()
+						.parents('li.configurable:not(.en_configuration)')
+							.mouseout();
+				},
+				function(){
+					if (!$(this).is('.en_configuration'))
+						$(this)
+							.removeClass('hover')
+							.end()
+							.parents('.configurable').eq('0')
+								.mouseover();
+				}
+			)
+			.filter(':not(.en_configuration)')
+				.end()
+			.end();
+
+
+		// On déplie toujours les fieldsets plés par défaut
+		$('.fieldset.plie').each(function(){
+			$(this)
+				.removeClass('plie')
+				.find('> fieldset > .editer-groupe').show();
+		});
+
+		// On se rend à la saisie en cour d'édition
+		if ($('.en_configuration').length > 0) {
+			$('.en_configuration').positionner(true);
+		}
+
+	})(jQuery);
+		[location.href = '#configurer_(#ENV{_saisie_deplacee_par_select})';]
+	</script>
+	</BOUCLE_editable>
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.php b/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.php
new file mode 100644
index 0000000000000000000000000000000000000000..e59ca06dda6794e02c75565e47c35bce0995ed09
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/construire_formulaire.php
@@ -0,0 +1,763 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/saisies');
+/**
+ * Formulaire permettant de construire un formulaire  ! En agençant des champs
+ * Chargement.
+ * @param string $identifiant identifiant unique du formulaire
+ * @param array $formulaires_initial, formulaire initial (par exemple si on modifie un formulaire déjà construit)
+ * @param array $options tableau d'options
+ *		- array options_globales : proposer des options globales pour le formulaire, liste de ces options
+ *		- array saisies_exclues : liste des saisies à ne pas proposer (= à exclure du choix)
+ *		- bool uniquement_sql : ne proposer que les saisies qui permettent de remplir un champ sql
+ * @return array $contexte
+**/
+function formulaires_construire_formulaire_charger($identifiant, $formulaire_initial = [], $options = []) {
+	$contexte = [];
+
+	// On ajoute un préfixe devant l'identifiant, pour être sûr
+	$identifiant = 'constructeur_formulaire_' . $identifiant;
+	$contexte['_identifiant_session'] = $identifiant;
+
+	// On vérifie ce qui a été passé en paramètre
+	if (!is_array($formulaire_initial)) {
+		$formulaire_initial = [];
+	}
+
+	// On s'assure que toutes les saisies ont un identifiant (en cas de bug lors de la création, par ex.)
+	$formulaire_initial = saisies_identifier($formulaire_initial);
+
+	// Construire le md5 du paramètre $formulaire_initial, et trouver celui qu'on avait stocké
+	$md5_formulaire_initial = md5(serialize($formulaire_initial));
+	$md5_precedent_formulaire_initial = session_get($identifiant . '_md5_formulaire_initial');
+
+	// Si pas de session, on prend le formulaire initial comme formulaire actuel,
+	// ou bien si la session est trop trop veille, on prend le formulaire initial comme formulaire
+	$formulaire_actuel = session_get($identifiant);
+	if (
+		is_null($formulaire_actuel)
+		|| (
+			$md5_precedent_formulaire_initial
+			&& $md5_formulaire_initial != $md5_precedent_formulaire_initial
+			&& $_SERVER['REQUEST_METHOD'] === 'GET'
+		)
+	) {
+		session_set($identifiant, $formulaire_initial);
+		session_set($identifiant . '_md5_formulaire_initial', $md5_formulaire_initial);
+		$formulaire_actuel = $formulaire_initial;
+	}
+
+	// Si le formulaire actuel est différent du formulaire initial on agite un drapeau pour le dire
+	if ($formulaire_actuel != $formulaire_initial) {
+		$contexte['formulaire_modifie'] = true;
+	}
+	$contexte['_message_attention'] = _T('saisies:construire_attention_modifie');
+
+	// On passe ça pour l'affichage
+	$contexte['_contenu'] = $formulaire_actuel;
+
+	// On passe ça pour la récup plus facile des champs
+	$contexte['_saisies_par_nom'] = saisies_lister_par_nom($formulaire_actuel);
+	// Pour déclarer les champs modifiables à CVT
+	foreach (array_keys($contexte['_saisies_par_nom']) as $nom) {
+		$contexte["saisie_modifiee_$nom"] = [];
+	}
+
+	// La liste des options globales qu'on peut configurer, si elles existent
+	if (is_array($options['options_globales'] ?? '')) {
+		$contexte['_activer_options_globales'] = true;
+		if (isset($formulaire_actuel['options'])) {
+			$contexte['options_globales'] = $formulaire_actuel['options'];
+		}
+		else {
+			$contexte['options_globales'] = [];
+		}
+	}
+
+	// La liste des saisies
+	if ($options['uniquement_sql'] ?? '') {
+		$saisies_disponibles = saisies_lister_disponibles_sql('saisies', false);
+	} else {
+		$saisies_disponibles = saisies_lister_disponibles('saisies', false);
+	}
+	if (is_array($options['saisies_exclues'] ?? '')) {
+		$saisies_disponibles = array_diff_key($saisies_disponibles, array_flip($options['saisies_exclues']));
+	}
+	$contexte['_saisies_disponibles_par_categories'] = saisies_regrouper_disponibles_par_categories($saisies_disponibles);
+
+	// Vient-on de déplacer une saisie en éditant son onglet ? On l'indique en contexte
+	$contexte['_saisie_deplacee_par_select'] = _request('_saisie_deplacee_par_select');
+
+	// La liste des groupes de saisies
+	$saisies_groupes_disponibles = saisies_groupes_lister_disponibles('saisies/groupes');
+	$contexte['_saisies_groupes_disponibles'] = $saisies_groupes_disponibles;
+
+	$contexte['fond_generer'] = 'formulaires/inc-generer_saisies_configurables';
+
+	if (_request('configurer_saisie')) {
+		$contexte['_configurer_saisie'] = 'configurer_saisie';
+	}
+	return $contexte;
+}
+
+function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial = [], $options = []) {
+	$erreurs = [];
+	// l'une ou l'autre sera presente
+	$configurer_saisie = $enregistrer_saisie = '';
+	$configurer_globales = '';
+	$enregistrer_globales = '';
+	// On ne fait rien du tout si on n'est pas dans l'un de ces cas
+	if (
+		!(
+			($nom_ou_id = $configurer_saisie  = _request('configurer_saisie'))
+			|| ($nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))
+			|| ($configurer_globales = _request('configurer_globales'))
+			|| ($enregistrer_globales = _request('enregistrer_globales'))
+		)
+	) {
+		return $erreurs;
+	}
+
+	// On ajoute un préfixe devant l'identifiant
+	$identifiant = 'constructeur_formulaire_' . $identifiant;
+	// On récupère le formulaire à son état actuel
+	$formulaire_actuel = session_get($identifiant);
+
+	// Gestion de la config globales
+	if ($configurer_globales || $enregistrer_globales) {
+		$options['options_globales'] = saisies_fieldsets_en_onglets($options['options_globales'], $identifiant, true);
+		$options['options_globales'] = saisies_transformer_option($options['options_globales'], 'conteneur_class', '#(.*)#', '\1 pleine_largeur');
+		array_walk_recursive($options['options_globales'], 'construire_formulaire_transformer_nom', 'options_globales[@valeur@]');
+		array_walk_recursive($options['options_globales'], 'construire_formulaire_transformer_afficher_si', 'options_globales');
+		$erreurs['configurer_globales'] = $options['options_globales'];
+
+		if ($enregistrer_globales) {
+			$vraies_erreurs = saisies_verifier($erreurs['configurer_globales']);
+		}
+	}
+	// Sinon c'est la gestion d'une saisie précise
+	else {
+		// On récupère les saisies actuelles, par identifiant ou par nom
+		if ($nom_ou_id[0] == '@') {
+			$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
+			$nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
+		}
+		else {
+			$saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
+			$nom = $nom_ou_id;
+		}
+		$noms_autorises = array_keys($saisies_actuelles);
+
+		// le nom (ou identifiant) doit exister
+		if (!in_array($nom_ou_id, $noms_autorises)) {
+			return $erreurs;
+		}
+		// La liste des saisies
+		if ($options['uniquement_sql'] ?? '') {
+			$saisies_disponibles = saisies_lister_disponibles_sql('saisies', true);
+		} else {
+			$saisies_disponibles = saisies_lister_disponibles('saisies', true);
+		}
+		if (is_array($options['saisies_exclues'] ?? '')) {
+			$saisies_disponibles = array_diff_key($saisies_disponibles, array_flip($options['saisies_exclues']));
+		}
+
+		$saisie = $saisies_actuelles[$nom_ou_id];
+		$formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
+		array_walk_recursive($formulaire_config, 'construire_formulaire_transformer_nom', "saisie_modifiee_{$nom}[options][@valeur@]");
+		array_walk_recursive($formulaire_config, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_{$nom}[options]");
+		$formulaire_config = saisie_identifier(['saisies' => $formulaire_config]);
+		$formulaire_config = $formulaire_config['saisies'];
+
+
+		// S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
+		if (
+			($options['modifier_nom'] ?? '')
+			&& ($chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_{$nom}[options][description]", true))
+		) {
+			$chemin_nom[] = 'saisies';
+			$chemin_nom[] = '0';
+
+			$formulaire_config = saisies_inserer(
+				$formulaire_config,
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => "saisie_modifiee_{$nom}[options][nom]",
+						'label' => _T('saisies:option_nom_label'),
+						'explication' => _T('saisies:option_nom_explication'),
+						'obligatoire' => 'oui',
+						'size' => 50
+					],
+					'verifier' => [
+						'type' => 'slug',
+						'options' => [
+							'normaliser_suggerer' => true
+						]
+					]
+				],
+				$chemin_nom
+			);
+		}
+
+		// liste des options de vérification
+		$verif_options = [];
+
+		// S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
+		if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_{$nom}[options][validation]", true)) {
+			include_spip('inc/verifier');
+			$liste_verifications = verifier_lister_disponibles();
+
+
+			// Filtrer, si besoin, les vérifications par type de saisie
+			$verifications = pipeline(
+				'saisies_verifier_lister_disponibles',
+				['args' => ['saisie' => $saisie['saisie']],
+				'data' => [
+						'disponibles' => $liste_verifications,
+						'obligatoires' => []
+					]
+				]
+			);
+			$liste_verifications = $verifications['disponibles'];
+			$liste_verifications_obligatoires = $verifications['obligatoires'];
+
+
+			uasort($liste_verifications, 'verifier_trier_par_titre');
+
+			$chemin_validation[] = 'saisies';
+			$chemin_validation[] = 1000000; // à la fin
+
+			// On construit la saisie à insérer et les fieldset des options
+			$saisie_liste_verif = [
+				'saisie' => 'selection',
+				'options' => [
+					'nom' => "saisie_modifiee_{$nom}[verifier][type]",
+					'label' => _T('saisies:construire_verifications_label'),
+					'cacher_option_intro' => true,
+					'conteneur_class' => 'liste_verifications',
+					'data' => [],
+					'class' => 'select2',
+					'multiple' => true
+				]
+			];
+
+			foreach ($liste_verifications as $type_verif => $verif) {
+				if (!in_array($type_verif, $liste_verifications_obligatoires)) {
+					$saisie_liste_verif['options']['data'][$type_verif] = $verif['titre'];
+				} else {
+					$verif_options[] = [
+						'saisie' => 'hidden',
+						'options' => [
+							'nom' => "saisie_modifiee_{$nom}[verifier][type][]",
+							'valeur_forcee' => $type_verif,
+						]
+					];
+				}
+				// Si le type de vérif a des options, on ajoute un fieldset
+				if (is_array($verif['options'] ?? []) && ($verif['options'] ?? '')) {
+					$groupe = [
+						'saisie' => 'fieldset',
+						'options' => [
+							'nom' => 'options',
+							'label' => $verif['titre'],
+							'explication' => $verif['description'] ?? '',
+							'conteneur_class' => "$type_verif options_verifier",
+							'afficher_si' => "@saisie_modifiee_{$nom}[verifier][type]@ IN '$type_verif'"
+						],
+						'saisies' => $verif['options']
+					];
+					array_walk_recursive($groupe, 'construire_formulaire_transformer_nom', "saisie_modifiee_{$nom}[verifier][$type_verif][@valeur@]");
+					array_walk_recursive($groupe, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_{$nom}[verifier][$type_verif]");
+					$verif_options[$type_verif] = $groupe;
+				}
+			}
+			if (!empty($saisie_liste_verif['options']['data'])) {
+				$verif_options = array_merge([$saisie_liste_verif], $verif_options);
+			}
+		}
+
+		// Permettre d'intégrer des saisies et fieldset au formulaire de configuration.
+		// Si des vérifications sont à faire, elles seront prises en compte
+		// lors des tests de vérifications à l'enregistrement.
+		$formulaire_config = pipeline('saisies_construire_formulaire_config', [
+			'data' => $formulaire_config,
+			'args' => [
+				'identifiant' => $identifiant,
+				'action' => $enregistrer_saisie ? 'enregistrer' : 'configurer',
+				'options' => $options,
+				'nom' => $nom,
+				'saisie' => $saisie,
+			],
+		]);
+
+
+		// Si la saisie possede un identifiant, on l'ajoute
+		// au formulaire de configuration pour ne pas le perdre en route
+		if ($saisie['identifiant'] ?? '') {
+			$formulaire_config = saisies_inserer(
+				$formulaire_config,
+				[
+					'saisie' => 'hidden',
+					'options' => [
+						'nom' => "saisie_modifiee_{$nom}[identifiant]",
+						'defaut' => $saisie['identifiant']
+					],
+				]
+			);
+		}
+
+		if ($enregistrer_saisie) {
+			// La saisie modifié
+			$saisie_modifiee = _request("saisie_modifiee_{$nom}");//contient tous les paramètres de la saisie
+			// On cherche les erreurs de la configuration
+			$vraies_erreurs = saisies_verifier($formulaire_config);
+
+			// Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
+			if (
+				($options['modifier_nom'] ?? '')
+				&& ($options['nom_unique'] ?? '')
+			) {
+				$nom_modifie = $saisie_modifiee['options']['nom'];
+				if ($nom_modifie != $enregistrer_saisie && saisies_chercher($formulaire_actuel, $nom_modifie)) {
+					$vraies_erreurs["saisie_modifiee_{$nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
+				}
+			}
+
+			// On regarde s'il a été demandé des vérifs, et on vérifie les options des vérif (!)
+			// Note : les options de verif sont en afficher_si, donc ne sont vérifié que celles des vérifs choisies.
+			$vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options));
+		}
+
+		// On insère chaque saisie des options de verification
+		if ($verif_options) {
+			foreach ($verif_options as $saisie_verif) {
+				$formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
+			}
+		}
+		$erreurs['configurer_' . $nom] = $formulaire_config;
+	}
+
+	// S'il y a des vraies erreurs au final
+	if ($enregistrer_globales || $enregistrer_saisie) {
+		if ($vraies_erreurs) {
+			$erreurs = array_merge($erreurs, $vraies_erreurs);
+			$erreurs['message_erreur'] = singulier_ou_pluriel(count($vraies_erreurs), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
+			set_request('configurer_saisie', true);// Si erreur, ca veut dire qu'on va continuer à configurer la saisie, donc il faut que charger le sache (rah, ce truc où vérifier ne peut pas renvoyer autre chose que des erreurs dans le #ENV...)
+		} else {
+			$erreurs = [];
+		}
+	} else {
+		$erreurs['message_erreur'] = ''; // on ne veut pas du message_erreur automatique
+	}
+
+	return $erreurs;
+}
+
+function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial = [], $options = []) {
+	$retours = [];
+	if ($options['uniquement_sql'] ?? '') {
+		$saisies_disponibles = saisies_lister_disponibles_sql('saisies', true);
+	} else {
+		$saisies_disponibles = saisies_lister_disponibles('saisies', true);
+	}
+	if (is_array($options['saisies_exclues'] ?? '')) {
+		$saisies_disponibles = array_diff_key($saisies_disponibles, array_flip($options['saisies_exclues']));
+	}
+
+	// On ajoute un préfixe devant l'identifiant
+	$identifiant = 'constructeur_formulaire_' . $identifiant;
+	// On récupère le formulaire à son état actuel
+	$formulaire_actuel = session_get($identifiant);
+
+	// Si on demande à ajouter un groupe
+	if ($ajouter_saisie = _request('ajouter_groupe_saisie')) {
+		$formulaire_actuel = saisies_groupe_inserer($formulaire_actuel, $ajouter_saisie);
+	}
+
+	// Si on demande à ajouter une saisie
+	if ($ajouter_saisie = _request('ajouter_saisie')) {
+		$nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie);
+		$saisie = [
+			'saisie' => $ajouter_saisie,
+			'options' => [
+				'nom' => $nom
+			]
+		];
+		// S'il y a des valeurs par défaut pour ce type de saisie, on les ajoute
+		$defaut = $saisies_disponibles[$ajouter_saisie]['defaut'] ?? '';
+		if (is_array($defaut)) {
+			$defaut = _T_ou_typo($defaut, 'multi');
+
+			$saisie = array_replace_recursive($saisie, $defaut);
+		}
+		// Si la dernière saisies est un fieldset (ou un type dérivé de fieldset, c'est à dire si peut contenir des sous saisies), inserer à la fin du fieldset, sauf si saisie à insérer est un fieldset
+		if (!empty($formulaire_actuel)) {
+			$saisie_de_fin = &$formulaire_actuel[max(array_keys($formulaire_actuel))];
+		} else {
+			$saisie_de_fin = ['saisie' => 'nope'];
+		}
+		if (isset($saisie_de_fin['saisies']) && ($saisie['saisie'] !== $saisie_de_fin['saisie'])) {
+			$saisies_fieldset_fin = &$saisie_de_fin['saisies'];
+			while (
+				is_array($saisies_fieldset_fin)
+				&& isset(array_slice($saisies_fieldset_fin, -1, 1)[0]['saisies'])
+				&& !isset($saisie['saisies'])
+			) {
+				$fin = &$saisies_fieldset_fin[count($saisies_fieldset_fin) - 1];
+				$saisies_fieldset_fin = &$fin['saisies'];
+			}
+			$saisies_fieldset_fin = saisies_inserer($saisies_fieldset_fin, $saisie);
+		} else {
+			$formulaire_actuel = saisies_inserer($formulaire_actuel, $saisie);
+		}
+	}
+
+	// Si on demande à dupliquer une saisie
+	if ($dupliquer_saisie = _request('dupliquer_saisie')) {
+		$formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie);
+	}
+
+	// Si on demande à supprimer une saisie
+	if ($supprimer_saisie = _request('supprimer_saisie')) {
+		$formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie);
+	}
+
+	// Si on enregistre la conf globale
+	if (_request('enregistrer_globales')) {
+		$options_globales = _request('options_globales');
+		$formulaire_actuel['options'] = $options_globales;
+	}
+
+	// Si on enregistre la conf d'une saisie
+	if ($nom = _request('enregistrer_saisie')) {
+		// On récupère ce qui a été modifié
+		$saisie_modifiee = _request("saisie_modifiee_$nom");
+
+		// On regarde s'il y a une position à modifier
+		if (isset($saisie_modifiee['position'])) {
+			$position = $saisie_modifiee['position'];
+			unset($saisie_modifiee['position']);
+			// On ne déplace que si ce n'est pas la même chose
+			if ($position != $nom) {
+				$formulaire_actuel = saisies_deplacer($formulaire_actuel, $nom, $position);
+			}
+			set_request('_saisie_deplacee_par_select', $nom);
+		}
+
+		// On regarde s'il y a des options de vérification à modifier
+		$verifier_format_api = [];
+		if (isset($saisie_modifiee['verifier']['type'])) {
+			foreach ($saisie_modifiee['verifier']['type'] as $type_verif) {
+				$verifier_format_api[] = [
+					'type' => $type_verif,
+					'options' => array_filter($saisie_modifiee['verifier'][$type_verif] ?? [], 'saisie_option_contenu_vide') ?? []
+				];
+			}
+		}
+		$saisie_modifiee['verifier'] = $verifier_format_api;
+
+		// On récupère les options postées en enlevant les chaines vides
+		$saisie_modifiee['options'] = array_filter($saisie_modifiee['options'], 'saisie_option_contenu_vide');
+
+
+		// On modifie enfin
+		$formulaire_actuel = saisies_modifier($formulaire_actuel, $nom, $saisie_modifiee);
+	}
+
+	// Si on demande à réinitialiser
+	if (_request('reinitialiser') == 'oui') {
+		$formulaire_actuel = $formulaire_initial;
+	}
+
+	// On enregistre en session la nouvelle version du formulaire
+	session_set($identifiant, $formulaire_actuel);
+
+	// Le formulaire reste éditable
+	$retours['editable'] = true;
+
+	return $retours;
+}
+
+/**
+ * Permet de modifier l'option `nom` d'une saisie.
+ * Fonction de callback pour array_walk_recursive().
+ * @internal
+ * @param string &$valeur
+ *	la valeur du tableau d'options
+ * @param string $cle
+ *	la clé du tableau, permet de savoir si on traite une option `nom` ou pas
+ * @param string $transformation
+ *	 chaine contenant notamment `@valeur@`, le `@valeur@` sera remplacé par la valeur original de `$valeur`, puis le tout reinjecté dans `$&valeur`.
+ * @return void
+ *
+**/
+function construire_formulaire_transformer_nom(&$valeur, string $cle, string $transformation) {
+	if ($cle == 'nom' && is_string($valeur)) {
+		$valeur = str_replace('@valeur@', $valeur, $transformation);
+	}
+}
+
+/**
+ * Permet de transformer les `afficher_si` présent au sein d'un YAML décrivant les options d'une saisie (abstraite)
+ * de sorte qu'ils fonctionnent au sein du formulaire permettant de construire une saisie (concrète).
+ * Pour ce faire il faut préserver les tests portant sur les plugins et les config
+ * mais transformer ceux portant sur des options décrites dans le tableau YAML.
+ * Il faut également éviter de modifier un name s'il contient `saisie_modifiee` pour éviter une réentrance.
+ * Fonction de callback pour array_walk_recursive().
+ * @internal
+ * @param string &$valeur
+ *	la valeur au sein du tableau d'options
+ * @param string $cle
+ *	la clé du tableau, permet de savoir si on traite une option `afficher_si` ou pas
+ * @param string $name_html
+ * Le name global dans le html du constructeur de saisie
+ * L'option testée par un afficher_si (`@option@ == 'truc'`) deviendra une clé de ce name (`name['option']`)
+ * Le tout sera reinjecté dans `$valeur` (`@name[option]@== 'truc'`)
+ * @return void
+**/
+function construire_formulaire_transformer_afficher_si(&$valeur, string $cle, $name_html) {
+	if ($cle == 'afficher_si' && is_string($valeur)) {
+		$matches = [];
+		preg_match_all('#@(.*)@#U', $valeur, $matches, PREG_PATTERN_ORDER);
+		foreach ($matches as $champ_potentiel) {
+			$nouveau_champ_potentiel = preg_replace('#@((?!saisie_modifiee)(?!config:)(?!plugin:).*)@#U', '@' . $name_html . '[${1}]@', $champ_potentiel);
+			$valeur = str_replace($champ_potentiel, $nouveau_champ_potentiel, $valeur);
+		}
+	}
+}
+
+/**
+ * Préparer une saisie pour la transformer en truc configurable
+ * @param array $saisie description de la saisie
+ * @param array $env environnement d'appel
+ * @return string fond du formulaire
+**/
+function construire_formulaire_generer_saisie_configurable(array $saisie, array $env): string {
+	// On récupère le nom
+	$nom = $saisie['options']['nom'];
+	$identifiant = isset($saisie['identifiant']) ? $saisie['identifiant'] : '';
+
+	// On désactive les onglets
+	unset($saisie['options']['onglet']) ;
+
+	// On cherche si ya un formulaire de config
+	$formulaire_config = isset($env['erreurs']['configurer_' . $nom]) ? $env['erreurs']['configurer_' . $nom] : '';
+
+	// On ajoute une classe
+	if (!isset($saisie['options']['conteneur_class'])) {
+		$saisie['options']['conteneur_class'] = ''; // initialisation
+	}
+	// Compat ancien nom li_class
+	if (isset($saisie['options']['li_class'])) {
+		$saisie['options']['conteneur_class'] .= ' ' . $saisie['options']['li_class']; // initialisation
+	}
+	$saisie['options']['conteneur_class'] .= ' configurable';
+
+	// On ajoute l'option "tout_afficher"
+	$saisie['options']['tout_afficher'] = 'oui';
+
+	// On précise (pour certaines saisies très spécifiques) que c'est dans un constructeur, pour pouvoir adapter le markup
+	$saisie['options']['constructeur'] = true;
+
+	// On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée
+	if (!$env['erreurs']) {
+		$saisie['options']['conteneur_class'] .= ' actionable';
+		$saisie = saisies_inserer_html(
+			$saisie,
+			recuperer_fond(
+				'formulaires/inc-construire_formulaire-actions',
+				[
+					'nom' => $nom,
+					'identifiant' => $identifiant,
+					'formulaire_config' => $formulaire_config,
+					'deplacable' => true,
+				]
+			),
+			'debut'
+		);
+	} else {
+		// Si une config de lancée, mettre l'ancre just au dessus
+		// On ajoute une ancre pour s'y déplacer
+		$saisie = saisies_inserer_html(
+			$saisie,
+			"\n<a id=\"configurer_$nom\"></a>\n",
+			'debut'
+		);
+	}
+
+	// Si ya un form de config on l'ajoute à la fin
+	if (is_array($formulaire_config)) {
+		// On double l'environnement
+		$env2 = $env;
+		// On ajoute une classe
+		$saisie['options']['conteneur_class'] .= ' en_configuration';
+
+		// Si possible on met en readonly
+		$saisie['options']['readonly'] = 'oui';
+
+		// On vire les sous-saisies s'il y en a
+		if (is_array($saisie['saisies'] ?? '') && $saisie['saisies']) {
+			$nb_champs_masques = count(saisies_lister_champs($saisie['saisies']));
+			$saisie['saisies'] = [
+				[
+					'saisie' => 'explication',
+					'options' => [
+						'nom' => 'truc',
+						'texte' => _T('saisies:construire_info_nb_champs_masques', ['nb' => $nb_champs_masques]),
+					]
+				]
+			];
+		}
+
+		// On va ajouter le champ pour la position
+		if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_{$nom}[options][description]", true))) {
+			$chemin_description = [0];
+			$formulaire_config = saisies_inserer(
+				$formulaire_config,
+				[
+					'saisie' => 'fieldset',
+					'options' => [
+						'nom' => "saisie_modifiee_{$nom}[options][description]",
+						'label' => _T('saisies:option_groupe_description'),
+
+					],
+					'saisies' => []
+				],
+				0
+			);
+		}
+		$chemin_description[] = 'saisies';
+		$chemin_description[] = '0'; // tout au début
+		$formulaire_config = saisies_inserer(
+			$formulaire_config,
+			[
+				'saisie' => 'position_construire_formulaire',
+				'options' => [
+					'nom' => "saisie_modifiee_{$nom}[position]",
+					'label' => _T('saisies:construire_position_label'),
+					'explication' => _T('saisies:construire_position_explication'),
+					'formulaire' => $env['_contenu'],
+					'saisie_a_positionner' => $nom
+				]
+			],
+			$chemin_description
+		);
+
+		// Fieldsets racines en onglets forcés + identifiant stable
+		$formulaire_config = saisies_fieldsets_en_onglets($formulaire_config, $env['_identifiant_session'], true);
+		// Tout les saisies en pleine largeur
+		$formulaire_config = saisies_transformer_option($formulaire_config, 'conteneur_class', '#(.*)#', '\1 pleine_largeur');
+
+		$env2['saisies'] = $formulaire_config;
+
+		// Un test pour savoir si on prend le _request ou bien
+		$erreurs_test = $env['erreurs'];
+		unset($erreurs_test['configurer_' . $nom]);
+		unset($erreurs_test['message_erreur']);
+
+		if (!$erreurs_test) {
+			$env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom];
+
+			// Support de l'ancien format avec une seule saisie
+			if (isset($env2["saisie_modifiee_$nom"]['verifier']['type'])) {
+				$env2["saisie_modifiee_$nom"]['verifier'] = [
+					[
+						'type' => $env2["saisie_modifiee_$nom"]['verifier']['type'],
+						'options' => $env2["saisie_modifiee_$nom"]['verifier']['options'] ?? []
+					]
+				];
+			}
+			// Puis convertir le tableau depuis le format API vers le format constructeur
+			$verif_format_constructeur = ['type' => []];
+			foreach ($env2["saisie_modifiee_$nom"]['verifier'] ?? [] as $verif) {
+				$verif_format_constructeur['type'][] = $verif['type'];
+				$verif_format_constructeur[$verif['type']] = [];
+				$options_verif = $verif['options'] ?? [];
+				foreach ($options_verif as $option_verif => $valeur_option_verif) {
+					$verif_format_constructeur[$verif['type']][$option_verif] = $valeur_option_verif;
+				}
+			}
+			$env2["saisie_modifiee_$nom"]['verifier'] = $verif_format_constructeur;
+		}
+
+		$env2['fond_generer'] = 'inclure/generer_saisies';
+		$saisie = saisies_inserer_html(
+			$saisie,
+			'<div class="formulaire_configurer"><div class="editer-groupe formulaire_configurer-contenus">'
+			. recuperer_fond(
+				'inclure/generer_saisies',
+				$env2
+			)
+			. '<div class="boutons">
+				<input type="hidden" name="enregistrer_saisie" value="' . $nom . '" />
+				<div class="groupe-btns">
+					<button type="submit" class="submit btn_secondaire noscroll" name="enregistrer_saisie" value="">' . _T('bouton_annuler') . '</button>
+					<input type="submit" class="submit noscroll" name="enregistrer" value="' . _T('bouton_valider') . '" />
+				</div>
+			</div>'
+			. '</div></div>',
+			'fin'
+		);
+	}
+
+	// On effacer l'afficher_si de la saisie qu'on édite car vu qu'on l'édite on veut systématiquement la voir. En revanche, les options globales peuvent encore avoir des afficher_si.
+	if (substr($saisie['options']['nom'], 0, 16) !== 'options_globales') {
+		unset($saisie['options']['afficher_si']);
+	}
+	// On génère le HTML de la saisie
+	$html = saisies_generer_html($saisie, $env);
+
+	return $html;
+}
+
+/**
+ * Callback d'array_filter()
+ * Permet de tester tout ce qui n'est pas un contenu vide
+ * En revanche la valeur '0' renvoie true
+ * @internal
+ * @param $var La variable a tester
+ * @return bool L'accepte-t-on ?
+**/
+function saisie_option_contenu_vide($var): bool {
+	if (!$var) {
+		if (is_string($var) && strlen($var)) {
+			return true;
+		}
+		return false;
+	}
+	return true;
+}
+
+function saisies_groupe_inserer($formulaire_actuel, $saisie) {
+	include_spip('inclure/configurer_saisie_fonctions');
+
+	//le groupe de saisies
+	$saisies_charger_infos = saisies_charger_infos($saisie, $saisies_repertoire = 'saisies/groupes');
+
+	//le tableau est-il en options ou en saisies ?
+	$classique_yaml = count($saisies_charger_infos['options']);
+	$formidable_yaml = count($saisies_charger_infos['saisies']);
+	if ($classique_yaml > 0) {
+		$champ_options = 'options';
+	}
+	if ($formidable_yaml > 0) {
+		$champ_options = 'saisies';
+	}
+
+	//les champs du groupe
+	foreach ($saisies_charger_infos[$champ_options] as $info_saisie) {
+		unset($info_saisie['identifiant']);
+		$construire_nom = $info_saisie[$champ_options]['nom'] ? $info_saisie[$champ_options]['nom'] : $info_saisie['saisie'];
+		$nom = $info_saisie[$champ_options]['nom'] = saisies_generer_nom($formulaire_actuel, $construire_nom);
+
+		$formulaire_actuel = saisies_inserer($formulaire_actuel, $info_saisie);
+	}
+
+	return $formulaire_actuel;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-construire_formulaire-actions.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-construire_formulaire-actions.html
new file mode 100644
index 0000000000000000000000000000000000000000..52cf4e53279f05599290b785128db5caa6ab6b01
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-construire_formulaire-actions.html
@@ -0,0 +1,27 @@
+#SET{nom,#ENV{identifiant,#ENV{nom}}}
+<div id="configurer_#ENV{nom}" class="actions groupe-btns">
+	[(#ENV{formulaire_config}|is_array|non)
+	[(#ENV{deplacable}|oui)
+	<span class="btn move deplacer_saisie" title="<:saisies:construire_action_deplacer:>">
+		[(#CHEMIN_IMAGE{formulaire-action-deplacer-16.png}|balise_img{<:saisies:construire_action_deplacer:>})]
+	</span>
+	]
+	<button type="submit" class="submit noscroll configurer_saisie" name="configurer_saisie" value="#GET{nom}" title="<:saisies:construire_action_configurer:>">
+		[(#CHEMIN_IMAGE{formulaire-action-configurer-16.png}|balise_img{<:saisies:construire_action_configurer:>})]
+	</button>
+	<button type="submit" class="submit noscroll dupliquer_saisie" name="dupliquer_saisie" value="#GET{nom}" title="<:saisies:construire_action_dupliquer:>">
+		[(#CHEMIN_IMAGE{formulaire-action-dupliquer-16.png}|balise_img{<:saisies:construire_action_dupliquer:>})]
+	</button>
+	<button type="submit" class="submit noscroll supprimer_saisie" name="supprimer_saisie" value="#GET{nom}" title="<:saisies:construire_action_supprimer:>" onclick="javascript:return confirm('<:saisies:construire_confirmer_supprimer_champ:>');">
+		[(#CHEMIN_IMAGE{formulaire-action-supprimer-16.png}|balise_img{<:saisies:construire_action_supprimer:>})]
+	</button>
+	]
+	[(#ENV{formulaire_config}|is_array|oui)
+	<button type="submit" class="submit enregistrer_saisie" name="enregistrer_saisie" value="#GET{nom}" title="<:bouton_enregistrer:>">
+		[(#CHEMIN_IMAGE{formulaire-action-enregistrer-16.png}|balise_img{<:bouton_enregistrer:>})]
+	</button>
+	<button type="submit" class="submit annuler" name="enregistrer_saisie" value="" title="<:saisies:construire_action_annuler:>">
+		[(#CHEMIN_IMAGE{formulaire-action-annuler-16.png}|balise_img{<:saisies:construire_action_annuler:>})]
+	</button>
+	]
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-generer_saisies_configurables.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-generer_saisies_configurables.html
new file mode 100644
index 0000000000000000000000000000000000000000..29314a80514857f3a4749b7df4cf52642ec74694
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-generer_saisies_configurables.html
@@ -0,0 +1,9 @@
+[(#REM) 
+  Exemple d'appel :
+    #INCLURE{fond=formulaires/inc-generer_saisies_configurables, env, fond_generer=formulaires/inc-generer_saisies_configurables, saisies=#ENV{tableau}}
+]
+<BOUCLE_contenu(DATA){source tableau, #ENV{saisies}}>
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+	[(#VALEUR**|construire_formulaire_generer_saisie_configurable{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+</BOUCLE_contenu>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-boutons.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-boutons.html
new file mode 100644
index 0000000000000000000000000000000000000000..f185708d4589ea652219b8b888df73bab62d071e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-boutons.html
@@ -0,0 +1,25 @@
+<p class="boutons" [ data-afficher_si="(#ENV*{_saisies/options/afficher_si_submit}|saisies_afficher_si_js{#ENV{_saisies}})"]>
+	<span class="image_loading"></span>
+	[(#SET{label_valider, #ENV*{_saisies/options/texte_submit, #ENV*{saisies_texte_submit, <:bouton_enregistrer:>}}})]
+	#SET{label_enregistrer,#GET{label_valider}}
+
+	[(#ENV{_etape}|et{#ENV{_etape}|!={#ENV{_etapes}}}|oui)
+		[(#SET{label_valider, #ENV*{_saisies/options/etapes_suivant, <:bouton_suivant:>}})]
+		[(#ENV*{_saisies/options/etapes_precedent_suivant_titrer}|oui)
+			#SET{etape,#ENV*{_saisies_par_etapes/etape_#VAL{#ENV{_etape}|plus{1}}}
+			[(#SET{etape_suivante_titre,#ENV*{label}|sinon{<:saisies:etapes_recapitulatif_label:>}})]
+			#SET{label_valider,#GET{label_valider}|trim|label_ponctuer|concat{' ',#GET{etape_suivante_titre}|wrap{'<span class="titre-etape">'}}}
+		]
+	]
+
+	[(#ENV{_etape}|>{1}|oui)
+		[(#SET{label_precedent,#ENV*{_saisies/options/etapes_precedent, <:precedent|ucfirst:>}})]
+		[(#ENV*{_saisies/options/etapes_precedent_suivant_titrer}|oui)
+			#SET{etape,#ENV*{_saisies_par_etapes}|saisies_determiner_recul_rapide{#ENV{_etape}}}
+			#SET{etape,#ENV*{_saisies_par_etapes/etape_#GET{etape}}}
+			#SET{label_precedent,#GET{label_precedent}|trim|label_ponctuer|concat{' ',#ENV*{label}}|wrap{'<span class="titre-etape">'}}}
+		]
+		<button type="submit" class="submit submit_precedent" name="aller_a_etape" value="[(#ENV{_saisies}|saisies_determiner_recul_rapide{#ENV{_etape}})]"><span class="btn__label">[(#GET{label_precedent}|_T_ou_typo)]</span></button>
+	]
+	<button type="submit" class="submit[ (#ENV{_etapes}|?{submit_suivant,submit_main})]" value="1" data-label_enregistrer="#GET{label_enregistrer}"><span class="btn__label">[(#GET{label_valider}|_T_ou_typo)]</span></button>
+</p>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-courante.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-courante.html
new file mode 100644
index 0000000000000000000000000000000000000000..11fdd49129d61067b196a307446d04158cf318a4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-courante.html
@@ -0,0 +1,35 @@
+#SET{afficher_si,#ARRAY}
+#SET{etapes_max,0}[(#REM) nombre d'étape max, en tenant compte du fait que certaines étapes passées ont deja été masquées par afficher_si]
+#SET{etape_a_afficher,0}
+#SET{saisies_afficher_si_masquees,#VAL{get}|saisies_afficher_si_liste_masquees}
+<BOUCLE_etapes(DATA){source table, #ENV{etapes}}>
+#SET{etape_courante,#CLE|replace{'etape_',''}}
+[(#REM) mettre uniquement les étapes passées qui ont réussi le test d'afficher_si]
+[(#GET{etape_courante}|<{#ENV{_etape}}|oui)
+	[(#VALEUR|in_any{#GET{saisies_afficher_si_masquees}}|non)
+		#SET{etape_a_afficher,#GET{etape_a_afficher}|plus{1}}
+		#SET{etapes_max,#GET{etapes_max}|plus{1}}
+	]
+]
+[(#REM) Mettre systématiquement l'étape courante]
+[(#ENV{_etape}|=={#GET{etape_courante}}|oui)
+	#SET{etape_a_afficher,#GET{etape_a_afficher}|plus{1}}
+	#SET{etapes_max,#GET{etapes_max}|plus{1}}
+	#SET{etape_a_afficher_label,#VALEUR{options/label}}
+]
+[(#REM) Mettre toutes les étapes futures]
+[(#GET{etape_courante}|>{#ENV{_etape}}|oui)
+	#SET{etapes_max,#GET{etapes_max}|plus{1}}
+]
+</BOUCLE_etapes>
+
+	#SET{params, #ARRAY{
+			'etape',<span class="formulaire_spip_etape__courante">#GET{etape_a_afficher}</span>,
+			'etapes', <span class="formulaire_spip_etape__total">#GET{etapes_max}</span>,
+			'label_etape',#GET{etape_a_afficher_label}
+		}
+	}
+<div class="formulaire_spip__etapes etapes formulaire_spip__etapes--courante" data-etapes_max="#GET{etapes_max}">
+	[(#VAL{saisies:cvt_etapes_courante}|_T{#GET{params}})]
+</div>
+</B_etapes>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-defaut.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-defaut.html
new file mode 100644
index 0000000000000000000000000000000000000000..49edfad716fdd62eefbff214624122917e10681f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-defaut.html
@@ -0,0 +1,22 @@
+#SET{afficher_si_masquees,#VAL{'get'}|saisies_afficher_si_liste_masquees}
+<B_etapes>
+<nav class="formulaire_spip__etapes etapes" aria-label="<:saisies:etapes_formulaire:>">
+	<ol class="etapes__items">
+		<BOUCLE_etapes(DATA){source table, #ENV{etapes}}>
+		#SET{etape,#CLE|replace{etape_,''}}
+		#SET{afficher_si,#VALEUR{options/afficher_si}|saisies_afficher_si_js{#ENV{etapes}}}
+		#SET{afficher,oui}
+		[(#VALEUR|in_any{#GET{afficher_si_masquees}}|oui)
+			#SET{afficher,''}
+		]
+		[(#GET{afficher}|oui)
+			<li class="etapes__item #CLE" [(#ENV{_etape}|=={#GET{etape}}|oui) aria-current="step"]>
+				[(#ENV{_etape}|>{#GET{etape}}|oui)<button type="submit" class="submit" name="aller_a_etape" value="#GET{etape}">#VALEUR{options/label}</button>]
+				[(#ENV{_etape}|=={#GET{etape}}|oui)<em>#VALEUR{options/label}</em>]
+				[(#ENV{_etape}|<{#GET{etape}}|oui)<span>#VALEUR{options/label}</span>]
+			</li>
+		]
+		</BOUCLE_etapes>
+	</ol>
+</nav>
+</B_etapes>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-recapitulatif.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-recapitulatif.html
new file mode 100644
index 0000000000000000000000000000000000000000..ba49d878f19096b6f6bba9dbbcc2427785dc848d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes-recapitulatif.html
@@ -0,0 +1,14 @@
+<div class="saisies_etapes_recapitulatif reponses">
+	[(#SET{saisies,#ENV{_saisies}|saisies_inserer{
+		#ARRAY{
+			saisie,explication,
+			options,#ARRAY{
+				nom,saisies_etapes_recapitulatif,
+				texte,<:saisies:etapes_recapitulatif_texte:>,
+			},
+		},
+		#LISTE{0}
+	}})]
+	#SET{valeurs,#ENV{_saisies_par_etapes/etape_#ENV{_etapes}/valeurs}}
+	#VOIR_SAISIES{#GET{saisies},#GET{valeurs},voir_explications=oui}
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes.html
new file mode 100644
index 0000000000000000000000000000000000000000..70c16e0362bf1abd148611a28794e0cf4db0f9ba
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt-etapes.html
@@ -0,0 +1,2 @@
+[(#REM) squelette gardé pour compatibilité historique, mais ne devrait plus être appelé, préferez un appel à la variante)]
+<INCLURE{fond=formulaires/inc-saisies-cvt-etapes-#ENV{_saisies/options/etapes_presentation,defaut}, etapes=#ENV{_saisies_par_etapes}, env} />
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt.html b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt.html
new file mode 100644
index 0000000000000000000000000000000000000000..b2eee9661ed5c727c52bc71e3f9816adc661bf25
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/inc-saisies-cvt.html
@@ -0,0 +1,36 @@
+<div class="formulaire_spip formulaire_#ENV{form}[ (#ENV{_etape}|oui)formulaire_multietapes]">
+	#ENV**{_saisies/options/inserer_debut}
+	[<p class="reponse_formulaire reponse_formulaire_ok"[(#HTML5|oui) role="status"]>(#ENV**{message_ok})</p>]
+	[<p class="reponse_formulaire reponse_formulaire_erreur"[(#HTML5|oui) role="alert"]>(#ENV**{message_erreur})</p>]
+	[(#ENV{editable}|oui)
+	<form method="post" action="#ENV{action}" enctype="multipart/form-data"[ data-resume_etapes_futures="(#ENV{_resume_etapes_futures}|json_encode|attribut_html)"]><div>
+		[(#REM) declarer les hidden qui declencheront le service du formulaire
+		parametre : url d'action ]
+		#ACTION_FORMULAIRE{#ENV{action}}
+		[(#ENV{_etape}|oui)
+			<INCLURE{fond=formulaires/inc-saisies-cvt-etapes-#ENV{_saisies/options/etapes_presentation,defaut}, etapes=#ENV{_saisies_par_etapes}, env} />
+		]
+
+		<div class="editer-groupe">
+				#SET{saisies, #ENV{_saisies}}
+				[(#ENV{_etape}|oui)
+					[(#ENV{_saisies/options/etapes_ignorer_recapitulatif}|non|et{#ENV{_etape}|=={#ENV{_etapes}}}|oui)
+						<INCLURE{fond=formulaires/inc-saisies-cvt-etapes-recapitulatif,env} />
+					]
+					[(#ENV{_saisies/options/etapes_ignorer_recapitulatif}|non|et{#ENV{_etape}|=={#ENV{_etapes}}}|non)
+						#SET{saisies, #GET{etapes}|table_valeur{etape_#ENV{_etape}/saisies}}
+						#GENERER_SAISIES{#GET{saisies},saisies_par_etapes=#ENV{_saisies_par_etapes}}
+					]
+				]
+				[(#ENV{_etape}|non)
+					#GENERER_SAISIES{#GET{saisies}}
+				]
+		</div>
+
+		[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+		<!--extra-->
+		<INCLURE{fond=formulaires/inc-saisies-cvt-boutons,env} />
+	</div></form>
+	]
+	#ENV**{_saisies/options/inserer_fin}
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/saisies_cvt.html b/design_system_dependences/saisies/v5.2.0/formulaires/saisies_cvt.html
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/saisies/v5.2.0/formulaires/saisies_cvt.php b/design_system_dependences/saisies/v5.2.0/formulaires/saisies_cvt.php
new file mode 100644
index 0000000000000000000000000000000000000000..a01d927761be46cfa392663e8dac186c85f82325
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/formulaires/saisies_cvt.php
@@ -0,0 +1,155 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function formulaires_saisies_cvt_saisies_dist() {
+	include_spip('inc/saisies');
+
+	$saisies = [
+		'options' => [
+			'texte_submit' => 'Pouet !',
+			#'etapes_activer' => true,
+			'etapes_suivant' => 'Suivant pouet',
+			'etapes_precedent' => 'Précédent pouet',
+			'etapes_navigation' => 'on',
+			'etapes_presentation' => 'courante',
+			'etapes_precedent_suivant_titrer' => 'true'
+		],
+		[
+			'saisie' => 'fieldset',
+			'options' => [
+				'nom' => 'persos',
+				'label' => 'Informations personnelles',
+			],
+			'saisies' => [
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'tableau[cle][nom]',
+						'label' => 'Nom'
+					]
+				],
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'tableau[cle][email]',
+						'obligatoire' => 'oui',
+						'label' => 'E-mail - declaration de nom en syntaxe html'
+					],
+					'verifier' => [
+						'type' => 'email'
+					]
+				],
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'tableau/cle/email2',
+						'obligatoire' => 'oui',
+						'label' => 'E-mail - déclaration de nom en syntaxe SPIP'
+					],
+					'verifier' => [
+						'type' => 'email'
+					]
+				],
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'a_supprimer',
+						'label' => 'Un champ à supprimer'
+					]
+				],
+			],
+		],
+		[
+			'saisie' => 'case',
+			'options' => [
+				'nom' => 'out',
+				'label_case' => 'Un champ à l’extérieur des groupes'
+			],
+		],
+		[
+			'saisie' => 'radio',
+			'options' => [
+				'nom' => 'radio avec disable (hors groupe)',
+				'data' => [
+					'a' => 'a',
+					'b' => 'b',
+					'c' => 'c',
+					'd' => 'd'
+				],
+				'disable_choix' => ['b', 'c']
+			]
+		],
+		[
+			'saisie' => 'fieldset',
+			'options' => [
+				'nom' => 'aumilieu',
+				'label' => 'une étape au milieu'
+			],
+			'saisies' => [
+				[
+					'saisie' => 'case',
+					'options' => [
+						'label' => 'Une case au milieu',
+						'nom' => 'case_milieu',
+					]
+				]
+			]
+		],
+		[
+			'saisie' => 'fieldset',
+			'options' => [
+				'nom' => 'ecrire',
+				'label' => 'Des choses à dire',
+				'icone' => 'saisies-xx.svg',
+				'taille_icone' => '24'
+			],
+			'saisies' => [
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'sujet',
+						'label' => 'Sujet'
+					]
+				],
+				[
+					'saisie' => 'textarea',
+					'options' => [
+						'nom' => 'message',
+						'obligatoire' => 'oui',
+						'label' => 'Un message',
+						'conteneur_class' => 'pleine_largeur',
+					],
+					'verifier' => [
+						[
+							'type' => 'taille',
+							'options' => ['min' => 10]
+						],
+						[
+							'type' => 'slug',
+						],
+					]
+				],
+			],
+		],
+	];
+
+	$chemin = saisies_chercher($saisies, 'a_supprimer', true);
+	$saisies = saisies_supprimer($saisies, $chemin);
+	$saisies = saisies_dupliquer($saisies, 'message');
+	$saisies = saisies_deplacer($saisies, 'tableau[cle][email]', 'tableau[cle][nom]');
+	//var_dump($saisies);
+
+	return $saisies;
+}
+
+function formulaires_saisies_cvt_charger() {
+	$contexte = [
+		'saisies_texte_submit' => 'Prout !',
+	];
+
+	return $contexte;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/images/formulaire-saisie-defaut-xx.svg b/design_system_dependences/saisies/v5.2.0/images/formulaire-saisie-defaut-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6f9706063cad9960150af21515dfb4243ea5a861
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/formulaire-saisie-defaut-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M27.5 10c-.831 0-1.5.892-1.5 2v14H12c-1.108 0-2 .669-2 1.5v9c0 .831.892 1.5 2 1.5h14v14c0 1.108.669 2 1.5 2h9c.831 0 1.5-.892 1.5-2V38h14c1.108 0 2-.669 2-1.5v-9c0-.831-.892-1.5-2-1.5H38V12c0-1.108-.669-2-1.5-2z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5ae66790b621d8f73650b25107c0795ff29b7233
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies-xx.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#666" d="M52 58H12c-3.3 0-6-2.7-6-6V12c0-3.3 2.7-6 6-6h40c3.3 0 6 2.7 6 6v40c0 3.3-2.7 6-6 6z"  />
+  <circle fill="#fff" cx="18.4" cy="19.9" r="7.7"/>
+  <circle fill="#fff" cx="47" cy="19.9" r="7.7"/>
+  <circle fill="#1d83d4" cx="47" cy="19.9" r="4.5"/>
+  <path fill="#fff" d="M51.3 52.2H12.7c-1.1 0-2-.9-2-2v-10c0-1.1.9-2 2-2h38.6c1.1 0 2 .9 2 2v10c0 1.1-.9 2-2 2z"/>
+  <path fill="#1d83d4" d="M14.1 40h3.8v10h-3.8z"/>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_articles-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_articles-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..44ef54e38f7cb8edbc74fb998f754070e062889a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_articles-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M15.285 4C12.177 4 10 6.863 10 9.941V54.06c0 3.077 2.177 5.94 5.285 5.94h33.43C51.823 60 54 57.137 54 54.059V9.94C54 6.863 51.823 4 48.715 4zm0 4h33.43C49.247 8 50 8.652 50 9.941V54.06c0 1.288-.753 1.94-1.285 1.94h-33.43C14.753 56 14 55.348 14 54.059V9.94C14 8.652 14.753 8 15.285 8zM24 16a3 3 0 0 0-3 3 3 3 0 0 0 3 3h16a3 3 0 0 0 3-3 3 3 0 0 0-3-3zm0 12a3 3 0 0 0-3 3 3 3 0 0 0 3 3h16a3 3 0 0 0 3-3 3 3 0 0 0-3-3zm0 12a3 3 0 0 0-3 3 3 3 0 0 0 3 3h10a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_auteurs-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_auteurs-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0c5b346aeba38bfb63cf69a9e90eeadb31c004eb
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_auteurs-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M32 6c-7.406 0-13.474 5.942-13.474 13.074 0 7.13 6.068 12.976 13.474 12.976 7.406 0 13.474-5.944 13.474-13.075C45.474 11.843 39.406 6 32 6zm-6.788 30.308C19.04 36.308 14 41.162 14 47.105v5.348C19.04 55.92 25.314 58 32 58s12.96-2.08 18-5.546v-5.25h-.102v-.1c0-5.942-5.04-10.796-11.212-10.796z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_case-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_case-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2ce2b3cba0dd4108d914f9531e27bc22d65c3104
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_case-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M16 10c-3.29 0-6 2.71-6 6v32c0 3.29 2.71 6 6 6h32c3.29 0 6-2.71 6-6V16c0-3.29-2.71-6-6-6zm27.908 11.129a3 3 0 0 1 2.233.896 3 3 0 0 1-.04 4.245l-16.04 15.744a3 3 0 0 1-4.192.011l-7.957-7.718a3 3 0 0 1-.066-4.243A3 3 0 0 1 22.088 30l5.857 5.682 13.953-13.696a3 3 0 0 1 2.01-.857z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_checkbox-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_checkbox-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f372ee4ed0fc1d25cb7d7d2aa504a3fa34da5bf7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_checkbox-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M7.6 2C4.532 2 2 4.532 2 7.6v28.8C2 39.468 4.532 42 7.6 42a2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.921 0-1.6-.679-1.6-1.6V7.6C6 6.679 6.679 6 7.6 6h28.8c.921 0 1.6.679 1.6 1.6a2 2 0 0 0 2 2 2 2 0 0 0 2-2C42 4.532 39.468 2 36.4 2zm10 10c-3.068 0-5.6 2.532-5.6 5.6v28.8c0 3.068 2.532 5.6 5.6 5.6a2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.921 0-1.6-.679-1.6-1.6V17.6c0-.921.679-1.6 1.6-1.6h28.8c.921 0 1.6.679 1.6 1.6a2 2 0 0 0 2 2 2 2 0 0 0 2-2c0-3.068-2.532-5.6-5.6-5.6zm10 10c-3.068 0-5.6 2.532-5.6 5.6v28.8c0 3.068 2.532 5.6 5.6 5.6h28.8c3.068 0 5.6-2.532 5.6-5.6V27.6c0-3.068-2.532-5.6-5.6-5.6zm25.353 10a3 3 0 0 1 2.219.932 3 3 0 0 1-.104 4.24L40.363 51.174a3 3 0 0 1-4.123.012l-7.297-6.866a3 3 0 0 1-.129-4.24 3 3 0 0 1 4.243-.129l5.226 4.918 12.649-12.04A3 3 0 0 1 52.953 32z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_choix_grille-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_choix_grille-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5a6b507fb13885144774a03dd82e2bdc64748c89
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_choix_grille-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M10.906 4A7 7 0 0 0 4 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm-42 21A7 7 0 0 0 4 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm-42 21A7 7 0 0 0 4 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_conteneur_inline.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_conteneur_inline.svg
new file mode 100644
index 0000000000000000000000000000000000000000..841ae72bca7ad0ffa3d8dabd507854e1e9a16c9c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_conteneur_inline.svg
@@ -0,0 +1 @@
+<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg"><g fill="#000000a8"><path d="M6.148 24.792c-1.52 0-2.703 1.318-2.703 2.842v8.731c0 1.525 1.184 2.843 2.703 2.843h21.624c1.52 0 2.703-1.318 2.703-2.842v-8.731c0-1.525-1.184-2.843-2.703-2.843zm0 1.802h21.624c.478 0 .901.414.901 1.04v8.731c0 .627-.423 1.04-.9 1.04H6.147c-.478 0-.901-.413-.901-1.04v-8.73c0-.627.423-1.041.9-1.041zm1.577.9a.676.676 0 0 0-.676.677.676.676 0 0 0 .676.675H8.85v6.308H7.725a.676.676 0 0 0-.676.675.676.676 0 0 0 .676.676h3.604a.676.676 0 0 0 .675-.676.676.676 0 0 0-.675-.675h-1.127v-6.308h1.127a.676.676 0 0 0 .675-.675.676.676 0 0 0-.675-.676ZM36.4 24.792c-1.519 0-2.703 1.318-2.703 2.842v8.731c0 1.525 1.184 2.843 2.703 2.843h21.625c1.519 0 2.703-1.318 2.703-2.842v-8.731c0-1.525-1.184-2.843-2.703-2.843zm0 1.802h21.625c.477 0 .9.414.9 1.04v8.731c0 .627-.423 1.04-.9 1.04H36.4c-.477 0-.9-.413-.9-1.04v-8.73c0-.627.423-1.041.9-1.041zm1.577.9a.676.676 0 0 0-.676.677.676.676 0 0 0 .676.675h1.126v6.308h-1.126a.676.676 0 0 0-.676.675.676.676 0 0 0 .676.676h3.604a.676.676 0 0 0 .676-.676.676.676 0 0 0-.676-.675h-1.126v-6.308h1.126a.676.676 0 0 0 .676-.675.676.676 0 0 0-.676-.676Z" style="stroke-width:.450506" transform="matrix(1.11167 0 0 1.11167 -3.568 -3.573)"/></g></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_destinataires-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_destinataires-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c5983bbeac87aec831a59c9d05d7197c9da28cb1
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_destinataires-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M7.428 12C4.46 12 2 14.445 2 17.414v27.307c0 2.969 2.46 5.412 5.428 5.412h26.578c0-.045-.006-.088-.006-.133 0-1.335.183-2.626.494-3.867H7.428c-.831 0-1.428-.6-1.428-1.412V17.85l14.021 11.882-9.763 9.19a1.5 1.5 0 1 0 2.056 2.185l10.01-9.421L28 36.494l5.676-4.808 6.263 5.896a16.086 16.086 0 0 1 2.567-1.705l-6.527-6.145L50 17.85V34c1.383 0 2.719.195 4 .527V17.414C54 14.444 51.54 12 48.572 12zm1.029 4h39.086L28 32.56zM50 38c-6.651 0-12 5.349-12 12s5.349 12 12 12 12-5.349 12-12-5.349-12-12-12zm0 4c2.469 0 4.492 1.947 4.492 4.324s-2.023 4.36-4.492 4.36-4.492-1.95-4.492-4.327S47.53 42 50 42zm-2.264 10.104h4.493c2.057 0 3.738 1.616 3.738 3.597v.033H56v1.75a10.613 10.613 0 0 1-6 1.85c-2.229 0-4.32-.694-6-1.85v-1.783c0-1.98 1.68-3.597 3.736-3.597z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_documents-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_documents-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a8d4d8bc5ff10f6c4569bff51464bfb6555e8940
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_documents-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M49.878 10.835c-5.482-5.482-14.402-5.482-19.885 0l-19.27 19.271a2.467 2.467 0 0 0 3.488 3.488l19.27-19.27c3.56-3.56 9.35-3.56 12.91 0a9.123 9.123 0 0 1 0 12.908l-24.14 24.14a3.334 3.334 0 0 1-4.71 0 3.335 3.335 0 0 1 0-4.71l23.019-23.02a2.467 2.467 0 0 0-3.488-3.489l-23.02 23.02c-3.222 3.222-3.222 8.465 0 11.687 3.222 3.222 8.465 3.222 11.687 0l24.14-24.14c5.495-5.495 5.495-14.39 0-19.885z" /></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_evenements-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_evenements-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..252b693a628bdef1aae242c037be73d06566a27e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_evenements-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M19 2a3 3 0 0 0-3 3v3H8c-3.248 0-6 2.599-6 5.846v42.308C2 59.401 4.752 62 8 62h48c3.248 0 6-2.599 6-5.846V13.846C62 10.599 59.248 8 56 8h-8V5a3 3 0 0 0-6 0v3H22V5a3 3 0 0 0-3-3zM6 22h52v34.154C58 57.17 57.184 58 56 58H8c-1.184 0-2-.831-2-1.846zm37.908 7.129a3 3 0 0 0-2.01.857L27.945 43.682 22.088 38a3 3 0 1 0-4.176 4.307l7.957 7.718a3 3 0 0 0 4.192-.011L46.1 34.27a3 3 0 0 0-2.193-5.141z" /></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_explication-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_explication-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..88c9bac87a7d5c54fff85829469a46e34b631040
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_explication-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M32 10c-12.127 0-22 9.873-22 22s9.873 22 22 22 22-9.873 22-22-9.873-22-22-22zm0 4c9.965 0 18 8.035 18 18s-8.035 18-18 18-18-8.035-18-18 8.035-18 18-18zm-.05 4A3 3 0 0 0 29 21a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-.05 0zm.05 8a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3 3 3 0 0 0 3-3V29a3 3 0 0 0-3-3z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_fieldset-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_fieldset-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0dcbeefd09db4bc27a90ad6b1326a9440fc5faca
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_fieldset-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path style="color:#000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;vector-effect:none;fill:#000;fill-opacity:.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000" d="M8 2C4.71 2 2 4.71 2 8v48c0 3.29 2.71 6 6 6h48c3.29 0 6-2.71 6-6V8c0-3.29-2.71-6-6-6H42a2 2 0 0 0-2 2 2 2 0 0 0 2 2h14c1.143 0 2 .857 2 2v48c0 1.143-.857 2-2 2H8c-1.143 0-2-.857-2-2V8c0-1.143.857-2 2-2a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm8 0a2 2 0 0 0-2 2 2 2 0 0 0 2 2h18a2 2 0 0 0 2-2 2 2 0 0 0-2-2z"/><path style="display:inline;fill:#000;fill-opacity:.33;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.33;paint-order:markers stroke fill" d="M12 14c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2h40c1.108 0 2-.892 2-2v-4c0-1.108-.892-2-2-2zm0 14c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2h40c1.108 0 2-.892 2-2v-4c0-1.108-.892-2-2-2zm0 14c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2h40c1.108 0 2-.892 2-2v-4c0-1.108-.892-2-2-2z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_grille-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_grille-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9cff432a5b7391402b14e58283b287d5d251e3fa
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_grille-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><path d="M10.906 4A7 7 0 0 0 4 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 11a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm-42 21A7 7 0 0 0 4 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 32a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm-42 21A7 7 0 0 0 4 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 25 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0zm21 0A7 7 0 0 0 46 53a7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7 7 7 0 0 0-.094 0z" fill-opacity=".659" paint-order="markers stroke fill"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_hidden-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_hidden-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e220731f72bc8773c797972b207c4e618d0cb948
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_hidden-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M32 16c-15.333 0-21.838 15.213-21.838 15.213L9.824 32l.338.787s2.488 5.794 7.992 10.23l-1.568 1.569a2 2 0 0 0 2.828 2.828l28-28a2 2 0 0 0-2.828-2.828L42.47 18.7A21.29 21.29 0 0 0 32 16zm0 4c2.896 0 5.397.644 7.54 1.633l-4.212 4.21a7 7 0 0 0-9.484 9.484l-4.899 4.9C16.96 37.18 14.84 33.21 14.254 32c.99-2.047 6.327-12 17.746-12zm16.762 3.723L45.984 26.5c2.118 2.346 3.342 4.632 3.762 5.5-.99 2.047-6.327 12-17.746 12a18.44 18.44 0 0 1-3.232-.283l-3.282 3.281A21.388 21.388 0 0 0 32 48c15.333 0 21.838-15.213 21.838-15.213l.338-.787-.338-.787s-1.604-3.726-5.076-7.49z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_icones_src.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_icones_src.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cf59e743297a7f1d8a8a2f26a653300ac5ef36d5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_icones_src.svg
@@ -0,0 +1,1568 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64.000003"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.0.2 (394de47547, 2021-03-26)"
+   sodipodi:docname="saisies_icones.svg">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="33.91227"
+     inkscape:cy="43.674373"
+     inkscape:document-units="px"
+     inkscape:current-layer="g2552"
+     inkscape:document-rotation="0"
+     showgrid="true"
+     units="px"
+     inkscape:snap-global="true"
+     inkscape:snap-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid833"
+       spacingx="2"
+       spacingy="2"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer21"
+     inkscape:label="divers"
+     style="display:none">
+    <g
+       inkscape:groupmode="layer"
+       id="g3498"
+       inkscape:label="hidden"
+       style="display:inline">
+      <g
+         inkscape:groupmode="layer"
+         id="g3492"
+         inkscape:label="hidden_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3484"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path2054"
+           cx="10"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2056"
+           cx="16"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2058"
+           cx="22"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2060"
+           cx="28"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2062"
+           cx="34"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2064"
+           cx="40"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2066"
+           cx="46"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2068"
+           cx="52"
+           cy="18"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2070"
+           cx="8"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2072"
+           cx="14"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2074"
+           cx="20"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2076"
+           cx="26"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2078"
+           cx="32"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2080"
+           cx="38"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2082"
+           cx="44"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2084"
+           cx="50"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2086"
+           cx="60"
+           cy="24"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2088"
+           cx="58"
+           cy="18.597977"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2090"
+           cx="60"
+           cy="30"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2092"
+           cx="60"
+           cy="36"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2094"
+           cx="60"
+           cy="42"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2096"
+           cx="56"
+           cy="46"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2098"
+           cx="4"
+           cy="42"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2100"
+           cx="4"
+           cy="36"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2102"
+           cx="4"
+           cy="30"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2104"
+           cx="4"
+           cy="24"
+           r="2" />
+        <circle
+           style="fill:#ff2a2a;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle2106"
+           cx="5.173945"
+           cy="19.229134"
+           r="2" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3274"
+         inkscape:label="hidden_src_2"
+         style="display:none">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 52,32 C 52,32 46,18 32,18 18,18 12,32 12,32 c 0,0 6,14 20,14 14,0 20,-14 20,-14 z"
+           id="path3485"
+           sodipodi:nodetypes="cscsc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 18,46 46,18"
+           id="path3487" />
+        <circle
+           style="fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5;paint-order:markers stroke fill"
+           id="path3489"
+           cx="32"
+           cy="32"
+           r="7" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 21.795334,47.861338 28,-28"
+           id="path3491" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer40"
+         inkscape:label="hidden_final_2"
+         style="display:inline">
+        <path
+           id="path3485-4"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:evenodd;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 32,16 C 16.666667,16 10.162109,31.212891 10.162109,31.212891 L 9.8242188,32 10.162109,32.787109 c 0,0 2.488391,5.79346 7.992188,10.230469 l -1.568359,1.56836 c -0.780847,0.781014 -0.780847,2.04711 0,2.828124 0.781014,0.780847 2.04711,0.780847 2.828124,0 9.527759,-9.527759 19.429103,-19.429099 28,-28 0.780847,-0.781014 0.780847,-2.04711 0,-2.828124 C 47.045295,16.217005 46.54698,16.006745 46.025391,16 c -0.539187,-0.0067 -1.058243,0.204563 -1.439453,0.585938 l -2.115235,2.115234 C 39.58367,17.099696 36.112218,16 32,16 Z m 0,4 c 2.895921,0 5.397222,0.643883 7.539062,1.632812 L 35.328125,25.84375 C 34.305996,25.290575 33.162217,25.000603 32,25 c -3.865993,0 -7,3.134007 -7,7 6.03e-4,1.162217 0.290575,2.305996 0.84375,3.328125 l -4.898438,4.898437 C 16.960024,37.179643 14.839593,33.210582 14.253906,32 15.244216,29.953082 20.580653,20 32,20 Z M 48.761719,23.722656 45.984375,26.5 c 2.117807,2.346382 3.341973,4.632409 3.761719,5.5 C 48.755784,34.046918 43.419347,44 32,44 30.861689,44 29.786082,43.897617 28.767578,43.716797 l -3.28125,3.28125 C 27.451559,47.621449 29.614518,48 32,48 47.333333,48 53.837891,32.787109 53.837891,32.787109 L 54.175781,32 53.837891,31.212891 c 0,0 -1.604203,-3.726281 -5.076172,-7.490235 z"
+           sodipodi:nodetypes="sccccccccccccsscccccccscccsccscccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3496"
+         inkscape:label="hidden_final"
+         style="display:none">
+        <path
+           id="path2054-5"
+           style="display:inline;fill:#000000;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 9.9511719,16 A 2,2 0 0 0 8,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.048828,0 z m 6.0000001,0 A 2,2 0 0 0 14,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 20,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 26,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 32,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 38,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 44,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 50,18 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0.597656 a 2,2 0 0 0 -1.951172,2 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m -52.7773439,0.63086 a 2,2 0 0 0 -2,2 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 z M 3.9511719,22 A 2,2 0 0 0 2,24 2,2 0 0 0 4,26 2,2 0 0 0 6,24 2,2 0 0 0 4,22 2,2 0 0 0 3.9511719,22 Z M 59.951172,22 A 2,2 0 0 0 58,24 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z M 3.9511719,28 A 2,2 0 0 0 2,30 2,2 0 0 0 4,32 2,2 0 0 0 6,30 2,2 0 0 0 4,28 2,2 0 0 0 3.9511719,28 Z M 59.951172,28 A 2,2 0 0 0 58,30 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z M 3.9511719,34 A 2,2 0 0 0 2,36 2,2 0 0 0 4,38 2,2 0 0 0 6,36 2,2 0 0 0 4,34 2,2 0 0 0 3.9511719,34 Z M 59.951172,34 A 2,2 0 0 0 58,36 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z M 3.9511719,40 A 2,2 0 0 0 2,42 2,2 0 0 0 4,44 2,2 0 0 0 6,42 2,2 0 0 0 4,40 2,2 0 0 0 3.9511719,40 Z M 59.951172,40 A 2,2 0 0 0 58,42 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z M 7.9511719,44 A 2,2 0 0 0 6,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.048828,0 z m 6.0000001,0 A 2,2 0 0 0 12,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 18,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 24,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 30,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 36,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 42,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 48,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z m 6,0 A 2,2 0 0 0 54,46 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.04883,0 z" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer19"
+     inkscape:label="contenu éditorial"
+     style="display:inline">
+    <g
+       inkscape:groupmode="layer"
+       id="layer34"
+       inkscape:label="documents"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer35"
+         inkscape:label="documents_final">
+        <path
+           d="m 49.878365,10.835309 c -5.482332,-5.4823321 -14.402663,-5.4823321 -19.884995,0 L 10.722416,30.106263 c -0.9632707,0.963171 -0.9631721,2.524884 0,3.488154 0.963173,0.963271 2.524885,0.963271 3.488156,0 L 33.481625,14.323365 c 3.559048,-3.558948 9.349832,-3.558948 12.908682,0 3.567639,3.567541 3.567343,9.341342 0,12.908586 L 22.250569,51.371788 c -1.29858,1.298777 -3.411932,1.298777 -4.710511,0 -1.298776,-1.29858 -1.298579,-3.411834 0,-4.710511 L 40.559831,23.641306 c 0.963271,-0.963172 0.963172,-2.524884 0,-3.488155 -0.963172,-0.963272 -2.524885,-0.963272 -3.488155,0 L 14.051804,43.172924 c -3.221963,3.222159 -3.221963,8.464957 0,11.686921 3.222259,3.222258 8.464957,3.221962 11.686822,9.8e-5 L 49.878365,30.720205 c 5.495859,-5.495663 5.495167,-14.389827 0,-19.884896 z"
+           fill="#555555"
+           id="path2"
+           style="fill:#000000;fill-opacity:0.66;stroke:none;stroke-width:0.125" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer36"
+       inkscape:label="mots"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer37"
+         inkscape:label="mots_final">
+        <path
+           fill="#666666"
+           d="M 53.294496,41.446994 35.359613,10.359864 35.188805,10.103652 C 34.334763,8.6517801 32.797487,7.6269296 31.089403,7.370717 L 18.534985,5.7480371 C 17.168518,5.5772287 15.802051,6.3458665 15.289625,7.6269296 L 10.421586,19.327305 c -0.6832341,1.62268 -0.5124251,3.416168 0.341617,4.86804 l 18.105691,31.428747 c 1.451871,2.476722 4.697231,3.416168 7.173953,1.964297 l 2.305914,-1.366468 12.981439,-7.51557 c 2.562126,-1.537275 3.416168,-4.697231 1.964296,-7.259357 z M 20.157665,18.387859 c -0.939446,-1.62268 -0.341617,-3.757785 1.281063,-4.697231 1.62268,-0.939447 3.757785,-0.341617 4.697231,1.281063 0.939447,1.62268 0.341617,3.757785 -1.281063,4.697231 -1.622679,0.939446 -3.757785,0.341617 -4.697231,-1.281063 z"
+           id="path2-0"
+           style="fill:#000000;fill-opacity:0.66;stroke-width:0.999998" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer38"
+       inkscape:label="rubriques"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer39"
+         inkscape:label="rubriques_final">
+        <path
+           d="m 48,58 c 0,1.243817 -0.833922,2 -2,2 H 6.0008294 C 4.7570134,60 4,59.183027 4,58.016949 V 22.016237 C 4,20.77242 4.8499434,20 6.0160204,20 H 22.501767 L 31.130742,28.07774 48,28 Z"
+           fill="#ebba16"
+           id="path6"
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           sodipodi:nodetypes="cssssscccc" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer22"
+       inkscape:label="articles"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer24"
+         inkscape:label="articles_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect886-0-0-6"
+           width="40"
+           height="52"
+           x="12"
+           y="6"
+           rx="3.2847977"
+           ry="3.9417572" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 24,19 H 40"
+           id="path1485-7-5"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 24,31 H 40"
+           id="path3323"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 24,43 H 34"
+           id="path3325"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer23"
+         inkscape:label="articles_final"
+         style="display:inline">
+        <path
+           id="rect886-0-0-6-0"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 15.285156,4 C 12.177292,4 10,6.8631682 10,9.9414062 V 54.058594 C 10,57.136832 12.177292,60 15.285156,60 H 48.714844 C 51.822708,60 54,57.136832 54,54.058594 V 9.9414062 C 54,6.8631682 51.822708,4 48.714844,4 Z m 0,4 H 48.714844 C 49.246535,8 50,8.6521774 50,9.9414062 V 54.058594 C 50,55.347823 49.246535,56 48.714844,56 H 15.285156 C 14.753465,56 14,55.347823 14,54.058594 V 9.9414062 C 14,8.6521774 14.753465,8 15.285156,8 Z M 24,16 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 h 16 a 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,12 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 h 16 a 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,12 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 h 10 a 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g2262"
+       inkscape:label="rubriques articles"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g2256"
+         inkscape:label="rurbiques_articles_src"
+         style="display:none">
+        <path
+           id="rect2248"
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 20.5,14.5 V 7.4417572 C 20.5,5.2580237 21.96502,3.5 23.784798,3.5 H 57.215202 C 59.03498,3.5 60.5,5.2580237 60.5,7.4417572 V 49.361566 C 60.5,51.545299 59.03498,53 57.215202,53 H 53.5"
+           sodipodi:nodetypes="cssssssc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 32.5,12.5 h 16"
+           id="path2250"
+           sodipodi:nodetypes="cc" />
+        <path
+           d="m 48,58 c 0,1.243817 -0.833922,2 -2,2 H 6.0008294 C 4.7570134,60 4,59.183027 4,58.016949 V 22.016237 C 4,20.77242 4.8499434,20 6.0160204,20 H 22.501767 L 31.130742,28.07774 48,28 Z"
+           fill="#ebba16"
+           id="path6-4"
+           style="display:inline;fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           sodipodi:nodetypes="cssssscccc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 32.5,20.5 h 16"
+           id="path2370"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g2260"
+         inkscape:label="rubriques_articles_final"
+         style="display:inline">
+        <path
+           id="rect2248-6"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 23.785156,2 C 20.999313,2 19,4.5867942 19,7.4414062 V 14.5 A 1.5,1.5 0 0 0 20.5,16 1.5,1.5 0 0 0 22,14.5 V 7.4414062 C 22,5.9285513 22.931443,5 23.785156,5 H 57.214844 C 58.068557,5 59,5.9285513 59,7.4414062 V 49.361328 C 59,50.874182 58.235238,51.5 57.214844,51.5 H 53.5 A 1.5,1.5 0 0 0 52,53 a 1.5,1.5 0 0 0 1.5,1.5 h 3.714844 C 59.834006,54.5 62,52.21594 62,49.361328 V 7.4414062 C 62,4.5867942 60.000687,2 57.214844,2 Z M 32.5,11 A 1.5,1.5 0 0 0 31,12.5 1.5,1.5 0 0 0 32.5,14 h 16 A 1.5,1.5 0 0 0 50,12.5 1.5,1.5 0 0 0 48.5,11 Z M 6.015625,18 C 4.9909804,18 3.9413931,18.362462 3.1757812,19.107422 2.4101695,19.852382 2,20.93816 2,22.015625 v 36.001953 c 0,1.015837 0.3588805,2.070058 1.109375,2.832031 C 3.8598695,61.611583 4.9402068,62 6,62 h 40 c 1.015362,0 2.065628,-0.35423 2.832031,-1.099609 C 49.598434,60.155011 50,59.068878 50,58 V 28 A 2.0002,2.0002 0 0 0 47.990234,26 L 31.916016,26.07422 23.869141,18.539063 A 2.0002,2.0002 0 0 0 22.501953,18 Z M 32.5,19 A 1.5,1.5 0 0 0 31,20.5 1.5,1.5 0 0 0 32.5,22 h 16 A 1.5,1.5 0 0 0 50,20.5 1.5,1.5 0 0 0 48.5,19 Z M 6,22 c 0.00904,-2.38e-4 0.00435,0 0.015625,0 h 15.695313 l 8.052734,7.537109 a 2.0002,2.0002 0 0 0 1.376953,0.541016 L 46,30.009766 V 58 H 6 V 22.015625 C 6,22.002829 5.9998698,22.010035 6,22 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer25"
+       inkscape:label="auteurs"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer26"
+         inkscape:label="auteurs_final">
+        <path
+           id="path4"
+           d="m 31.999999,6 c -7.405714,0 -13.473883,5.942084 -13.473883,13.073512 0,7.131429 6.068169,12.976785 13.473883,12.976785 7.405714,0 13.473883,-5.944018 13.473883,-13.075446 C 45.473882,11.843422 39.405713,6 31.999999,6 Z M 25.21183,36.308184 C 19.040402,36.308184 14,41.161905 14,47.104762 v 4.358482 0.990477 C 19.039999,55.920387 25.314285,58 31.999999,58 c 6.685714,0 12.96,-2.079613 18,-5.546279 v -5.250299 h -0.102456 v -0.09866 c 1e-6,-5.942857 -5.040401,-10.796578 -11.21183,-10.796578 z"
+           style="fill:#000000;fill-opacity:0.66;stroke-width:1" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g2554"
+       inkscape:label="evenements"
+       style="display:inline">
+      <g
+         inkscape:groupmode="layer"
+         id="g2548"
+         inkscape:label="evenement_src"
+         style="display:none">
+        <path
+           d="M 44,32.127616 27.95823,47.872504 20,40.153221"
+           id="path839-8"
+           sodipodi:nodetypes="ccc"
+           style="display:inline;fill:none;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+        <path
+           id="rect886-0-0-8-9"
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="m 47.999991,10 h 7.999998 c 2.216,0 4,1.715385 4,3.846155 v 42.30769 c 0,2.13077 -1.784,3.846155 -4,3.846155 H 8.0000038 c -2.216,0 -4,-1.715385 -4,-3.846155 v -42.30769 c 0,-2.13077 1.784,-3.846155 4,-3.846155 H 12 Z"
+           sodipodi:nodetypes="csssssssscc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:4.00001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 6,20.000001 H 58"
+           id="path1485-7-4-4"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 45,11 V 5"
+           id="path2810-9"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 19,11 V 5"
+           id="path2607-1"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g2552"
+         inkscape:label="evenement_final"
+         style="display:inline">
+        <path
+           d="M 19,2 C 17.343146,2 16,3.3431458 16,5 V 8 H 12 8 C 4.7518791,8 2,10.598592 2,13.845703 V 56.154297 C 2,59.401408 4.7518791,62 8,62 h 48 c 3.248121,0 6,-2.598592 6,-5.845703 V 13.845703 C 62,10.598592 59.248121,8 56,8 H 48 V 5 C 48,3.3431458 46.656854,2 45,2 43.343146,2 42,3.3431458 42,5 V 8 H 22 V 5 C 22,3.3431458 20.656854,2 19,2 Z M 6,22 H 58 V 56.154297 C 58,57.168726 57.183879,58 56,58 H 8 C 6.8161209,58 6,57.168726 6,56.154297 Z m 37.908203,7.128906 c -0.753886,0.02301 -1.471445,0.329137 -2.009765,0.857422 L 27.945312,43.681641 22.087891,38 c -1.18924,-1.153664 -3.088545,-1.124807 -4.242188,0.06445 -1.153137,1.189775 -1.123405,3.089089 0.06641,4.242188 l 7.957032,7.71875 c 1.168718,1.134412 3.02905,1.129211 4.191406,-0.01172 L 46.101562,34.269531 c 1.183427,-1.160922 1.200922,-3.061632 0.03906,-4.24414 C 45.554127,29.42822 44.744819,29.103222 43.9082,29.128906 Z"
+           style="fill:#000000;fill-opacity:0.65882403" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer20"
+     inkscape:label="structure"
+     style="display:none">
+    <g
+       inkscape:groupmode="layer"
+       id="layer27"
+       inkscape:label="fieldset"
+       style="display:inline">
+      <g
+         inkscape:groupmode="layer"
+         id="layer28"
+         inkscape:label="fieldset_src"
+         style="display:none">
+        <path
+           id="rect886-0-0-52"
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 42,4 H 55.999999 C 58.215999,4 60,5.7840006 60,8.0000014 V 56.000006 c 0,2.216001 -1.784001,4.000002 -4.000001,4.000002 H 8.0000014 C 5.7840006,60.000008 4,58.216007 4,56.000006 V 8.0000014 C 4,5.7840006 5.7840006,4 8.0000014,4"
+           sodipodi:nodetypes="csssssssc" />
+        <path
+           id="path2447"
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 16.000001,4 H 34"
+           sodipodi:nodetypes="cc" />
+        <path
+           id="rect3592-7-2"
+           style="display:inline;fill:#000000;fill-opacity:0.33;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.33;paint-order:markers stroke fill"
+           d="m 12,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z m 0,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z m 0,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3602"
+         inkscape:label="fieldset_final"
+         style="display:inline">
+        <path
+           id="rect886-0-0-52-6"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 8,2 C 4.7105937,2 2,4.7105937 2,8 v 48 c 0,3.289406 2.7105935,6 6,6 h 48 c 3.289406,0 6,-2.710593 6,-6 V 8 C 62,4.7105935 59.289406,2 56,2 H 42 a 2,2 0 0 0 -2,2 2,2 0 0 0 2,2 h 14 c 1.142594,0 2,0.8574049 2,2 v 48 c 0,1.142595 -0.857406,2 -2,2 H 8 C 6.8574049,58 6,57.142596 6,56 V 8 C 6,6.8574047 6.8574047,6 8,6 A 2,2 0 0 0 10,4 2,2 0 0 0 8,2 Z m 8,0 a 2,2 0 0 0 -2,2 2,2 0 0 0 2,2 H 34 A 2,2 0 0 0 36,4 2,2 0 0 0 34,2 Z" />
+        <path
+           id="rect3592-7"
+           style="display:inline;fill:#000000;fill-opacity:0.33;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.33;paint-order:markers stroke fill"
+           d="m 12,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z m 0,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z m 0,14 c -1.107998,0 -2,0.892002 -2,2 v 4 c 0,1.107998 0.892002,2 2,2 h 40 c 1.107998,0 2,-0.892002 2,-2 v -4 c 0,-1.107998 -0.892002,-2 -2,-2 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer29"
+       inkscape:label="explication"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer30"
+         inkscape:label="explication_src"
+         style="display:none">
+        <circle
+           style="fill:none;fill-opacity:0.25;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path3835"
+           cx="32"
+           cy="32"
+           r="20" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 32,29 V 43"
+           id="path4030"
+           sodipodi:nodetypes="cc" />
+        <circle
+           style="fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path4032"
+           cx="32"
+           cy="21"
+           r="3" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer31"
+         inkscape:label="explication_final"
+         style="display:inline">
+        <circle
+           style="display:inline;fill:none;fill-opacity:0.25;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path3835-3"
+           cx="32"
+           cy="32"
+           r="20" />
+        <path
+           style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 32,29 V 43"
+           id="path4030-6"
+           sodipodi:nodetypes="cc" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path4032-1"
+           cx="32"
+           cy="21"
+           r="3" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="choix restreint"
+     style="display:none">
+    <g
+       inkscape:groupmode="layer"
+       id="layer2"
+       inkscape:label="radio"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer4"
+         inkscape:label="radio_src"
+         style="display:none">
+        <circle
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="path892"
+           cx="32"
+           cy="32"
+           r="20" />
+        <circle
+           style="fill:#000000;fill-opacity:0.66;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle894"
+           cx="32"
+           cy="32"
+           r="12" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g866"
+         inkscape:label="radio_final"
+         style="display:inline">
+        <path
+           id="path892-8"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 32,10 C 19.873425,10 10,19.873425 10,32 10,44.126575 19.873425,54 32,54 44.126575,54 54,44.126575 54,32 54,19.873425 44.126575,10 32,10 Z m 0,4 c 9.964815,0 18,8.035185 18,18 0,9.964815 -8.035185,18 -18,18 -9.964815,0 -18,-8.035185 -18,-18 0,-9.964815 8.035185,-18 18,-18 z m 0,6 A 12,12 0 0 0 20,32 12,12 0 0 0 32,44 12,12 0 0 0 44,32 12,12 0 0 0 32,20 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g1229"
+       inkscape:label="oui_non"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g1223"
+         inkscape:label="oui_non_src"
+         style="display:none">
+        <rect
+           style="fill:#000000;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.658824;paint-order:fill markers stroke"
+           id="rect1231"
+           width="56"
+           height="28"
+           x="4"
+           y="18"
+           rx="14"
+           ry="14" />
+        <circle
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="circle1221"
+           cx="46"
+           cy="32"
+           r="12" />
+        <path
+           d="M 53.000001,27.999959 43.642299,36.000103 39,32.077852"
+           id="path3907-5"
+           sodipodi:nodetypes="ccc"
+           style="display:inline;fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1227"
+         inkscape:label="oui_non_final"
+         style="display:inline">
+        <path
+           id="path1283"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="M 18,16 C 9.1705945,16 2,23.170594 2,32 2,40.829406 9.1705945,48 18,48 H 46 C 54.829406,48 62,40.829406 62,32 62,23.170594 54.829406,16 46,16 Z m 28,4 A 12,12 0 0 1 58,32 12,12 0 0 1 46,44 12,12 0 0 1 34,32 12,12 0 0 1 46,20 Z m 6.943359,6 a 2,2 0 0 0 -1.242187,0.480469 L 43.634766,33.375 40.291016,30.550781 a 2,2 0 0 0 -2.81836,0.236328 2,2 0 0 0 0.236328,2.81836 l 4.642578,3.921875 a 2.0002,2.0002 0 0 0 2.589844,-0.0078 l 9.357422,-8 A 2,2 0 0 0 54.519531,26.701172 2,2 0 0 0 52.943359,26 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g884"
+       inkscape:label="case"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g878"
+         inkscape:label="case_src"
+         style="display:none">
+        <rect
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect886"
+           width="40"
+           height="40"
+           x="12"
+           y="12"
+           rx="4"
+           ry="4" />
+        <path
+           d="M 44,24.127616 27.958225,39.872504 20,32.153221"
+           id="path839"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3818"
+         inkscape:label="case_src_2"
+         style="display:inline">
+        <rect
+           style="fill:#000000;fill-opacity:0.658824;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3814"
+           width="40"
+           height="40"
+           x="12"
+           y="12"
+           rx="4"
+           ry="4" />
+        <path
+           d="M 44,24.127616 27.958225,39.872504 20,32.153221"
+           id="path3816"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3836"
+         inkscape:label="case_final_2"
+         style="display:none">
+        <path
+           id="path3840"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="m 16,10 c -3.289406,0 -6,2.710594 -6,6 v 32 c 0,3.289406 2.710594,6 6,6 h 32 c 3.289406,0 6,-2.710594 6,-6 V 16 c 0,-3.289406 -2.710594,-6 -6,-6 z m 27.908203,11.128906 a 3,3 0 0 1 2.232422,0.896485 3,3 0 0 1 -0.03906,4.24414 L 30.060547,42.013672 a 3.0003,3.0003 0 0 1 -4.191406,0.01172 l -7.957032,-7.71875 A 3,3 0 0 1 17.845703,30.064453 3,3 0 0 1 22.087891,30 l 5.857421,5.681641 13.953126,-13.695313 a 3,3 0 0 1 2.009765,-0.857422 z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g882"
+         inkscape:label="case_final"
+         style="display:none">
+        <path
+           id="rect886-7"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="m 16,10 c -3.289406,0 -6,2.710594 -6,6 v 32 c 0,3.289406 2.710594,6 6,6 h 32 c 3.289406,0 6,-2.710594 6,-6 V 16 c 0,-3.289406 -2.710594,-6 -6,-6 z m 0,4 h 32 c 1.142594,0 2,0.857406 2,2 v 32 c 0,1.142594 -0.857406,2 -2,2 H 16 c -1.142594,0 -2,-0.857406 -2,-2 V 16 c 0,-1.142594 0.857406,-2 2,-2 z m 27.908203,7.128906 a 3,3 0 0 0 -2.009765,0.857422 L 27.945312,35.681641 22.087891,30 a 3,3 0 0 0 -4.242188,0.06445 3,3 0 0 0 0.06641,4.242188 l 7.957032,7.71875 a 3.0003,3.0003 0 0 0 4.191406,-0.01172 L 46.101562,26.269531 a 3,3 0 0 0 0.03906,-4.24414 3,3 0 0 0 -2.232422,-0.896485 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g1051"
+       inkscape:label="checkbox"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g1045"
+         inkscape:label="checkbox_src"
+         style="display:none">
+        <rect
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1041"
+           width="26"
+           height="26"
+           x="4"
+           y="4"
+           rx="2.5999999"
+           ry="2.5999999" />
+        <path
+           d="M 24,12.751719 14.642298,21.248351 10,17.082687"
+           id="path1043"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+        <rect
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1053"
+           width="26"
+           height="26"
+           x="34"
+           y="34"
+           rx="2.5999999"
+           ry="2.5999999" />
+        <path
+           d="M 54,42.751719 44.642298,51.248351 40,47.082687"
+           id="path1055"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1161"
+         inkscape:label="checkbox_src_2"
+         style="display:none">
+        <path
+           id="rect1153"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 17.6,50 C 15.6056,50 14,48.3944 14,46.4 V 17.6 C 14,15.6056 15.6056,14 17.6,14 h 28.8 c 1.9944,0 3.6,1.6056 3.6,3.6"
+           sodipodi:nodetypes="cssssc" />
+        <rect
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1163"
+           width="36"
+           height="36"
+           x="24"
+           y="24"
+           rx="3.5999999"
+           ry="3.5999999" />
+        <path
+           d="M 53,35 38.295041,49.000114 31,42.136244"
+           id="path1165"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824" />
+        <path
+           id="path1308"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 7.6,40 C 5.6056,40 4,38.3944 4,36.4 V 7.6 C 4,5.6056 5.6056,4 7.6,4 H 36.4 C 38.3944,4 40,5.6056 40,7.6"
+           sodipodi:nodetypes="cssssc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3911"
+         inkscape:label="checkbox_src_3"
+         style="display:inline">
+        <path
+           id="path3903"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 17.6,50 C 15.6056,50 14,48.3944 14,46.4 V 17.6 C 14,15.6056 15.6056,14 17.6,14 h 28.8 c 1.9944,0 3.6,1.6056 3.6,3.6"
+           sodipodi:nodetypes="cssssc" />
+        <rect
+           style="fill:#000000;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3905"
+           width="36"
+           height="36"
+           x="24"
+           y="24"
+           rx="3.5999999"
+           ry="3.5999999" />
+        <path
+           d="M 53,35 38.295041,49.000114 31,42.136244"
+           id="path3907"
+           sodipodi:nodetypes="ccc"
+           style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           id="path3909"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 7.6,40 C 5.6056,40 4,38.3944 4,36.4 V 7.6 C 4,5.6056 5.6056,4 7.6,4 H 36.4 C 38.3944,4 40,5.6056 40,7.6"
+           sodipodi:nodetypes="cssssc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3921"
+         inkscape:label="checkbox_final_3"
+         style="display:none">
+        <path
+           id="path3913"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 7.5996094,2 C 4.5318038,2 2,4.5318038 2,7.5996094 V 36.400391 C 2,39.468196 4.5318038,42 7.5996094,42 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 6.6786149,38 6,37.321385 6,36.400391 V 7.5996094 C 6,6.6786149 6.6786149,6 7.5996094,6 H 36.400391 C 37.321385,6 38,6.6786149 38,7.5996094 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 42,4.5318038 39.468196,2 36.400391,2 Z M 17.599609,12 C 14.531804,12 12,14.531804 12,17.599609 V 46.400391 C 12,49.468196 14.531804,52 17.599609,52 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 16.678615,48 16,47.321385 16,46.400391 V 17.599609 C 16,16.678615 16.678615,16 17.599609,16 H 46.400391 C 47.321385,16 48,16.678615 48,17.599609 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 52,14.531804 49.468196,12 46.400391,12 Z m 10,10 C 24.531804,22 22,24.531804 22,27.599609 V 56.400391 C 22,59.468196 24.531804,62 27.599609,62 H 56.400391 C 59.468196,62 62,59.468196 62,56.400391 V 27.599609 C 62,24.531804 59.468196,22 56.400391,22 Z m 25.353516,10 a 3,3 0 0 1 2.21875,0.931641 3,3 0 0 1 -0.103516,4.240234 L 40.363281,51.173828 a 3.0003,3.0003 0 0 1 -4.123047,0.01172 l -7.296875,-6.865235 a 3,3 0 0 1 -0.128906,-4.240234 3,3 0 0 1 4.242188,-0.128906 l 5.226562,4.917969 12.648438,-12.041016 A 3,3 0 0 1 52.953125,32 Z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer5"
+         inkscape:label="checkbox_final_2"
+         style="display:none">
+        <path
+           id="rect1153-0"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 7.5996094,2 C 4.5318038,2 2,4.5318038 2,7.5996094 V 36.400391 C 2,39.468196 4.5318038,42 7.5996094,42 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 6.6786149,38 6,37.321385 6,36.400391 V 7.5996094 C 6,6.6786149 6.6786149,6 7.5996094,6 H 36.400391 C 37.321385,6 38,6.6786149 38,7.5996094 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 42,4.5318038 39.468196,2 36.400391,2 Z M 17.599609,12 C 14.531804,12 12,14.531804 12,17.599609 V 46.400391 C 12,49.468196 14.531804,52 17.599609,52 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 16.678615,48 16,47.321385 16,46.400391 V 17.599609 C 16,16.678615 16.678615,16 17.599609,16 H 46.400391 C 47.321385,16 48,16.678615 48,17.599609 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 52,14.531804 49.468196,12 46.400391,12 Z m 10,10 C 24.531804,22 22,24.531804 22,27.599609 V 56.400391 C 22,59.468196 24.531804,62 27.599609,62 H 56.400391 C 59.468196,62 62,59.468196 62,56.400391 V 27.599609 C 62,24.531804 59.468196,22 56.400391,22 Z m 0,4 H 56.400391 C 57.321385,26 58,26.678615 58,27.599609 V 56.400391 C 58,57.321385 57.321385,58 56.400391,58 H 27.599609 C 26.678615,58 26,57.321385 26,56.400391 V 27.599609 C 26,26.678615 26.678615,26 27.599609,26 Z m 25.353516,6 a 3,3 0 0 0 -2.021484,0.828125 L 38.283203,44.869141 33.056641,39.951172 a 3,3 0 0 0 -4.242188,0.128906 3,3 0 0 0 0.128906,4.240234 l 7.296875,6.865235 a 3.0003,3.0003 0 0 0 4.123047,-0.01172 L 55.068359,37.171875 A 3,3 0 0 0 55.171875,32.931641 3,3 0 0 0 52.953125,32 Z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1049"
+         inkscape:label="checkbox_final"
+         style="display:none">
+        <path
+           id="rect1041-3"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 6.5996094,2 C 4.0858039,2 2,4.0858039 2,6.5996094 V 27.400391 C 2,29.914196 4.0858039,32 6.5996094,32 H 27.400391 C 29.914196,32 32,29.914196 32,27.400391 V 6.5996094 C 32,4.0858039 29.914196,2 27.400391,2 Z m 0,4 H 27.400391 C 27.767385,6 28,6.232615 28,6.5996094 V 27.400391 C 28,27.767385 27.767385,28 27.400391,28 H 6.5996094 C 6.232615,28 6,27.767385 6,27.400391 V 6.5996094 C 6,6.232615 6.232615,6 6.5996094,6 Z m 17.4023436,4.751953 a 2,2 0 0 0 -1.345703,0.519531 l -8.021484,7.283204 -3.298828,-2.960938 a 2,2 0 0 0 -2.8242192,0.152344 2,2 0 0 0 0.1523437,2.824218 l 4.6425785,4.166016 a 2.0002,2.0002 0 0 0 2.679687,-0.0078 l 9.357422,-8.496094 a 2,2 0 0 0 0.136719,-2.824219 2,2 0 0 0 -1.478516,-0.65625 z M 36.599609,32 C 34.085804,32 32,34.085804 32,36.599609 V 57.400391 C 32,59.914196 34.085804,62 36.599609,62 H 57.400391 C 59.914196,62 62,59.914196 62,57.400391 V 36.599609 C 62,34.085804 59.914196,32 57.400391,32 Z m 0,4 H 57.400391 C 57.767385,36 58,36.232615 58,36.599609 V 57.400391 C 58,57.767385 57.767385,58 57.400391,58 H 36.599609 C 36.232615,58 36,57.767385 36,57.400391 V 36.599609 C 36,36.232615 36.232615,36 36.599609,36 Z m 17.402344,4.751953 a 2,2 0 0 0 -1.345703,0.519531 l -8.021484,7.283204 -3.298828,-2.960938 a 2,2 0 0 0 -2.824219,0.152344 2,2 0 0 0 0.152343,2.824218 l 4.642579,4.166016 a 2.0002,2.0002 0 0 0 2.679687,-0.0078 l 9.357422,-8.496094 a 2,2 0 0 0 0.136719,-2.824219 2,2 0 0 0 -1.478516,-0.65625 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g1113"
+       inkscape:label="selection_multiple"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g1099"
+         inkscape:label="selection_multiple_src"
+         style="display:none">
+        <path
+           id="path1091"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 17.6,50 C 15.6056,50 14,48.3944 14,46.4 V 17.6 C 14,15.6056 15.6056,14 17.6,14 h 28.8 c 1.9944,0 3.6,1.6056 3.6,3.6"
+           sodipodi:nodetypes="cssssc" />
+        <rect
+           style="fill:#000000;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1093"
+           width="36"
+           height="36"
+           x="24"
+           y="24"
+           rx="3.5999999"
+           ry="3.5999999" />
+        <path
+           id="path1097"
+           style="fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="M 7.6,40 C 5.6056,40 4,38.3944 4,36.4 V 7.6 C 4,5.6056 5.6056,4 7.6,4 H 36.4 C 38.3944,4 40,5.6056 40,7.6"
+           sodipodi:nodetypes="cssssc" />
+        <path
+           id="path3991-3"
+           style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.99999;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 31,37 H 53 L 42,51 Z"
+           sodipodi:nodetypes="cccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1103"
+         inkscape:label="selection_multiple_final"
+         style="display:inline">
+        <path
+           id="path1091-6"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 7.5996094,2 C 4.5318038,2 2,4.5318038 2,7.5996094 V 36.400391 C 2,39.468196 4.5318038,42 7.5996094,42 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 6.6786149,38 6,37.321385 6,36.400391 V 7.5996094 C 6,6.6786149 6.6786149,6 7.5996094,6 H 36.400391 C 37.321385,6 38,6.6786149 38,7.5996094 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 42,4.5318038 39.468196,2 36.400391,2 Z M 17.599609,12 C 14.531804,12 12,14.531804 12,17.599609 V 46.400391 C 12,49.468196 14.531804,52 17.599609,52 a 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 C 16.678615,48 16,47.321385 16,46.400391 V 17.599609 C 16,16.678615 16.678615,16 17.599609,16 H 46.400391 C 47.321385,16 48,16.678615 48,17.599609 a 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 C 52,14.531804 49.468196,12 46.400391,12 Z m 10,10 C 24.531804,22 22,24.531804 22,27.599609 V 56.400391 C 22,59.468196 24.531804,62 27.599609,62 H 56.400391 C 59.468196,62 62,59.468196 62,56.400391 V 27.599609 C 62,24.531804 59.468196,22 56.400391,22 Z M 31,37 H 53 L 42,51 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer13"
+       inkscape:label="selection"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer14"
+         inkscape:label="selection_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect886-0-89"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <path
+           id="rect2425"
+           style="fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 34,27 H 53.999999 L 44,39 Z"
+           sodipodi:nodetypes="cccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3960"
+         inkscape:label="selection_src_2"
+         style="display:none">
+        <rect
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3956"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <path
+           id="path3958"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 34,27 H 53.999999 L 44,39 Z"
+           sodipodi:nodetypes="cccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3993"
+         inkscape:label="selection_src_3"
+         style="display:inline">
+        <rect
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3814-7"
+           width="40"
+           height="40"
+           x="12"
+           y="12"
+           rx="4"
+           ry="4" />
+        <path
+           id="path3991"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.99999;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 21,28 H 43 L 32,42.000001 Z"
+           sodipodi:nodetypes="cccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g4019"
+         inkscape:label="selection_final_3"
+         style="display:none">
+        <path
+           id="path4023"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="m 16,10 c -3.289406,0 -6,2.710594 -6,6 v 32 c 0,3.289406 2.710594,6 6,6 h 32 c 3.289406,0 6,-2.710594 6,-6 V 16 c 0,-3.289406 -2.710594,-6 -6,-6 z m 5,18 H 43 L 32,42 Z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3966"
+         inkscape:label="selection_final_2"
+         style="display:none">
+        <path
+           id="path3970"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="M 8,16 C 4.6280237,16 2,18.925397 2,22.308594 V 41.691406 C 2,45.074603 4.6280237,48 8,48 h 48 c 3.371976,0 6,-2.925397 6,-6.308594 V 22.308594 C 62,18.925397 59.371976,16 56,16 Z M 34,27 H 54 L 44,39 Z" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g2444"
+         inkscape:label="selection_final"
+         style="display:none">
+        <path
+           id="rect886-0-89-7"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 8,16 C 4.6280237,16 2,18.925397 2,22.308594 V 41.691406 C 2,45.074603 4.6280237,48 8,48 h 48 c 3.371976,0 6,-2.925397 6,-6.308594 V 22.308594 C 62,18.925397 59.371976,16 56,16 Z m 0,4 h 48 c 1.060026,0 2,0.918865 2,2.308594 V 41.691406 C 58,43.081135 57.060026,44 56,44 H 8 C 6.9399742,44 6,43.081135 6,41.691406 V 22.308594 C 6,20.918865 6.9399742,20 8,20 Z m 26,7 10,12 10,-12 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer15"
+       inkscape:label="choix_grille"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer16"
+         inkscape:label="choix_grille_src"
+         style="display:none">
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="path2541"
+           cx="11"
+           cy="11"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2543"
+           cx="53"
+           cy="11"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2545"
+           cx="32"
+           cy="11"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2547"
+           cx="11"
+           cy="32"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2549"
+           cx="53"
+           cy="32"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2551"
+           cx="32"
+           cy="32"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2553"
+           cx="11"
+           cy="53"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2555"
+           cx="53"
+           cy="53"
+           r="7" />
+        <circle
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle2557"
+           cx="32"
+           cy="53"
+           r="7" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g2648"
+         inkscape:label="choix_grille_final"
+         style="display:inline">
+        <path
+           id="path2541-6"
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 10.90625,4 A 7,7 0 0 0 4,11 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 25,11 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 46,11 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m -42,21 A 7,7 0 0 0 4,32 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 25,32 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 46,32 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m -42,21 A 7,7 0 0 0 4,53 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 25,53 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z m 21,0 A 7,7 0 0 0 46,53 a 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 7,7 0 0 0 -0.09375,0 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer41"
+       inkscape:label="destinataire">
+      <g
+         inkscape:groupmode="layer"
+         id="layer42"
+         inkscape:label="destinataire_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1064-1"
+           width="48"
+           height="34.133335"
+           x="3.9999988"
+           y="13.999999"
+           rx="3.4285724"
+           ry="3.4133344" />
+        <path
+           style="display:inline;fill:none;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:2.99999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 5.2857101,15.279996 28.000002,34.52726 50.714295,15.279996"
+           id="path1473-2" />
+        <path
+           style="display:inline;fill:none;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:2.99999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 11.285707,40.015061 27.999999,24.283237 44.714291,40.015061"
+           id="path1576-7" />
+        <circle
+           style="fill:#000000;fill-opacity:0.658824;stroke:#ffffff;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
+           id="path1339"
+           cx="50"
+           cy="50"
+           r="14" />
+        <path
+           id="path4-0"
+           d="m 49.999999,42 c -2.468571,0 -4.491294,1.980695 -4.491294,4.357837 0,2.377143 2.022723,4.325595 4.491294,4.325595 2.468571,0 4.491294,-1.981339 4.491294,-4.358482 C 54.491293,43.947807 52.46857,42 49.999999,42 Z M 47.737276,52.102728 C 45.680134,52.102728 44,53.720635 44,55.701587 v 1.452827 0.330159 c 1.679999,1.155556 3.771428,1.84876 5.999999,1.84876 2.228571,0 4.320001,-0.693204 6.000001,-1.84876 v -1.750099 h -0.03415 v -0.03289 c 0,-1.980952 -1.680133,-3.598859 -3.737276,-3.598859 z"
+           style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1371"
+         inkscape:label="destinataire_final">
+        <path
+           id="rect1361"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 7.4277344,12 C 4.4596704,12 2,14.444878 2,17.414062 v 27.306641 c 0,2.969185 2.4596704,5.412109 5.4277344,5.412109 H 34.005859 C 34.005489,50.08811 34,50.044789 34,50 c 0,-1.335314 0.183483,-2.625866 0.494141,-3.867188 H 7.4277344 C 6.5969401,46.132812 6,45.533493 6,44.720703 V 17.849609 l 14.021484,11.882813 -9.763672,9.189453 c -0.6038142,0.567794 -0.6326844,1.517686 -0.06445,2.121094 0.567794,0.603815 1.517686,0.632685 2.121094,0.06445 L 22.324219,31.685547 28,36.494141 l 5.675781,-4.808594 6.263672,5.896484 c 0.796119,-0.646459 1.655286,-1.218942 2.566406,-1.705078 L 35.978516,29.732422 50,17.849609 V 34 c 1.382943,0 2.718615,0.19487 4,0.527344 V 17.414062 C 54,14.444878 51.54033,12 48.572266,12 Z m 1.0292968,4 H 47.542969 L 28,32.560547 Z M 50,38 c -6.651106,0 -12,5.348894 -12,12 0,6.651106 5.348894,12 12,12 6.651106,0 12,-5.348894 12,-12 0,-6.651106 -5.348894,-12 -12,-12 z m 0,4 c 2.468571,0 4.492188,1.947076 4.492188,4.324219 -10e-7,2.377143 -2.023617,4.359375 -4.492188,4.359375 -2.468571,0 -4.492188,-1.949029 -4.492188,-4.326172 C 45.507813,43.98028 47.531429,42 50,42 Z m -2.263672,10.103516 h 4.492188 c 2.057143,0 3.738281,1.616704 3.738281,3.597656 v 0.0332 H 56 v 1.75 c -1.68,1.155556 -3.771429,1.849609 -6,1.849609 -2.228571,0 -4.320001,-0.694053 -6,-1.849609 v -0.330078 -1.453125 c 0,-1.980952 1.679186,-3.597656 3.736328,-3.597656 z" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="champ libre"
+     style="display:none">
+    <g
+       inkscape:groupmode="layer"
+       id="layer7"
+       inkscape:label="input"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer8"
+         inkscape:label="input_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect886-0"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <path
+           style="fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 11.5,23.5 h 8"
+           id="path1481"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 11.5,40.5 h 8"
+           id="path1483"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 15.5,37.500116 V 26.5"
+           id="path1485"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer9"
+         inkscape:label="input_final"
+         style="display:inline">
+        <path
+           id="rect886-0-8"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 8,16 C 4.6280237,16 2,18.925397 2,22.308594 V 41.691406 C 2,45.074603 4.6280237,48 8,48 h 48 c 3.371976,0 6,-2.925397 6,-6.308594 V 22.308594 C 62,18.925397 59.371976,16 56,16 Z m 0,4 h 48 c 1.060026,0 2,0.918865 2,2.308594 V 41.691406 C 58,43.081135 57.060026,44 56,44 H 8 C 6.9399742,44 6,43.081135 6,41.691406 V 22.308594 C 6,20.918865 6.9399742,20 8,20 Z m 3.5,2 A 1.5,1.5 0 0 0 10,23.5 1.5,1.5 0 0 0 11.5,25 H 14 v 1.5 11 1.5 H 11.5 A 1.5,1.5 0 0 0 10,40.5 1.5,1.5 0 0 0 11.5,42 h 8 A 1.5,1.5 0 0 0 21,40.5 1.5,1.5 0 0 0 19.5,39 H 17 V 37.5 26.5 25 h 2.5 A 1.5,1.5 0 0 0 21,23.5 1.5,1.5 0 0 0 19.5,22 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g3127"
+       inkscape:label="number"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g3121"
+         inkscape:label="number_src"
+         style="display:inline">
+        <path
+           id="rect2425-9"
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="m 42,34 h 12 l -6,7.2 z"
+           sodipodi:nodetypes="cccc" />
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3113"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <path
+           style="fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 36.5,43.000116 V 21"
+           id="path3119"
+           sodipodi:nodetypes="cc" />
+        <path
+           id="path3149"
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 42,30 H 53.666667 L 47.833333,23 Z"
+           sodipodi:nodetypes="cccc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3125"
+         inkscape:label="number_final"
+         style="display:none">
+        <path
+           id="rect2425-9-3"
+           style="display:inline;fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           d="M 8,16 C 4.6280237,16 2,18.925397 2,22.308594 V 41.691406 C 2,45.074603 4.6280237,48 8,48 h 48 c 3.371976,0 6,-2.925397 6,-6.308594 V 22.308594 C 62,18.925397 59.371976,16 56,16 Z m 0,4 h 27 v 1 22 1 H 8 C 6.9399742,44 6,43.081135 6,41.691406 V 22.308594 C 6,20.918865 6.9399742,20 8,20 Z m 30,0 h 18 c 1.060026,0 2,0.918865 2,2.308594 V 41.691406 C 58,43.081135 57.060026,44 56,44 H 38 V 43 21 Z M 47.833984,23 42,30 H 53.666016 Z M 42,34 48,41.199219 54,34 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g3621"
+       inkscape:label="password"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g3615"
+         inkscape:label="password_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3609"
+           width="55.999996"
+           height="28"
+           x="3.9999988"
+           y="17.999998"
+           rx="4.0000019"
+           ry="4.3076944" />
+        <path
+           style="fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 34.5,43.000116 V 21"
+           id="path3611"
+           sodipodi:nodetypes="cc" />
+        <rect
+           style="fill:#000000;fill-opacity:0.658824;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect3632"
+           width="14"
+           height="11"
+           x="40"
+           y="29"
+           rx="2"
+           ry="2.2" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 44,30 v -2 c 0,0 0,-3 3,-3 3,0 3,3 3,3 v 2"
+           id="path3634"
+           sodipodi:nodetypes="ccscc" />
+        <circle
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="path3636"
+           cx="47"
+           cy="34.5"
+           r="2" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3619"
+         inkscape:label="password_final"
+         style="display:inline">
+        <path
+           id="rect3609-6"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 8,16 C 4.6280237,16 2,18.925397 2,22.308594 V 41.691406 C 2,45.074603 4.6280237,48 8,48 h 48 c 3.371976,0 6,-2.925397 6,-6.308594 V 22.308594 C 62,18.925397 59.371976,16 56,16 Z m 0,4 h 25 v 1 22 1 H 8 C 6.9399742,44 6,43.081135 6,41.691406 V 22.308594 C 6,20.918865 6.9399742,20 8,20 Z m 28,0 h 20 c 1.060026,0 2,0.918865 2,2.308594 V 41.691406 C 58,43.081135 57.060026,44 56,44 H 36 V 43 21 Z m 11,4 c -1.833333,0 -3.025274,1.06422 -3.519531,2.052734 C 42.986212,27.041248 43,28 43,28 v 1 h -1 c -1.108,0 -2,0.980419 -2,2.199219 v 6.601562 C 40,39.019581 40.892,40 42,40 h 10 c 1.108,0 2,-0.980419 2,-2.199219 V 31.199219 C 54,29.980419 53.108,29 52,29 h -1 v -1 c 0,0 0.01379,-0.958752 -0.480469,-1.947266 C 50.025274,25.06422 48.833333,24 47,24 Z m 0,2 c 1.166667,0 1.474726,0.43578 1.730469,0.947266 C 48.986212,27.458752 49,28 49,28 v 1 h -4 v -1 c 0,0 0.01379,-0.541248 0.269531,-1.052734 C 45.525274,26.43578 45.833333,26 47,26 Z m -0.04883,6.5 a 2,2 0 0 1 0.04883,0 2,2 0 0 1 2,2 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 1.951172,-2 z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g3720"
+       inkscape:label="colors"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="g3714"
+         inkscape:label="colors_src"
+         style="display:none">
+        <circle
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle3712"
+           cx="47"
+           cy="34.5"
+           r="2" />
+        <path
+           id="path3736"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:fill markers stroke"
+           d="M 37.302876,15.383415 48.616585,26.697124 25.989168,49.324541 c -2.828427,2.828427 -7.071068,4.24264 -11.313709,0 -4.24264,-4.242641 -2.828427,-8.485282 0,-11.313709 z"
+           sodipodi:nodetypes="cccscc" />
+        <path
+           id="path3734"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:fill markers stroke"
+           d="M 52,36 V 52 H 20 c -4,0 -8,-2 -8,-8 0,-6 4,-8 8,-8 z"
+           sodipodi:nodetypes="cccscc" />
+        <path
+           id="rect3731"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:fill markers stroke"
+           d="m 12,12 h 16 v 32 c 0,4 -2,8 -8,8 -6,0 -8,-4 -8,-8 z"
+           sodipodi:nodetypes="cccscc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g3718"
+         inkscape:label="colors_final"
+         style="display:inline">
+        <circle
+           style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824;paint-order:markers stroke fill"
+           id="circle3712-6"
+           cx="47"
+           cy="34.5"
+           r="2" />
+        <path
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="M 37.302876,15.383415 48.616585,26.697124 25.989168,49.324541 c -2.828427,2.828427 -7.071068,4.24264 -11.313709,0 -4.24264,-4.242641 -2.828427,-8.485282 0,-11.313709 z"
+           id="path3772" />
+        <path
+           id="path3774"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.658824;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+           d="m 12,10 a 2.0002,2.0002 0 0 0 -2,2 v 32 c 0,0.366857 0.02061,0.737912 0.05078,1.109375 0.009,0.109253 0.01964,0.216709 0.03125,0.324219 0.0304,0.284974 0.07224,0.56933 0.123047,0.853515 0.0126,0.06987 0.0214,0.141914 0.03516,0.210938 0.13585,0.686666 0.335861,1.363659 0.611328,2.019531 0.02921,0.06968 0.06316,0.134709 0.09375,0.203125 0.101406,0.226405 0.209439,0.450294 0.330079,0.669922 0.06093,0.111294 0.126612,0.216909 0.191406,0.324219 0.09881,0.163203 0.201855,0.32417 0.3125,0.482422 0.08426,0.12067 0.172332,0.236804 0.261719,0.351562 0.05942,0.07643 0.109377,0.157425 0.171875,0.232422 0.04955,0.05946 0.108687,0.111792 0.160156,0.169922 0.106385,0.120001 0.21584,0.235313 0.328125,0.347656 0.112343,0.112285 0.227655,0.22174 0.347656,0.328125 0.05813,0.05147 0.110463,0.110608 0.169922,0.160156 0.075,0.0625 0.15599,0.112453 0.232422,0.171875 0.114758,0.08939 0.230892,0.177463 0.351562,0.261719 0.158252,0.110645 0.319219,0.213686 0.482422,0.3125 0.10731,0.06479 0.212925,0.13048 0.324219,0.191406 0.219628,0.12064 0.443517,0.228673 0.669922,0.330079 0.06842,0.03059 0.133443,0.06454 0.203125,0.09375 0.655872,0.275467 1.332865,0.475478 2.019531,0.611328 0.06902,0.01375 0.141068,0.02256 0.210938,0.03516 0.284185,0.0508 0.568541,0.09264 0.853515,0.123047 0.10751,0.01161 0.214966,0.02227 0.324219,0.03125 C 19.262088,53.979394 19.633143,54 20,54 h 32 a 2.0002,2.0002 0 0 0 2,-2 V 36 a 2.0002,2.0002 0 0 0 -2,-2 h -7.857422 l 5.888672,-5.888672 a 2.0002,2.0002 0 0 0 0,-2.828125 L 38.716797,13.96875 A 2.0002,2.0002 0 0 0 37.328125,13.382812 2.0002,2.0002 0 0 0 35.888672,13.96875 L 30,19.857422 V 12 a 2.0002,2.0002 0 0 0 -2,-2 z m 2,4 h 12 v 30 c 0,1.666667 -0.428916,3.188918 -1.287109,4.21875 C 23.854697,49.248582 22.555556,50 20,50 17.444444,50 16.145303,49.248582 15.287109,48.21875 14.428916,47.188918 14,45.666667 14,44 Z m 23.302734,4.210938 8.486328,8.486328 L 38.486328,34 H 30 V 25.515625 Z M 30,38 H 50 V 50 H 28.365234 C 29.564815,48.178104 30,46.034522 30,44 Z" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g1078"
+       inkscape:label="email"
+       style="display:inline">
+      <g
+         inkscape:groupmode="layer"
+         id="g1072"
+         inkscape:label="email_src"
+         style="display:inline">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect1064"
+           width="55.999996"
+           height="40"
+           x="3.9999988"
+           y="11.999999"
+           rx="4.000001"
+           ry="4.000001" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 89.465367,40.098573 C 88.98291,40.25413 86.956959,40.5 85.996,40.5 79.685333,40.5 77.5,36.006939 77.5,32 c 0,-4.675326 3.152023,-8.5 8.496,-8.5 5.059058,0 7.552,3.319131 7.552,8.5 0,3.060538 -1.61102,4.20573 -2.902188,4.20573 -1.190996,0 -2.753574,-1.678272 -2.753574,-2.718744 v -4.441041 c -4.163642,-1.11617 -5.178776,0.993738 -5.178776,2.960694 0,2.082769 0.92722,3.412591 2.946765,3.412591 1.074856,0 2.172598,-0.587291 2.172598,-0.587291"
+           id="path1389"
+           sodipodi:nodetypes="cccsssscscc" />
+        <path
+           style="fill:none;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:2.99999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="M 5.4999952,13.499995 32,36.055381 58.500007,13.499995"
+           id="path1473" />
+        <path
+           style="fill:none;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:2.99999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.66"
+           d="m 12.499991,42.486398 19.500006,-18.43573 19.500006,18.43573"
+           id="path1576" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g1076"
+         inkscape:label="email_final"
+         style="display:none">
+        <path
+           id="rect1064-9"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="m 8,10 c -3.2894061,0 -6,2.710594 -6,6 v 32 c 0,3.289406 2.7105939,6 6,6 h 48 c 3.289406,0 6,-2.710594 6,-6 V 16 c 0,-3.289406 -2.710594,-6 -6,-6 z m 0.4023438,4 H 55.597656 L 32,34.085938 Z M 6.0097656,15.904297 23.072266,30.425781 11.46875,41.396484 c -0.602132,0.569442 -0.628371,1.519279 -0.05859,2.121094 0.569442,0.602132 1.519279,0.628371 2.121094,0.05859 L 25.371094,32.382812 32,38.025391 38.628906,32.382812 50.46875,43.576172 c 0.601815,0.569777 1.551652,0.543538 2.121094,-0.05859 0.569777,-0.601815 0.543538,-1.551652 -0.05859,-2.121094 L 40.927734,30.425781 57.990234,15.904297 C 57.991654,15.936841 58,15.966965 58,16 v 32 c 0,1.142595 -0.857405,2 -2,2 H 8 C 6.857405,50 6,49.142595 6,48 V 16 c 0,-0.03303 0.00835,-0.06316 0.00977,-0.0957 z"
+           sodipodi:nodetypes="ssssssssscccccccccccccccccssssssc" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer10"
+       inkscape:label="textarea"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer11"
+         inkscape:label="textarea_src"
+         style="display:none">
+        <rect
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           id="rect886-0-0"
+           width="55.999985"
+           height="55.999989"
+           x="4.0000038"
+           y="4"
+           rx="4"
+           ry="4" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 11.5,11.5 h 8"
+           id="path1481-2"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="m 11.5,28.5 h 8"
+           id="path1483-3"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 15.5,25.500116 V 14.5"
+           id="path1485-7"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="layer12"
+         inkscape:label="textarea_final"
+         style="display:inline">
+        <path
+           id="rect886-0-0-5"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 8,2 C 4.7105945,2 2,4.7105945 2,8 v 48 c 0,3.289406 2.7105945,6 6,6 h 48 c 3.289406,0 6,-2.710594 6,-6 V 8 C 62,4.7105945 59.289406,2 56,2 Z m 0,4 h 48 c 1.142594,0 2,0.8574055 2,2 v 48 c 0,1.142594 -0.857406,2 -2,2 H 8 C 6.8574055,58 6,57.142594 6,56 V 8 C 6,6.8574055 6.8574055,6 8,6 Z m 3.5,4 c -0.828427,0 -1.5,0.671573 -1.5,1.5 0,0.828427 0.671573,1.5 1.5,1.5 H 14 v 1.5 11 1.5 h -2.5 c -0.828427,0 -1.5,0.671573 -1.5,1.5 0,0.828427 0.671573,1.5 1.5,1.5 h 8 C 20.328427,30 21,29.328427 21,28.5 21,27.671573 20.328427,27 19.5,27 H 17 V 25.5 14.5 13 h 2.5 C 20.328427,13 21,12.328427 21,11.5 21,10.671573 20.328427,10 19.5,10 Z"
+           sodipodi:nodetypes="sssssssssssssssssssssccccssssssccccssss" />
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer17"
+       inkscape:label="date"
+       style="display:none">
+      <g
+         inkscape:groupmode="layer"
+         id="layer18"
+         inkscape:label="date_src"
+         style="display:inline">
+        <path
+           id="rect886-0-0-8"
+           style="display:inline;fill:none;fill-opacity:0.66;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+           d="m 47.999991,10 h 7.999998 c 2.216,0 4,1.715385 4,3.846155 v 42.30769 c 0,2.13077 -1.784,3.846155 -4,3.846155 H 8.0000038 c -2.216,0 -4,-1.715385 -4,-3.846155 v -42.30769 c 0,-2.13077 1.784,-3.846155 4,-3.846155 H 12 Z"
+           sodipodi:nodetypes="csssssssscc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:4.00001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 6,20.000001 H 58"
+           id="path1485-7-4"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 45,11 V 5"
+           id="path2810"
+           sodipodi:nodetypes="cc" />
+        <path
+           d="M 44,50 V 28 h -6"
+           id="path2965"
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           sodipodi:nodetypes="ccc" />
+        <path
+           d="m 30,49.999995 c 0,0 -6.24743,-0.1312 -10,5e-6 C 22.726764,45.823524 30,37.526984 30,33.307357 30,29.774311 27.349118,28 25,28 c -2.541273,0 -4.293517,1.417497 -5,3.353463"
+           id="path2967"
+           style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           sodipodi:nodetypes="cccsc" />
+        <path
+           style="display:inline;fill:#000000;fill-opacity:0.658824;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.658824"
+           d="M 19,11 V 5"
+           id="path2607"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         inkscape:groupmode="layer"
+         id="g2865"
+         inkscape:label="date_final"
+         style="display:none">
+        <path
+           id="rect886-0-0-8-6"
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:0.66;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
+           d="M 19,2 C 17.343146,2 16,3.3431458 16,5 V 8 H 12 8 C 4.7518791,8 2,10.598592 2,13.845703 V 56.154297 C 2,59.401408 4.7518791,62 8,62 h 48 c 3.248121,0 6,-2.598592 6,-5.845703 V 13.845703 C 62,10.598592 59.248121,8 56,8 H 48 V 5 C 48,3.3431458 46.656854,2 45,2 43.343146,2 42,3.3431458 42,5 V 8 H 22 V 5 C 22,3.3431458 20.656854,2 19,2 Z M 6,22 H 58 V 56.154297 C 58,57.168726 57.183879,58 56,58 H 8 C 6.8161209,58 6,57.168726 6,56.154297 Z m 19,4 c -3.284993,0 -5.915114,2.0269 -6.878906,4.667969 -0.378656,1.037693 0.155641,2.185865 1.193359,2.564453 1.037693,0.378656 2.185865,-0.155642 2.564453,-1.19336 C 22.32808,30.808199 23.202447,30 25,30 c 1.342039,0 3,0.774009 3,3.306641 0,0.960701 -1.520485,4.184787 -3.623047,7.226562 -2.102562,3.041776 -4.573809,6.110827 -6.050781,8.373047 -0.884924,1.356641 0.125357,3.147544 1.74414,3.091797 C 23.69888,51.871177 29.958984,52 29.958984,52 31.063645,52.022887 31.977578,51.145686 32,50.041016 32.022887,48.936355 31.145686,48.022422 30.041016,48 c 0,0 -3.461868,0.01075 -6.13086,0.002 1.242518,-1.679993 2.368728,-3.185725 3.757813,-5.195312 C 29.883716,39.60112 32,36.565566 32,33.306641 32,28.77318 28.356197,26 25,26 Z m 13,0 c -1.104569,0 -2,0.895431 -2,2 0,1.104569 0.895431,2 2,2 h 4 v 20 c 0,1.104569 0.895431,2 2,2 1.104569,0 2,-0.895431 2,-2 V 28 c -1.1e-4,-1.104524 -0.895476,-1.99989 -2,-2 z"
+           sodipodi:nodetypes="ssccsssssssscsssccssccsssscscccsssccccccsssssscsssccs" />
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer32"
+     inkscape:label="défaut"
+     style="display:none">
+    <g
+       inkscape:groupmode="layer"
+       id="layer33"
+       inkscape:label="défaut_src"
+       style="display:none">
+      <rect
+         style="fill:#000000;fill-opacity:0.66;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+         id="rect958"
+         width="44"
+         height="12"
+         x="10"
+         y="-38"
+         rx="2"
+         ry="1.5"
+         transform="rotate(90)" />
+      <rect
+         style="fill:#000000;fill-opacity:0.66;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+         id="rect979"
+         width="44"
+         height="12"
+         x="-54"
+         y="-38"
+         rx="2"
+         ry="1.5"
+         transform="scale(-1)" />
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="g976"
+       inkscape:label="défaut_final"
+       style="display:inline">
+      <path
+         id="rect958-7"
+         style="display:inline;fill:#000000;fill-opacity:0.66;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.66;paint-order:markers stroke fill"
+         d="M 27.5,10 C 26.669,10 26,10.892 26,12 V 26 H 12 c -1.108,0 -2,0.669 -2,1.5 v 9 c 0,0.831 0.892,1.5 2,1.5 h 14 v 14 c 0,1.108 0.669,2 1.5,2 h 9 C 37.331,54 38,53.108 38,52 V 38 h 14 c 1.108,0 2,-0.669 2,-1.5 v -9 C 54,26.669 53.108,26 52,26 H 38 V 12 c 0,-1.108 -0.669,-2 -1.5,-2 z" />
+    </g>
+  </g>
+  <g
+     inkscape:label="repères"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <rect
+       style="fill:none;stroke:#ff0000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.2;paint-order:markers stroke fill"
+       id="rect835"
+       width="62"
+       height="62"
+       x="1"
+       y="1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#b200ff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 0,16 H 64"
+       id="path979" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#b200ff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 0,48 H 64"
+       id="path981" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 0,10 H 64"
+       id="path983" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 0,54 H 64"
+       id="path985" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 54,0 V 64"
+       id="path987" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"
+       d="M 10,0 V 64"
+       id="path989" />
+  </g>
+</svg>
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3d46bcb0f457cbbff9078efe432409ee2a505b9a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M8 16c-3.372 0-6 2.925-6 6.309V41.69C2 45.075 4.628 48 8 48h48c3.372 0 6-2.925 6-6.309V22.31c0-3.385-2.628-6.31-6-6.31zm0 4h48c1.06 0 2 .919 2 2.309V41.69c0 1.39-.94 2.309-2 2.309H8c-1.06 0-2-.919-2-2.309V22.31C6 20.919 6.94 20 8 20zm3.5 2a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5H14v14h-2.5a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5h8a1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5H17V25h2.5a1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input_colors-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input_colors-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..23ecc8a7b8f88594cc0cc7417f430cad195e6127
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input_colors-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M12 10a2 2 0 0 0-2 2v32a13.742 13.742 0 0 0 .205 2.287c.013.07.021.142.035.211.136.687.336 1.364.612 2.02.029.07.063.134.093.203.102.226.21.45.33.67.061.11.127.217.192.324.099.163.202.324.312.482.085.12.173.237.262.352.06.076.11.157.172.232.05.06.109.112.16.17a7.98 7.98 0 0 0 .676.676c.058.051.11.11.17.16.075.063.156.113.232.172.115.09.231.177.352.262.158.11.319.213.482.312.107.065.213.13.324.192.22.12.444.228.67.33.069.03.134.064.203.093.656.276 1.333.476 2.02.612.069.014.141.022.21.035a12.216 12.216 0 0 0 1.179.154c.371.03.742.051 1.109.051h32a2 2 0 0 0 2-2V36a2 2 0 0 0-2-2h-7.857l5.888-5.889a2 2 0 0 0 0-2.828L38.717 13.97a2 2 0 0 0-1.389-.586 2 2 0 0 0-1.44.586L30 19.857V12a2 2 0 0 0-2-2zm2 4h12v30c0 1.667-.429 3.189-1.287 4.219C23.855 49.249 22.556 50 20 50s-3.855-.751-4.713-1.781C14.43 47.189 14 45.667 14 44zm23.303 4.21 8.486 8.487L38.486 34H30v-8.484zM30 38h20v12H28.365c1.2-1.822 1.635-3.965 1.635-6z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input_date-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input_date-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1cd599d5361c616372f8da29ebed2ec03165c626
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input_date-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M19 2a3 3 0 0 0-3 3v3H8c-3.248 0-6 2.599-6 5.846v42.308C2 59.401 4.752 62 8 62h48c3.248 0 6-2.599 6-5.846V13.846C62 10.599 59.248 8 56 8h-8V5a3 3 0 0 0-6 0v3H22V5a3 3 0 0 0-3-3zM6 22h52v34.154C58 57.17 57.184 58 56 58H8c-1.184 0-2-.831-2-1.846zm19 4c-3.285 0-5.915 2.027-6.879 4.668a2 2 0 1 0 3.758 1.371C22.329 30.81 23.202 30 25 30c1.342 0 3 .774 3 3.307 0 .96-1.52 4.184-3.623 7.226s-4.574 6.111-6.05 8.373c-.886 1.357.125 3.148 1.743 3.092 3.63-.127 9.89.002 9.89.002a2 2 0 1 0 .082-4s-3.462.01-6.13.002c1.242-1.68 2.368-3.186 3.757-5.195C29.884 39.6 32 36.566 32 33.307 32 28.773 28.356 26 25 26zm13 0a2 2 0 0 0 0 4h4v20a2 2 0 0 0 4 0V28a2 2 0 0 0-2-2z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input_email-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input_email-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..febc3be345a59b5a19c5229781bb02642e1ec52a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input_email-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M8 10c-3.29 0-6 2.71-6 6v32c0 3.29 2.71 6 6 6h48c3.29 0 6-2.71 6-6V16c0-3.29-2.71-6-6-6zm.402 4h47.196L32 34.086zM6.01 15.904l17.062 14.522-11.603 10.97a1.5 1.5 0 1 0 2.062 2.18l11.84-11.193L32 38.025l6.629-5.642 11.84 11.193a1.5 1.5 0 1 0 2.062-2.18l-11.603-10.97L57.99 15.904c.002.033.01.063.01.096v32c0 1.143-.857 2-2 2H8c-1.143 0-2-.857-2-2V16c0-.033.008-.063.01-.096z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input_number-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input_number-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f7a67612f9fa27fc1cfce0e9d04607e19e9b0818
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input_number-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M8 16c-3.372 0-6 2.925-6 6.309V41.69C2 45.075 4.628 48 8 48h48c3.372 0 6-2.925 6-6.309V22.31c0-3.385-2.628-6.31-6-6.31zm0 4h27v24H8c-1.06 0-2-.919-2-2.309V22.31C6 20.919 6.94 20 8 20zm30 0h18c1.06 0 2 .919 2 2.309V41.69c0 1.39-.94 2.309-2 2.309H38V21zm9.834 3L42 30h11.666zM42 34l6 7.2 6-7.2z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_input_password-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_input_password-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f12e1512546d745320e2748e942c8e645e0c5981
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_input_password-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M8 16c-3.372 0-6 2.925-6 6.309V41.69C2 45.075 4.628 48 8 48h48c3.372 0 6-2.925 6-6.309V22.31c0-3.385-2.628-6.31-6-6.31zm0 4h25v24H8c-1.06 0-2-.919-2-2.309V22.31C6 20.919 6.94 20 8 20zm28 0h20c1.06 0 2 .919 2 2.309V41.69c0 1.39-.94 2.309-2 2.309H36V21zm11 4c-1.833 0-3.025 1.064-3.52 2.053C42.986 27.04 43 28 43 28v1h-1c-1.108 0-2 .98-2 2.2v6.6c0 1.22.892 2.2 2 2.2h10c1.108 0 2-.98 2-2.2v-6.6c0-1.22-.892-2.2-2-2.2h-1v-1s.014-.959-.48-1.947C50.025 25.064 48.833 24 47 24zm0 2c1.167 0 1.475.436 1.73.947C48.986 27.46 49 28 49 28v1h-4v-1s.014-.541.27-1.053c.255-.511.563-.947 1.73-.947zm-.049 6.5a2 2 0 0 1 .049 0 2 2 0 0 1 2 2 2 2 0 0 1-2 2 2 2 0 0 1-2-2 2 2 0 0 1 1.951-2z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_mots-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_mots-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..43f704ac14c75ec9696c0b885a41ce45ea5de6c2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_mots-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M53.294 41.447 35.36 10.36l-.171-.256c-.854-1.452-2.392-2.477-4.1-2.733L18.535 5.748c-1.366-.17-2.733.598-3.245 1.879l-4.868 11.7a5.426 5.426 0 0 0 .341 4.868l18.106 31.43c1.452 2.476 4.697 3.415 7.174 1.963l2.306-1.366 12.981-7.516c2.562-1.537 3.416-4.697 1.964-7.259zm-33.136-23.06c-.94-1.622-.342-3.757 1.28-4.696 1.623-.94 3.759-.342 4.698 1.28.94 1.623.342 3.758-1.281 4.698-1.623.94-3.758.342-4.697-1.281z" /></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_radio-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_radio-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b138edc5c402cba4ac07b5932fdafdd8eca390df
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_radio-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M32 10c-12.127 0-22 9.873-22 22s9.873 22 22 22 22-9.873 22-22-9.873-22-22-22zm0 4c9.965 0 18 8.035 18 18s-8.035 18-18 18-18-8.035-18-18 8.035-18 18-18zm0 6a12 12 0 0 0-12 12 12 12 0 0 0 12 12 12 12 0 0 0 12-12 12 12 0 0 0-12-12z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a4c1507167f0233a2054ab31cb3f66ba2bb76cbe
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><g style="display:inline;stroke-width:1.09091"><path d="M8 8.875A2.37 2.37 0 0 1 10.375 6.5h43.25A2.37 2.37 0 0 1 56 8.875v38.417a2.37 2.37 0 0 1-2.375 2.374H35.816l-9.413-9.329L8 40.422" fill="#a37800" style="stroke-width:1.09091" transform="translate(2.667 6.218) scale(.91667)"/><path d="M14.106 12.521c0-1.017.763-1.78 1.78-1.78h32.227c1.018 0 1.781.763 1.781 1.78v28.665c0 1.017-.763 1.78-1.78 1.78h-13.23l-7.04-7.038-13.738.084" fill="#fff" style="stroke-width:1.09091" transform="translate(2.667 6.218) scale(.91667)"/><path d="M56 47.376a2.37 2.37 0 0 1-2.375 2.375h-43.25A2.37 2.37 0 0 1 8 47.376V8.875A2.37 2.37 0 0 1 10.375 6.5h17.809l9.413 9.413L56 15.83" fill="#ebba16" style="stroke-width:1.09091" transform="translate(2.667 6.218) scale(.91667)"/></g></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques_articles-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques_articles-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..84958389f2fc30ef183a7a991f32d9f78d12c337
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_rubriques_articles-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M23.785 2C21 2 19 4.587 19 7.441V14.5a1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5V7.441C22 5.93 22.931 5 23.785 5h33.43C58.069 5 59 5.929 59 7.441v41.92c0 1.513-.765 2.139-1.785 2.139H53.5A1.5 1.5 0 0 0 52 53a1.5 1.5 0 0 0 1.5 1.5h3.715c2.619 0 4.785-2.284 4.785-5.139V7.441C62 4.587 60 2 57.215 2zm8.715 9a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5h16a1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5zM6.016 18c-1.025 0-2.075.362-2.84 1.107C2.41 19.852 2 20.938 2 22.016v36.002c0 1.015.359 2.07 1.11 2.832C3.86 61.612 4.94 62 6 62h40c1.015 0 2.066-.354 2.832-1.1C49.598 60.155 50 59.07 50 58V28a2 2 0 0 0-2.01-2l-16.074.074-8.047-7.535A2 2 0 0 0 22.502 18zM32.5 19a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5h16a1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5zM6 22h15.711l8.053 7.537a2 2 0 0 0 1.377.541L46 30.01V58H6V22z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_select-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_select-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..701df82175cb7934284b8032a052918ece827db3
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_select-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M16 10c-3.29 0-6 2.71-6 6v32c0 3.29 2.71 6 6 6h32c3.29 0 6-2.71 6-6V16c0-3.29-2.71-6-6-6zm5 18h22L32 42z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_select_multiple-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_select_multiple-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5b101fc3e09acdff19858c53c70e111564b2966e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_select_multiple-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M7.6 2C4.532 2 2 4.532 2 7.6v28.8C2 39.468 4.532 42 7.6 42a2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.921 0-1.6-.679-1.6-1.6V7.6C6 6.679 6.679 6 7.6 6h28.8c.921 0 1.6.679 1.6 1.6a2 2 0 0 0 2 2 2 2 0 0 0 2-2C42 4.532 39.468 2 36.4 2zm10 10c-3.068 0-5.6 2.532-5.6 5.6v28.8c0 3.068 2.532 5.6 5.6 5.6a2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.921 0-1.6-.679-1.6-1.6V17.6c0-.921.679-1.6 1.6-1.6h28.8c.921 0 1.6.679 1.6 1.6a2 2 0 0 0 2 2 2 2 0 0 0 2-2c0-3.068-2.532-5.6-5.6-5.6zm10 10c-3.068 0-5.6 2.532-5.6 5.6v28.8c0 3.068 2.532 5.6 5.6 5.6h28.8c3.068 0 5.6-2.532 5.6-5.6V27.6c0-3.068-2.532-5.6-5.6-5.6zM31 37h22L42 51z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_textarea-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_textarea-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7a024429169c0eb81383d5d6913a5f0176cdf7c8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_textarea-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M8 2C4.71 2 2 4.71 2 8v48c0 3.29 2.71 6 6 6h48c3.29 0 6-2.71 6-6V8c0-3.29-2.71-6-6-6zm0 4h48c1.143 0 2 .857 2 2v48c0 1.143-.857 2-2 2H8c-1.143 0-2-.857-2-2V8c0-1.143.857-2 2-2zm3.5 4a1.5 1.5 0 0 0 0 3H14v14h-2.5a1.5 1.5 0 0 0 0 3h8a1.5 1.5 0 0 0 0-3H17V13h2.5a1.5 1.5 0 0 0 0-3z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/images/saisies_toggle-xx.svg b/design_system_dependences/saisies/v5.2.0/images/saisies_toggle-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..06c772a9676245e27afe0675b3ecbbd18317fb66
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/images/saisies_toggle-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path fill="#000000a8" d="M18 16C9.17 16 2 23.17 2 32s7.17 16 16 16h28c8.83 0 16-7.17 16-16s-7.17-16-16-16zm28 4a12 12 0 0 1 12 12 12 12 0 0 1-12 12 12 12 0 0 1-12-12 12 12 0 0 1 12-12zm6.943 6a2 2 0 0 0-1.242.48l-8.066 6.895-3.344-2.824a2 2 0 0 0-2.818.236 2 2 0 0 0 .236 2.818l4.643 3.922a2 2 0 0 0 2.59-.007l9.357-8a2 2 0 0 0 .22-2.819A2 2 0 0 0 52.944 26z"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies.php b/design_system_dependences/saisies/v5.2.0/inc/saisies.php
new file mode 100644
index 0000000000000000000000000000000000000000..5703cd40729d42f94fef9944525b2057c7933570
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * Gestion des saisies
+ *
+ * @package SPIP\Saisies\Saisies
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+// Différentes méthodes pour trouver les saisies
+include_spip('inc/saisies_lister');
+
+// Différentes méthodes pour trouver les saisies avec un .yaml
+include_spip('inc/saisies_lister_disponibles');
+
+// Différentes méthodes pour manipuler une liste de saisies
+include_spip('inc/saisies_manipuler');
+
+// Les outils pour identifier les saisies de manière stables
+include_spip('inc/saisies_identifiants');
+
+// Les outils pour vérifier les saisies
+include_spip('inc/saisies_verifier');
+
+// Les outils pour trouver la valeur d'un champ posté depuis une saisies
+include_spip('inc/saisies_request');
+
+// Les outils pour afficher les saisies et leur vue
+include_spip('inc/saisies_afficher');
+
+// Les outils pour manipuler les options data
+include_spip('inc/saisies_data');
+
+// Les outils pour l'affichage conditionnelle des saisies
+include_spip('inc/saisies_afficher_si_php');
+
+// Les outils pour l'aide
+include_spip('inc/saisies_aide');
+
+// Les outils pour faciliter la construction de formulaires CVT sous formes de listes de saisies
+include_spip('inc/saisies_formulaire');
+
+// Les outils pour faciliter les conversion de name
+include_spip('inc/saisies_name');
+
+// Les outils pour obtenir des infos sur une saisie précise
+include_spip('inc/saisies_info');
+
+if (!function_exists('_T_ou_typo')) {
+	/**
+	 * une fonction qui regarde si $texte est une chaine de langue
+	 * de la forme <:qqch:>
+	 * si oui applique _T()
+	 * si non applique typo() suivant le mode choisi
+	 *
+	 * @param mixed $valeur
+	 *     Une valeur à tester. Si c'est un tableau, la fonction s'appliquera récursivement dessus.
+	 * @param string $mode_typo
+	 *     Le mode d'application de la fonction typo(), avec trois valeurs possibles "toujours", "jamais" ou "multi".
+	 * @return mixed
+	 *     Retourne la valeur éventuellement modifiée.
+	 */
+	function _T_ou_typo($valeur, $mode_typo = 'toujours', $connect = null, $env = []) {
+		if (!in_array($mode_typo, ['toujours', 'multi', 'jamais'])) {
+			$mode_typo = 'toujours';
+		}
+
+		// Si la valeur est bien une chaine (et pas non plus un entier déguisé)
+		if (is_string($valeur) && !is_numeric($valeur)) {
+			$presence_idiome = strpos($valeur, '<:');
+			// Si la chaine est du type <:truc:> on passe à _T()
+			if (
+				$presence_idiome === 0
+				&& preg_match('/^\<:([^>]*?):\>$/', $valeur, $match)
+			) {
+				$valeur = _T($match[1]);
+			} else {
+				// Sinon on la passe a typo() si c'est pertinent
+				if ($presence_idiome !== false) {
+					if (class_exists(Spip\Texte\Collecteur\Idiomes::class)) {//SPIP 4.2 et >
+						$idiomes = new Spip\Texte\Collecteur\Idiomes();
+						$presence_idiome = $idiomes->collecter($valeur, ['detecter_presence' => true]);
+					} else {// SPIP 4.1 et <
+						include_spip('inc/texte');
+						$presence_idiome = preg_match(_EXTRAIRE_IDIOME, $valeur);
+					}
+				}
+
+				if (
+					$mode_typo === 'toujours'
+					|| ($mode_typo === 'multi' && ($presence_idiome || strpos($valeur, '<multi>') !== false))
+				) {
+					include_spip('inc/texte');
+					// définir le connect pour éviter de déclencher les sécurités dans typo
+					// mais si on est en GLOBALS['filtrer_javascript'] == -1 alors le résultat passera dans safehtml
+					$env['espace_prive'] = false;
+					$valeur = typo($valeur, true, $connect ?? '', $env);
+					// et sécuriser quand même le tout
+					$valeur = interdire_scripts($valeur);
+				}
+			}
+		}
+		// Si c'est un tableau, on réapplique la fonction récursivement
+		elseif (is_array($valeur)) {
+			foreach ($valeur as $cle => $valeur2) {
+				$valeur[$cle] = _T_ou_typo($valeur2, $mode_typo, $connect, $env);
+			}
+		}
+
+		return $valeur;
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher.php
new file mode 100644
index 0000000000000000000000000000000000000000..83e5b74cba39429e7d696832e353647d290bac52
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher.php
@@ -0,0 +1,350 @@
+<?php
+
+/**
+ * Gestion de l'affichage des saisies.
+ *
+ * @return SPIP\Saisies\Afficher
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Indique si une saisie peut être affichée.
+ *
+ * On s'appuie sur l'éventuelle clé "editable" du $champ.
+ * Si editable vaut :
+ *    - absent : le champ est éditable
+ *    - 1, le champ est éditable
+ *    - 0, le champ n'est pas éditable
+ *    - -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)
+ *         ou dans un de ses enfants (fieldsets)
+ *
+ * @param array $champ
+ *                                 Tableau de description de la saisie
+ * @param array $env
+ *                                 Environnement transmis à la saisie, certainement l'environnement du formulaire
+ * @param bool  $utiliser_editable
+ *                                 - false pour juste tester le cas -1
+ *
+ * @return bool
+ *              Retourne un booléen indiquant l'état éditable ou pas :
+ *              - true si la saisie est éditable (peut être affichée)
+ *              - false sinon
+ */
+function saisie_editable($champ, $env, $utiliser_editable = true) {
+	if ($utiliser_editable) {
+		// si le champ n'est pas éditable, on sort.
+		if (!isset($champ['editable'])) {
+			return true;
+		}
+		$editable = $champ['editable'];
+
+		if ($editable > 0) {
+			return true;
+		}
+		if ($editable == 0) {
+			return false;
+		}
+	}
+
+	// cas -1
+	// name de la saisie
+	if (isset($champ['options']['nom'])) {
+		// si on a le name dans l'environnement, on le teste
+		$nom = $champ['options']['nom'];
+		if (isset($env[$nom])) {
+			return $env[$nom] ? true : false;
+		}
+	}
+	// sinon, si on a des sous saisies
+	if (is_array($champ['saisies'] ?? '')) {
+		foreach ($champ['saisies'] as $saisie) {
+			if (saisie_editable($saisie, $env, false)) {
+				return true;
+			}
+		}
+	}
+
+	// aucun des paramètres demandés n'avait de contenu
+	return false;
+}
+
+/**
+ * Génère une saisie à partir d'un tableau la décrivant et de l'environnement.
+ *
+ * @param array $champ
+ *                     Description de la saisie.
+ *                     Le tableau doit être de la forme suivante :
+ *                     array(
+ *                     'saisie' => 'input',
+ *                     'options' => array(
+ *                     'nom' => 'le_name',
+ *                     'label' => 'Un titre plus joli',
+ *                     'obligatoire' => 'oui',
+ *                     'explication' => 'Remplissez ce champ en utilisant votre clavier.'
+ *                     )
+ *                     )
+ * @param array $env
+ *                     Environnement du formulaire
+ *                     Permet de savoir les valeurs actuelles des contenus des saisies,
+ *                     les erreurs eventuelles présentes...
+ *
+ * @return string
+ *                Code HTML des saisies de formulaire
+ */
+function saisies_generer_html($champ, $env = []) {
+	// Si le parametre n'est pas bon, on genere du vide
+	if (!is_array($champ)) {
+		return '';
+	}
+
+	// Si la saisie n'est pas editable, on sort aussi.
+	if (!saisie_editable($champ, $env)) {
+		return '';
+	}
+
+	$contexte = [];
+
+	// On sélectionne le type de saisie
+	$contexte['type_saisie'] = $champ['saisie'];
+	// Identifiant unique de saisie, si present
+	if (isset($champ['identifiant'])) {
+		$contexte['id_saisie'] = $champ['identifiant'];
+	}
+
+	// S'il y a le détail des saisies du même formulaire, on le passe en contexte. Utiliser pour générer correctement les afficher_si
+	// Attention, en cas de multi-étapes, on passe le contexte de toutes les saisies, classées par etape en cherchant par priorité dans `saisies_par_etapes`, puis `_saisies_par_etapes`, puis `saisies` qu'on regroupe en étapes.
+	if (isset($env['_etape']) && isset($env['saisies_par_etapes'])) {
+		$contexte['_saisies'] = $env['saisies_par_etapes'];
+	} elseif (isset($env['_etape']) && isset($env['_saisies_par_etapes'])) {
+		$contexte['_saisies'] = $env['_saisies_par_etapes'];
+	} else {
+		$contexte['_saisies'] = isset($env['saisies']) ? $env['saisies'] : [];
+	}
+
+	// Peut-être des transformations à faire sur les options textuelles
+	$options = isset($champ['options']) ? $champ['options'] : [];
+	foreach ($options as $option => $valeur) {
+		if (substr($option, 0, 4) === 'data' && !is_array($valeur)) {//data, ou datas, ou data_rows, ou data_cols
+			// exploser une chaine datas en tableau
+			$options[$option] = _T_ou_typo(saisies_chaine2tableau($valeur), 'multi');
+		} else {
+			$options[$option] = _T_ou_typo($valeur, 'multi');
+		}
+	}
+	// compatibilité li_class > conteneur_class
+	if (!empty($options['li_class'])) {
+		if (isset($options['conteneur_class'])) {
+			$options['conteneur_class'] .= ' ' . $options['li_class'];
+		} else {
+			$options['conteneur_class'] = $options['li_class'];
+		}
+	}
+	// Ne pas passer les sous saisies qui auraient été mise dans $options directement dans le le contexte, cf https://git.spip.net/spip-contrib-extensions/saisies/issues/127
+	unset($options['saisies']);
+
+	// On ajoute les options propres à la saisie
+	$contexte = array_merge($contexte, $options);
+
+	// On ajoute aussi les infos de vérification, si cela peut se faire directement en HTML5
+	if (isset($champ['verifier'])) {
+		$contexte = array_merge($contexte, ['verifier' => $champ['verifier']]);
+	}
+
+	// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
+	if (isset($contexte['env']) || is_array($champ['saisies'] ?? '')) {
+		unset($contexte['env']);
+
+		// on sauve l'ancien environnement
+		// car les sous-saisies ne doivent pas être affectees
+		// par les modification sur l'environnement servant à generer la saisie mère
+		$contexte['_env'] = $env;
+
+		// À partir du moment où on passe tout l'environnement,
+		// il faut enlever certains éléments qui ne doivent absolument provenir que des options
+		unset($env['inserer_debut']);
+		unset($env['inserer_fin']);
+		unset($env['id']);
+		$saisies_disponibles = saisies_lister_disponibles();
+		if (isset($saisies_disponibles[$contexte['type_saisie']]) && is_array($saisies_disponibles[$contexte['type_saisie']]['options'] ?? '')) {
+			$options_a_supprimer = array_merge(
+				saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']),
+				saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options_dev'] ?? [])
+			);
+			foreach ($options_a_supprimer as $option_a_supprimer) {
+				unset($env[$option_a_supprimer]);
+			}
+		}
+		$contexte = array_merge($env, $contexte);
+	} else {
+		// Sinon on ne sélectionne que quelques éléments importants
+		// On récupère la liste des erreurs
+		$contexte['erreurs'] = isset($env['erreurs']) ? $env['erreurs'] : [];
+		// On récupère la langue de l'objet si existante
+		if (isset($env['langue'])) {
+			$contexte['langue'] = $env['langue'];
+		}
+		// On ajoute toujours le bon self
+		$contexte['self'] = self();
+	}
+
+	// Transformer en amont les noms
+	$contexte['nom'] = saisie_nom2name($contexte['nom']);
+	// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
+	// Si le nom du champ est un tableau indexé, il faut parser !
+	if (
+		isset($contexte['nom'])
+		&& preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)
+		&& isset($env[$separe[1]])
+	) {
+		$contexte['valeur'] = $env[$separe[1]];
+		preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
+		// On va chercher au fond du tableau
+		foreach ($index[1] as $cle) {
+			$contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;
+		}
+	} elseif (isset($contexte['nom']) && isset($env[$contexte['nom']])) {
+		// Sinon la valeur est juste celle du nom si elle existe
+		$contexte['valeur'] = $env[$contexte['nom']];
+	} else {
+		// Sinon rien
+		$contexte['valeur'] = null;
+	}
+
+	// Si ya des enfants on les remonte dans le contexte
+	if (is_array($champ['saisies'] ?? '')) {
+		$contexte['saisies'] = $champ['saisies'];
+	}
+	// On génère la saisie
+	return recuperer_fond(
+		'saisies/_base',
+		$contexte
+	);
+}
+
+/**
+ * Génère une vue d'une saisie à partir d'un tableau la décrivant.
+ *
+ * @see saisies_generer_html()
+ *
+ * @param array $saisie
+ *                               Tableau de description d'une saisie
+ * @param array $env
+ *                               L'environnement, contenant normalement la réponse à la saisie
+ * @param array $env_obligatoire
+ *                               Ce qui doit toujours être passé à l'environnement
+ *
+ * @return string
+ *                Code HTML de la vue de la saisie
+ */
+function saisies_generer_vue($saisie, $env = [], $env_obligatoire = []) {
+	// Si le paramètre n'est pas bon, on génère du vide
+	if (!is_array($saisie)) {
+		return '';
+	}
+
+	$contexte = [];
+
+	// On sélectionne le type de saisie
+	$contexte['type_saisie'] = $saisie['saisie'];
+
+	// Peut-être des transformations à faire sur les options textuelles
+	$options = $saisie['options'];
+	foreach ($options as $option => $valeur) {
+		if (substr($option, 0, 4) === 'data' && !is_array($valeur)) {//data, ou datas, ou data_rows, ou data_cols
+			$options[$option] = _T_ou_typo(saisies_chaine2tableau($valeur), 'multi');
+		} else {
+			$options[$option] = _T_ou_typo($valeur, 'multi');
+		}
+	}
+
+	// On ajoute les options propres à la saisie
+	$contexte = array_merge($contexte, $options);
+
+	// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
+	if (isset($contexte['env']) || is_array($saisie['saisies'] ?? '')) {
+		unset($contexte['env']);
+
+		// on sauve l'ancien environnement
+		// car les sous-saisies ne doivent pas être affectees
+		// par les modification sur l'environnement servant à generer la saisie mère
+		$contexte['_env'] = $env;
+
+		// À partir du moment où on passe tout l'environnement, il faut enlever
+		// certains éléments qui ne doivent absolument provenir que des options
+		$saisies_disponibles = saisies_lister_disponibles();
+
+		if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'] ?? '')) {
+			$options_a_supprimer = array_merge(
+				saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']),
+				saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options_dev'] ?? [])
+			);
+			foreach ($options_a_supprimer as $option_a_supprimer) {
+				unset($env[$option_a_supprimer]);
+			}
+		}
+		$contexte = array_merge($env, $contexte);
+	}
+
+	// Faut-il aussi afficher les explications ?
+	if (isset($env['voir_explications'])) {
+		$contexte['voir_explications'] = $env['voir_explications'];
+	}
+	// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
+
+	// On regarde en priorité s'il y a un tableau listant toutes les valeurs, sinon on cherchera dans l'env
+	$contexte['valeur'] = saisies_request($contexte['nom'], (!empty($env['valeurs']) && is_array($env['valeurs'])) ? $env['valeurs'] : $env);
+	if (is_null($contexte['valeur'])) {
+		$contexte['valeur'] = '';
+	}
+
+	// Si ya des enfants on les remonte dans le contexte
+	if (is_array($saisie['saisies'] ?? '')) {
+		$contexte['saisies'] = $saisie['saisies'];
+	}
+
+	if (is_array($env_obligatoire)) {
+		$contexte = array_merge($contexte, $env_obligatoire);
+	}
+
+	// On génère la saisie
+	return recuperer_fond(
+		'saisies-vues/_base',
+		$contexte
+	);
+}
+
+/**
+ * Récupère l'erreur d'une saisie particulière au sein d'un tableau d'erreur
+ * @param ?array $erreurs
+ *	Tableau d'erreurs, 3 formats possibles
+ *	- * Arborescents SPIP 'niveau1/niveau2/niveau3' => 'erreur'
+ *	- * Arborescents HTML 'niveau1[niveau2][niveau3]' => 'erreur'
+ *	- * Arborescents PHP ['niveau1' => ['niveau2' => 'niveau3' => 'erreur']]]
+ *	@param string $nom_ou_$name
+ *	- * Soit nom SPIP 'niveau1/niveau2/niveau3'
+ *	- * Soit name HTML 'niveau1[niveau2][niveau3]'
+ *	@return string
+ **/
+function saisies_trouver_erreur(?array $erreurs, string $nom_ou_name): string {
+	if (!$erreurs) {
+		return '';
+	}
+	$nom = saisie_name2nom($nom_ou_name);
+	$name = saisie_nom2name($nom_ou_name);
+
+	$retour = $erreurs[$nom] ?? '';
+
+	if (!$retour) {
+		$retour = table_valeur($erreurs, $nom);
+	}
+
+	if (!$retour) {
+		$retour = $erreurs[$name] ?? '';
+	}
+
+	return interdire_scripts($retour);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_commun.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_commun.php
new file mode 100644
index 0000000000000000000000000000000000000000..60219ed0ffa01466cd3ce381c54f894f1eae0292
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_commun.php
@@ -0,0 +1,385 @@
+<?php
+
+/**
+ * Gestion de l'affichage conditionnelle des saisies.
+ * Partie commun js/php
+ *
+ * @package SPIP\Saisies\Afficher_si_commun
+ **/
+
+
+/**
+ * Reçoit une condition
+ * la parse pour trouver champs/opérateurs/valeurs etc.
+ * @param string $condition
+ * @param null|string $no_arobase, permet de ne pas parser le arobase
+ * @return array tableau d'analyse (resultat d'un preg_match_all) montrant sous condition par sous condition l'analyse en champ/opérateur/valeur etc.
+ **/
+function saisies_parser_condition_afficher_si($condition, $no_arobase = null) {
+	static $cache = [
+		'no_arobase' => [],
+		'arobase' => []
+	];
+	if ($no_arobase !== null) {
+		$cache_ici = &$cache['no_arobase'];
+		$no_arobase = '?';
+	} else {
+		$no_arobase = '';
+		$cache_ici = &$cache['arobase'];
+	}
+	if (isset($cache_ici[$condition])) {
+		return $cache_ici[$condition];
+	}
+
+	$condition = preg_replace('#!\d* IN#', '!IN', $condition); // Un peu de souplesse, autoriser ! IN
+
+	$regexp =
+		'(?<negation>!?)' // négation éventuelle
+		. "((?:(?<arobase>@)(?<champ>.+?)(\k<arobase>)))$no_arobase" // @champ_@, optionnel (formidable_ts)
+		. '(?<total>:TOTAL)?' // TOTAL éventuel (pour les champs de type case à cocher)
+		. '(' // partie operateur + valeur (optionnelle) : debut
+		. '(?:\s*?)' // espaces éventuels après
+		. '(?<operateur>==|!=|IN|!IN|>=|>|<=|<|MATCH|!MATCH)' // opérateur
+		. '(?:\s*?)' // espaces éventuels après
+		. '((?<guillemet>"|\')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>[+-]?\d+))' // valeur (string) ou valeur_numérique (int)
+		. ')?' // partie operateur + valeur (optionnelle) : fin
+		. '|(?<booleen>false|true)';//accepter false/true brut
+	$regexp = "#$regexp#";
+
+	preg_match_all($regexp, $condition, $tests, PREG_SET_ORDER);
+	$tests = array_map('saisies_afficher_si_filtrer_parse_condition', $tests);
+	$tests = array_filter($tests, function ($m) {
+		if ($m['expression'] === '') {
+			return false;
+		} else {
+			return true;
+		}
+	});
+	$tests = array_values($tests);
+
+	$cache_ici[$condition] = $tests;
+	return $tests;
+}
+
+/**
+ * Filtrer le retour d'un parsage d'un test d'afficher_si,
+ * pour ne pas garder des infos qui ne servent pas par là suite.
+ * IE : si la REGEXP était optimale, on n'aurai pas besoin de cette fonction
+ * Note : on garde les fonctions entrées vides, car parfois besoin de distinguer vide de null
+ * @param array $parse
+ * @return array $parse
+ **/
+function saisies_afficher_si_filtrer_parse_condition($parse) {
+	// Pour des raisons de regexp distingue valeur et valeur numerique, mais pas besoin ici
+	// Supprimer certaines choses dont on n'a pas besoin
+	$parse['expression'] = $parse[0];
+	unset($parse['arobase']);
+	unset($parse['guillemet']);
+	foreach ($parse as $cle => $valeur) {
+		if (is_int($cle)) {
+			unset($parse[$cle]);
+		}
+	}
+	if (($parse['valeur_numerique'] ?? '') !== '') {
+		$parse['valeur'] = $parse['valeur_numerique'];
+		unset($parse['valeur_numerique']);
+	}
+	return $parse;
+}
+
+/**
+ * Retourne le résultat de l'évaluation d'un plugin actif
+ * @param string $champ (sans les @@)
+ * @param string $negation ! si on doit nier
+ * @return bool '' ('' si jamais on ne teste pas un plugin)
+ **/
+function saisies_afficher_si_evaluer_plugin($champ, $negation = '') {
+	if (preg_match_all('#plugin:(.*)#', $champ, $matches, PREG_SET_ORDER)) {
+		foreach ($matches as $plugin) {
+			$plugin_a_tester = $plugin[1];
+			if ($negation) {
+				$actif = !test_plugin_actif($plugin_a_tester);
+			} else {
+				$actif = test_plugin_actif($plugin_a_tester);
+			}
+		}
+	}	else {
+		$actif = '';
+	}
+	return $actif;
+}
+
+
+/**
+ * Teste une condition d'afficher_si
+ * @param string|array $valeur_champ la valeur du champ à tester. Cela peut être :
+ *	- un string
+ *	- un tableau
+ *	- un tableau sérializé
+ * @param string $total TOTAL si on demande de faire le décompte dans un tableau
+ * @param string $operateur : l'opérateur
+ * @param string $valeur la valeur à tester
+ * @param string $negation y-a-t-il un négation avant le test ? '!' si oui
+ * @return bool false / true selon la condition
+ **/
+function saisies_tester_condition_afficher_si($valeur_champ, $total, $operateur = '', $valeur = '', $negation = '') {
+	// Si pas operateur ni de valeur on test juste qu'un champ est cochée / validé
+	if (!$operateur && !$valeur) {
+		// En JS `Boolean('0')` renvoie True ;
+		// En PHP `boolval('0') renvoi False
+		// On se cale sur le comportement de JS
+		// Cf https://git.spip.net/spip-contrib-extensions/saisies/issues/274
+		if ($valeur_champ === '0') {
+			$valeur_champ = 'oui';
+		}
+		if ($negation) {
+			return !(isset($valeur_champ) && $valeur_champ);
+		}
+		else {
+			return isset($valeur_champ) && $valeur_champ;
+		}
+	}
+
+	if (is_null($valeur_champ)) {
+		$valeur_champ = '';
+	}
+	//Si champ est de type string, tenter d'unserializer
+	if (!is_array($valeur_champ)) {
+		$tenter_unserialize = @unserialize($valeur_champ);
+		if ($tenter_unserialize) {
+			$valeur_champ = $tenter_unserialize;
+		}
+	}
+	// Transformation en tableau des valeurs et valeur_champ, si IN/!IN
+	if (in_array($operateur, ['IN', '!IN'])) {
+		if (!is_array($valeur_champ)) {
+				$valeur_champ = [$valeur_champ];
+		}
+	}
+
+	//Et maintenant appeler les sous fonctions qui vont bien
+	if (is_string($valeur_champ)) {
+		$retour = saisies_tester_condition_afficher_si_string($valeur_champ, $operateur, $valeur);
+	} elseif (is_array($valeur_champ)) {
+		$retour = saisies_tester_condition_afficher_si_array($valeur_champ, $total, $operateur, $valeur);
+	}
+	if ($negation) {
+		return !$retour;
+	} else {
+		return $retour;
+	}
+}
+
+/**
+ * Teste un condition d'afficher_si lorsque la valeur envoyée par le formulaire est une chaîne
+ * @param string $valeur_champ la valeur du champ à tester.
+ * @param string $operateur : l'opérateur:
+ * @param string|int $valeur la valeur à tester.
+ * @return bool false / true selon la condition
+ **/
+function saisies_tester_condition_afficher_si_string($valeur_champ, $operateur, $valeur) {
+	if ($operateur === '==') {
+		return $valeur_champ == $valeur;
+	} elseif ($operateur === '!=') {
+		return $valeur_champ != $valeur;
+	} elseif ($operateur === '<') {
+		return $valeur_champ < $valeur;
+	} elseif ($operateur === '<=') {
+		return $valeur_champ <= $valeur;
+	} elseif ($operateur === '>') {
+		return $valeur_champ > $valeur;
+	} elseif ($operateur === '>=') {
+		return $valeur_champ >= $valeur;
+	} elseif ($operateur === 'MATCH') {
+		return preg_match($valeur, $valeur_champ);
+	} elseif ($operateur === '!MATCH') {
+		return !preg_match($valeur, $valeur_champ);
+	} else {//Si mauvaise operateur -> on annule
+		return false;
+	}
+}
+
+/**
+ * Teste un condition d'afficher_si lorsque la valeur postée est un tableau
+ * @param array $valeur_champ la valeur du champ à tester.
+ * @param string $operateur : l'opérateur:
+ * @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23,25"
+ * @return bool false / true selon la condition
+ **/
+function saisies_tester_condition_afficher_si_array($valeur_champ, $total, $operateur, $valeur) {
+	if ($total) {//Cas 1 : on demande à compter le nombre total de champ
+		return saisies_tester_condition_afficher_si_string(count($valeur_champ), $operateur, $valeur);
+	} else {//Cas deux : on test une valeur
+		$valeur = explode(',', $valeur);
+		$intersection = array_intersect($valeur_champ, $valeur);
+		if (in_array($operateur, ['==', 'IN'])) {
+			return count($intersection) > 0;
+		} else {
+			return count($intersection) == 0;
+		}
+	}
+}
+
+/**
+ * Retourne la valeur d'une config, si nécessaire
+ * @param string $champ le "champ" a tester : config:xxx ou un vrai champ
+ * @return string
+ **/
+function saisies_afficher_si_get_valeur_config($champ) {
+	$valeur = '';
+	if (preg_match('#config:(.*)#', $champ, $config)) {
+		$config_a_tester = str_replace(':', '/', $config[1]);
+		$valeur = lire_config($config_a_tester);
+	}
+	return $valeur;
+}
+
+/**
+ * Vérifie qu'une condition est sécurisée
+ * IE : ne permet pas d'executer n'importe quel code arbitraire.
+ * @param string $condition
+ * @param array $tests tableau des tests parsés
+ * @return bool true si secure / false sinon
+ **/
+function saisies_afficher_si_secure($condition, $tests = []) {
+	$condition_original = $condition;
+	$hors_test = ['||','&&','!','(',')','true','false'];
+	foreach ($tests as $test) {
+		$condition = str_replace($test['expression'], '', $condition);
+	}
+	foreach ($hors_test as $hors) {
+		$condition = str_replace($hors, '', $condition);
+	}
+	$condition = trim($condition);
+	if ($condition) {// il reste quelque chose > c'est le mal
+		spip_log("Afficher_si incorrect. $condition_original non sécurisée; il reste une partie non parsée : $condition", 'saisies' . _LOG_CRITIQUE);
+		return false;
+	} else {
+		return true;
+	}
+}
+
+/**
+ * Vérifie qu'une condition respecte la syntaxe formelle
+ * @param string $condition
+ * @param array $tests liste des tests simples
+ * @return bool
+ **/
+function saisies_afficher_si_verifier_syntaxe($condition, $tests = []) {
+	if (!$condition) {
+		// Si vide, alors tout va bien
+		return true;
+	}
+	if ($tests && saisies_afficher_si_secure($condition, $tests)) {//Si cela passe la sécurité, faisons des tests complémentaires
+		// parenthèses équilibrées
+		if (substr_count($condition, '(') != substr_count($condition, ')')) {
+			return false;
+		}
+		// pas de && ou de || qui traine sans rien à gauche ni à droite
+		$condition = " $condition ";
+		$condition_pour_sous_test = str_replace('||', '$', $condition);
+		$condition_pour_sous_test = str_replace('&&', '$', $condition_pour_sous_test);
+		$liste_sous_tests = explode('$', $condition_pour_sous_test);
+		$liste_sous_tests = array_map('trim', $liste_sous_tests);
+		if ($liste_sous_tests != array_filter($liste_sous_tests)) {
+			return false;
+		}
+
+		//Vérifier la syntaxe regexp en cas de MATCH
+		foreach ($tests as $test) {
+			if (in_array($test['operateur'] ?? '', ['MATCH', '!MATCH'])) {
+				if (!($regexp = saisies_afficher_si_parser_valeur_MATCH($test['valeur'])) || !$regexp['regexp']) {
+					$expression = $test['expression'];
+					spip_log("Afficher_si incorrect. $expression incluant MATCH, mais valeur à tester non valide (manque // ?)", 'saisies' . _LOG_CRITIQUE);
+					return false;
+				}
+			}
+		}
+		// Tout va bien !
+		return true;
+	}
+	// Pas sécure, on refuse
+	return false;
+}
+
+/**
+ * Décompose une chaine
+ *'/regex/modificateur'
+ * @param string $valeur
+ * @return array(
+ *	'regexp' => string,
+ *	'modificateur' => string
+ *	)
+ **/
+function saisies_afficher_si_parser_valeur_MATCH($valeur) {
+	preg_match('#^\/(.*)\/(.*)$#', $valeur, $m);
+	if ($m) {
+		return [
+			'regexp' => $m[1],
+			'regexp_modif' => $m[2]
+		];
+	} else {
+		return [
+			'regexp' => '',
+			'regexp_modif' => ''
+		];
+	}
+}
+
+
+
+/**
+ * Vérifier que les afficher_si dans un tableau de saisies sont cohérents
+ * A savoir qu'on ne demande pas un test sur un champ inexistans
+ * @param array $saisie
+ * @return string erreurs
+ **/
+function saisies_verifier_coherence_afficher_si(array $saisies): string {
+	$erreur = '';
+	$liste_erreurs = [];
+	$saisies_avec_afficher_si = saisies_lister_avec_option('afficher_si', $saisies);
+	$saisies = pipeline('saisies_afficher_si_saisies', $saisies);
+	$saisies_par_nom = array_keys(saisies_lister_par_nom($saisies));
+
+	foreach ($saisies_avec_afficher_si as $saisie) {
+		$afficher_si = $saisie['options']['afficher_si'];
+		preg_match_all('/@(.*)@/mU', $afficher_si, $champs_dans_afficher_si);
+		$champs_dans_afficher_si = $champs_dans_afficher_si[1];
+
+		// Autoriser '@config:xxx' et '@plugin:xx@'
+		$champs_dans_afficher_si = array_filter($champs_dans_afficher_si, function ($champ) {
+			if (strpos($champ, 'config:') === 0 || strpos($champ, 'plugin:') === 0) {
+				return false;
+			} else {
+				return true;
+			}
+		});
+		$diff = array_diff($champs_dans_afficher_si, $saisies_par_nom);
+		if ($diff) {
+			$liste_erreurs[$saisie['options']['nom']] = [
+				'erreurs' => 	$diff,
+				'label' => $saisie['options']['label_case'] ?? $saisie['options']['label']
+			];
+		}
+	}
+
+	// Une fois les erreurs compilés, générer le message d'erreur
+	if ($liste_erreurs) {
+		$erreur = singulier_ou_pluriel(
+			count($liste_erreurs),
+			'saisies:coherence_afficher_si_erreur_singulier',
+			'saisies:coherence_afficher_si_erreur_pluriel'
+		);
+		foreach ($liste_erreurs as $cle => $value) {
+			$erreur .= '<br /> - '
+				. _T(
+					'saisies:coherence_afficher_si_appel',
+					[
+						'label' => $value['label'],
+						'erreurs' => '@' . implode('@, @', $value['erreurs']) . '@'
+					]
+				);
+		}
+	}
+	return $erreur;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_js.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_js.php
new file mode 100644
index 0000000000000000000000000000000000000000..522de1d0e87a5cf3ee05c9f21e89035a37ec9f7d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_js.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * Gestion de l'affichage conditionnelle des saisies.
+ * Partie spécifique js
+ *
+ * @package SPIP\Saisies\Afficher_si_js
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/saisies_afficher_si_commun');
+include_spip('inc/saisies_lister');
+
+/**
+ * Transforme une condition afficher_si en condition js
+ * @param string $condition
+ * @param array $saisies_par_etapes les saisies du même formulaire, regroupées par etapes. Nécessaire pour savoir quel type de test js on met.
+ * @return string
+ **/
+function saisies_afficher_si_js($condition, $saisies_par_etapes = []) {
+	if (!$condition) {
+		return '';
+	}
+	$saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes);
+	$etape = _request('_etape');
+	if ($etape && array_key_exists('etape_1', $saisies_par_etapes)) {
+		$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']);
+		$saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes);
+	} else {
+		$saisies_toutes_par_nom = $saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes);
+	}
+
+	if ($tests = saisies_parser_condition_afficher_si($condition)) {
+		if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
+			spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", 'saisies' . _LOG_CRITIQUE);
+			return '';
+		}
+		foreach ($tests as $test) {
+			$expression = $test['expression'];
+			unset($test['expression']);// Les les fonctions saisies_afficher_si_js n'ont pas besoin de l'expression qui est deja parsée, et cela évite qu'elles l'insèrent dans le js, avec le risque du coup de remplacement recursif et du coup de saisie js invalide.
+
+			$negation = isset($test['negation']) ? $test['negation'] : '' ;
+			$champ = isset($test['champ']) ? $test['champ'] : '' ;
+			$total = isset($test['total']) ? $test['total'] : '';
+			$operateur = isset($test['operateur']) ? $test['operateur'] : null ;
+			$negation = isset($test['negation']) ? $test['negation'] : '';
+			$booleen = isset($test['booleen']) ? $test['booleen'] : '';
+			$valeur = isset($test['valeur']) ? $test['valeur'] : null ;
+			$valeur_numerique = isset($test['valeur_numerique']) ? $test['valeur_numerique'] : '' ;
+
+			$plugin = saisies_afficher_si_evaluer_plugin($champ, $negation);
+
+			if ($plugin !== '') {
+				$condition = str_replace($expression, $plugin ? 'true' : 'false', $condition);
+			} elseif (stripos($champ, 'config:') !== false) {
+				$config = saisies_afficher_si_get_valeur_config($champ);
+				$test_modifie = eval('return ' . saisies_tester_condition_afficher_si($config, $total, $operateur, $valeur, $negation) . ';') ? 'true' : 'false';
+				$condition = str_replace($expression, $test_modifie, $condition);
+			} elseif ($booleen) {
+				$condition = $condition;
+			} else { // et maintenant, on rentre dans le vif du sujet : les champs.
+				if (!isset($saisies_toutes_par_nom[$champ])) {//La saisie conditionnante n'existe pas pour ce formulaire > on laisse tomber
+					spip_log("Afficher_si incorrect. Champ $champ inexistant", 'saisies' . _LOG_CRITIQUE);
+					$condition = '';
+				} elseif (!isset($saisies_etape_courante_par_nom[$champ])) {
+					//Cas 1. La saisie existe bien dans le formulaire, mais pas à l'étape courante.
+
+					$test_modifie = eval('return ' . saisies_tester_condition_afficher_si(saisies_get_valeur_saisie($saisies_toutes_par_nom[$champ]), $total, $operateur, $valeur, $negation) . ';') ? 'true' : 'false';
+					$condition = str_replace($expression, $test_modifie, $condition);
+				} else {
+					$type_saisie = $saisies_toutes_par_nom[$champ]['saisie'];
+					if (!$f = charger_fonction($type_saisie, 'saisies_afficher_si_js', true)) {//Y-a-t'il une fonction spécifique pour la génération du JS de cette saisie ?
+						$f = charger_fonction('defaut', 'saisies_afficher_si_js');
+					}
+
+					$condition = str_replace($expression, $f($test, $saisies_etape_courante_par_nom, $saisies_par_etapes), $condition);
+				}
+			}
+		}
+	} else {
+		if (!saisies_afficher_si_verifier_syntaxe($condition)) {
+			spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", 'saisies' . _LOG_CRITIQUE);
+			return '';
+		}
+	}
+	return str_replace('"', '&quot;', $condition);
+}
+
+/**
+ * Vérifier qu'un test JS d'afficher si est statique, c'est à dire qu'il ne dépend d'aucune saisie de l'étape en cours.
+ *
+ * Exemple
+ *	`false && false` => statique, la fonction renvoie true
+ *	`true && afficher_si(...)` => pas statique, la fonction renvoie false
+ * @param string $afficher_si
+ * @return bool
+ **/
+function saisies_afficher_si_js_est_statique($test) {
+	$test = str_replace('false', '', $test);
+	$test = str_replace('true', '', $test);
+	$test = str_replace('&&', '', $test);
+	$test = str_replace('||', '', $test);
+	$test = str_replace('(', '', $test);
+	$test = str_replace(')', '', $test);
+	$test = str_replace('!', '', $test);
+	$test = trim($test);
+	if ($test) {//S'il reste encore quelque chose, c'est qu'on a des choses variables
+		return false;
+	} else {
+		return true;
+	}
+}
+
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_php.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_php.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a13de8acfefdf6f679b04243db538427f3e0d75
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_afficher_si_php.php
@@ -0,0 +1,275 @@
+<?php
+
+/**
+ * Gestion de l'affichage conditionnelle des saisies.
+ * Partie spécifique php
+ *
+ * @package SPIP\Saisies\Afficher_si_php
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/saisies_afficher_si_commun');
+
+/**
+ * Traitement des saisies ayant l'option `afficher_si`.
+ *
+ * Lorsque qu'on affiche les saisies avec `#VOIR_SAISIES`,
+ * ou lorsqu'on les vérifie avec saisies_verifier().
+ * Si la condition d'affichage d'une saisie n'est pas remplie, on retire cette saisie du tableau de saisies, SAUF SI l'option `afficher_si_remplissage_uniquement` est activée et que `$env` est non null.
+ *
+ * @param array      $saisies
+ *                            Tableau de descriptions de saisies
+ * @param array|null $env
+ *                            Tableau d'environnement transmis dans inclure/voir_saisies.html,
+ *                            NULL si on doit rechercher dans _request (pour saisies_verifier()).
+ * @param array $saisies_toutes_par_nom ensemble des saisies du formulaire courant, quelque soit le niveau de profondeur dans l'arborescence des saisies. A passer uniquement lorsque la fonction s'appelle elle-même, pour gérer la récursion
+ * @return array
+ *               Tableau de descriptions de saisies
+ */
+function saisies_verifier_afficher_si(array $saisies, ?array $env = null, array $saisies_toutes_par_nom = []): array {
+	if (!$saisies_toutes_par_nom) {
+		$saisies = pipeline('saisies_afficher_si_saisies', $saisies);
+		$saisies_toutes_par_nom = saisies_lister_par_nom($saisies);
+	}
+
+	foreach ($saisies as $cle => $saisie) {
+		$condition = trim($saisie['options']['afficher_si'] ?? '');
+		if ($condition) {
+			// Est-ce uniquement au remplissage?
+			if (($saisie['options']['afficher_si_remplissage_uniquement'] ?? '')  == 'on') {
+				$remplissage_uniquement = true;
+			} else {
+				$remplissage_uniquement = false;
+			}
+
+			// On transforme en une condition PHP valide
+			$ok = saisies_evaluer_afficher_si($condition, $env, $saisies_toutes_par_nom);
+			if (!$ok) {
+				saisies_afficher_si_liste_masquees('set', $saisie);//Retenir que la saisie a été masquée
+				if ($remplissage_uniquement == false || is_null($env)) {
+					unset($saisies[$cle]);
+				}
+			}
+		}
+		if (isset($saisies[$cle]['saisies'])) {
+			// S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
+			$a_merger = isset($saisies['options']) ? ['options' => $saisies['options']] : [];
+			$saisies[$cle]['saisies'] = saisies_verifier_afficher_si(
+				array_merge(
+					$saisies[$cle]['saisies'],
+					$a_merger
+				),
+				$env,
+				$saisies_toutes_par_nom
+			);
+		}
+	}
+	return $saisies;
+}
+
+/**
+ * Recherche les saisies qui ont été masquées par afficher_si
+ * et les mets à `''`,
+ * sauf si
+ * *	- options globales de saisies :  `afficher_si_avec_post`
+ * *  - option de la saisie spécifique : `afficher_si_avec_post`
+ * Cette fonction est appelée à la toute fin de `saisies_verifier()`
+ **/
+function saisies_afficher_si_masquees_set_request_empty_string($saisies, $valeurs = null) {
+	$saisies_masquees = saisies_afficher_si_liste_masquees('get');//Trouver les saisies masquées
+	if (!empty($saisies['options']['afficher_si_avec_post'])) {
+		return;
+	}
+	foreach ($saisies_masquees as $saisie) {
+		if (
+			empty($saisie['options']['afficher_si_avec_post']) // option de la saisie
+		) {
+			saisies_set_request_recursivement($saisie, '', $valeurs);
+		}
+	}
+}
+
+
+/**
+ * Pose un set_request sur une saisie et toute ses sous-saisies.
+ * Utiliser notamment pour annuler toutes les sous saisies d'un fieldeset
+ * si le fieldset est masquée à cause d'un afficher_si.
+ * @param array $saisie
+ * @param null|str|array $val (defaut `''`)
+ * @param array $valeurs
+ *     Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
+ **/
+function saisies_set_request_recursivement($saisie, $val = '', $valeurs = null) {
+	// Attention, tout champ peut être un sous-tableau !
+	saisies_set_request($saisie['options']['nom'], $val, $valeurs);
+
+	if (isset($saisie['saisies'])) {
+		foreach ($saisie['saisies'] as $sous_saisie) {
+			saisies_set_request_recursivement($sous_saisie, $val, $valeurs);
+		}
+	}
+}
+
+/**
+ * Récupère la valeur d'un champ à tester avec afficher_si
+ * Si le champ est de type @config:xx@, alors prend la valeur de la config
+ * Si le champ est de type @plugin:xx@, vérifier si le plugin est actif
+ * Sinon en _request() ou en $env["valeurs"]
+ * @param string $champ
+ * @param null|array $env
+ * @param array $saisies_par_nom
+ *   Les saisies déjà classées par nom de champ
+ * @return  la valeur du champ ou de la config
+ **/
+function saisies_afficher_si_get_valeur_champ($champ, $env, $saisies_par_nom) {
+	$valeur = null;
+	$plugin = saisies_afficher_si_evaluer_plugin($champ);
+	$config = saisies_afficher_si_get_valeur_config($champ);
+	$fichiers = false;
+	$est_tabulaire = false;
+
+	if (isset($saisies_par_nom[$champ])) {
+		$fichiers = saisies_saisie_est_fichier($saisies_par_nom[$champ]);
+		$est_tabulaire = saisies_saisie_est_tabulaire($saisies_par_nom[$champ]);
+	}
+	if (strpos($champ, 'plugin:') === 0) {
+		$valeur = $plugin;
+	} elseif (strpos($champ, 'config:') === 0) {
+		$valeur = $config;
+	} elseif (is_null($env)) {
+		if ($fichiers) {
+			$precedent = saisies_request('cvtupload_fichiers_precedents');
+			if ($precedent) {
+				$precedent = $precedent[$champ];
+			}
+			$valeur = saisies_request_property_from_FILES($champ, 'name');
+		} else {
+			$valeur = saisies_request($champ);
+		}
+	} else {
+		$valeur = saisies_request($champ, (!empty($env['valeurs']) && is_array($env['valeurs'])) ? $env['valeurs'] : $env);
+		if (is_null($valeur)) {
+			$valeur = '';
+		}
+	}
+	if ($fichiers) {
+		if (!is_array($precedent)) {
+			$precedent = [];
+		}
+		$valeur = array_merge($valeur, $precedent);
+		$valeur = array_filter($valeur);
+	}
+
+	// On teste si on doit forcer que ce soit un tableau, suivant le type de la saisie
+	if ($est_tabulaire) {
+		$data = saisies_trouver_data($saisies_par_nom[$champ]);
+		$valeur = saisies_valeur2tableau($valeur, $data);
+	}
+
+	return $valeur;
+}
+
+
+/**
+ * Prend un test conditionnel,
+ * le sépare en une série de sous-tests de type champ - operateur - valeur
+ * remplace chacun de ces sous-tests par son résultat
+ * renvoie la chaine transformé
+ * @param string $condition
+ * @param array|null $env
+ *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
+ *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
+ * @param  array $saisies_par_nom
+ *   Les saisies déjà classées par nom de champ
+ * @param string|null $no_arobase une valeur à tester là où il devrait y avoir un @@
+ * @return string $condition
+ **/
+function saisies_transformer_condition_afficher_si($condition, $env = null, $saisies_par_nom = [], $no_arobase = null) {
+	if ($tests = saisies_parser_condition_afficher_si($condition, $no_arobase)) {
+		if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
+			spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", 'saisies' . _LOG_CRITIQUE);
+			return '';
+		}
+
+		foreach ($tests as $test) {
+			$expression = $test['expression'];
+			if (!isset($test['booleen'])) {
+				$total = isset($test['total']) ? $test['total'] : '';
+				$operateur = isset($test['operateur']) ? $test['operateur'] : null;
+				$negation = isset($test['negation']) ? $test['negation'] : '';
+
+				if (isset($test['valeur'])) {
+					$valeur = $test['valeur'];
+				} else {
+					$valeur = null;
+				}
+
+				if ($no_arobase === null) {
+					$nom_champ = $test['champ'];
+				} else {
+					$nom_champ = '';
+				}
+				if (!$saisies_par_nom || isset($saisies_par_nom[$nom_champ]) || strpos($nom_champ, 'config:') === 0 || strpos($nom_champ, 'plugin:') === 0) {
+					if ($no_arobase === null) {
+						$valeur_champ = saisies_afficher_si_get_valeur_champ($nom_champ, $env, $saisies_par_nom);
+					} else {
+						$valeur_champ = $no_arobase;
+					}
+					$test_modifie = saisies_tester_condition_afficher_si($valeur_champ, $total, $operateur, $valeur, $negation) ? 'true' : 'false';
+					$condition = str_replace($expression, $test_modifie, $condition);
+				} else {
+					$condition = '';// Si champ inexistant, on laisse tomber tout le tests
+					spip_log("Afficher_si incorrect. Champ $nom_champ inexistant", 'saisies' . _LOG_CRITIQUE);
+				}
+			}
+		}
+	} else {
+		if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
+			spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", 'saisies' . _LOG_CRITIQUE);
+			return '';
+		}
+	}
+
+	return $condition;
+}
+
+
+/**
+ * Evalue un afficher_si
+ * @param string $condition
+ * @param array|null $env
+ *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
+ *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
+ * @param array $saisies_par_nom
+ *   Les saisies déjà classées par nom de champ
+ * @param string|null $no_arobase une valeur à tester là où il devrait y avoir un @@
+ * @return bool le résultat du test
+ **/
+function saisies_evaluer_afficher_si($condition, $env = null, $saisies_par_nom = [], $no_arobase = null) {
+	$condition = saisies_transformer_condition_afficher_si($condition, $env, $saisies_par_nom, $no_arobase);
+	if ($condition) {
+		eval('$ok = ' . $condition . ';');
+	} else {
+		$ok = true;
+	}
+	return $ok;
+}
+
+/**
+ * Liste des saisies masquées par afficher_si dans le hit courant
+ * @param str $action ('set'|'get'), defaut 'get';
+ * @param array $saisie complète
+ * @return array|null
+ **/
+function saisies_afficher_si_liste_masquees($action = 'get', $saisie = '') {
+	static $tableau = [];
+	if ($action === 'set') {
+		$tableau[] = $saisie;
+	} elseif ($action === 'get') {
+		return $tableau;
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_aide.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_aide.php
new file mode 100644
index 0000000000000000000000000000000000000000..15119027f7c25fa7c3a3967d2516c5f796cff381
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_aide.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * Gestion de l'aide des saisies
+ *
+ * @package SPIP\Saisies\Aide
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Génère une page d'aide listant toutes les saisies et leurs options
+ *
+ * Retourne le résultat du squelette `inclure/saisies_aide` auquel
+ * on a transmis toutes les saisies connues.
+ *
+ * @return string Code HTML
+ */
+function saisies_generer_aide() {
+	// On a déjà la liste par saisie
+	$saisies = saisies_lister_disponibles('saisies', false);
+
+	// On construit une liste par options
+	$options = [];
+	$options_dev = [];
+	foreach (['options_dev' => &$options_dev, 'options' => &$options] as $nom_type_options => &$type_options) {
+		foreach ($saisies as $type_saisie => $saisie) {
+			if (!isset($saisie[$nom_type_options])) {
+				continue;
+			}
+			$options_saisie = saisies_lister_par_nom($saisie[$nom_type_options], false);
+			if (isset($options_saisie['datas'])) {//Datas devient data
+				$options_saisie['data'] = $options_saisie['datas'];
+				unset($options_saisie['datas']);
+			}
+			foreach ($options_saisie as $nom => $option) {
+				if (isset($option['options']['datas'])) {
+					$option['options']['data'] = $option['options']['datas'];
+					unset($option['options']['datas']);
+				}
+				// Si l'option n'existe pas encore
+				if (!isset($type_options[$nom])) {
+					$type_options[$nom] = _T_ou_typo($option['options']);
+				}
+				// On ajoute toujours par qui c'est utilisé
+				$type_options[$nom]['utilisee_par'][] = $type_saisie;
+			}
+			ksort($options_saisie);
+			$saisies[$type_saisie][$nom_type_options] = $options_saisie;
+		}
+		ksort($type_options);
+	}
+	return recuperer_fond(
+		'inclure/saisies_aide',
+		[
+			'saisies' => saisies_regrouper_disponibles_par_categories($saisies),
+			'options' => $options,
+			'options_dev' => $options_dev
+		]
+	);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_data.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_data.php
new file mode 100644
index 0000000000000000000000000000000000000000..47016ddff48006ce850cbfac8a6717dc23824e52
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_data.php
@@ -0,0 +1,287 @@
+<?php
+
+/**
+ * Trouver et manipuler les data des saisies,
+ * qu'elles soient sous forme tabulaire ou sous forme de liste
+ *
+ * @package SPIP\Saisies\Data
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Aplatit une description chaînée, en supprimant les sous-groupes.
+ * @param string $chaine La chaîne à aplatir
+ * @return string
+ */
+function saisies_aplatir_chaine($chaine) {
+	$chaine = explode("\n", trim($chaine));
+	$chaine = array_filter($chaine, function ($ligne) {
+		if (substr($ligne, 0, 2) === '/*' || substr($ligne, 0, 1) === '*') {
+			return false;
+		} else {
+			return true;
+		}
+	});
+	return implode("\n", $chaine);
+}
+
+/**
+ * Transforme une chaine en tableau avec comme principe :
+ *
+ * - une ligne devient une case
+ * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur
+ * - si la ligne commence par * alors on commence un sous-tableau
+ * - si la ligne est égale à /*, alors on finit le sous-tableau
+ *
+ * @param string $chaine Une chaine à transformer
+ * @param string $separateur Séparateur utilisé
+ * @return array Retourne un tableau PHP
+ */
+function saisies_chaine2tableau($chaine, $separateur = "\n") {
+	if ($chaine && is_string($chaine)) {
+		$tableau = [];
+		$soustab = false;
+
+		// On découpe d'abord en lignes
+		$lignes = explode($separateur, $chaine);
+		foreach ($lignes as $i => $ligne) {
+			$ligne = trim(trim($ligne), '|');
+			// Si ce n'est pas une ligne sans rien
+			if ($ligne !== '') {
+				// si ca commence par * c'est qu'on va faire un sous tableau
+				if (strpos($ligne, '*') === 0) {
+					$soustab = true;
+					$soustab_cle = _T_ou_typo(substr($ligne, 1), 'multi');
+					if (!isset($tableau[$soustab_cle])) {
+						$tableau[$soustab_cle] = [];
+					}
+				} elseif ($ligne == '/*') {//si on finit sous tableau
+					$soustab = false;
+				} else {
+					//sinon c'est une entrée normale
+					// Si on trouve un découpage dans la ligne on fait cle|valeur
+					if (strpos($ligne, '|') !== false) {
+						list($cle,$valeur) = explode('|', $ligne, 2);
+						// permettre les traductions de valeurs au passage
+						if ($soustab == true) {
+							$tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi');
+						} else {
+							$tableau[$cle] = _T_ou_typo($valeur, 'multi');
+						}
+					} else {
+						// Sinon on génère la clé
+						if ($soustab == true) {
+							$tableau[$soustab_cle][$i] = _T_ou_typo($ligne, 'multi');
+						} else {
+							$tableau[$i] = _T_ou_typo($ligne, 'multi');
+						}
+					}
+				}
+			}
+		}
+		return $tableau;
+	} elseif (is_array($chaine)) {
+		return $chaine;
+	} else {
+		return [];
+	}
+}
+
+/**
+ * Transforme un tableau en chaine de caractères avec comme principe :
+ *
+ * - une case devient une ligne de la chaine
+ * - chaque ligne est générée avec la forme cle|valeur
+ * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef
+ * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau.
+ *
+ * @param array $tableau Tableau à transformer
+ * @return string Texte représentant les données du tableau
+ */
+function saisies_tableau2chaine($tableau) {
+	if ($tableau && is_array($tableau)) {
+		$chaine = '';
+		$avant_est_tableau = false;
+
+		foreach ($tableau as $cle => $valeur) {
+			if (is_array($valeur)) {
+				$avant_est_tableau = true;
+				$ligne = trim("*$cle");
+				$chaine .= "$ligne\n";
+				$chaine .= saisies_tableau2chaine($valeur) . "\n";
+			} else {
+				if ($avant_est_tableau == true) {
+					$avant_est_tableau = false;
+					$chaine .= "/*\n";
+				}
+				$ligne = trim("$cle|$valeur");
+				$chaine .= "$ligne\n";
+			}
+		}
+		$chaine = trim($chaine);
+
+		return $chaine;
+	}
+	elseif (is_string($tableau)) {
+		// Si c'est déjà une chaine on la renvoie telle quelle
+		return $tableau;
+	}
+	else {
+		return '';
+	}
+}
+
+/**
+ * Transforme une valeur en tableau d'élements si ce n'est pas déjà le cas
+ *
+ * @param mixed $valeur
+ * @param array $data
+ *	Options `data` de la saisie
+ * @return array Tableau de valeurs
+ **/
+function saisies_valeur2tableau($valeur, $data = []) {
+	$data = saisies_aplatir_tableau($data);
+	$tableau = [];
+
+	if ($valeur === null) {
+		$tableau = [];
+	} elseif (is_array($valeur)) {
+		$tableau = $valeur;
+	} elseif (strlen($valeur)) {
+		$tableau = saisies_chaine2tableau($valeur);
+
+		// Si qu'une seule valeur, c'est qu'elle a peut-être un separateur à virgule
+		// et a donc une clé 0 dans ce cas la d'ailleurs
+		if (count($tableau) == 1 && isset($tableau[0])) {
+			$tableau = saisies_chaine2tableau($tableau[0], ',');
+		}
+	}
+
+	// On vérifie la pertinence des valeurs pour s'assurer d'avoir le choix alternatif dans sa clé à part
+	if (is_array($data) && $data) {
+		foreach ($tableau as $cle => $valeur) {
+			if (!in_array($valeur, array_keys($data))) {
+				$choix_alternatif = $valeur;
+				unset($tableau[$cle]);
+				$tableau['choix_alternatif'] = $valeur;
+			}
+		}
+	}
+
+	return $tableau;
+}
+
+/**
+ * Pour les saisies multiples (type checkbox) proposant un choix alternatif,
+ * retrouve à partir des data de choix proposés
+ * et des valeurs des choix enregistrés
+ * le texte enregistré pour le choix alternatif.
+ *
+ * @param array $data
+ * @param array $valeur
+ * @return string choix_alternatif
+ **/
+function saisies_trouver_choix_alternatif($data, $valeur) {
+	if (!is_array($valeur)) {
+		$valeur = saisies_valeur2tableau($valeur);
+	}
+	if (!is_array($data)) {
+		$data = saisies_chaine2tableau($data) ;
+	}
+
+	$choix_theorique = array_keys($data);
+	$choix_alternatif = array_values(array_diff($valeur, $choix_theorique));
+	if (isset($choix_alternatif[0])) {
+		return $choix_alternatif[0]; //on suppose que personne ne s'est amusé à proposer deux choix alternatifs
+	} else {
+		return '';
+	}
+}
+
+
+/**
+ * Aplatit une description tabulaire en supprimant les sous-groupes.
+ * Ex : les data d'une saisie de type select
+ *
+ * @param array $tab            Le tableau à aplatir
+ * @param bool  $masquer_sous_groupe mettre à true pour ne pas montrer le sous-groupe dans les label humain
+ *
+ * @return array
+ */
+function saisies_aplatir_tableau($tab, $masquer_sous_groupe = false) {
+	$nouveau_tab = [];
+	if (is_string($tab)) {
+		$tab = saisies_chaine2tableau($tab);
+	}
+	if (is_array($tab)) {
+		foreach ($tab as $entree => $contenu) {
+			if (is_array($contenu)) {
+				foreach ($contenu as $cle => $valeur) {
+					if ($masquer_sous_groupe) {
+						$nouveau_tab[$cle] = $valeur;
+					} else {
+						$nouveau_tab[$cle] = _T('saisies:saisies_aplatir_tableau_montrer_groupe', ['valeur' => $valeur, 'groupe' => $entree]);
+					}
+				}
+			} else {
+				$nouveau_tab[$entree] = $contenu;
+			}
+		}
+	}
+
+	return $nouveau_tab;
+}
+
+
+/**
+ * Trouve le champ data ou datas (pour raison historique)
+ * parmi les paramètres d'une saisie
+ * et le retourne après avoir l'avoir transformé en tableau si besoin
+ * @param array $description description de la saisie
+ * @bool $disable_choix : si true, supprime les valeurs contenu dans l'option disable_choix des data
+ * @return array data
+ **/
+function saisies_trouver_data($description, $disable_choix = false) {
+	$options = $description['options'];
+	if (isset($options['data'])) {
+		$data = $options['data'];
+	} elseif (isset($options['datas'])) {
+		$data = $options['datas'];
+	} else {
+		$data = [];//normalement on peut pas mais bon
+	}
+	$data = saisies_chaine2tableau($data);
+
+	if ($disable_choix == true && isset($options['disable_choix'])) {
+		$disable_choix = array_flip(saisies_normaliser_disable_choix($options['disable_choix']));
+		$data = array_diff_key($data, $disable_choix);
+	}
+	return $data;
+}
+
+/**
+ * Prend une option disable_choix en entrée
+ * Si tableau, renvoi presque tel quel
+ * Si chaine, l'explose au niveau des virgules
+ * Trim dans tous les cas les différents choix
+ * @param array|string $disable
+ * @return array
+ **/
+function saisies_normaliser_disable_choix($disable): array {
+	if (is_array($disable)) {
+		// nothing to do
+	} elseif ($disable === null) {
+		$disable = [];
+	} elseif (strlen($disable)) {
+		$disable = explode(',', trim($disable));
+	} else {
+		$disable = [];
+	}
+	$disable = array_map('trim', $disable);
+	$disable = array_filter($disable);
+	return $disable;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_formulaire.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_formulaire.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1b1eed32635d63ce79c2e82706e6b5ca1df9325
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_formulaire.php
@@ -0,0 +1,170 @@
+<?php
+
+/**
+ * Oautils pour faciliter la construction de formulaires CVT sous formes de listes de saisies
+ *
+ * @package SPIP\Saisies\Saisies
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Cherche la description des saisies d'un formulaire CVT dont on donne le nom
+ *
+ * @param string $form Nom du formulaire dont on cherche les saisies
+ * @param array $args Tableau d'arguments du formulaire
+ * @return array Retourne les saisies du formulaire sinon false
+ */
+function saisies_chercher_formulaire($form, $args, $je_suis_poste = false) {
+	$saisies = [];
+
+	if ($fonction_saisies = charger_fonction('saisies', 'formulaires/' . $form, true)) {
+		$saisies = call_user_func_array($fonction_saisies, $args);
+	}
+
+	// Si on a toujours un tableau, on passe les saisies dans un pipeline normé comme pour CVT
+	if (is_array($saisies)) {
+		$saisies = pipeline(
+			'formulaire_saisies',
+			[
+				'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $je_suis_poste],
+				'data' => $saisies
+			]
+		);
+	}
+
+	if (!is_array($saisies)) {
+		$saisies = false;
+	}
+
+	return $saisies;
+}
+
+
+/**
+ * Génère un nom unique pour un champ d'un formulaire donné
+ *
+ * @param array $formulaire
+ *     Le formulaire à analyser
+ * @param string $type_saisie
+ *     Le type de champ dont on veut un identifiant
+ * @return string
+ *     Un nom unique par rapport aux autres champs du formulaire
+ */
+function saisies_generer_nom($formulaire, $type_saisie) {
+	$champs = saisies_lister_champs($formulaire);
+
+	// Tant que type_numero existe, on incrémente le compteur
+	$compteur = 1;
+	while (array_search($type_saisie . '_' . $compteur, $champs) !== false) {
+		$compteur++;
+	}
+
+	// On a alors un compteur unique pour ce formulaire
+	return $type_saisie . '_' . $compteur;
+}
+
+
+/**
+ * Détermine si peut faire une avance rapide en sautant des étapes qui sont "masquées" par afficher_si
+ * @param array $saisies le tableau d'ensemble des saisies
+ * @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
+ * @return int l'étape où avancer
+ **/
+function saisies_determiner_avance_rapide(array $saisies, int $etape): int {
+	return saisies_determiner_deplacement_rapide($saisies, $etape, +1);
+}
+
+/**
+ * Détermine si peut faire un recul rapide en sautant des étapes qui sont "masquées" par afficher_si
+ * @param array $saisies le tableau d'ensemble des saisies
+ * @param int $etape l'étape à partir de laquelle on commence à tester les étapes précédentes
+ * @return int l'étape où avancer
+ **/
+function saisies_determiner_recul_rapide(array $saisies, int $etape): int {
+	return saisies_determiner_deplacement_rapide($saisies, $etape, -1);
+}
+
+/**
+ * Détermine si peut faire un déplacement rapide en sautant des étapes qui sont "masquées" par afficher_si
+ * Pour le confort de lecture, on pourra préférer les fonctions appellantes
+ * `saisies_determiner_avance_rapide()` et `saisies_determiner_recul_rapide()`
+ * @param array $saisies le tableau d'ensemble des saisies, potentiellement déjà classées par étapes
+ * @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
+ * @param int $sens 1 (avance) ou -1 (recule)
+ * @return int l'étape où avancer
+ **/
+function saisies_determiner_deplacement_rapide(array $saisies, int $etape, int $sens): int {
+	if (abs($sens) != 1) {
+		spip_log("Argument $sens invalide dans saisies_determiner_deplacement_rapide ($sens)", 'saisies.' . _LOG_ERREUR);
+		return $etape;
+	}
+	if (isset($saisies['etape_1'])) {
+		$saisies_par_etapes = $saisies;
+	} else {
+		$saisies_par_etapes = saisies_lister_par_etapes($saisies);
+	}
+	$saisies_afficher_si_liste_masquees = saisies_afficher_si_liste_masquees('get');
+	$nb_total_etapes = count($saisies_par_etapes);
+	$i = $etape + $sens;
+	$etape_a_conserver = false;//Basculé à true dès qu'un afficher_si réussit ou si pas d'afficher_si
+	while (!$etape_a_conserver && $i <= $nb_total_etapes) {//Tester les futures étapes 1 par 1
+		$etape = $saisies_par_etapes["etape_$i"];
+		if (!($etape['options']['afficher_si'] ?? '')) {
+			$etape_a_conserver = true;
+		} elseif (!in_array($etape, $saisies_afficher_si_liste_masquees)) {
+			$etape_a_conserver = true;
+		} else {
+			$i = $i + $sens;
+		}
+	}
+	return $i;
+}
+
+/**
+ * Retourne un résumé des étapes futures (qu'elles s'afficheront finalement ou pas).
+ * @param array $etapes liste des étapes (sous forme de tableau de saisies)
+ * @param int $etape etape courante
+ * @param array $options_demandees tableau décrivant les options qu'on demande
+ * @return array [
+ *	'etape_n' => ['info_x' => 'valeur_x', 'info_y' => 'valeur_y' …]
+ *	…
+ * ]
+**/
+function saisies_resumer_etapes_futures(array $etapes, int $etape, array $options_demandees): array {
+	$return = [];
+	foreach ($etapes as $e => $description) {
+		$numero_etape = intval(str_replace('etape_', '', $e));
+		if ($numero_etape > $etape) {
+			$output_etape = [];
+
+			foreach ($options_demandees as $option) {
+				if (isset($description['options'][$option])) {
+					$output_etape[$option] = $description['options'][$option];
+				}
+			}
+
+			$return[$e] = $output_etape;
+		}
+	}
+	return $return;
+}
+
+/**
+ * Détermine quels options d'étapes sont utiles au résumé des étapes futures
+ * En fonction des options globales du formulaire
+ * @param array $options_globales optiosn globales du formulaire
+ * @return array liste des options à garder
+**/
+function saisies_determiner_options_demandees_resumer_etapes_futures(array $options_globales): array {
+	$options = ['afficher_si'];// on veut dans tous les cas les afficher_si
+
+	if (in_array($options_globales['etapes_precedent_suivant_titrer'] ?? '', ['on', true], true)) {
+		$options[] = 'label';
+	}
+	return $options;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_identifiants.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_identifiants.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d7de716e7392877abd987aa4cd35c5f6fc66503
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_identifiants.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * Gestion de l'identification pérenne des saisies
+ *
+ * @package SPIP\Saisies\Identifiants
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Crée un identifiant Unique
+ * pour la saisie donnee si elle n'en a pas
+ * (et pour ses sous saisies éventuels)
+ *
+ * @param array $saisie Tableau d'une saisie
+ * @param bool $regenerer Régénère un nouvel identifiant pour la saisie ?
+ * @return array Tableau de la saisie complété de l'identifiant
+ **/
+function saisie_identifier($saisie, $regenerer = false) {
+	if (!($saisie['identifiant'] ?? '')) {
+		$saisie['identifiant'] = uniqid('@');
+	} elseif ($regenerer) {
+		$saisie['identifiant'] = uniqid('@');
+	}
+	if (is_array($saisie['saisies'] ?? '')) {
+		$saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer);
+	}
+
+	return $saisie;
+}
+
+
+/**
+ * Crée un identifiant Unique
+ * pour toutes les saisies donnees qui n'en ont pas
+ *
+ * @param array $saisies Tableau de saisies
+ * @param bool $regenerer Régénère un nouvel identifiant pour toutes les saisies ?
+ * @return array Tableau de saisies complété des identifiants
+ */
+function saisies_identifier($saisies, $regenerer = false) {
+	if (!is_array($saisies)) {
+		return [];
+	}
+
+	foreach ($saisies as $k => $saisie) {
+		if ($k !== 'options') {
+			$saisies[$k] = saisie_identifier($saisie, $regenerer);
+		}
+	}
+
+	return $saisies;
+}
+
+
+
+/**
+ * Supprimer récursivement les identifiants d'un tableau de saisie
+ * Seul usage probable : pour les test uniaires
+ * pour la saisie donnee si elle n'en a pas
+ * (et pour ses sous saisies éventuels)
+ *
+ * @param array $saisie Tableau d'une saisie
+ * @return array Tableau de la saisie sans les identifiant
+ **/
+function saisies_supprimer_identifiants($saisies) {
+	unset($saisies['identifiant']);
+	foreach ($saisies as $cle => $valeur) {
+		if (is_array($valeur)) {
+			$saisies[$cle] = saisies_supprimer_identifiants($valeur);
+		}
+	}
+	return $saisies;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_info.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_info.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea95f5f1e56d489e058cda8d7ae9d737d5955500
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_info.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * Obtenir des informations sur une saisie précise
+ *
+ **/
+
+/**
+ * La saisie renvoie t-elle un tableau?
+ * note: on teste saisie par saisie, et non pas type de saisie par type de saisie, car certains types (`selection` par ex.) peuvent, en fonction des options, être tabulaire ou pas.
+ * @param $saisie
+ * @return return bool true si la saisie est tabulaire, false sinon
+ **/
+function saisies_saisie_est_tabulaire($saisie) {
+	if (in_array($saisie['saisie'], ['checkbox', 'selection_multiple', 'choix_grille'])) {
+		$est_tabulaire = true;
+	} else {
+		if ($saisie['saisie'] === 'selection' && ($saisie['options']['multiple'] ?? '')) {
+			$est_tabulaire =  true;
+		} else {
+			$est_tabulaire = false;
+		}
+	}
+	return pipeline(
+		'saisie_est_tabulaire',
+		['args' => $saisie, 'data' => $est_tabulaire]
+	);
+}
+
+/**
+ * La saisie remplie-t-elle `$_FILES` ?
+ * note: on teste saisie par saisie, et non pas type de saisie par type de saisie, car certains types (`input` par ex.) peuvent, en fonction des options, être fichier ou pas.
+ * @param array $saisie
+ * @return bool
+ **/
+function saisies_saisie_est_fichier($saisie) {
+	$file = (($saisie['saisie'] === 'input' && ($saisie['options']['type'] ?? '') === 'file') || $saisie['saisie'] == 'fichiers');
+	return pipeline(
+		'saisie_est_fichier',
+		['args' => $saisie, 'data' => $file]
+	);
+}
+
+/**
+ * Indique si une saisie à sa valeur gelée
+ * - soit par option disabled avec envoi cachée
+ * - soit par option readonly
+ * @param array $description description de la saisie
+ * @return bool true si gélée, false sinon)
+ **/
+function saisies_saisie_est_gelee(array $description): bool {
+	$options = $description['options'];
+	//As t-on bloqué d'une manière ou d'une autre la valeur postée?
+	if (($options['readonly'] ?? '') || (($options['disable'] ?? '') && ($options['disable_avec_post'] ?? ''))) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * @deprecated saisies_verifier_gel_saisie
+ * Renommée en saisies_saisie_est_gelee
+ * @param array $description
+ * @return bool
+**/
+function saisies_verifier_gel_saisie(array $description): bool {
+
+	trigger_error('fonction `saisie_verifier_gel_saisie()` depréciée, utiliser à la place `saisies_saisie_est_gelee()`', E_USER_DEPRECATED);
+	spip_log('fonction `saisie_verifier_gel_saisie()` depréciée, utiliser à la place `saisies_saisie_est_gelee()`', 'saisies');
+	return saisies_saisie_est_gelee($description);
+}
+
+/**
+ * Renvoie true si la saisie est un conteneur de sous saisies, qu'elle contienne effectivement des sous saisies ou pas
+ * @param array $saisie
+ * @return bool
+ **/
+function saisies_saisie_est_avec_sous_saisies(array $saisie): bool {
+	$type = $saisie['saisie'] ?? '';
+	if (include_spip("saisies/$type")) {
+		$f = $type . '_est_avec_sous_saisies';
+		if (function_exists($f)) {
+			return $f($saisie);
+		}
+	}
+	return false;
+}
+
+
+/**
+ * Renvoie true si la saisie peut recevoir un label,  qu'elle contienne effectivement un label ou pas
+ * @param array $saisie
+ * @return bool
+ **/
+function saisies_saisie_est_labelisable(array $saisie): bool {
+	$type = $saisie['saisie'] ?? '';
+	if (include_spip("saisies/$type")) {
+		$f = $type . '_est_labelisable';
+		if (function_exists($f)) {
+			return $f($saisie);
+		}
+	}
+	return true;
+}
+
+
+/**
+ * Renvoie true si la saisie correspond à un champ au sens HTML
+ * @param array $saisie
+ * @return bool
+ **/
+function saisies_saisie_est_champ(array $saisie): bool {
+	$type = $saisie['saisie'] ?? '';
+	if (include_spip("saisies/$type")) {
+		$f = $type . '_est_champ';
+		if (function_exists($f)) {
+			return $f($saisie);
+		}
+	}
+	return true;
+}
+
+/**
+ * Renvoi le label de la saisie
+ * la plupart du temps c'est juste le champ label
+ * mais pour certaines saisies c'est autre chose
+ * @param array $saisie
+ * @return string
+ **/
+function saisies_saisie_get_label(array $saisie): string {
+	$type = $saisie['saisie'] ?? '';
+	if (include_spip("saisies/$type")) {
+		$f = $type . '_get_label';
+		if (function_exists($f)) {
+			return $f($saisie);
+		}
+	}
+	return $saisie['options']['label'] ?? '';
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_lister.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_lister.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a7e6dbabd34f7c62b39a36b6b8e89e4372a1de0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_lister.php
@@ -0,0 +1,589 @@
+<?php
+
+/**
+ * Gestion de listes des saisies.
+ *
+ * @return SPIP\Saisies\Listes
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par identifiant unique.
+ *
+ * @param array $contenu        Le contenu d'un formulaire
+ * @param bool  $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
+ *
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_identifiant($contenu, $avec_conteneur = true) {
+	$saisies = [];
+
+	if (is_array($contenu)) {
+		foreach ($contenu as $ligne) {
+			if (is_array($ligne)) {
+				$enfants_presents = is_array($ligne['saisies'] ?? '');
+				if (array_key_exists('saisie', $ligne) && (!$enfants_presents || $avec_conteneur) && isset($ligne['identifiant'])) {
+					$saisies[$ligne['identifiant']] = $ligne;
+				}
+				if ($enfants_presents) {
+					$saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies'], $avec_conteneur));
+				}
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par nom.
+ *
+ * @param array $contenu        Le contenu d'un formulaire
+ * @param bool  $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
+ *
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_nom($contenu, $avec_conteneur = true) {
+	$saisies = [];
+	if (is_array($contenu)) {
+		foreach ($contenu as $ligne) {
+			if (is_array($ligne)) {
+				if (
+					array_key_exists('saisie', $ligne)
+					&& (!is_array($ligne['saisies'] ?? '') || $avec_conteneur)
+					&& isset($ligne['options'])
+				) {
+					$saisies[$ligne['options']['nom']] = $ligne;
+				}
+				if (is_array($ligne['saisies'] ?? '')) {
+					$saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies'], $avec_conteneur));
+				}
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Liste les saisies en parcourant tous les niveau de la hiérarchie, et en excluant les saisies ayant des sous-saisies
+ * @param array  $saisies Liste de saisies
+ * @return liste de ces saisies triées selon l'ordre de déclaration initiale
+ */
+function saisies_lister_finales($saisies) {
+	$saisies_retour = [];
+	foreach ($saisies as $identifiant => $saisie) {
+		if (isset($saisie['saisies'])) {
+			$saisies_retour = array_merge($saisies_retour, saisies_lister_finales($saisie['saisies']));
+		} elseif (isset($saisie['saisie'])) {// pour ne pas avoir les options gloables des saisies
+			$saisies_retour[] = $saisie;
+		}
+	}
+	return $saisies_retour;
+}
+/**
+ * Liste les saisies ayant une option X
+ * # saisies_lister_avec_option('sql', $saisies);.
+ *
+ *
+ * @param string $option  Nom de l'option cherchée
+ * @param array  $saisies Liste de saisies
+ * @param string $tri     tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
+ *
+ * @return liste de ces saisies triees par nom ayant une option X définie
+ */
+function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
+	$saisies_option = [];
+
+	// tri par nom si ce n'est pas le cas
+	$s = array_keys($saisies);
+	if (is_int(array_shift($s))) {
+		$trier = 'saisies_lister_par_' . $tri;
+		$saisies = $trier($saisies);
+	}
+
+	foreach ($saisies as $nom_ou_id => $saisie) {
+		if ($saisie['options'][$option] ?? '') {
+			$saisies_option[$nom_ou_id] = $saisie;
+		}
+	}
+
+	return $saisies_option;
+}
+
+/**
+ * Liste les saisies ayant une definition SQL.
+ *
+ * @param array  $saisies liste de saisies
+ * @param string $tri     tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
+ *
+ * @return liste de ces saisies triees par nom ayant une option sql définie
+ */
+function saisies_lister_avec_sql($saisies, $tri = 'nom') {
+	return saisies_lister_avec_option('sql', $saisies, $tri);
+}
+
+/**
+ * Liste les saisies d'un certain type.
+ *
+ * @example `$saisies_date = saisies_lister_avec_type($saisies, 'date')`
+ *
+ * @param array $saisies liste de saisies
+ * @param string|array $type Type de la saisie, ou tableau de types
+ * @param string $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom')
+ * @param bool avec_conteneur faut-il conserver l'arbo?
+ *
+ * @return liste de ces saisies triees par nom
+ */
+function saisies_lister_avec_type($saisies, $type, $tri = 'nom', $avec_conteneur = false) {
+	if (!is_array($type)) {
+		$type = [$type];
+	}
+	unset($saisies['options']);//Pas les options globales du formulaire
+	$saisies_type = [];
+
+	// tri par nom si ce n'est pas le cas
+	$s = array_keys($saisies);
+	if (is_int(array_shift($s)) && $tri && !$avec_conteneur) {
+		$trier = 'saisies_lister_par_' . $tri;
+		$saisies = $trier($saisies);
+	}
+
+	foreach ($saisies as $nom_ou_id => $saisie) {
+		if (in_array($saisie['saisie'], $type)) {
+			if ($avec_conteneur && isset($saisie['saisies'])) {
+				$saisie['saisies'] = saisies_lister_avec_type($saisie['saisies'], $type, $tri, $avec_conteneur);
+			}
+			$saisies_type[$nom_ou_id] = $saisie;
+		}
+	}
+
+	return $saisies_type;
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par type de saisie.
+ * $saisie['input']['input_1'] = $saisie.
+ *
+ * Attention : ne sont retournées que les saisies finales (qui ne contiennent pas de sous-saisies).
+ * @param array $contenu Le contenu d'un formulaire
+ *
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_type($contenu) {
+	$saisies = [];
+
+	if (is_array($contenu)) {
+		foreach ($contenu as $ligne) {
+			if (is_array($ligne)) {
+				if (array_key_exists('saisie', $ligne) && (!isset($ligne['saisies']))) {
+					$saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne;
+				}
+				if (is_array($ligne['saisies'] ?? '')) {
+					$saisies = array_merge_recursive($saisies, saisies_lister_par_type($ligne['saisies']));
+				}
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Liste les saisies par étapes s'il y en a
+ *
+ * @param array $saisies
+ * 		Liste des saisies
+ * @param bool $check_only = false, si true, se contente de vérifier si on gère les étapes, mais ne construit pas le tableau d'étape
+ * @return array|bool
+ * 		Retourne un tableau associatif par numéro d'étape avec pour chacune leurs saisies (ou bien true si check_only est à true), false si pas d'étapes
+ * 		Retourne un tableau associatif "etape_xxx" => "contenu de l'étape" avec pour chacune leurs saisies, false si pas d'étapes
+ * 		Ajoute si besoin une étape N+1 "Récapitulatif"
+ * 		Les noms des étapes sont automatiquement passés dans _T_ou_typo
+ */
+function saisies_lister_par_etapes($saisies, $check_only = false) {
+	$saisies_etapes = false;
+	$etapes = 0;
+
+	if ($saisies['options']['etapes_activer'] ?? '') {
+		if (isset($saisies['options']['etapes_ignorer_recapitulatif'])) {
+			$ignorer_recapitulatif = $saisies['options']['etapes_ignorer_recapitulatif'];
+		} else {
+			$ignorer_recapitulatif = false;
+		}
+
+		// Un premier parcourt pour compter les étapes
+		unset($saisies['options']);
+		foreach ($saisies as $cle => $saisie) {
+			if (is_array($saisies) && $saisie['saisie'] === 'fieldset') {
+				$etapes++;
+			}
+		}
+
+		// Seulement s'il y a au moins deux étapes
+		if ($etapes > 1) {
+			if ($check_only) {
+				return true;
+			}
+			$saisies_etapes = [];
+			$compteur_etape = 0;
+
+			// On reparcourt pour lister les saisies
+			foreach ($saisies as $cle => $saisie) {
+				// Si c'est un groupe, on ajoute son contenu à l'étape
+				if (($saisie['saisie'] ?? '') === 'fieldset') {
+					$compteur_etape++;
+					// S'il y a eu des champs hors groupe avant, on fusionne
+					if (isset($saisies_etapes["etape_$compteur_etape"]['saisies'])) {
+						$saisies_precedentes = $saisies_etapes["etape_$compteur_etape"]['saisies'];
+						$saisies_etapes["etape_$compteur_etape"] = $saisie;
+						$saisies_etapes["etape_$compteur_etape"]['saisies'] = array_merge($saisies_precedentes, $saisie['saisies']);
+					}
+					else {
+						$saisies_etapes["etape_$compteur_etape"] = $saisie;
+					}
+					$saisies_etapes["etape_$compteur_etape"]['options']['label'] = _T_ou_typo($saisies_etapes["etape_$compteur_etape"]['options']['label']);
+				}
+				// Sinon si champ externe à un groupe, on l'ajoute à toutes les étapes
+				elseif (isset($saisie['saisie'])) {
+					for ($e = 1; $e <= $etapes; $e++) {
+						if (!isset($saisies_etapes["etape_$e"]['saisies'])) {
+							$saisies_etapes["etape_$e"] = ['saisies' => []];
+						}
+						array_push($saisies_etapes["etape_$e"]['saisies'], $saisie);
+					}
+				}
+			}
+			//// Ajouter l'étape recapitulatif
+			if (!$ignorer_recapitulatif) {
+				$compteur_etape++;
+				if (test_plugin_actif('cvtupload')) {
+					include_spip('inc/cvtupload');
+					$valeurs = array_merge($_POST, cvtupload_vue_from_FILES());
+				} else {
+					$valeurs = $_POST;
+				}
+				$saisies_etapes["etape_$compteur_etape"] = [
+					'saisie' => 'fieldset',
+					'options' => [
+						'nom' => '@saisies_recapitulatif',
+						'label' => _T('saisies:etapes_recapitulatif_label')
+					],
+					'saisies' => [],
+					'valeurs' => $valeurs,
+				];
+			}
+		}
+	}
+
+	return $saisies_etapes;
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * une liste des noms des champs du formulaire.
+ *
+ * @param array $contenu        Le contenu d'un formulaire
+ * @param bool  $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
+ *
+ * @return array Un tableau listant les noms des champs
+ */
+function saisies_lister_champs($contenu, $avec_conteneur = true) {
+	$saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
+
+	return array_keys($saisies);
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * une liste des labels humains des vrais champs du formulaire (par nom)
+ *
+ * @param array $contenu        Le contenu d'un formulaire
+ * @param bool  $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
+ *
+ * @return array Un tableau listant les labels humains des champs
+ */
+function saisies_lister_labels($contenu, $avec_conteneur = false) {
+	$saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
+
+	$labels = [];
+	foreach ($saisies as $nom => $saisie) {
+		if (isset($saisie['options']['label'])) {
+			$labels[$nom] = $saisie['options']['label'];
+		}
+	}
+
+	return $labels;
+}
+
+/**
+ * A utiliser dans une fonction charger d'un formulaire CVT,
+ * cette fonction renvoie le tableau de contexte correspondant
+ * de la forme $contexte['nom_champ'] = ''.
+ *
+ * @param array $contenu Le contenu d'un formulaire (un tableau de saisies)
+ *
+ * @return array Un tableau de contexte
+ */
+function saisies_charger_champs($contenu) {
+	return array_fill_keys(saisies_lister_champs($contenu, false), null);
+}
+
+/**
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * une liste des valeurs par défaut des champs du formulaire.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ *
+ * @return array Un tableau renvoyant la valeur par défaut de chaque champs
+ */
+function saisies_lister_valeurs_defaut($contenu) {
+	$contenu = saisies_lister_par_nom($contenu, false);
+	$defauts = [];
+
+	foreach ($contenu as $nom => $saisie) {
+		// Si le nom du champ est un tableau indexé, il faut parser !
+		$nom = saisie_nom2name($nom);
+		if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)) {
+			$nom = $separe[1];
+			// Dans ce cas on ne récupère que le nom,
+			// la valeur par défaut du tableau devra être renseigné autre part
+			$defauts[$nom] = [];
+		}
+		else {
+			$defauts[$nom] = $saisie['options']['defaut'] ?? '';
+			$champ_defaut_session = $saisie['options']['defaut_session'] ?? '';
+			if ($champ_defaut_session) {
+				include_spip('inc/session');
+					$valeur_session = session_get($champ_defaut_session);
+					if ($valeur_session) {
+						$defauts[$nom] = $valeur_session;
+					}
+			}
+		}
+	}
+
+	return $defauts;
+}
+
+/**
+ * Compare deux tableaux de saisies pour connaitre les différences.
+ *
+ * @param array  $saisies_anciennes Un tableau décrivant des saisies
+ * @param array  $saisies_nouvelles Un autre tableau décrivant des saisies
+ * @param bool   $avec_conteneur    Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
+ * @param string $tri               Comparer selon quel tri ? 'nom' / 'identifiant'
+ *
+ * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
+ */
+function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur = true, $tri = 'nom') {
+	$trier = "saisies_lister_par_$tri";
+	$saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur);
+	$saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur);
+
+	// Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles
+	$saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles);
+	// Les saisies ajoutées, c'est le contraire
+	$saisies_ajoutees = array_diff_key($saisies_nouvelles, $saisies_anciennes);
+	// Il reste alors les saisies qui ont le même nom
+	$saisies_restantes = array_intersect_key($saisies_anciennes, $saisies_nouvelles);
+	// Dans celles-ci, celles qui sont modifiées sont celles dont la valeurs est différentes
+	$saisies_modifiees = array_udiff(array_diff_key($saisies_nouvelles, $saisies_ajoutees), $saisies_restantes, 'saisies_comparer_rappel');
+	#$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel');
+	// Et enfin les saisies qui ont le même nom et la même valeur
+	$saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees);
+
+	return [
+		'supprimees' => $saisies_supprimees,
+		'ajoutees' => $saisies_ajoutees,
+		'modifiees' => $saisies_modifiees,
+		'identiques' => $saisies_identiques,
+	];
+}
+
+/**
+ * Compare deux saisies et indique si elles sont égales ou pas.
+ *
+ * @param array $a Une description de saisie
+ * @param array $b Une autre description de saisie
+ *
+ * @return int Retourne 0 si les saisies sont identiques, 1 sinon.
+ */
+function saisies_comparer_rappel($a, $b) {
+	if ($a === $b) {
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+/**
+ * Compare deux tableaux de saisies pour connaitre les différences
+ * en s'appuyant sur les identifiants de saisies.
+ *
+ * @see saisies_comparer()
+ *
+ * @param array $saisies_anciennes Un tableau décrivant des saisies
+ * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
+ * @param bool  $avec_conteneur    Indique si on veut prendre en compte dans la comparaison
+ *                                 les conteneurs comme les fieldsets
+ *
+ * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
+ */
+function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur = true) {
+	return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, 'identifiant');
+}
+
+/**
+ * Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun.
+ *
+ * @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun
+ */
+function saisies_autonomes() {
+	$saisies_autonomes = pipeline(
+		'saisies_autonomes',
+		[
+			'fieldset',
+			'conteneur_inline',
+			'hidden',
+			'destinataires',
+			'explication',
+			'champ',
+		]
+	);
+
+	return $saisies_autonomes;
+}
+
+
+/**
+ * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin
+ *
+ * @param array $saisies Un tableau décrivant les saisies
+ * @param array|string $id_ou_nom_ou_chemin L'identifiant ou le nom de la saisie à chercher ou le chemin sous forme d'une liste de clés
+ * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin
+ * @return array Retourne soit la saisie, soit son chemin, soit null
+ */
+function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin = false) {
+	unset($saisies['options']);
+	if (is_array($saisies) && $id_ou_nom_ou_chemin) {
+		if (is_string($id_ou_nom_ou_chemin)) {
+			$nom = $id_ou_nom_ou_chemin;
+			// identifiant ? premier caractere @
+			$id = ($nom[0] == '@');
+
+			foreach ($saisies as $cle => $saisie) {
+				$chemin = [$cle];
+				// notre saisie est la bonne ?
+				if ($id) {
+					$nom_cette_saisie = $saisie['identifiant'] ?? '';
+				} else {
+					$nom_cette_saisie = $saisie['options']['nom'] ?? '';
+				}
+				if ($nom === $nom_cette_saisie) {
+					return $retourner_chemin ? $chemin : $saisie;
+					// sinon a telle des enfants ? et si c'est le cas, cherchons dedans
+				} elseif (
+					is_array($saisie['saisies'] ?? '') && ($saisie['saisies'] ?? [])
+					&& ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))
+				) {
+					return $retourner_chemin ? array_merge($chemin, ['saisies'], $retour) : $retour;
+				}
+			}
+		} elseif (is_array($id_ou_nom_ou_chemin)) {
+			$chemin = $id_ou_nom_ou_chemin;
+			$saisie = $saisies;
+
+			// On vérifie l'existence quand même
+			foreach ($chemin as $cle) {
+				if (isset($saisie[$cle])) {
+					$saisie = $saisie[$cle];
+				} else {
+					return null;
+				}
+			}
+
+			// Si c'est une vraie saisie
+			if (($saisie['saisie'] ?? '') && ($saisie['options']['nom'] ?? '')) {
+				return $retourner_chemin ? $chemin : $saisie;
+			}
+		}
+	}
+
+	return null;
+}
+
+/**
+ * Prend un tableau de saisie
+ * retourne un tableau contenant uniquement les champs de saisie organisé par section (fieldset), avec pour chaque saisie le nom de la saisie en clé
+ * @param array $saisies le tableau de saisie
+ * @param array $options tableau d'options
+ *	- string `callback_section` nom de la fonction de rappel sur les section, à défaut prend le nom ; exemple : `'saisies_saisie_get_label'`
+ *	- string `callback_champ` nom de la fonction de rappel sur les champ, à défaut renvoie la saisie complète ; exemple : `'saisies_saisie_get_label'`
+ *	- int `profondeur_max_output` indique sur combien de niveau doit être le tableau d'output, si pas défini / <= 0 , va jusqu'au bout de la hiérarchie, sinon ca aplatit les niveaux les plus profonds
+ *	- array|string forcer_type: liste de type à prendre, en excluant les autres
+ * @return array
+**/
+function saisies_lister_champs_par_section(array $saisies, array $options = []): array {
+	unset($saisies['options']);
+
+	$resultat = [];
+
+
+	// Normaliser les options
+	$callback_section = $options['callback_section'] ?? function (array $s): string {
+		return $s['options']['nom'];
+	};
+	$callback_champ = $options['callback_champ'] ?? function (array $s): array {
+		return 	$s;
+	};
+	$profondeur_max_output = intval($options['profondeur_max_output'] ?? 0);
+
+	$forcer_type = $options['forcer_type'] ?? [];
+	if (!is_array($forcer_type)) {
+		$forcer_type = [trim($forcer_type)];
+	}
+	$forcer_type = array_filter($forcer_type);
+
+
+	// À quel niveau est-ton dans l'arborescence ?
+	static $profondeur_actuelle = 1;
+	$profondeur_actuelle++;
+
+	// Parcourir les saisies et remplir $resultat (array)
+	foreach ($saisies as $saisie) {
+		if (saisies_saisie_est_avec_sous_saisies($saisie) && saisies_saisie_est_labelisable($saisie)) {
+			$section = $callback_section($saisie);
+
+			if (!$profondeur_max_output || $profondeur_actuelle <= $profondeur_max_output) {
+				$resultat[$section] = saisies_lister_champs_par_section($saisie['saisies'], $options);
+			} else {
+				$resultat[$section] =
+					saisies_lister_champs_par_section(
+						saisies_lister_finales($saisie['saisies']),
+						$options
+					);
+			}
+		} elseif (saisies_saisie_est_avec_sous_saisies($saisie)) {
+			$resultat = array_merge($resultat, saisies_lister_champs_par_section($saisie['saisies'], $options));
+		} elseif (saisies_saisie_est_champ($saisie)) {
+			$nom = $saisie['options']['nom'];
+			if (!$forcer_type) {
+				$resultat[$nom] = $callback_champ($saisie);
+			} elseif (in_array($saisie['saisie'], $forcer_type)) {
+				$resultat[$nom] = $callback_champ($saisie);
+			}
+		}
+	}
+
+	// Avant de ressortir, diminuer la profondeur actuelle
+	$profondeur_actuelle--;
+	return $resultat;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_lister_disponibles.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_lister_disponibles.php
new file mode 100644
index 0000000000000000000000000000000000000000..185da799cec524f186d627b2934138b23ec24f78
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_lister_disponibles.php
@@ -0,0 +1,367 @@
+<?php
+
+/**
+ * Gestion de listes des saisies disponibles (via .yaml)
+ *
+ * @return SPIP\Saisies\Listes\Disponibles
+ **/
+
+
+/**
+ * Liste toutes les saisies configurables (ayant une description).
+ * @param string $saisies_repertoire le répertoire où trouver les saisies
+ * @param bool $inclure_obsoletes : faut-il inclure les saisies obsolètes ?
+ * @return array Un tableau listant des saisies et leurs options
+ */
+function saisies_lister_disponibles($saisies_repertoire = 'saisies', $inclure_obsoletes = true) {
+	if (!defined('_DIR_PLUGIN_YAML')) {
+		throw new Exception('La fonction saisies_lister_disponibles() nécessite le plugin YAML');
+	}
+	static $saisies = null;
+	static $saisies_obsoletes = [];
+
+	if (is_null($saisies)) {
+		$saisies = [];
+		$liste = find_all_in_path("$saisies_repertoire/", '.+[.]yaml$');
+
+		if (count($liste)) {
+			foreach ($liste as $fichier => $chemin) {
+				$type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
+				$dossier = str_replace($fichier, '', $chemin);
+				// On ne garde que les saisies qui ont bien le HTML avec !
+				if (
+					file_exists("$dossier$type_saisie.html")
+					&& (
+						is_array($saisie = saisies_charger_infos($type_saisie))
+					)
+				) {
+					if ($saisie['obsolete'] ?? false) {
+						$saisies_obsoletes[$type_saisie] = $saisie;
+					} else {
+						$saisies[$type_saisie] = $saisie;
+					}
+				}
+			}
+		}
+	}
+	if ($inclure_obsoletes) {
+		return pipeline('saisies_lister_disponibles', array_merge($saisies, $saisies_obsoletes));
+	} else {
+		return pipeline('saisies_lister_disponibles', $saisies);
+	}
+}
+
+/**
+ * Liste tous les groupes de saisies configurables (ayant une description).
+ * @return array Un tableau listant des saisies et leurs options
+ */
+function saisies_groupes_lister_disponibles($saisies_repertoire = 'saisies') {
+	static $saisies = null;
+
+	if (is_null($saisies)) {
+		$saisies = [];
+		$liste = find_all_in_path("$saisies_repertoire/", '.+[.]yaml$');
+
+		if (count($liste)) {
+			foreach ($liste as $fichier => $chemin) {
+				$type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
+				$dossier = str_replace($fichier, '', $chemin);
+
+				if (is_array($saisie = saisies_charger_infos($type_saisie, $saisies_repertoire))) {
+					$saisies[$type_saisie] = $saisie;
+				}
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Lister les saisies existantes ayant une définition SQL.
+ * @param string $saisies_repertoire le répertoire où trouver les saisies
+ * @param bool $inclure_obsoletes : faut-il inclure les saisies obsolètes ?
+ * @return array Un tableau listant des saisies et leurs options
+ */
+function saisies_lister_disponibles_sql($saisies_repertoire = 'saisies', $inclure_obsoletes = true) {
+	$saisies = [];
+	$saisies_disponibles = saisies_lister_disponibles($saisies_repertoire, $inclure_obsoletes);
+	foreach ($saisies_disponibles as $type => $saisie) {
+		if ($saisie['defaut']['options']['sql'] ?? '') {
+			$saisies[$type] = $saisie;
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Charger les informations contenues dans le YAML d'une saisie.
+ *
+ * @param string $type_saisie Le type de la saisie
+ *
+ * @return array Un tableau contenant le YAML décodé
+ */
+function saisies_charger_infos($type_saisie, $saisies_repertoire = 'saisies') {
+	static $cache = [];
+	if (defined('_DIR_PLUGIN_YAML')) {
+		include_spip('inc/yaml');
+		$fichier = find_in_path("$saisies_repertoire/$type_saisie.yaml");
+		if (isset($cache[$fichier])) {
+			$saisie = $cache[$fichier];
+		} else {
+			$saisie = yaml_charger_inclusions(yaml_decode_file($fichier));
+
+			if (is_array($saisie)) {
+				$saisie = saisies_recuperer_heritage($saisie, $saisies_repertoire);
+				$saisie['titre'] = _T_ou_typo($saisie['titre'] ?? '');
+				if (!$saisie['titre']) {
+					$saisie['titre'] = $type_saisie;
+				};
+				$saisie['description'] =  _T_ou_typo($saisie['description'] ?? '');
+				if ($saisie['icone'] ?? '') {
+					$icone = $saisie['icone'];
+					$saisie['icone'] = chemin_image($icone);
+					if (!$saisie['icone']) {
+						$saisie['icone'] = find_in_path($icone);
+					}
+				} else {
+					$saisie['icone'] = '';
+				}
+			}
+			$cache[$fichier] = $saisie;
+		}
+	}
+	else {
+		throw new Exception('La fonction saisies_charger_infos() nécessite le plugin YAML');
+	}
+
+	return $saisie;
+}
+/**
+ * Permet à une saisie d'hériter des options et valeur par défaut d'une autre saisies
+ * @param string $saisie la saisie
+ * @param string $saisies_repertoire = 'saisies'
+ * @return array
+ **/
+function saisies_recuperer_heritage($saisie, $saisies_repertoire = 'saisies') {
+	if (!isset($saisie['heritage'])) {
+		return $saisie;
+	}
+	$heritage = $saisie['heritage'];
+	$parent = saisies_charger_infos($heritage['parent'], $saisies_repertoire);
+	$saisie_options = &$parent['options'];
+
+	// Enlever les options
+	if (isset($heritage['enlever_options'])) {
+		foreach ($heritage['enlever_options'] as $option) {
+			$saisie_options = saisies_supprimer($saisie_options, $option);
+		}
+	}
+	// Les saisies qu'on modifie
+	if (isset($heritage['modifier_options'])) {
+		foreach ($heritage['modifier_options'] as $option) {
+			if (isset($option['chemin'])) {
+				$id_ou_nom_ou_chemin = $option['chemin'];
+				unset($option['chemin']);
+			} elseif (isset($option['options']['nom'])) {
+				$id_ou_nom_ou_chemin = $option['options']['nom'];
+			} else {
+				continue;
+			}
+			if (($option['mode'] ?? '') === 'fusionner') {
+				$fusion = true;
+			} else {
+				$fusion = false;
+			}
+			unset($option['mode']);
+			$saisie_options = saisies_modifier($saisie_options, $id_ou_nom_ou_chemin, $option, $fusion);
+		}
+	}
+	//Ajouter les nouvelles options
+	if (isset($heritage['ajouter_options'])) {
+		foreach ($heritage['ajouter_options'] as $option) {
+			if (isset($option['chemin'])) {
+				$chemin = $option['chemin'];
+				unset($option['chemin']);
+				$saisie_options = saisies_inserer($saisie_options, $option, $chemin);
+			} elseif (isset($option['inserer_avant'])) {
+				$chemin = $option['inserer_avant'];
+				unset($option['inserer_avant']);
+				$saisie_options = saisies_inserer_avant($saisie_options, $option, $chemin);
+			} elseif (isset($option['inserer_apres'])) {
+				$chemin = $option['inserer_apres'];
+				unset($option['inserer_apres']);
+				$saisie_options = saisies_inserer_apres($saisie_options, $option, $chemin);
+			}
+		}
+	}
+
+	// Nettoyage et fusion finale
+	unset($saisie['heritage']);
+
+	$saisie = array_replace_recursive($parent, $saisie);
+	return $saisie;
+}
+
+
+
+/**
+ * Lister les catégories par défaut, puis les envoyer au pipeline
+ * @return array liste des catégories
+ **/
+function saisies_lister_categories() {
+	$categories = pipeline(
+		'saisies_lister_categories',
+		[
+			'libre' => [
+				'nom' => _T('saisies:categorie_libre_label'),
+			],
+			'choix' => [
+				'nom' =>  _T('saisies:categorie_choix_label'),
+			],
+			'structure' => [
+				'nom' =>  _T('saisies:categorie_structure_label'),
+			],
+			'objet' => [
+				'nom' =>  _T('saisies:categorie_objet_label'),
+			],
+			'defaut' => [
+				'nom' =>  _T('saisies:categorie_defaut_label'),
+			]
+		]
+	);
+
+	// S'assurer que defaut soit tout le temps à la fin
+	$defaut = $categories['defaut'];
+	unset($categories['defaut']);
+	$categories['defaut'] = $defaut;
+
+	return $categories;
+}
+
+/**
+ * Lister les saisies disponibles en les regroupant en catégories
+ * @param array $options
+ *	'saisies_repertoire' => string ('saisies')
+ *	'inclure_obsoletes' => bool (false)
+ *	'categorie' => string|null|false (false)
+ *	'uniquement_sql' => bool (false) pour limiter à celle avec sql
+ * @return array
+ **/
+function saisies_lister_disponibles_par_categories($options = []) {
+	// Options par défaut
+	if (!isset($options['saisies_repertoire'])) {
+		$options['saisies_repertoire'] = 'saisies';
+	}
+	if (!isset($options['inclure_obsoletes'])) {
+		$options['inclure_obsoletes'] = false;
+	}
+	if (!isset($options['categorie'])) {
+		$options['categorie'] = false;
+	}
+
+	if ($options['uniquement_sql'] ?? '') {
+		$saisies = saisies_lister_disponibles_sql($options['saisies_repertoire'], $options['inclure_obsoletes']);
+	} else {
+		$saisies = saisies_lister_disponibles($options['saisies_repertoire'], $options['inclure_obsoletes']);
+	}
+
+	return saisies_regrouper_disponibles_par_categories($saisies, $options['categorie']);
+}
+/**
+ * Liste par catégorie les saisies disponibles ayant une définition SQL
+ * @param array $options > voir saisies_lister_disponibles_par_categories
+ * return array
+ **/
+function saisies_lister_disponibles_sql_par_categories($options = []) {
+	$options['uniquement_sql'] = true;
+	return saisies_lister_disponibles_par_categories($options);
+}
+
+
+
+/**
+ * Regroupe par categories les saisies
+ * @param array $saisies
+ * @param string|null $categorie_demande pour ne renvoyer que cette catégorie
+ * @return array
+ **/
+function saisies_regrouper_disponibles_par_categories($saisies = [], $categorie_demande = null) {
+
+	$categories = saisies_lister_categories();
+	foreach ($saisies as $s => $saisie) {
+		if (isset($saisie['categorie']['type'])) {
+			$categorie = $saisie['categorie']['type'];
+		} else {//Sinon defaut
+			$categorie = 'defaut';
+			spip_log($saisie['titre'] . ' sans catégorie, reclassée en defaut', 'saisies');
+		}
+
+		// Saisie dans une catégorie non existante
+		if (!isset($categories[$categorie])) {
+			spip_log($saisie['titre'] . "dans une catégorie inexistante ($categorie), reclassée en defaut", 'saisies');
+			$categorie = 'defaut';
+		}
+
+		// Si l'On demande uniquement une cate
+		if ($categorie_demande && $categorie_demande !== $categorie) {
+			continue;
+		}
+
+		// Vérifier qu'il y a deja des saisies pour cette catégorie
+		if (!isset($categories[$categorie]['saisies'])) {
+			$categories[$categorie]['saisies'] = [];
+		}
+
+		$categories[$categorie]['saisies'][$s] = $saisie;
+	}
+	foreach ($categories as $cat => &$desc) {
+		if (isset($desc['saisies'])) {
+			uasort($desc['saisies'], 'saisies_lister_disponibles_par_categories_usort');
+		}
+	}
+
+	return $categories;
+}
+
+
+
+/**
+ * Function de comparaison pour trier les saisies disponibles par rang
+ * Si pas de rang défini, on met après ceux avec rang
+ * Si deux saisies avec le même rang, on se rabat sur l'ordre alpha
+ * @param $saisie1
+ * @param $saisie2
+ * @return int
+ **/
+function saisies_lister_disponibles_par_categories_usort($saisie1, $saisie2) {
+	if (!isset($saisie1['categorie']['rang']) && isset($saisie2['categorie']['rang'])) {
+		return +1;
+	}
+	if (isset($saisie1['categorie']['rang']) && !isset($saisie2['categorie']['rang'])) {
+		return -1;
+	}
+	if (!isset($saisie1['categorie']['rang']) && !isset($saisie2['categorie']['rang'])) {
+		$rang1 = $rang2 = 0;
+	} else {
+		$rang1 = $saisie1['categorie']['rang'];
+		$rang2 = $saisie2['categorie']['rang'];
+	}
+	// On utilise la fonction translitteration faute de mieux, pour avoir Évenement avant Rubrique, mais en réalité il faudrait gerer cela par les fonctions de comparaison de Inl
+	$titre1 = translitteration($saisie1['titre']);
+	$titre2 = translitteration($saisie2['titre']);
+	// Rangs égaux > on tri par titre
+	if ($rang1 == $rang2) {
+		if ($titre1 > $titre2) {
+			return 1;
+		} elseif ($titre1 < $titre2) {
+			//Même si a priori peu probable que ce soit égal !
+			return -1;
+		}
+		return 0;
+		// Rang différent : on tri par rang
+	} else {
+		return $rang1 - $rang2;
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_manipuler.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_manipuler.php
new file mode 100644
index 0000000000000000000000000000000000000000..193df88605ac9d6cee8b62443fe2b4ac36424dda
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_manipuler.php
@@ -0,0 +1,660 @@
+<?php
+
+/**
+ * Gestion de la manipulation des saisies.
+ *
+ * @return SPIP\Saisies\Manipuler
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Supprimer une saisie dont on donne l'identifiant, le nom ou le chemin.
+ *
+ * @param array $saisies
+		 Tableau des descriptions de saisies
+ * @param string|array $id_ou_nom_ou_chemin
+ *   L'identifiant unique
+ *     ou le nom de la saisie à supprimer
+ *     ou son chemin sous forme d'une liste de clés
+ *
+ * @return array
+ *               Tableau modifié décrivant les saisies
+ */
+function saisies_supprimer($saisies, $id_ou_nom_ou_chemin) {
+	// On enlève les options générales avant de manipuler
+	if (isset($saisies['options'])) {
+		$options_generales = $saisies['options'];
+		unset($saisies['options']);
+	}
+
+	// Si la saisie n'existe pas, on ne fait rien
+	if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)) {
+		// La position finale de la saisie
+		$position = array_pop($chemin);
+
+		// On va chercher le parent par référence pour pouvoir le modifier
+		$parent = &$saisies;
+		foreach ($chemin as $cle) {
+			$parent = &$parent[$cle];
+		}
+
+		// On supprime et réordonne
+		unset($parent[$position]);
+		$parent = array_values($parent);
+	}
+
+	// On remet les options générales après avoir manipulé
+	if (isset($options_generales)) {
+		$saisies['options'] = $options_generales;
+	}
+
+	return $saisies;
+}
+
+/**
+ * Insère une saisie à une position donnée dans un tableau de donnée
+ *		- soit en lui passant un chemin
+ *		- soit en lui passant une saisie devant laquelle se placer
+ * @param array $saisies     Tableau des descriptions de saisies
+ * @param array $saisie     Description de la saisie à insérer
+ * @param array|string $id_ou_nom_ou_chemin
+ *	- Si array c'est un chemin
+ *     Position complète où insérer la saisie
+ *				- Si directement à la racine du tableau : array(<index_où_inserer>)
+ *				- Si au sein d'un fieldset ou assimilé : array(<index_du _fieldset>, 'saisies', <index_où_inserer_au_sein_du_fieldset>)
+ *	- Si string
+ *		- Si entre crochets, ca veut dire qu'on insère à la fin d'un fieldset `[fieldset]`
+ *		- Si entre crochets, suivis d'un entier entre crochet, on insère à une position données dans le fieldset `[fieldset][0]`
+ *		- Si pas de crochet, on insère avant la saisie `saisie`
+ *  - En absence, insère la saisie à la fin.
+ * @return array
+ *     Tableau des saisies complété de la saisie insérée
+ **/
+function saisies_inserer($saisies, $saisie, $id_ou_nom_ou_chemin = []) {
+	if (is_string($id_ou_nom_ou_chemin) && $id_ou_nom_ou_chemin) {//Est-ce qu'on n'a un nom ou un id ?
+		if (preg_match('/^\[(@?[\w]*)\](\[([\d])*\])*$/', $id_ou_nom_ou_chemin, $match)) {//Si [fieldset], inserer à la fin du fieldset, si [fieldset][X] inserer à la position X dans le fieldset
+			if (isset($match[3])) {
+				$position = $match[3];
+			} else {
+				$position = 10000000;
+			}
+			$parent = saisies_chercher($saisies, $match[1], true);
+			$chemin = array_merge($parent, ['saisies', $position]);
+			$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
+		} else {
+			$saisies = saisies_inserer_avant($saisies, $saisie, $id_ou_nom_ou_chemin);
+		}
+	}	else {
+		$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $id_ou_nom_ou_chemin);
+	}
+	return $saisies;
+}
+
+/**
+ * Insère une saisie avant une autre saisie.
+ *
+ * @param array $saisies     Tableau des descriptions de saisies
+ * @param array $saisie     Description de la saisie à insérer
+ * @param array $id_ou_nom_ou_chemin identifiant ou nom ou chemin de la saisie devant laquelle inserer
+ * @return array
+ *     Tableau des saisies complété de la saisie insérée
+ */
+function saisies_inserer_avant($saisies, $saisie, $id_ou_nom_ou_chemin) {
+	if (is_array($id_ou_nom_ou_chemin)) {
+		$chemin = $id_ou_nom_ou_chemin;
+	} else {
+		$chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
+	}
+	$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
+	return $saisies;
+}
+
+/**
+ * Insère une saisie après une autre saisie.
+ *
+ * @param array $saisies     Tableau des descriptions de saisies
+ * @param array $saisie     Description de la saisie à insérer
+ * @param array $id_ou_nom_ou_chemin identifiant ou nom ou chemin de la saisie devant laquelle inserer
+ * @return array
+ *     Tableau des saisies complété de la saisie insérée
+ */
+function saisies_inserer_apres($saisies, $saisie, $id_ou_nom_ou_chemin) {
+	if (is_array($id_ou_nom_ou_chemin)) {
+		$chemin = $id_ou_nom_ou_chemin;
+	} else {
+		$chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
+	}
+	// Si la saisie que l'on cherche n'existe pas, insérer tout à la fin
+	if ($chemin === null) {
+		$saisies = saisies_inserer_selon_chemin($saisies, $saisie);
+	} else {
+		$chemin[count($chemin) - 1]++;
+		$saisies = saisies_inserer_selon_chemin($saisies, $saisie, $chemin);
+	}
+	//Augmenter de 1 le dernier element du chemin
+	return $saisies;
+}
+
+/**
+ * Insère une saisie à une position donnée, en lui passant un chemin.
+ *
+ * @param array $saisies     Tableau des descriptions de saisies
+ * @param array $saisie     Description de la saisie à insérer
+ * @param array $chemin
+ *     Position complète où insérer la saisie
+ *				- Si directement à la racine du tableau : array(<index_où_inserer>)
+ *				- Si au sein d'un fieldset ou assimilé : array(<index_du _fieldset>, 'saisies', <index_où_inserer_au_sein_du_fieldset>)
+ *     En absence, insère la saisie à la fin.
+ * @return array
+ *     Tableau des saisies complété de la saisie insérée
+ */
+function saisies_inserer_selon_chemin($saisies, $saisie, $chemin = []) {
+	// On enlève les options générales avant de manipuler
+	if (isset($saisies['options'])) {
+		$options_generales = $saisies['options'];
+		unset($saisies['options']);
+	}
+	// On vérifie quand même que ce qu'on veut insérer est correct
+	if (isset($saisie['saisie']) && isset($saisie['options']['nom'])) {
+		// ajouter un identifiant
+		$saisie = saisie_identifier($saisie);
+
+		// Par défaut le parent c'est la racine
+		$parent = &$saisies;
+		// S'il n'y a pas de position, on va insérer à la fin du formulaire
+		if (!$chemin) {
+			$position = count($parent);
+		} elseif (is_array($chemin)) {
+			$position = array_pop($chemin);
+			foreach ($chemin as $cle) {
+				// Si la clé est un conteneur de saisies ("saisies") et qu'elle n'existe pas encore, on la crée
+				if ($cle == 'saisies' && !isset($parent[$cle])) {
+					$parent[$cle] = [];
+				}
+				$parent = &$parent[$cle];
+			}
+			// On vérifie maintenant que la position est cohérente avec le parent
+			if ($position < 0) {
+				$position = 0;
+			} elseif ($position > count($parent)) {
+				$position = count($parent);
+			}
+		}
+		// Et enfin on insère
+		array_splice($parent, $position, 0, [$saisie]);
+	}
+
+	// On remet les options générales après avoir manipulé
+	if (isset($options_generales)) {
+		$saisies['options'] = $options_generales;
+	}
+
+	return $saisies;
+}
+
+
+/**
+ * Duplique une saisie (ou groupe de saisies)
+ * en placant la copie à la suite de la saisie d'origine.
+ * Modifie automatiquement les identifiants des saisies.
+ *
+ * @param array        $saisies             Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie a dupliquer
+ *
+ * @return array Retourne le tableau modifié des saisies
+ */
+function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin) {
+	// On récupère le contenu de la saisie à déplacer
+	$saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
+	if ($saisie) {
+		list($clone) = saisies_transformer_noms_auto($saisies, [$saisie]);
+		// insertion apres quoi ?
+		$chemin_validation = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
+		// 1 de plus pour mettre APRES le champ trouve
+		++$chemin_validation[count($chemin_validation) - 1];
+		// On ajoute "copie" après le label du champs
+		if (isset($clone['options']['label'])) {
+			$clone['options']['label'] .= ' ' . _T('saisies:construire_action_dupliquer_copie');
+		}
+
+		// Création de nouveau identifiants pour le clone
+		$clone = saisie_identifier($clone, true);
+
+		$saisies = saisies_inserer($saisies, $clone, $chemin_validation);
+	}
+
+	return $saisies;
+}
+
+/**
+ * Déplace une saisie existante autre part.
+ *
+ * @param array        $saisies             Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
+ * @param string       $ou
+ *	- Le nom de la saisie devant laquelle on déplacera
+ *	- OU le nom d'un conteneur entre crochets [conteneur] (et dans ce cas on déplace à la fin de conteneur)
+ *	- OU le nom d'un conteneur entre crochets suivi d'un identifiant numérique entre crochets [conteneur][x] (et dans ce cas on déplace à la position x au sein du conteneur)
+ * @param string $avant_ou_apres (optionel) : valeur possible : `'avant'` ou `'apres'`, pour inserer respectivent avant/après la saisie `$ou`
+ * @return array Retourne le tableau modifié des saisies
+ */
+function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou, $avant_ou_apres = 'avant') {
+	// Si le paramètre $avant_ou_apres est erronné, on arrête là
+	if ($avant_ou_apres !== 'avant' && $avant_ou_apres !== 'apres') {
+		return $saisies;
+	}
+	// On récupère le contenu de la saisie à déplacer
+	$saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
+
+	// Si on l'a bien trouvé
+	if ($saisie) {
+		// On cherche l'endroit où la déplacer
+		// Si $ou est vide, c'est à la fin de la racine
+		if (!$ou) {
+			$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+			$chemin = [count($saisies)];
+		} elseif (preg_match('/^\[(@?[\w]*)\](\[([\d])*\])*$/', $ou, $match)) {
+			// Si l'endroit est entre crochet, c'est un conteneur
+			$parent = $match[1];
+			// Si dans les crochets il n'y a rien, on met à la fin du formulaire
+			if (!$parent) {
+				$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+				$chemin = [count($saisies)];
+			} elseif (saisies_chercher($saisies, $parent, true)) {
+				// Sinon on vérifie que ce conteneur existe
+				// S'il existe on supprime la saisie et on recherche la nouvelle position
+				$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+				$parent = saisies_chercher($saisies, $parent, true);
+				//Si [fieldset], inserer à la fin du fieldset, si [fieldset][X] inserer à la position X dans le fieldset
+				if (isset($match[3])) {
+					$position = $match[3];
+				} else {
+					$position = 10000000;
+				}
+				$chemin = array_merge($parent, ['saisies', $position]);
+			} else {
+				$chemin = false;
+			}
+		} else {
+			// Sinon ça sera devant un champ
+			// On vérifie que le champ existe
+			if (saisies_chercher($saisies, $ou, true)) {
+				// S'il existe on supprime la saisie
+				$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+				// Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie
+				$chemin = saisies_chercher($saisies, $ou, true);
+			} else {
+				$chemin = false;
+			}
+		}
+
+		// Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
+		if ($chemin) {
+			if ($avant_ou_apres === 'avant') {
+				$saisies = saisies_inserer($saisies, $saisie, $chemin);
+			} else {
+				$saisies = saisies_inserer_apres($saisies, $saisie, $chemin);
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Déplacer une saisie existante avant une autre
+ * @param array        $saisies             Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
+ * @param string       $ou la saisie devant laquelle déplacer
+ * @return array $string
+ * @use saisie_deplacer()
+ **/
+function saisies_deplacer_avant($saisies, $id_ou_nom_ou_chemin, $ou) {
+	return saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou, 'avant');
+}
+
+
+/**
+ * Déplacer une saisie existante après une autre
+ * @param array        $saisies             Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
+ * @param string       $ou la saisie devant laquelle déplacer
+ * @return array $string
+ * @use saisie_deplacer()
+ **/
+function saisies_deplacer_apres($saisies, $id_ou_nom_ou_chemin, $ou) {
+	return saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou, 'apres');
+}
+
+/**
+ * Modifie une saisie.
+ *
+ * @param array        $saisies             Un tableau décrivant les saisies
+ * @param array|string $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à modifier
+ * @param array        $modifs              Le tableau des modifications à apporter à la saisie
+ * @param bool				 $fusion							True si on veut simplifier rajouter des choses, sans tout remplacer
+ * @return array Retourne le tableau décrivant les saisies, mais modifié
+ */
+function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs, $fusion = false) {
+	if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)) {
+		$position = array_pop($chemin);
+		$parent = &$saisies;
+		foreach ($chemin as $cle) {
+			$parent = &$parent[$cle];
+		}
+
+		// On récupère le type tel quel
+		$modifs['saisie'] = $parent[$position]['saisie'];
+		// On récupère le nom s'il n'y est pas
+		if (!isset($modifs['options']['nom'])) {
+			$modifs['options']['nom'] = $parent[$position]['options']['nom'];
+		}
+		// On récupère les enfants tels quels s'il n'y a pas des enfants dans la modif
+		if (
+			!isset($modifs['saisies'])
+			&& isset($parent[$position]['saisies'])
+			&& is_array($parent[$position]['saisies'])
+		) {
+			$modifs['saisies'] = $parent[$position]['saisies'];
+		}
+		// Pareil pour les vérifications
+		if (
+			!isset($modifs['verifier'])
+			&& is_array($parent[$position]['verifier'] ?? '')
+		) {
+			$modifs['verifier'] = $parent[$position]['verifier'];
+		}
+
+		// Si 'nouveau_type_saisie' est donnee, c'est que l'on souhaite
+		// peut être changer le type de saisie !
+		// Note : on maintient encore la syntaxe historique qui met cela dans 'options', mais elle n'est pas nécessaire et disparaitra en 6.0
+		if ($type = ($modifs['nouveau_type_saisie'] ?? '')) {
+			$modifs['saisie'] = $type;
+			unset($modifs['nouveau_type_saisie']);
+		} elseif ($type = ($modifs['options']['nouveau_type_saisie'] ?? '')) {
+			$modifs['saisie'] = $type;
+			unset($modifs['options']['nouveau_type_saisie']);
+			trigger_error('Dans la fonction saisies_modifier, nouveau_type_saisie doit être appelé à la racine de $modifs. L\'appel dans $options est deprécié et sera supprimé en v6.', E_USER_DEPRECATED);
+			spip_log('Dans la fonction saisies_modifier, nouveau_type_saisie doit être appelé à la racine de $modifs. L\'appel dans $options est deprécié et sera supprimé en v6.', 'saisies');
+		}
+		// On remplace tout
+		if (!$fusion) {
+			$parent[$position] = $modifs;
+		} else {
+			$parent[$position] = array_replace_recursive($parent[$position], $modifs);
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Transforme tous les noms du formulaire avec un preg_replace.
+ *
+ * @param array  $saisies      Un tableau décrivant les saisies
+ * @param string $masque       Ce que l'on doit chercher dans le nom
+ * @param string $remplacement Ce par quoi on doit remplacer
+ *
+ * @return array               Retourne le tableau modifié des saisies
+ */
+function saisies_transformer_noms($saisies, $masque, $remplacement) {
+	return saisies_transformer_option($saisies, 'nom', $masque, $remplacement);
+}
+
+/**
+ * Transforme tous les noms en les encapsulant avec un préfixe.
+ *
+ * Cela permet d'avoir toutes les valeurs postées dans un unique tableau.
+ * Après transformation, on pourra faire `_request(<prefixe>)` pour les récupérer.
+ *
+ * Utilisation possible : on mélange les saisies de plusieurs formulaires,
+ * et on a dans ce cas besoin de cloisonner les valeurs.
+ *
+ * @example Avant/après
+ * - bidule        → prefixe[bidule]
+ * - machin[chose] → prefixe[machin][chose]
+ *
+ * @param array $saisies
+ *   Un tableau décrivant les saisies
+ * @param string $prefixe
+ *   Préfixe
+ * @param boolean $recursif
+ *   Pour procéder récursivement dans les fieldsets
+ * @return array
+ */
+function saisies_encapsuler_noms(array $saisies, string $prefixe, bool $recursif = true) {
+	$saisies = saisies_mapper_option(
+		$saisies,
+		'nom',
+		function ($nom) use ($prefixe) {
+			// Soit c'est déjà un tableau : machin[truc]
+			if (($pos = strpos($nom, '[')) !== false) {
+				$nom = "{$prefixe}[" . substr_replace($nom, ']', $pos, 0);
+				// Soit c'est un nom simple : machin
+			} else {
+				$nom = "{$prefixe}[{$nom}]";
+			}
+			return $nom;
+		},
+		[],
+		$recursif
+	);
+
+	return $saisies;
+}
+
+/**
+ * Transforme toutes les options textuelles d'un certain nom, avec un preg_replace.
+ *
+ * @param $saisies
+ *     Tableau décrivant les saisies
+ * @param $option
+ *     Nom de l'option à transformer (par ex "nom", ou "afficher_si"), ou tableau
+ *     Note : si l'option n'existe pas, elle est automatiquement mise à `''` avant toute transformation
+ * @param $masque
+ *     Ce que l'on doit chercher dans le texte
+ * @param $remplacement
+ *     Ce par quoi on doit remplacer
+ * @param bool $recursif
+ * @return array
+ * 		Retourne le tableau modifié des saisies
+ */
+function saisies_transformer_option($saisies, $option, $masque, $remplacement, $recursif = true) {
+	return saisies_mapper_option(
+		$saisies,
+		$option,
+		function ($valeur, $masque, $remplacement) {
+			if (!is_string($valeur)) {
+				$valeur = '';
+			}
+			return preg_replace($masque, $remplacement, $valeur);
+		},
+		[$masque, $remplacement],
+		$recursif
+	);
+}
+
+
+/**
+ * Modifie toutes les options d'un certain nom, avec une fonction de rappel.
+ *
+ * @param array $saisies
+ *     Tableau décrivant les saisies
+ * @param str|array $options
+ *     Nom de l'option à transformer (par ex "nom", ou "afficher_si")
+ *     Ou tableau de noms
+ *     Note : si l'option n'existe pas, elle est automatiquement mise à `''` avant toute transformation
+ * @param str $callback
+ *		 Nom de la fonction à appliquer
+ * @param array $args
+ *		 Arguments de la fonction de rappel
+ *		 La valeur de l'option est passée automatiquement en premier
+ * @param bool $recursif=True
+ * @return array
+ * 		Retourne le tableau modifié des saisies
+ */
+function saisies_mapper_option($saisies, $options, $callback, $args = [], $recursif = true) {
+	if (!is_array($options)) {
+		$options = [$options];
+	}
+	if (is_array($saisies)) {
+		foreach ($saisies as $cle => $saisie) {
+			foreach ($options as $option) {
+				$saisies[$cle]['options'][$option] = call_user_func_array($callback, array_merge([$saisies[$cle]['options'][$option] ?? ''], $args));
+			}
+			// On parcourt récursivement toutes les saisies enfants
+			if (is_array($saisie['saisies'] ?? '') && $recursif) {
+				$saisies[$cle]['saisies'] = saisies_mapper_option($saisie['saisies'], $option, $callback, $args, $recursif);
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Supprime toutes les options d'un certain nom.
+ *
+ * @param $saisies
+ *     Tableau décrivant les saisies
+ * @param $option
+ *     Nom de l'option à supprimer (par ex "nom", ou "afficher_si")
+ * @param bool $recursif
+ * @return array
+ * 		Retourne le tableau modifié des saisies
+ */
+function saisies_supprimer_option($saisies, $option, $recursif = true) {
+	if (is_array($saisies)) {
+		foreach ($saisies as $cle => $saisie) {
+			unset($saisies[$cle]['options'][$option]);
+
+			// On parcourt récursivement toutes les saisies enfants
+			if (is_array($saisie['saisies'] ?? '') && $recursif) {
+				$saisies[$cle]['saisies'] = saisies_supprimer_option($saisie['saisies'], $option);
+			}
+		}
+	}
+
+	return $saisies;
+}
+/**
+ * Transforme les noms d'une liste de saisies pour qu'ils soient
+ * uniques dans le formulaire donné.
+ *
+ * @param array $formulaire  Le formulaire à analyser
+ * @param array $saisies     Un tableau décrivant les saisies.
+ *
+ * @return array
+ *     Retourne le tableau modifié des saisies
+ */
+function saisies_transformer_noms_auto($formulaire, $saisies) {
+	if (is_array($saisies)) {
+		foreach ($saisies as $cle => $saisie) {
+			$saisies[$cle]['options']['nom'] = saisies_generer_nom($formulaire, $saisie['saisie']);
+			// il faut prendre en compte dans $formulaire les saisies modifiees
+			// sinon on aurait potentiellement 2 champs successifs avec le meme nom.
+			// on n'ajoute pas les saisies dont les noms ne sont pas encore calculees.
+			$new = $saisies[$cle];
+			unset($new['saisies']);
+			$formulaire[] = $new;
+
+			if (is_array($saisie['saisies'] ?? '')) {
+				$saisies[$cle]['saisies'] = saisies_transformer_noms_auto($formulaire, $saisie['saisies']);
+			}
+		}
+	}
+
+	return $saisies;
+}
+
+/**
+ * Insère du HTML au début ou à la fin d'une saisie.
+ *
+ * @param array  $saisie    La description d'une seule saisie
+ * @param string $insertion Du code HTML à insérer dans la saisie
+ * @param string $ou        L'endroit où insérer le HTML : "debut" ou "fin"
+ *
+ * @return array            Retourne la description de la saisie modifiée
+ */
+function saisies_inserer_html($saisie, $insertion, $ou = 'fin') {
+	if (!in_array($ou, ['debut', 'fin'])) {
+		$ou = 'fin';
+	}
+
+	if ($ou == 'debut') {
+		$saisie['options']['inserer_debut'] =
+			$insertion . (isset($saisie['options']['inserer_debut']) ? $saisie['options']['inserer_debut'] : '');
+	} elseif ($ou == 'fin') {
+		$saisie['options']['inserer_fin'] =
+			(isset($saisie['options']['inserer_fin']) ? $saisie['options']['inserer_fin'] : '') . $insertion;
+	}
+
+	return $saisie;
+}
+
+/**
+ * Ajoute l'option onglet aux fieldset de premier niveau dans un tableau de $saisie
+ * Ajoute également un identifiant unique, éventuellement préfixé
+ * @param array $saisies
+ * @param string $identifiant_prefixe
+ * @param bool $vertical
+ * @return array $saisies modifiées
+ **/
+function saisies_fieldsets_en_onglets($saisies, $identifiant_prefixe = '', $vertical = false) {
+	foreach ($saisies as &$saisie) {
+		if ($saisie['saisie'] == 'fieldset') {
+			$saisie['options']['onglet'] = 'on';
+			if ($vertical) {
+				$saisie['options']['onglet_vertical'] = 'on';
+			}
+			$saisie['identifiant'] = $identifiant_prefixe . '_' . saisie_nom2classe($saisie['options']['nom']);
+		}
+	}
+	return $saisies;
+}
+
+/**
+ * Prend un tableau de saisies
+ * Enlève les saisies qui n'ont rien dans _request
+ * Ou dont l'ensemble des sous-saisies sont vides
+ * @param array $saisies
+ * @param optional $tableau (tableau pour chercher dans request)
+ * @return array
+ **/
+function saisies_supprimer_sans_reponse(array $saisies, array $tableau = []): array {
+	// On gère les options de saisies
+	if (isset($saisies['options'])) {
+		$options_generales = $saisies['options'];
+		unset($saisies['options']);
+	}
+	foreach ($saisies as $key => $saisie) {
+		// Cas 1: c'est une saisies avec sous_saisies, dans ce cas on analyse d'abord les sous_saisies, puis on supprime le cas échéant
+		if (isset($saisie['saisies'])) {
+			$saisie['saisies'] = saisies_supprimer_sans_reponse($saisie['saisies'], $tableau);
+			if (empty($saisie['saisies'])) {
+				unset($saisies[$key]);
+			}
+		} else {
+			// Cas 2, c'est une saisie terminale, dans ce cas on vérifie si présente
+			$valeur = saisies_request($saisie['options']['nom']);
+			if (is_string($valeur)) {
+				$valeur = vider_date($valeur);
+			}
+			if (
+				($valeur === '' || is_null($valeur))
+				&& !saisies_request_from_FILES($saisie['options']['nom'])
+			) {// Notons la très stricte égalité ppur ne pas supprimer une saisie dont la valeur serait 0
+				unset($saisies[$key]);
+			}
+		}
+	}
+	$saisies = array_values($saisies);
+	if (isset($options_generales)) {
+		$saisies['options'] = $options_generales;
+	}
+	return $saisies;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_migrer_afficher_si_remplissage.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_migrer_afficher_si_remplissage.php
new file mode 100644
index 0000000000000000000000000000000000000000..12ec323ba8fb9d1b8ed11947a7f412b67e899d20
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_migrer_afficher_si_remplissage.php
@@ -0,0 +1,50 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ *  Parcours un tableau de saisies,
+ *  regarde si on a un champ afficher_si_remplissage
+ *  et le transforme en champs
+ *  afficher_si +
+ *  afficher_si_remplissage_uniquement
+ * @param array $saisies
+ *		Les saisies initiales
+ * @return array $saisies
+ *		Les saisies modifiées
+ */
+function saisies_migrer_afficher_si_remplissage($saisies) {
+	// Parcourir le tableau de saisie
+	foreach ($saisies as &$saisie) {
+		$options = &$saisie['options'];
+
+		if ($options['afficher_si_remplissage'] ?? '') {
+			// si a tout hasard la personne avait rempli les deux champs afficher_si, on fusionne les conditions
+			if ($options['afficher_si'] ?? '') {
+				$options['afficher_si'] =
+					'('
+					. $options['afficher_si']
+					. ')'
+					. ' && ' //emploi de && pour pouvoir fonctionner en js
+					. '('
+					. $options['afficher_si_remplissage']
+					. ')';
+			} else {
+				$options['afficher_si'] = $options['afficher_si_remplissage'];
+			}
+
+			$options['afficher_si_remplissage_uniquement'] = 'on';
+			unset($options['afficher_si_remplissage']);
+		}
+
+		// appliquer recursivement si on a des saisies filles
+		if (is_array($saisie['saisies'] ?? '')) {
+			$saisie['saisies'] = saisies_migrer_afficher_si_remplissage($saisie['saisies']);
+		}
+	}
+
+	return $saisies;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_name.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_name.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fd1c8b4ddd26042bfc49df52a22461de5a2ea27
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_name.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Gestion de name
+ * Partie commun js/php
+ *
+ * @package SPIP\Saisies\Name
+ **/
+
+
+/**
+ * Passer un nom en une valeur compatible avec une classe css
+ *
+ * - toto => toto,
+ * - toto/truc => toto_truc,
+ * - toto[truc] => toto_truc
+ *
+ * @param string $nom
+ * @return string
+ **/
+function saisie_nom2classe($nom) {
+	return str_replace(['/', '[', ']', '&#91;', '&#93;'], ['_', '_', '', '_', ''], $nom);
+}
+
+/**
+ * Ajouter une ou des classes sur la saisie en fonction du type
+ * @param $type_saisie
+ * @return string
+ */
+function saisie_type2classe($type_saisie) {
+	$class = "saisie_{$type_saisie}";
+	if (strpos($type_saisie, 'selecteur') === 0) {
+		$class .= ' selecteur_item';
+	}
+	$class = trim($class);
+	return $class;
+}
+
+/**
+ * Passer un nom en une valeur compatible avec un `name` de formulaire
+ *
+ * - toto => toto,
+ * - toto/truc => toto[truc],
+ * - toto/truc/ => toto[truc][],
+ * - toto[truc] => toto[truc]
+ *
+ * @see saisie_name2nom() pour l'inverse.
+ * @param string $nom
+ * @return string
+ **/
+function saisie_nom2name($nom) {
+	if (false === strpos($nom, '/')) {
+		return $nom;
+	}
+	$nom = explode('/', $nom);
+	$premier = array_shift($nom);
+	$nom = implode('][', $nom);
+	return $premier . '[' . $nom . ']';
+}
+
+/**
+ * Passer un `name` en un format de nom compris de saisies
+ *
+ * - toto => toto,
+ * - toto[truc] => toto/truc,
+ * - toto[truc][] => toto/truc/
+ * - toto/truc => toto/truc
+ *
+ * @see saisie_nom2name() pour l'inverse.
+ * @param string $name
+ * @return string
+ **/
+function saisie_name2nom($name) {
+	if (false === strpos($name, '[')) {
+		return $name;
+	}
+	$name = explode('[', str_replace(']', '', $name));
+	return implode('/', $name);
+}
+
+/**
+ * Appliquer `saisie_nom2name()` sur les clés d'un tableau
+ * utilisé pour gérer les erreurs
+ * @param array $tab
+ * @return array
+ **/
+function saisies_cles_nom2name($tab) {
+	if (!is_array($tab)) {
+		return $tab;
+	}
+	foreach ($tab as $k => $v) {
+		$kbis = saisie_nom2name($k);
+		if ($kbis !== $k) {
+			unset($tab[$k]);
+			$tab[$kbis] = $v;
+		}
+	}
+	return $tab;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_request.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_request.php
new file mode 100644
index 0000000000000000000000000000000000000000..743f26e2bf430a5aa087d9accbb4982818f6c69d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_request.php
@@ -0,0 +1,197 @@
+<?php
+
+/**
+ * Gestion des request (get/set) avec saisies
+ * Tenir compte notamment de :
+ *  - name tabulaire du style `toto[truc][bidule]`
+ *  - saisies fichiers où il faut chercher dans _$FILES
+ *
+ * @package SPIP\Saisies\Saisies_request
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+
+/**
+ * Trouve le résultat d'une saisie (`_request()`)
+ * en tenant compte du fait que la saisie peut être décrite sous forme de sous entrées d'un tableau
+ *	- soit `toto[truc][bidule]`
+ *	- soit `toto/truc/bidule`
+ *
+ * @param string $champ
+ * 		Nom du champ de la saisie, y compris avec crochets pour sous entrées
+ * @param null|array $valeurs
+ *		Tableau où chercher, à defaut get/post
+ * @return string|array
+ * 		Résultat du _request()
+ **/
+function saisies_request($champ, $valeurs = null) {
+	$champ = saisie_nom2name($champ);
+
+	if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
+		$valeur = _request($separe[1], $valeurs);
+
+		// On va chercher au fond du tableau
+		preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
+		foreach ($index[1] as $cle) {
+			$valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;
+		}
+	} else { // Sinon la valeur est juste celle du champ
+		$valeur = _request($champ, $valeurs);
+	}
+
+	return $valeur;
+}
+
+/**
+ * Trouve le sous tableau de $_FILES correspondant à champ,
+ * en prenant en compte CVT-Upload
+ * @param string $champ
+ * @return array|null
+ **/
+function saisies_request_from_FILES($champ) {
+
+	$infos_fichiers_precedents = _request('cvtupload_fichiers_precedents');
+	if (isset($infos_fichiers_precedents[$champ])) { // si on a déjà envoyé des infos avants
+		$valeur = isset($_FILES[$champ]) ? $_FILES[$champ] : []; // on ne met pas true, car il faudra aussi vérifier les nouveaux fichiers du même champ qui viennent d'être envoyés.
+	}
+	elseif (isset($_FILES[$champ]['error'])) {//si jamais on a déja envoyé quelque chose dans le précédent envoi = ok
+		$valeur = null; //On considère que par défaut on a envoyé aucun fichiers
+
+		// Si c'est un champ unique
+		if (!is_array($_FILES[$champ]['error']) && $_FILES[$champ]['error'] != 4) {
+			$valeur = $_FILES[$champ];
+		} elseif (is_array($_FILES[$champ]['error'])) {
+			foreach ($_FILES[$champ]['error'] as $err) {
+				if ($err != 4) {
+					//Si un seul fichier a été envoyé, même avec une erreur,
+					// on considère que le critère obligatoire est rempli.
+					// Il faudrait que verifier/fichiers.php vérifier les autres types d'erreurs.
+					// Voir http://php.net/manual/fr/features.file-upload.errors.php
+					$valeur = $_FILES[$champ];
+					break;
+				}
+			}
+		}
+	} elseif (!isset($_FILES[$champ])) {
+		$valeur = null;
+	}
+	return $valeur;
+}
+
+/**
+ * Trouve une propriété d'un fichier uploadé au sein d'un $_FILES
+ * en tenant compte du fait que la saisie peut être décrit sous forme de sous entrées d'un tableau ET que dans ce cas la structure PHP de $_FILES est totalement aberrant
+ *
+ * @todo Prendre en compte aussi la notation champ/index/index
+ * @param string $champ
+ * 		Nom du champ de la saisie, y compris avec crochets pour sous entrées
+ * @param string $property
+ * @return string|array
+ * 		Résultat du _request()
+ **/
+function saisies_request_property_from_FILES($champ, $property = 'name') {
+	// Si le nom du champ est un tableau indexé, il faut parser !
+	if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
+		$files = saisies_request($champ, [$separe[1] => $_FILES[$separe[1]][$property]]);
+		if (is_null($files)) {
+			$files = [];
+		}
+	} else {
+		$files = isset($_FILES[$champ][$property]) ? $_FILES[$champ][$property] : [];
+	}
+	return $files;
+}
+
+/**
+ * Modifie la valeur d'un saisie postée en tenant compte que ça puisse être un tableau
+ *	- soit `toto[truc][bidule]`
+ *	- soit `toto/truc/bidule`
+ * @todo Prendre un arg en plus pour enregistrer la valeur dans un autre tableau que le GET/POST
+ * @param string $nom
+ * 		Nom du champ
+ * @param $valeur
+ * 		Valeur à remplir dans le request
+ * @param array $valeurs
+ *    Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
+ * @return void
+ */
+function saisies_set_request($champ, $valeur, $valeurs = null) {
+	$champ = saisie_nom2name($champ);
+	// Si on détecte que c'est un tableau[index][index]
+	if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
+		$nom_champ_principal = $separe[1];
+		$champ_principal  = _request($nom_champ_principal, $valeurs);
+		$enfant = &$champ_principal;
+
+		// On va chercher au fond du tableau
+		preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
+		foreach ($index[1] as $cle) {
+			$enfant = &$enfant[$cle];
+		}
+		// Une fois descendu tout en bas, on met la valeur
+		$enfant = $valeur;
+		// Et on reinjecte le tout
+		saisies_liste_set_request('set', $nom_champ_principal, $champ_principal, $valeurs);
+		set_request($nom_champ_principal, $champ_principal);
+	} else {// Sinon la valeur est juste celle du nom
+		saisies_liste_set_request('set', $champ, $valeur, $valeurs);
+		set_request($champ, $valeur, $valeurs);
+	}
+}
+
+/**
+ * Pour chaque champ, sauvegarde l'historique de ses valeurs avant que set_request
+ * Utilisé notamment par formidable pour trouver les saisies qui été mises à ''
+ * @param string $action 'set|get'
+ * @param string $champ
+ * @param string $nouvelle_valeur
+ * @param array $valeurs
+ *     Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
+ * @return array (si action = get) un tableau associatif
+ *	- '<champ>' => ['valeur_initiale', 'valeur_modifiee1', 'valeur_modifiee2'
+ **/
+function saisies_liste_set_request($action = 'set', $champ = 'null', $nouvelle_valeur = '', $valeurs = null) {
+	static $cache = [];
+	if ($action === 'get') {
+		return $cache;
+	} else {
+		if (!isset($cache[$champ])) {
+			$cache[$champ] = [_request($champ, $valeurs)];
+		}
+		$cache[$champ] = array_merge($cache[$champ], [$nouvelle_valeur]);
+	}
+}
+
+
+/**
+ * Chercher la valeur d'une saisie, en tenant compte du fait que potentiellement c'est une saisies fichiers
+ * @param array $saisie
+ * @param array $valeurs
+ * @return string|array $valeur
+ *     Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
+ **/
+function saisies_get_valeur_saisie($saisie, $valeurs = null) {
+	$champ = $saisie['options']['nom'];
+	$file = saisies_saisie_est_fichier($saisie);
+
+	// Cas de la saisie 'fichiers':
+	if ($file && !is_array($valeurs)) {
+		$valeur = saisies_request_from_FILES($champ);
+	} else {// Tout type de saisie, sauf fichiers
+		$valeur = saisies_request($champ, $valeurs);
+		// Filtrer les tableaux. Ex d'application:
+		// - saisie date/heure qui envoi des input texte en tableau > il faut pas que les champs envoyés soient vides
+		// - saisie destinataire, qui pourrait avoir une première option vide
+		if (is_array($valeur)) {
+			$valeur = array_filter($valeur, function ($v) {
+				return (!empty($v) || $v == '0');
+			});
+		}
+	}
+	return $valeur;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inc/saisies_verifier.php b/design_system_dependences/saisies/v5.2.0/inc/saisies_verifier.php
new file mode 100644
index 0000000000000000000000000000000000000000..045b4878f703e381919421bc535dc01efbced613
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inc/saisies_verifier.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * Gestion de la verification des saisies
+ *
+ * @package SPIP\Saisies\Verifier
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifier tout un formulaire tel que décrit avec les Saisies
+ *
+ * @param array $formulaire Le formulaire à vérifier, c'est à dire un tableau de saisies, avec éventuellement une clé options, comprenant tout les étapes
+ * @param bool $saisies_masquees_empty_string
+ *		Si true, les saisies masquées selon afficher_si ne sont pas verifiées.
+ *		/!\ Dans tous les cas ces saisies sont mises à `''` à la fin de des tests, si aucune erreur.
+ * @param $etape l'étape courante à vérifier
+ * @param array $valeurs Optionnellement un tableau de valeurs à passer à _request plutôt que GET/POST
+ * @return array Retourne un tableau d'erreurs
+ */
+function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $etape = null, $valeurs = null) {
+	include_spip('inc/verifier');
+	$verif_fonction = charger_fonction('verifier', 'inc', true);
+
+	// Lister les saisies par étapes, si besoin
+	if (is_numeric($etape)) {
+		$saisies_par_etapes = saisies_lister_par_etapes($formulaire);
+	} else {
+		$saisies_par_etapes = $formulaire;
+	}
+
+	// Enlever les afficher_si où la condition n'est pas validée, si besoin
+	if ($saisies_masquees_empty_string) {
+		$saisies_par_etapes_apres_verification_afficher_si = saisies_verifier_afficher_si($saisies_par_etapes, $valeurs);
+	} else {
+		$saisies_par_etapes_apres_verification_afficher_si = $saisies_par_etapes;
+	}
+
+	// Trouver les saisies de l'étape courante
+	if (is_numeric($etape)) {
+		if (isset($saisies_par_etapes_apres_verification_afficher_si["etape_$etape"])) {
+			$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si["etape_$etape"]['saisies'];
+		} else {//Si jamais l'étape courante a été masquée par afficher_si
+			$saisies_etape_courante_apres_verification_afficher_si = [];
+		}
+	} else {
+		$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si;
+	}
+
+	// On passe à une liste par nom
+	$saisies_etape_courante_apres_verification_afficher_si_par_nom = saisies_lister_par_nom($saisies_etape_courante_apres_verification_afficher_si);
+
+	// Vérifier si c'est obligatoire
+	$erreurs = [];
+	// On parcourt chacune des saisies
+	foreach ($saisies_etape_courante_apres_verification_afficher_si_par_nom as $saisie) {
+		$champ = $saisie['options']['nom'];
+		$valeur = saisies_get_valeur_saisie($saisie, $valeurs);
+		$obligatoire = $saisie['options']['obligatoire'] ?? '';
+		$file = saisies_saisie_est_fichier($saisie);
+
+		// On commence par vérifier l'obligation, seulement si demandé
+		if (
+			$obligatoire
+			&& $obligatoire != 'non'
+			&& (
+				($file && $valeur == null)
+				|| (!$file && (
+					is_null($valeur)
+					|| (is_string($valeur) && trim($valeur) == '')
+					|| (is_array($valeur) && count($valeur) == 0)
+				))
+			)
+		) {
+			$erreurs[$champ] =
+				($saisie['options']['erreur_obligatoire'] ?? '')
+				? _T_ou_typo($saisie['options']['erreur_obligatoire'])
+				: _T('info_obligatoire');
+		}
+
+		// S'il y a une erreur d'obligation, on passe à la saisie suivante
+		if ($erreurs[$champ] ?? '') {
+			continue;
+		}
+		$verifier_tous = $saisie['verifier'] ?? [];
+		// Compatibilité historique avec les vieux appels
+		if (isset($verifier_tous['type'])) {
+			$verifier_tous = [$verifier_tous];
+		}
+		//Boucle sur toutes les verif
+		foreach ($verifier_tous as $verifier) {
+			if (is_array($verifier) && $verifier) {//Sécurité d'appel
+				// Si on fait une vérification de type fichiers, il n'y a pas vraiment de normalisation, mais un retour d'erreur fichiers par fichiers
+				if ($verif_fonction) {
+					if ($verifier['type'] == 'fichiers') {
+						$normaliser = [];
+					} else {
+						$normaliser = null;
+					}
+					$options = $verifier['options'] ?? [];
+					if (!$options) {//Sécurité, si jamais ''
+						$options = [];
+					}
+					$options = array_merge($options, ['_saisie' => $saisie]);
+					if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) {
+						if (isset($erreurs[$champ])) {
+							$erreurs[$champ] .= '<br />' . $erreur_eventuelle;
+						} else {
+							$erreurs[$champ] = $erreur_eventuelle;
+						}
+						// Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur
+					}
+					// S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST
+					elseif (!is_null($normaliser) && $verifier['type'] != 'fichiers') {
+						saisies_set_request($champ, $normaliser, $valeurs);
+					}
+				} else {
+					spip_log('Demande de vérification, mais fonction inc_verifier inexistante (probablement plugin verifier manquant)', 'saisies' . _LOG_ERREUR);
+				}
+			}
+		}
+	}
+
+	// On passe nos résultats à un pipeline
+	$erreurs = pipeline(
+		'saisies_verifier',
+		[
+			'args' => [
+				'formulaire' => $formulaire,
+				'saisies' => $saisies_etape_courante_apres_verification_afficher_si_par_nom,
+				'saisies_par_etapes' => $saisies_par_etapes,
+				'saisies_par_etapes_apres_verification_afficher_si' => $saisies_par_etapes_apres_verification_afficher_si,
+				'saisies_etape_courante_apres_verification_afficher_si' => $saisies_etape_courante_apres_verification_afficher_si,
+				'saisies_masquees_empty_string' => $saisies_masquees_empty_string,
+				'etape' => $etape,
+				'valeurs' => $valeurs,
+			],
+			'data' => $erreurs
+		]
+	);
+	//S'il n'y a pas d'erreur, et seulement si on vient de franchir la dernière étape, on vide les afficher_si)
+	if (
+		empty($erreurs)
+		&&  ($etape === count($saisies_par_etapes)
+		&& !_request('aller_a_etape', $valeurs))
+		|| (!$etape)
+	) {
+		saisies_afficher_si_masquees_set_request_empty_string($saisies_par_etapes, $valeurs);
+	}
+
+
+	// Vérifier que les valeurs postées sont acceptables, à savoir par exemple que pour un select, ce soit ce qu'on a proposé. On vérifie cela en tout dernier, après le vidage des afficher_si car certainses saisies peuvent avoir des valeurs acceptables qui dépendant des afficher_si (exemple : les saisies calculs).  Si jamais on a une valeur innacceptable, c'est que la personne a triché sur le POST en truandant le HTML, donc on s'en fiche si en retour son formulaire d'erreur n'est pas cohérent.
+	if ($formulaire['options']['verifier_valeurs_acceptables'] ?? '') {
+		$erreurs = saisies_verifier_valeurs_acceptables($saisies_etape_courante_apres_verification_afficher_si_par_nom, $erreurs);
+	}
+	return $erreurs;
+}
+
+/**
+ * Vérifier que les valeurs postées sont acceptables,
+ * c'est-à-dire qu'elles ont été proposées lors de la conception de la saisie.
+ * Typiquement pour une saisie radio, vérifier que les gens n'ont pas postée une autre fleur.
+ * @param $saisies array tableau général des saisies, déjà aplati, classé par nom de champ
+ * @param $erreurs array tableau des erreurs
+ * @return array table des erreurs modifiés
+ **/
+function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
+	$verifier = charger_fonction('valeurs_acceptables', 'verifier');
+	foreach ($saisies as $saisie => $description) {
+		// Pas la peine de vérifier si par ailleurs il y a déjà une erreur
+		if (isset($erreurs[$saisie])) {
+			continue;
+		}
+		$valeur = saisies_request($saisie);
+
+		//Il n'y a rien à vérifier sur les saisies pas champ
+		if (!saisies_saisie_est_champ($description)) {
+			continue;
+		}
+		if ($erreur = $verifier($valeur, ['_saisie' => $description])) {
+			$erreurs[$saisie] = $erreur;
+		}
+	}
+	return $erreurs;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie.html b/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie.html
new file mode 100644
index 0000000000000000000000000000000000000000..70991bbeb7b14c4484618aae71c7f4fc30eb7348
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie.html
@@ -0,0 +1,19 @@
+[(#REM) 
+  
+  ### /!\ necessite le plugin YAML ###
+  
+  Genere l'intérieur d'un formulaire permettant de configurer une saisie.
+  
+  Par defaut, ne permet pas de configurer le "name" de la saisie car dans la
+  plupart des cas c'est une valeur qui sera automatique. On utilise le parametre
+  "avec_nom=oui" pour forcer le champ.
+  
+  Exemples d'appels :
+    #INCLURE{fond=inclure/configurer_saisie, env, saisie=input}
+    #INCLURE{fond=inclure/configurer_saisie, env, saisie=input, avec_nom=oui}
+
+]
+
+[(#SET{config, #ENV{saisie}|construire_configuration_saisie{#ENV{avec_nom}}})]
+
+#GENERER_SAISIES{#GET{config}}
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie_fonctions.php b/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..697f62d3a71748d4d9ecfa4e8555aa336e44c69f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/configurer_saisie_fonctions.php
@@ -0,0 +1,39 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function construire_configuration_saisie($saisie, $avec_nom = 'non') {
+	include_spip('inc/yaml');
+	$configuration_saisie = yaml_decode_file(find_in_path('saisies/' . $saisie . '.yaml'));
+
+	if (is_array($configuration_saisie)) {
+		$configuration_saisie = $configuration_saisie['options'];
+		// On ne met le premier champ permettant de configurer le "name" seulement si on le demande explicitement
+		if ($avec_nom == 'oui') {
+			array_unshift(
+				$configuration_saisie[0]['contenu'],
+				[
+					'saisie' => 'input',
+					'options' => [
+						'nom' => 'nom',
+						'label' => '<:saisies:option_nom_label:>',
+						'explication' => '<:saisies:option_nom_explication:>',
+						'obligatoire' => 'oui'
+					],
+					'verifier' => [
+						'type' => 'regex',
+						'options' => [
+							'modele' => '/^[\w]+$/'
+						]
+					]
+				]
+			);
+		}
+	} else {
+		$configuration_saisie = [];
+	}
+	return $configuration_saisie;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/generer_saisies.html b/design_system_dependences/saisies/v5.2.0/inclure/generer_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..a2a052ae0ffaec5a933bae7cbc0036cfcd8799b7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/generer_saisies.html
@@ -0,0 +1,51 @@
+[(#REM)
+
+  Génère le contenu (l'intérieur) d'un formulaire, à partir d'une description dans un tableau PHP.
+  Le tableau doit être de la forme suivante :
+
+  // Chaque ligne est elle-même un tableau
+  array(
+  	// Ligne de type "explication"
+  	array(
+  		'explication' => 'Ceci est un bloc d'explication général.'
+  	),
+  	// Ligne classique, cad un champ de formulaire
+  	array(
+  		'saisie' => 'input',
+  		'options => array(
+  			'nom' => 'mon_champ',
+  			'label' => 'Un joli titre',
+  			'obligatoire' => 'oui'
+  		)
+  	),
+  	// Ligne contenant un fieldset
+  	array(
+  		'groupe' => 'Ceci est le titre du groupe de champs (fieldset)',
+  		'css' => 'eventuelles classes css',
+  		'contenu' => array(
+  			// On recommence ici suivant le même formalisme que le tableau général.
+  		)
+  	)
+  )
+
+
+  Exemples d'appels :
+    # INCLURE{fond=inclure/generer_saisies, env, saisies=#ENV{tableau}}
+
+]
+
+[(#SET{saisies, #ENV*{saisies}})]
+
+[(#REM) sécurité sur l'appel : chercher les saisies dans l'étape courante, on test #ENV{_env} pour ne pas chercher des étapes au sein d'une étape, sinon ca tourne en rond !]
+[(#ENV{_etape}|oui)
+	[(#ENV{_env}|non)
+		#SET{saisies_par_etapes, #ENV*{saisies_par_etapes}|sinon{#ENV*{_saisies_par_etapes}}|sinon{#ENV*{saisies}|saisies_lister_par_etapes}}
+		#SET{saisies, #GET{saisies_par_etapes/etape_#ENV{_etape}/saisies}}
+	]
+]
+
+<BOUCLE_contenu(DATA){source tableau, #GET{saisies}}>
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+[(#VALEUR**|saisies_generer_html{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+</BOUCLE_contenu>
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide.html b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide.html
new file mode 100644
index 0000000000000000000000000000000000000000..cdd41bdf3d0d8fc6993df9d471f1a0659cfaefc7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide.html
@@ -0,0 +1,8 @@
+
+Sauter à : <a href="#liste_saisies">Toutes les saisies</a>, <a href="#liste_options_saisies">Toutes les options de base</a>, <a href="#liste_options_dev_saisies">Toutes les options de dev</a>.
+<INCLURE{fond=inclure/saisies_aide/tableau, titre='Utilisation des options de base', env} />
+<INCLURE{fond=inclure/saisies_aide/tableau, titre='Utilisation des options de dev', preambule="Options disponibles uniquement pour le dévellopement PHP/Squelette.", env, options=#ENV{options_dev}} />
+<INCLURE{fond=inclure/saisies_aide/saisies, env} />
+<INCLURE{fond=inclure/saisies_aide/options, titre='Toutes les options de base', id='liste_options_saisies', env} />
+<INCLURE{fond=inclure/saisies_aide/options, titre='Toutes les options de dev', id='liste_options_dev_saisies', preambule="Options disponibles uniquement pour le dévellopement PHP/Squelette.", env, options=#ENV{options_dev}} />
+<INCLURE{fond=inclure/saisies_aide/addendum, env} />
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/addendum.html b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/addendum.html
new file mode 100644
index 0000000000000000000000000000000000000000..df562a3cae9de6238d1252ec1670915d40fa4ad3
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/addendum.html
@@ -0,0 +1,9 @@
+
+<h2 class="h2 spip">Addendum historique</h2>
+
+<ul>
+	<li>L'option <code>datas</code> est encore supportée, mais on lui préferera l'option <code>data</code>.</li>
+	<li>La saisie <code>oui_non</code> ne doit plus être utilisée. On lui préférera la saisie <code>radio</code>, avec des libellés pouvant se comprendre hors contexte ("J'accepte telle action" / "Je refuse telle action").</li>
+	<li>La saisie <code>selection_multiple</code> ne doit plus être utilisée. On lui préféra la saisie <code>selection</code> avec l'option <code>multiple</code>.
+</ul>
+
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/options.html b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/options.html
new file mode 100644
index 0000000000000000000000000000000000000000..4073921c1d94c2e83f6ae0f423296bcf5e30995f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/options.html
@@ -0,0 +1,37 @@
+<h2 class="h2 spip" id="#ENV{id}">#ENV{titre}</h2>
+
+#ENV{preambule}
+
+
+<BOUCLE_options(DATA){source tableau, #ENV{options}}>
+[(#LABEL|oui)
+	[(#SET{label,#LABEL[ -(#LABEL_CASE)]})]
+]
+[(#LABEL|non)
+	#SET{label,#LABEL_CASE}
+]
+<h3 class="h3 spip" id="option_#CLE">[(#GET{label}|?{#GET{label} [ ((#CLE))], #CLE})]</h3>
+[<p class="description">
+	<strong>Description :</strong> (#EXPLICATION|sinon{#LABEL|?{#LABEL_CASE}})
+	[<br /><strong>Description pour les devs :</strong> (#EXPLICATION_DEV)]
+</p>]
+[<p class="attention">
+	<strong>Attention :</strong> (#ATTENTION)
+</p>]
+<B_utilisee_par>
+<p class="utilisee_par">
+	<strong>Utilisée par :</strong>
+	<BOUCLE_utilisee_par(DATA){source tableau, #UTILISEE_PAR}{", "}><a href="#saisie_#VALEUR">#VALEUR</a></BOUCLE_utilisee_par>
+</p>
+</B_utilisee_par>
+<B_choix>
+<p class="choix_possibles">
+	<strong>Choix possibles :</strong>
+	<ul class="spip">
+		<BOUCLE_choix(DATA){source tableau, #DATA}>
+		<li>"#CLE" : #VALEUR</li>
+		</BOUCLE_choix>
+	</ul>
+</p>
+</B_choix>
+</BOUCLE_options>
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/saisies.html b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..a8f7f241d0b923e908506ecf18005ea891b6c18b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/saisies.html
@@ -0,0 +1,22 @@
+<h2 class="h2 spip" id="liste_saisies">Toutes les saisies, par catégories</h2>
+<BOUCLE_categories(DATA){source tableau, #ENV{saisies}}>
+<h3 class="h3">#NOM</h3>
+<BOUCLE_saisies(DATA){source tableau, #SAISIES}>
+<h4 class="h3 spip" id="saisie_#CLE">#TITRE (#CLE)</h4>
+<p class="description">
+	<strong>Description :</strong> #DESCRIPTION
+</p>
+<B_options_saisie>
+<p class="options">
+	<strong>Options de base:</strong>
+	<BOUCLE_options_saisie(DATA){source tableau, #OPTIONS}{", "}><a href="#option_#CLE">#CLE</a></BOUCLE_options_saisie>
+</p>
+</B_options_saisie>
+<B_options_dev_saisie>
+<p class="options_dev">
+	<strong>Options de dev:</strong>
+	<BOUCLE_options_dev_saisie(DATA){source tableau, #OPTIONS_DEV}{", "}><a href="#option_#CLE">#CLE</a></BOUCLE_options_dev_saisie>
+</p>
+</B_options_dev_saisie>
+</BOUCLE_saisies>
+</BOUCLE_categories>
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/tableau.html b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/tableau.html
new file mode 100644
index 0000000000000000000000000000000000000000..e50be61508a281c4e2c6a37e0848012415cfb789
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/saisies_aide/tableau.html
@@ -0,0 +1,44 @@
+<h2 class="h2 spip">#ENV{titre}</h2>
+<B_options_tableau>
+
+#ENV{preambule}
+
+<div style="overflow:auto; border-collapse:collapse">
+<table class="spip">
+	<colgroup>
+		<col span="1">
+	<BOUCLE_categories_tableau_colgroup(DATA){source tableau, #ENV{saisies}}>
+		<col span="[(#SAISIES|count)]">
+	</BOUCLE_categories_tableau_colgroup>
+	</colgroup>
+<thead>
+	<tr class="first_row">
+		<th></th>
+		<BOUCLE_categories_tableau_th_first(DATA){source tableau, #ENV{saisies}}>
+			<th colspan="[(#SAISIES|count)]" style="border-left: 1px solid black;">#NOM</th>
+		</BOUCLE_categories_tableau_th_first>
+	</tr>
+	<tr class="first_row">
+		<th>Options \ Saisies</th>
+		<BOUCLE_categories_tableau_th(DATA){source tableau, #ENV{saisies}}>
+			<BOUCLE_saisies_tableau_th(DATA){source tableau, #SAISIES}>
+				<th [(#COMPTEUR_BOUCLE|=={1}|oui)style="border-left: 1px solid black;"]><a href="#saisie_#CLE">#CLE</a></th>
+			</BOUCLE_saisies_tableau_th>
+		</BOUCLE_categories_tableau_th>
+	</tr>
+</thead>
+<tbody>
+	<BOUCLE_options_tableau(DATA){source tableau, #ENV{options}}>
+	<tr class="tr_liste [(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
+		<th><a href="#option_#CLE">#CLE</a></th>
+		<BOUCLE_categories_tableau(DATA){source tableau, #ENV{saisies}}>
+			<BOUCLE_saisies_tableau(DATA){source tableau, #SAISIES}>
+				<td [(#COMPTEUR_BOUCLE|=={1}|oui)style="border-left: 1px solid black;"]>[(#CLE|in_array{#_options_tableau:UTILISEE_PAR}|?{'X','-'})]</td>
+			</BOUCLE_saisies_tableau>
+		</BOUCLE_categories_tableau>
+	</tr>
+	</BOUCLE_options_tableau>
+</tbody>
+</table>
+</div>
+</B_options_tableau>
diff --git a/design_system_dependences/saisies/v5.2.0/inclure/voir_saisies.html b/design_system_dependences/saisies/v5.2.0/inclure/voir_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..44b6fe26e05221961489668f79a20c71deea71f7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/inclure/voir_saisies.html
@@ -0,0 +1,12 @@
+[(#REM) S'il y a des options afficher_si, il faut vérifier que les conditions sont remplies ]
+[(#SET{saisies,#ENV{saisies}|saisies_verifier_afficher_si{#ENV**|unserialize}})]
+<BOUCLE_saisies(DATA){source tableau, #GET{saisies}}>
+[(#EVAL{!defined('_SAISIES_AFFICHAGE_COMPACT')}|oui)
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+	[(#VALEUR|saisies_generer_vue{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+]
+[(#EVAL{defined('_SAISIES_AFFICHAGE_COMPACT')}|oui)
+[<div class="champ afficher [contenu_(#VALEUR|table_valeur{options/nom})]">[<strong class="label colonincluded">(#VALEUR|table_valeur{options/label}|typo)</strong>[(#VAL{:}|typo)]] (#VAL{saisie}|array_key_exists{#VALEUR}|?{[(#VALEUR|saisies_generer_vue{#ENV{_env}|sinon{#ENV**|unserialize},#ARRAY{valeur_uniquement,oui,sans_reponse,''}}|ptobr)]})</div>]
+]
+</BOUCLE_saisies>
diff --git a/design_system_dependences/saisies/v5.2.0/install.log b/design_system_dependences/saisies/v5.2.0/install.log
new file mode 100644
index 0000000000000000000000000000000000000000..496ede61b926f2da81c2b7c184ec476b427f498d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/install.log
@@ -0,0 +1,3 @@
+installation: charger_plugin
+date: 2024-01-16T13:05:58Z
+source: ../tmp/cache/chargeur/v5.2.0-e295d2ac-saisies-222af-v5.2.0.zip
diff --git a/design_system_dependences/saisies/v5.2.0/javascript/saisies.js b/design_system_dependences/saisies/v5.2.0/javascript/saisies.js
new file mode 100644
index 0000000000000000000000000000000000000000..0734a91fea79e2acbb57d9a8320ccdb1cd3ce2db
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/javascript/saisies.js
@@ -0,0 +1,307 @@
+jQuery(function(){
+	saisies_fieldset_pliable();
+	saisies_fieldset_onglet();
+	saisies_multi_novalidate();
+	onAjaxLoad(saisies_fieldset_pliable);
+	onAjaxLoad(saisies_fieldset_onglet);
+	onAjaxLoad(saisies_multi_novalidate);
+});
+
+/**
+ * Rend certains fieldsets pliables
+ *
+ * Il s'agit des fieldsets portant les classes "fieldset.pliable"
+ * Non cumulable avec les fieldsets en onglets.
+ */
+function saisies_fieldset_pliable(){
+	// On cherche les groupes de champs pliables
+	jQuery('.fieldset.pliable')
+		.each(function(){
+			var fieldset = jQuery(this);
+			var groupe = jQuery(this).find('> .editer-groupe');
+			var legend = jQuery(this).find('> legend');
+
+			// On éviter de plier un fieldset qui contient des erreurs lors de
+			// l'initialisation.
+			if (fieldset.find('.erreur').length > 0) {
+				fieldset.removeClass('plie');
+			}
+
+			// S'il est déjà plié on cache le contenu
+			if (fieldset.is('.plie'))
+				groupe.hide();
+
+			// Ensuite on ajoute une action sur le titre
+			legend
+				.unbind('click')
+				.click(
+					function(){
+						fieldset.toggleClass('plie');
+						if (groupe.is(':hidden'))
+							groupe.show();
+						else
+							groupe.hide();
+					}
+				);
+		});
+};
+
+/**
+ * Tranforme certains fieldsets en onglets
+ *
+ * - Ceux portant les classes "fieldset.fieldset_onglet".
+ * - Accessible à l'exception de la navigation au clavier.
+ * - Les onglets sont persistants si les fieldsets possèdent un id ou un data-id.
+ * - Non cumulable avec les fieldsets pliables.
+ *
+ * Markup inspiré de https://van11y.net/fr/onglets-accessibles/
+ */
+function saisies_fieldset_onglet() {
+
+	// Classes utilisées
+	var classes = {
+		// conteneur général
+		wrapper:       'saisies-onglets',
+		// Menu
+		tablist:       'saisies-menu-onglets',
+		tablist_items: 'saisies-menu-onglets__items',
+		tablist_item:  'saisies-menu-onglets__item',
+		tablist_link:  'saisies-menu-onglets__lien',
+		active:        'actif',
+		error:         'erreur',
+		scrollable:    'scrollable',
+		// contenus (les fieldsets)
+		tabscontents:  'saisies-contenus-onglets',
+		tabcontent:    'saisies-contenu-onglet', // en complément de .fieldset_onglet
+	}
+	var selecteur_fieldset = '.fieldset.fieldset_onglet:not(.pliable)';
+	var storage = window.sessionStorage;
+
+	// Générer les onglets
+	var init = function() {
+		$.each(collections_fieldsets(), function(i, $fieldsets) {
+			// A-t-on ne serait-ce qu'un onglet vertical ? Si oui, on considère que tout est en vertical
+			$fieldsets.each(function() {
+				if ($(this).hasClass('fieldset_onglet_vertical')) {
+					classes.wrapper = classes.wrapper + ' ' + 'saisies-onglets-verticaux';
+					return false;
+				}
+			});
+
+			var
+				$conteneur				= $('<div class="'+classes.wrapper+'"></div>'),
+				$menu							= $('<nav class="'+classes.tablist+'"><ul class="'+classes.tablist_items+'" role="tablist"></ul></nav>'),
+				$contenus					= $('<div class="'+classes.tabscontents+'"></div>'),
+				ids_contenus			= [],
+				$first_fieldset		= $fieldsets.first(),
+				id_menu						= null;
+
+			// On insère un conteneur général avant le premier fieldset de la série
+			// puis celui des contenus à l'intérieur.
+			$conteneur.append($contenus).insertBefore($first_fieldset);
+
+			// On parcourt la série de fieldsets pour préparer
+			// les entrées du menu, les interactions et les contenus
+			$fieldsets.each(function() {
+
+				var
+					$contenu      = $(this),
+					id_persistant = $contenu.attr('id') || $contenu.attr('data-id'),
+					afficher_si		= $contenu.attr('data-afficher_si') || 'true',
+					id_contenu    = id_persistant || randomId(),
+					id_onglet     = 'onglet-' + id_contenu;
+
+				// On ajoute les attributs nécessaire : id, classe, role et aria
+				// on supprime ensuite tout ce qui est afficher si
+				// puis on le cache d'office et on le déplace dans le conteneur.
+
+				$contenu
+					.attr('id', id_contenu)
+					.addClass(classes.tabcontent)
+					.attr('role', 'tabpanel')
+					.attr('aria-labelledby', id_onglet)
+					.attr('data-saisies-onglet', true) // pour s'assurer de ne pas passer plusieurs fois
+					.removeAttr('data-afficher_si')
+					.hide().attr('hidden', '')
+					.appendTo($contenus);
+
+				// On récupère le titre et on le cache
+				var titre = $contenu.find('legend').first().hide().text();
+
+				// On crée l'onglet avec son interaction
+				var $onglet = $('<li class="'+classes.tablist_item+'"><a class="'+classes.tablist_link+'" href="#'+id_contenu+'" id="'+id_onglet+'" aria-controls="'+id_contenu+'" role="tab" aria-selected="false" tabindex="-1">'+titre+'</a></li>');
+				$onglet
+					.attr('data-afficher_si', afficher_si)
+					.click(function() {
+						activer_onglet($(this).find('.'+classes.tablist_link));
+						$(this).siblings().each(function() {
+							desactiver_onglet($(this).find('.'+classes.tablist_link));
+						});
+						return false;
+					});
+
+				// Lorsqu'on masque l'onglet avec afficher_si, se rendre si possible au premier onglet
+				$onglet.on('afficher_si_masque_pre', function() {
+					$this_onglet = $(this);
+					$lien = $this_onglet.children('a');
+					// Si c'est onglet actif, on ferme l'onglet et on cherche le premier onglet dispo
+					if ($lien.attr('aria-selected') == 'true') {
+						$nouvel_onglet = $this_onglet.siblings().not('.afficher_si_masque').first().children('a')
+						desactiver_onglet($lien);
+						activer_onglet($nouvel_onglet);
+					}
+				});
+
+
+				// Lorsqu'on rend visible l'onglet après un afficher_si, si c'est le seul, y aller directement
+				$onglet.on('afficher_si_visible_post', function() {
+					$voisins = $(this).siblings().not('.afficher_si_masque');
+					if (!$voisins.length) {
+						activer_onglet($onglet.children('a'));
+					}
+				});
+
+
+				// On note l'id persistant
+				if (id_persistant) {
+					ids_contenus.push(id_persistant);
+				}
+
+				// S'il y a des erreurs dans cette partie du contenu, on met une classe "erreur" à l'onglet aussi
+				if ($contenu.find('.editer.erreur').length) {
+					$onglet.children('a').addClass(classes.error);
+				}
+
+				// On ajoute l'onglet au menu
+				$menu.find('.'+classes.tablist_items).append($onglet);
+			});
+
+			// On insère le menu dans le DOM.
+			// Si *tous* les fieldsets on un id persistant, on peut s'en servir pour celui du menu,
+			// ce qui permet la navigation persistante.
+			// l'id du menu sera utilisé comme clé dans la session, on le simplifie avec un hash.
+			if (ids_contenus.length === $fieldsets.length) {
+				id_menu = 'onglets-'+hashCode(ids_contenus.join(''));
+				$menu.attr('data-id', id_menu);
+			}
+			$menu.prependTo($conteneur);
+
+			// Indiquer si le menu doit être scrollable
+			if ($menu[0].scrollWidth > $menu[0].clientWidth) {
+				$menu.addClass(classes.scrollable);
+			}
+
+			// On active l'onglet par défaut, par ordre de priorité :
+			//  - le premier avec une erreur
+			//	- celui en session s'il existe
+			//	- le 1er trouvé
+			var $onglet_defaut;
+			if ($('.' + classes.tablist_link + '.' + classes.error).length > 0) {
+				$onglet_defaut = $('.' + classes.tablist_link + '.' + classes.error).first();
+			} else if (storage.getItem(id_menu) !== null && $('#'+escapeId(storage.getItem(id_menu))).length > 0) {
+				$onglet_defaut = $('#'+escapeId(storage.getItem(id_menu)));
+			} else {
+				$onglet_defaut = $menu.find('.'+classes.tablist_link).first();
+			}
+			activer_onglet($onglet_defaut, 0, false);
+		});
+	}
+
+	// Retourne un tableau de collections de fieldsets
+	// par log de fieldset coté à cote
+	var collections_fieldsets = function() {
+		var collections = [];
+		$(selecteur_fieldset).each( function() {
+				$fieldsets_niveau = $(this).add($(this).nextUntil(':not('+selecteur_fieldset+')')),
+				parsed = $(this).data('saisies-onglet-parsed') || false;
+			if (!parsed) {
+				collections.push($fieldsets_niveau);
+				$fieldsets_niveau.each( function() {
+					$(this).data('saisies-onglet-parsed', true);
+				});
+			}
+		});
+		return collections;
+	}
+
+	// Activer un onglet
+	// @param object $onglet Élément <a>
+	var activer_onglet = function( $onglet, duree = 150, persistant = true ) {
+		if ($onglet.length) {
+			var $contenu = $(escapeId($onglet.attr('href')));
+			$onglet.addClass(classes.active).attr('aria-selected', true).removeAttr('tabindex');
+			$contenu.fadeIn(duree).removeAttr('hidden');
+			// Mettre en session si on a ce qu'il faut
+			var id_menu = $onglet.parents('.'+classes.tablist).attr('data-id') || null;
+			if (persistant && id_menu) {
+				storage.setItem(id_menu, $onglet.attr('id'));
+			}
+		}
+	}
+
+	// Désactiver un onglet
+	// @param object $onglet Élément <a>
+	var desactiver_onglet = function( $onglet, duree = 150 ) {
+		if ($onglet.length) {
+			var $contenu = $(escapeId($onglet.attr('href')));
+			$onglet.removeClass(classes.active).attr('aria-selected', false).attr('tabindex', -1);
+			$contenu.hide().attr('hidden', '');
+		}
+	}
+
+	// Échapper les ids pour ne pas faire couiner jQuery
+	var escapeId = function ( id ) {
+		id = (id || '').replace(/[^\d\w_\-\#]/gi, '\\$&');
+		return id;
+	}
+
+	// Retourne un identifiant aléatoire
+	// https://stackoverflow.com/a/8084248
+	var randomId = function (taille = 8) {
+		var random = (Math.random() + 1).toString(36);
+		return random.substring(random.length - taille);
+	}
+
+	// Hash simple et rapide
+	// https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0
+	var hashCode = function(s) {
+		for (var i = 0, h = 0; i < s.length; i++)
+			h = Math.imul(31, h) + s.charCodeAt(i) | 0;
+		return Math.abs(h);
+	}
+
+	// C'est parti
+	init();
+}
+
+function saisies_date_jour_mois_annee_changer_date(me, datetime) {
+	var champ = jQuery(me);
+	var li = champ.closest('.editer');
+	var	jour = jQuery.trim(li.find('.date_jour').val());
+	var	mois = jQuery.trim(li.find('.date_mois').val());
+	var	annee = jQuery.trim(li.find('.date_annee').val());
+	var	date = jQuery.trim(li.find('.datetime').val());
+
+	while(jour.length < 2) {jour = '0' + jour;}
+	while(mois.length < 2) {mois = '0' + mois;}
+	while(annee.length < 4) {annee = '0' + annee;}
+
+	if (datetime == 'oui') {
+		heure = date.substring(10);
+		if (!heure || !(heure.length == 9)) {
+			heure = ' 00:00:00';
+		}
+		date = annee + '-' + mois + '-' + jour + heure;
+	}
+	else {
+		date = annee + '-' + mois + '-' + jour;
+	}
+	li.find('.datetime').attr('value', date);
+}
+
+/** Ne pas valider lors des retours arrières sur multiétape **/
+function saisies_multi_novalidate() {
+	$('[name^="_retour_etape"],[name="aller_a_etape"]').click(function() {
+		$(this).parents('form').attr('novalidate', 'novalidate');
+	});
+}
diff --git a/design_system_dependences/saisies/v5.2.0/javascript/saisies_afficher_si.js b/design_system_dependences/saisies/v5.2.0/javascript/saisies_afficher_si.js
new file mode 100644
index 0000000000000000000000000000000000000000..6c1c43ce256a5621fd6804690614a2b7e4918c36
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/javascript/saisies_afficher_si.js
@@ -0,0 +1,256 @@
+$(function(){
+	afficher_si_init();
+	onAjaxLoad(afficher_si_init);
+});
+afficher_si_current_data = '';
+function afficher_si_init() {
+	$('form:not([data-afficher_si-init])').each(function(){
+		// Seulement si au moins un afficher_si dedans !
+		if ($(this).find('[data-afficher_si]').length !== 0 || $(this).find('[data-resume_etapes_futures]') !== 0) {
+			form = $(this);
+			form.find('.formulaire_spip__etapes').each(function() {
+				$(this).css('min-height', $(this).height());
+			});
+			afficher_si_init_chemin_etapes(form);
+
+			afficher_si_set_current_data(form);
+			form.find('[data-afficher_si]').each(function(){
+				condition = verifier_afficher_si($(this), true);
+				animer_afficher_si($(this), condition, true);
+			}
+			);
+			afficher_si_set_etapes_presentation_courante(form);
+			afficher_si_set_etape_suivante(form);
+
+			// Un écouteur sur la modif de tous les champs de ce form
+			$(this).find('textarea, input, select').change(function() {
+				afficher_si_onchange($(this))}
+			);
+			$(this).attr('data-afficher_si-init', true);
+		}
+	})
+}
+
+/**
+ * Ecouteur sur les champ
+ * @param jQuery Object $champ
+**/
+function afficher_si_onchange($champ) {
+	// Seulement si ce champ a un name
+	if (name = $champ.attr('name')) {
+		form = $champ.parents('form');
+		name = name.replace('[]', '');
+
+		afficher_si_set_current_data(form);
+
+		// Si un autre champ utilise celui-ci dans une condition
+		form.find('[data-afficher_si*=\''+name+'\']').each(function(){
+			condition = verifier_afficher_si($(this));
+			animer_afficher_si($(this), condition);
+		})
+		afficher_si_set_etapes_presentation_courante(form, name);
+		afficher_si_set_etape_suivante(form, name);
+	}
+}
+function afficher_si_set_current_data(form) {
+	current_data = form.serializeArray();//Le format de retour n'est pas simple, on transforme en tableau associatif
+	afficher_si_current_data = [];
+	$(current_data).each(function() {
+		if (this.name.includes('[]')) {
+			this.name	= this.name.replace('[]', '');
+			if (Array.isArray(afficher_si_current_data[this.name])) {
+				afficher_si_current_data[this.name].push(this.value)
+			} else {
+				afficher_si_current_data[this.name] = [this.value];
+			}
+		} else {
+			afficher_si_current_data[this.name] = this.value;
+		}
+	});
+}
+function verifier_afficher_si(saisie, chargement = false) {
+	if ((saisie.hasClass('erreur') || $('.erreur', saisie).length) && chargement) {//Tjr afficher au chargement s'il y  une erreur. Si cela arrive c'est qu'il y a quelque part une incohérence entre l'évaluation JS et l'évaluation PHP des afficher si.
+		console.log('Attention : saisies masquée par afficher_si avec une erreur...' + saisie.attr('data-id'));
+		return true;
+	}
+	condition = saisie.attr('data-afficher_si');
+	condition = eval(condition);
+	return condition
+}
+function animer_afficher_si(saisie, condition, chargement){
+	if (condition) {
+		if (!saisie.hasClass('afficher_si_visible')) {
+			saisie.trigger('afficher_si_visible_pre');
+			saisie.removeClass('afficher_si_masque_chargement').removeClass('afficher_si_masque').addClass('afficher_si_visible').removeAttr('aria-hiden');
+			if (!saisie.hasClass('etapes__item') && !saisie.hasClass('saisie_hidden')) {
+				afficher_si_show(saisie);
+			}
+			saisie.find('[data-afficher-si-required]').attr('required', true).attr('data-afficher-si-required',false);
+			saisie.trigger('afficher_si_visible_post');
+		}
+	} else {
+		if (!saisie.hasClass('afficher_si_masque')) {
+			saisie.trigger('afficher_si_masque_pre');
+			if (!saisie.hasClass('etapes__item') && !saisie.hasClass('saisie_hidden')) {
+				afficher_si_hide(saisie);
+			}
+			if (chargement) {
+				saisie.addClass('afficher_si_masque_chargement');
+			}
+			saisie.addClass('afficher_si_masque').removeClass('afficher_si_visible').attr('aria-hiden', true);
+			saisie.find('[required]').attr('required', false).attr('data-afficher-si-required', null);
+			saisie.trigger('afficher_si_masque_post');
+		}
+	}
+}
+
+function afficher_si(args) {
+	if (afficher_si_current_data.hasOwnProperty(args['champ'])) {
+		valeur_champ = afficher_si_current_data[args['champ']];
+	} else {
+		valeur_champ = '';
+	}
+	valeur = args['valeur'];
+
+	// Compat historique == > IN pour données tabulaires !
+	if (Array.isArray(valeur_champ) && !args['total']) {
+		if (args['operateur'] == '==') {
+			args['operateur'] = 'IN';
+		} else if(args['operateur'] == '!=') {
+			args['operateur'] = '!IN';
+		}
+	}
+	// Si on vérifie un total
+	if (args['total']) {
+		if (Array.isArray(valeur_champ)) {
+			valeur_champ = valeur_champ.length;
+		} else {
+			valeur_champ = 0;
+		}
+	}
+
+	// Transformation en tableau des valeurs et valeur_champ, si IN/!IN
+	if (args['operateur'] == 'IN' || args['operateur'] == '!IN') {
+		valeur = valeur.split(',');
+		if (!Array.isArray(valeur_champ)) {
+			if (valeur_champ) {
+				valeur_champ = [valeur_champ];
+			} else {
+				valeur_champ = [];
+			}
+		}
+	}
+
+	// Transformation en entier des valeurs et valeur_champ, si opérateur de comparaison
+	if (['<', '<=', '>=', '>'].includes(args['operateur'])) {
+		valeur = Number(valeur);
+		valeur_champ = Number(valeur_champ);
+	}
+
+	// Et maintenant les test
+	switch (args['operateur']) {
+		case '==':
+			return valeur_champ == valeur;
+		case '!=':
+			return valeur_champ != valeur;
+		case '>':
+			return valeur_champ > valeur;
+		case '>=':
+			return valeur_champ >= valeur;
+		case '<':
+			return valeur_champ < valeur;
+		case '<=':
+			return valeur_champ <= valeur;
+		case 'MATCH':
+			return RegExp(valeur, args.regexp_modif).test(valeur_champ);
+		case '!MATCH':
+			return !RegExp(valeur, args.regexp_modif).test(valeur_champ);
+		case 'IN':
+			return $(valeur).filter(valeur_champ).length ? true : false;
+		case '!IN':
+			return $(valeur).filter(valeur_champ).length ? false : true;
+		default:
+			return valeur_champ ? true : false;
+	}
+}
+
+
+//Pour l'affichage des étapes selon la présentation "étape courante" seulement
+//@param form, le formulaire
+//@param name le nom de la saisie dont la valeur vient juste de changer
+function afficher_si_set_etapes_presentation_courante(form, name='') {
+	var etapes = afficher_si_parse_data_etapes_futures(form);
+	if (!etapes) {
+		return;
+	}
+	form.find('[data-etapes_max]').each(function() {
+		var etape_total = $(this).attr('data-etapes_max');
+		for (etape in etapes) {
+			var condition = etapes[etape]['afficher_si'] ?? 'true';
+			if (!name || condition.includes(name)) {
+				$(this).attr('data-' + etape, eval(condition));
+			}
+			if (condition && !eval($(this).attr('data-' + etape))) {
+				etape_total--;
+			}
+		}
+		$(this).find('.formulaire_spip_etape__total').text(etape_total);
+	});
+}
+
+// Pour le libellé de l'étape suivante
+//@param form, le formulaire
+//@param name le nom de la saisie dont la valeur vient juste de changer
+function afficher_si_set_etape_suivante(form, name) {
+	var etapes = afficher_si_parse_data_etapes_futures(form);
+	if (!etapes) {
+		return;
+	}
+	var label_enregistrer = form.find('button.submit_suivant').attr('data-label_enregistrer');
+	var titre_retenu = label_enregistrer;
+	// Chercher la première future étape
+	for (etape in etapes) {
+		var afficher_si_etape = etapes[etape]['afficher_si'] ?? 'true';
+		if (eval(afficher_si_etape)) {
+			titre_retenu = etapes[etape]['label'];
+			break;
+		}
+	}
+	form.find('button.submit_suivant').each(function() {
+		var $span = $(this).find('.btn__label');
+		// Stocker le modèle pour suivant, si pas deja fait
+		if (!$(this).attr('data-modele')) {
+			$(this).attr('data-modele', $span.html());
+		}
+		// Puis ajuster le titre, le modèle variant selon que nous passons directement à la validation ou pas
+		if (titre_retenu == label_enregistrer) {
+			$span.html(titre_retenu);
+		} else {
+			$span.html($(this).attr('data-modele'));
+			$span.find('.titre-etape').html(titre_retenu);
+		}
+	});
+}
+// Recopier les info d'afficher_si présente dans [data-resume_etapes_futures] au sein de chaque etapes futures
+// Le but est de simplifier ainsi le code principal, en se contentant du code de animer_afficher_si()
+// @param jquery obcet form
+function afficher_si_init_chemin_etapes(form) {
+	var etapes = afficher_si_parse_data_etapes_futures(form);
+	if (!etapes) {
+		return;
+	}
+	for (etape in etapes) {
+		var afficher_si_etape = etapes[etape]['afficher_si'] ?? '';
+		if (afficher_si_etape) {
+			form.find('.etapes__item.' + etape).attr('data-afficher_si', afficher_si_etape);
+		}
+	}
+}
+function afficher_si_parse_data_etapes_futures(form) {
+	var data = form.attr('data-resume_etapes_futures');
+	if (!data) {
+		return;
+	}
+	var etapes = JSON.parse(data);
+	return etapes;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/javascript/saisies_textarea_counter.js b/design_system_dependences/saisies/v5.2.0/javascript/saisies_textarea_counter.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9ad0e68a5238fc66168fdf9cc5ea4c6af2d70b1
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/javascript/saisies_textarea_counter.js
@@ -0,0 +1,75 @@
+/*!
+  Scampi textarea-counter
+  Décompte les caractères restants dans les éléments textarea disposant d’un maxlength
+  Ajoute des attributs aria pour annoncer le nombre de caractères restant
+*/
+var Scampi = Scampi || {};
+
+Scampi.textareaCounter = function textareaCounter() {
+  var textAreaFields = document.querySelectorAll("textarea[maxlength]");
+  var stepPolite = 100;
+  var stepAssertive = 20;
+
+  Array.prototype.forEach.call(textAreaFields, function (textarea) {
+    var idTextarea = textarea.id;
+    if(!document.querySelector("#"+idTextarea + "-counter")) {
+      var maxLength = textarea.getAttribute("maxlength");
+      var messageLength = textarea.value.length;
+      var activeValue = countRest(maxLength, messageLength);
+      textarea.setAttribute("aria-describedby", idTextarea + "-counter");
+      textarea.insertAdjacentHTML("afterend", "<p class='textarea-counter' id='" + idTextarea + "-counter'><span class='textarea-counter-nb'>" + activeValue + "</span> " + saisies_caracteres_restants + "</p>");
+      textarea.addEventListener("input", handleInput);
+      textarea.addEventListener("keypress", handleInput);
+    }
+  });
+
+  function handleInput(evt) {
+    textarea = evt.target;
+    paragraph = textarea.nextElementSibling;
+    updateValue(textarea, paragraph);
+  }
+
+  function countRest(maxlength, messageLength) {
+    return maxlength - messageLength;
+  }
+
+  function countStepPolite(maxLengthValue) {
+    return maxLengthValue - stepPolite;
+  }
+
+  function countStepAssertive(maxLengthValue) {
+    return maxLengthValue - stepAssertive;
+  }
+
+  function updateAria(maxLengthValue, messageLength, paragraph) {
+    politeFlag = countStepPolite(maxLengthValue);
+    assertiveFlag = countStepAssertive(maxLengthValue);
+
+    if (messageLength < politeFlag) {
+      paragraph.removeAttribute("aria-live");
+      paragraph.removeAttribute("aria-atomic");
+    }
+    else if (messageLength >= politeFlag && messageLength < assertiveFlag) {
+      paragraph.setAttribute("aria-live", "polite");
+      paragraph.setAttribute("aria-atomic", "true");
+    }
+    else if (messageLength >= assertiveFlag) {
+      paragraph.setAttribute("aria-live", "assertive");
+      paragraph.setAttribute("aria-atomic", "true");
+    }
+  }
+
+  function updateValue(textarea, paragraph) {
+    var maxLength = textarea.getAttribute("maxlength");
+    var messageLength = textarea.value.length;
+    var counter = paragraph.querySelector(".textarea-counter-nb")
+
+    counter.innerText = countRest(maxLength, messageLength);
+    updateAria(maxLength, messageLength, paragraph);
+  }
+}
+
+jQuery(function(){
+  Scampi.textareaCounter();
+  onAjaxLoad(Scampi.textareaCounter);
+});
diff --git a/design_system_dependences/saisies/v5.2.0/javascript/textarea-counter/textarea-counter.md b/design_system_dependences/saisies/v5.2.0/javascript/textarea-counter/textarea-counter.md
new file mode 100644
index 0000000000000000000000000000000000000000..60714469baee9b26a38d003694f9b7df200a36be
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/javascript/textarea-counter/textarea-counter.md
@@ -0,0 +1,56 @@
+# Textarea counter
+
+Script extrait de Scampi, une biliothèque légère de composants scss, html, javascript respectant la Checklist Pidila : RGAA, Charte internet de l’État, Éco-conception, Bonnes pratiques Opquast, RGI.
+
+https://pidila.gitlab.io/scampi/
+
+Présentation
+-------------------------------------------
+
+Ce script permet d’ajouter le décompte de caractères restant sur un élément de formulaire de type `textarea` lorsque que l’attribut `maxlength` est défini.
+
+Les utilisateurs de lecteurs d’écran sont prévenus du nombre de caractères restant lorsque certains seuils sont atteint grâce aux attributs `aria-live="polite"` ou `aria-live="assertive"` et `aria-atomic="true"`.
+
+Ces seuils sont configurables dans le script à travers les variables `stepPolite` et `stepAssertive`.
+
+Ils sont fixés pour :
+-  `aria-live="polite"` lorsqu’il reste 100 caractères ou moins
+-  `aria-live="assertive"` lorsqu’il reste 20 caractères ou moins
+
+
+Utilisation
+---------------------------------------------------
+
+Inclure le script et le style à votre projet.
+
+Renseigner l’attribut `maxlength` sur l’élément `textarea`.
+
+### Configuration
+
+La variable proposée dans ce module est :
+
+- `$textarea-counter-nb-color` : couleur du compteur, sa valeur par défaut est `$primary-color`
+
+Exemple d’utilisation
+---------------------------------------------------------------------
+
+
+### Code écrit
+
+```html
+<div class="form-group">
+  <label for="textarea-1">Test maxlength à 240</label>
+  <textarea class="form-control" id="textarea-1" cols="30" rows="4" maxlength="240"></textarea>
+</div>
+```
+
+### Code généré
+
+```html
+<div class="form-group">
+  <label for="textarea-1">Test maxlength à 240</label>
+  <textarea class="form-control" id="textarea-1" cols="30" rows="4" maxlength="240" ariadescribedby="textarea-1-counter"></textarea>
+  <p class="textarea-counter" id="textarea-1-counter"><span class="textarea-counter-nb">240</span> caractères restants</p>
+</div>
+```
+
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies.xml b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies.xml
new file mode 100644
index 0000000000000000000000000000000000000000..148f4bdfcd779c0952685e06632f80d41bc20fd5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies.xml
@@ -0,0 +1,43 @@
+<traduction
+	module="paquet-saisies"
+	id="paquet-saisies--saisies-b6ba2"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/saisies.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ar" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+	</langue>
+	<langue code="de" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=de" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+		<traducteur nom="Torsten Willmann" lien="https://trad.spip.net/auteur/torsten-willmann" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=en" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+		<traducteur nom="jack31" lien="https://trad.spip.net/auteur/jack31" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=es" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="danielquisbert" lien="https://trad.spip.net/auteur/danielquisbert" />
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr_tu" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Cerf" lien="https://trad.spip.net/auteur/cerf" />
+		<traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" />
+	</langue>
+	<langue code="it" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=it" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=nl" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=pt_br" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="ru" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ru" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=sk" total="4" traduits="3" relire="0" modifs="1" nouveaux="0" pourcent="75.00">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ar.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..140d551bd1356b7a1208f21784621b4b0b462321
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ar.php
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'يسهّل هذا الملحق إنشاء حقول للاستمارات من خلال توفيره علامة SAISIE#. تتوافق علامات HTML الناتجة مع تسمية الاستمارات 
+		المقترحة في SPIP بإصداراته الأحدث من ٢.٠ ومع ملحق الاعدادات CFG.', # MODIF
+	'saisies_nom' => 'إدخال للاستمارات',
+	'saisies_slogan' => 'إنشاء حقول استمارات بسهولة',
+	'saisies_titre' => 'إدخال للاستمارات'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_de.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa0666d44f2c2885488b8a4b15dbe0a35a7e01d7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_de.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Dieses Plugin erleichtert die Erstellung von Eingabefeldern für Formulare und bietet einen Tag #SAISIE. Das erzeugte HTML ist mit der Nomenklatur der von SPIP vorgeschlagenen Formulare kompatibel.', # MODIF
+	'saisies_nom' => 'Eingabefelder für Formulare',
+	'saisies_slogan' => 'Unkompliziertes Erstellen von Eingabefeldern für Formulare.',
+	'saisies_titre' => 'Eingabefelder für Formulare'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_en.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..af77702b0fcd0614975b2741c452fc133842f438
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_en.php
@@ -0,0 +1,19 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'This plugin makes it easier to write form fields by providing a #SAISIE tag. 
+		The generated HTML is compatible with the classification of forms
+		proposed by SPIP.', # MODIF
+	'saisies_nom' => 'Entries for forms',
+	'saisies_slogan' => 'Create easily forms fields.',
+	'saisies_titre' => 'Entries for forms'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_es.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..beabe3990a4f5783e396eaaf4f063b04506d315c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_es.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Este plugin permite facilitar la redacción de campos de formularios proponiendo una etiqueta #SAISIE. El HTML generado es compatible con la nomenclatura de los formularios propuestos por SPIP > 2.0 y con el plugin de configuración CFG.', # MODIF
+	'saisies_nom' => 'Entradas para formularios',
+	'saisies_slogan' => 'Escribir fácilmente los campos de formularios.',
+	'saisies_titre' => 'Entradas para formularios'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..377110308db77cd991bce3f9cec9c7dbc54d2922
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/saisies.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Ce plugin permet de faciliter l’écriture de champs de formulaires en proposant une
+	balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
+	proposée par SPIP.',
+	'saisies_nom' => 'Saisies pour formulaires',
+	'saisies_slogan' => 'Écrire facilement des champs de formulaires.',
+	'saisies_titre' => 'Saisies pour formulaires'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr_tu.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr_tu.php
new file mode 100644
index 0000000000000000000000000000000000000000..c27203668534fce7975c0785164fd7ef98a3d98e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_fr_tu.php
@@ -0,0 +1,19 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Ce plugin permet de faciliter l’écriture de champs de formulaires en proposant une
+		balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
+		proposée par SPIP.', # MODIF
+	'saisies_nom' => 'Saisies pour formulaires',
+	'saisies_slogan' => 'Écrire facilement des champs de formulaires.',
+	'saisies_titre' => 'Saisies pour formulaires'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_it.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_it.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6a814d63ad2a83bbfaaf981bf66dee16c0adf2c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_it.php
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Questo plugin semplifica la scrittura dei campi del modulo offrendo l’etichetta #SAISIE. L’HTML generato è compatibile con la nomenclatura dei form
+offerto da SPIP.', # MODIF
+	'saisies_nom' => 'Saisies per i moduli',
+	'saisies_slogan' => 'Scrivi facilmente i campi del modulo.',
+	'saisies_titre' => 'Saisies per i moduli'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_nl.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..5830c6c085d2bd826049ba10bfb71b3841a6f682
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_nl.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Deze plugin vereenvoudigt het maken van formuliervelden danzij een code #SAISIE. De gegenereerde HTML is compatibel met die van SPIP formulieren vanaf versie 2.0 en met de configuratie plugin CFG.', # MODIF
+	'saisies_nom' => 'Saisies (Invoer) voor formulieren',
+	'saisies_slogan' => 'Eenvoudig formuliervelden maken.',
+	'saisies_titre' => 'Invoer voor formulieren'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_pt_br.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..778cc5c7690a561b07b7d3cc0155d4950581b9e8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_pt_br.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Este plugin permite facilitar a escrita de campos de formulários, propondo uma tag #SAISIE. O HTML gerado é compatível com a nomenclatura dos formulários propostos pelo SPIP > 2.0 e com o plugin de configuração CFG.', # MODIF
+	'saisies_nom' => 'Entradas para formulários',
+	'saisies_slogan' => 'Facilitar a entrada de dados em campos de formulários.',
+	'saisies_titre' => 'Entrada de dados para formulários'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ru.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ru.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee403ebc28406d285373bee73ba8f0849d5c3231
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_ru.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Этот плагин облегчает работу по созданию форм. Вам предоставляется возможность создавать поля (input,textarea) в форме при помощи тега #SAISIE. Полученная форма полностью совместима со стандартом  SPIP 2.0+ и c плагином CFG.', # MODIF
+	'saisies_nom' => 'Поля для форм (saises)',
+	'saisies_slogan' => 'Упрощение работы по созданию форм',
+	'saisies_titre' => 'Поля для форм (saises)'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_sk.php b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..31acc600ca9bf37aa70cf1e247d7c8e800b023d7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/paquet-saisies_sk.php
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'saisies_description' => 'Tento zásuvný modul uľahčuje zápis polí formulára ponúknutím tagu #INPUT. Vytvorený kód HTML je kompatibilný s klasifikáciou formulárov, ktorú ponúka SPIP > 2.0 a so zásuvným modulom na konfiguráciu – CFG.', # MODIF
+	'saisies_nom' => 'Vstupy pre formuláre',
+	'saisies_slogan' => 'Jednoduchý zápis polí formulárov.',
+	'saisies_titre' => 'Vstupy pre formuláre'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies.xml b/design_system_dependences/saisies/v5.2.0/lang/saisies.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d101c9d1756b005bf1c24774db663ba568082f8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies.xml
@@ -0,0 +1,61 @@
+<traduction
+	module="saisies"
+	id="saisies--saisies-b6ba2"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/saisies.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=ar" total="275" traduits="16" relire="0" modifs="7" nouveaux="252" pourcent="5.82">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+	</langue>
+	<langue code="ca" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=ca" total="275" traduits="77" relire="0" modifs="17" nouveaux="181" pourcent="28.00" />
+	<langue code="de" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=de" total="275" traduits="183" relire="0" modifs="7" nouveaux="85" pourcent="66.55">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+		<traducteur nom="Torsten Willmann" lien="https://trad.spip.net/auteur/torsten-willmann" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=en" total="275" traduits="227" relire="2" modifs="7" nouveaux="39" pourcent="82.55">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+		<traducteur nom="jack31" lien="https://trad.spip.net/auteur/jack31" />
+		<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
+		<traducteur nom="maieul" lien="https://trad.spip.net/auteur/maieul" />
+		<traducteur nom="Paolo" lien="https://trad.spip.net/auteur/paolo" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=es" total="275" traduits="254" relire="0" modifs="2" nouveaux="19" pourcent="92.36">
+		<traducteur nom="Cerezo" lien="https://trad.spip.net/auteur/cerezo" />
+		<traducteur nom="danielquisbert" lien="https://trad.spip.net/auteur/danielquisbert" />
+		<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
+		<traducteur nom="Raquel S. Bujaldón" lien="https://trad.spip.net/auteur/raquel-s-bujaldon" />
+		<traducteur nom="severo" lien="https://trad.spip.net/auteur/severo" />
+	</langue>
+	<langue code="fa" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=fa" total="275" traduits="91" relire="0" modifs="17" nouveaux="167" pourcent="33.09">
+		<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=fr" total="275" traduits="275" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu" total="275" traduits="257" relire="0" modifs="1" nouveaux="17" pourcent="93.45">
+		<traducteur nom="beatnick" lien="https://trad.spip.net/auteur/beatnick" />
+		<traducteur nom="Cerf" lien="https://trad.spip.net/auteur/cerf" />
+		<traducteur nom="maieul" lien="https://trad.spip.net/auteur/maieul" />
+		<traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" />
+	</langue>
+	<langue code="it" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=it" total="275" traduits="239" relire="0" modifs="3" nouveaux="33" pourcent="86.91">
+		<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=nl" total="275" traduits="177" relire="0" modifs="29" nouveaux="69" pourcent="64.36">
+		<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
+		<traducteur nom="maieul" lien="https://trad.spip.net/auteur/maieul" />
+		<traducteur nom="mpossoz" lien="https://trad.spip.net/auteur/mpossoz" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=pt_br" total="275" traduits="262" relire="0" modifs="0" nouveaux="13" pourcent="95.27">
+		<traducteur nom="placido" lien="https://trad.spip.net/auteur/placido" />
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="ru" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=ru" total="275" traduits="122" relire="0" modifs="30" nouveaux="123" pourcent="44.36">
+		<traducteur nom="nazar" lien="https://trad.spip.net/auteur/nazar" />
+		<traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" />
+		<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/saisies?lang_cible=sk" total="275" traduits="136" relire="0" modifs="25" nouveaux="114" pourcent="49.45">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_ar.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_ar.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca9acbb665180a34525d948b3dba03a33c72d786
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_ar.php
@@ -0,0 +1,44 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// C
+	'construire_action_annuler' => 'إلغاء',
+	'construire_action_configurer' => 'إعداد',
+	'construire_action_deplacer' => 'نقل',
+	'construire_action_dupliquer' => 'تكرار',
+	'construire_action_supprimer' => 'حذف',
+	'construire_ajouter_champ' => 'إضافة حقل',
+	'construire_confirmer_supprimer_champ' => 'هل تريد فعلاً حذف هذا الحقل؟',
+	'construire_position_fin_formulaire' => 'في أسفل الاستمارة',
+	'construire_position_label' => 'موقع الحقل',
+	'construire_reinitialiser' => 'إعادة تأصيل الاستمارة',
+
+	// L
+	'label_annee' => 'السنة',
+	'label_jour' => 'اليوم',
+	'label_mois' => 'الشهر',
+
+	// O
+	'option_attention_explication' => 'رسالة أهم من التفسير.',
+	'option_attention_label' => 'تحذير',
+	'option_autocomplete_on' => 'تفعيل',
+	'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.', # MODIF
+	'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".', # MODIF
+	'option_type_choix_plusieurs' => 'Permettre à l’utilisateur de choisir <strong>plusieurs</strong> destinataires.', # MODIF
+	'option_type_choix_un' => 'Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire.', # MODIF
+
+	// S
+	'saisie_checkbox_titre' => 'Cases à cocher', # MODIF
+	'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.', # MODIF
+
+	// V
+	'vue_sans_reponse' => '<i>Sans réponse</i>' # MODIF
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_ca.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_ca.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb41c051fa0a0b51f6d94eb86a3fe1a6caf939fe
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_ca.php
@@ -0,0 +1,119 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=ca
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_parcourir_docs_article' => 'Fullejar l’article',
+	'bouton_parcourir_docs_breve' => 'Fullejar la breu',
+	'bouton_parcourir_docs_rubrique' => 'Fullejar la secció',
+	'bouton_parcourir_mediatheque' => 'Fullejar la mediateca',
+
+	// L
+	'label_annee' => 'Any',
+	'label_jour' => 'Dia',
+	'label_mois' => 'Mes',
+
+	// O
+	'option_attention_explication' => 'Un missatge més important que l’explicació.',
+	'option_attention_label' => 'Advertència',
+	'option_cacher_option_intro_label' => 'Amagar la primera elecció buida',
+	'option_choix_destinataires_explication' => 'Un o diversos autors, d’entre els quals hi ha l’usuari, podrà fer la seva tria. Si no hi ha res seleccionat, és l’autor que ha instal·lat el lloc el que serà escollit.', # MODIF
+	'option_choix_destinataires_label' => 'Possibles destinataris',
+	'option_class_label' => 'Classes CSS suplementàries',
+	'option_cols_explication' => 'Amplada del bloc en número de caràcters. Aquesta opció no s’aplica sempre ja que els estils CSS del vostre lloc el poden anul·lar.', # MODIF
+	'option_cols_label' => 'Amplada',
+	'option_datas_explication' => 'Heu d’especificar una opció per línia en la forma "cle|Label du choix"', # MODIF
+	'option_datas_label' => 'Llista d’eleccions possibles',
+	'option_defaut_label' => 'Valor per defecte',
+	'option_disable_avec_post_explication' => 'Idèntic que l’opció anterior però tanmateix envia el valor dins d’un camps amagat.',
+	'option_disable_avec_post_label' => 'Desactivar però enviar',
+	'option_disable_explication' => 'El camp no pot obtenir el focus.',
+	'option_disable_label' => 'Desactivar el camp',
+	'option_explication_explication' => 'Si és necessari, una frase curta descriu l’objecte del camp.',
+	'option_explication_label' => 'Explicació',
+	'option_groupe_affichage' => 'Visualització',
+	'option_groupe_description' => 'Descripció',
+	'option_groupe_utilisation' => 'Utilització',
+	'option_groupe_validation' => 'Validació',
+	'option_info_obligatoire_explication' => 'Podeu, per defecte, modificar la indicació d’obligació: <i>[Obligatoire]</i>.', # MODIF
+	'option_info_obligatoire_label' => 'Indicació d’obligació',
+	'option_inserer_barre_choix_edition' => 'barra d’edició completa',
+	'option_inserer_barre_choix_forum' => 'barra dels fòrums',
+	'option_inserer_barre_explication' => 'Insereix una barra d’eines del portaplomes si aquest està activat.',
+	'option_inserer_barre_label' => 'Inserir una barra d’eines',
+	'option_label_case_label' => 'Etiqueta situada al costat de la casella',
+	'option_label_explication' => 'El títol que es mostrarà.',
+	'option_label_label' => 'Etiqueta',
+	'option_maxlength_explication' => 'L’usuari no podrà escriure més caràcters que aquest nombre.', # MODIF
+	'option_maxlength_label' => 'Número màxim de caràcters',
+	'option_nom_explication' => 'Un nom informàtic que identificarà el camp. Ha de contenir només caràcters alfanumèrics minúsculs o el caràcter "_".', # MODIF
+	'option_nom_label' => 'Nom del camp',
+	'option_obligatoire_label' => 'Camp obligatori',
+	'option_option_intro_label' => 'Etiqueta de la primera elecció buida',
+	'option_pliable_label' => 'Plegable',
+	'option_pliable_label_case' => 'El grup de camps es podrà replegar.',
+	'option_plie_label' => 'Ja plegat',
+	'option_plie_label_case' => 'Si el grup de camps és plegable, ja estarà plegat a la visualització del formulari.',
+	'option_previsualisation_explication' => 'Si el portaplomes està activat, afegit una pestanya per fer una visualització prèvia del text introduït. ',
+	'option_previsualisation_label' => 'Activar la visualització prèvia',
+	'option_readonly_explication' => 'El camp es pot llegir, seleccionar, però no modificar.',
+	'option_readonly_label' => 'Només lectura',
+	'option_rows_explication' => 'Alçada del bloc en número de línies. Aquesta opció no es pot aplicar sempre ja que els estils CSS del vostre lloc el poden anul·lar.',
+	'option_rows_label' => 'Número de línies',
+	'option_size_explication' => 'Amplada del camp en número de caràcters. Aquesta opció no es pot aplicar sempre ja que els estils CSS del vostre lloc el poden anul·lar. ',
+	'option_size_label' => 'Mida del camp',
+	'option_type_choix_plusieurs' => 'Permetrà a l’usuari escollir <strong>diversos</strong> destinataris.', # MODIF
+	'option_type_choix_tous' => 'Posar <strong>tots</strong> aquests autors com a destinataris. L’usuari no tindrà cap tria.', # MODIF
+	'option_type_choix_un' => 'Permetre a l’usuari escollir <strong>un únic</strong> destinatari.', # MODIF
+	'option_type_explication' => 'En mode "amagat", el contingut del camp no serà visible.',
+	'option_type_label' => 'Tipus del camp',
+	'option_type_password' => 'Amagat', # MODIF
+	'option_type_text' => 'Normal',
+
+	// S
+	'saisie_case_explication' => 'Permet activar o desactivar alguna cosa.',
+	'saisie_case_titre' => 'Casella única',
+	'saisie_checkbox_explication' => 'Permet escollir diverses opcions amb caselles.',
+	'saisie_checkbox_titre' => 'Caselles a marcar', # MODIF
+	'saisie_destinataires_explication' => 'Permet escollir un o diversos destinataris entre els autors seleccionats prèviament.', # MODIF
+	'saisie_destinataires_titre' => 'Destinataris',
+	'saisie_explication_explication' => 'Un text explicatiu general.',
+	'saisie_explication_titre' => 'Explicació',
+	'saisie_fieldset_explication' => 'Un quadre que podrà englobar diversos camps.',
+	'saisie_fieldset_titre' => 'Grup de camps',
+	'saisie_file_explication' => 'Enviament d’un arxiu ',
+	'saisie_file_titre' => 'Arxiu',
+	'saisie_hidden_explication' => 'Un camp omplert prèviament que l’usuari no podrà veure.', # MODIF
+	'saisie_hidden_titre' => 'Camp amagat',
+	'saisie_input_explication' => 'Una simple línia de text, que podrà ser visible o estar amagada (contrasenya).',
+	'saisie_input_titre' => 'Línia de text',
+	'saisie_oui_non_explication' => 'Si o no, està clar? :)',
+	'saisie_oui_non_titre' => 'Si o no ',
+	'saisie_radio_defaut_choix1' => 'Un',
+	'saisie_radio_defaut_choix2' => 'Dos',
+	'saisie_radio_defaut_choix3' => 'Tres',
+	'saisie_radio_explication' => 'Permet escollir una opció entre les diverses disponibles.', # MODIF
+	'saisie_radio_titre' => 'Botons ràdios',
+	'saisie_selection_explication' => 'Escollir una opció en una llista desplegable.', # MODIF
+	'saisie_selection_multiple_explication' => 'Permet escollir diverses opcions amb una llista.',
+	'saisie_selection_multiple_titre' => 'Selecció múltiple',
+	'saisie_selection_titre' => 'Llista desplegable', # MODIF
+	'saisie_textarea_explication' => 'Un camp de text en diverses línies.',
+	'saisie_textarea_titre' => 'Bloc de text',
+
+	// T
+	'tous_visiteurs' => 'Tots els visitants (fins i tot els no registrats)',
+
+	// V
+	'vue_sans_reponse' => '<i>Sense resposta</i>', # MODIF
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_de.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_de.php
new file mode 100644
index 0000000000000000000000000000000000000000..7770f981ad387c97add81681fa551e7b2ec9d7d3
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_de.php
@@ -0,0 +1,229 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Anzeigen',
+	'assets_global' => 'Javascript und CSS auf allen Seiten in den Tag &lt;head&gt; laden',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Artikel durchsuchen',
+	'bouton_parcourir_docs_breve' => 'Meldung durchsuchen',
+	'bouton_parcourir_docs_rubrique' => 'Rubrik durchsuchen',
+	'bouton_parcourir_mediatheque' => 'Mediathek durchsuchen',
+
+	// C
+	'caracteres_restants' => 'verbleibende Zeichen ',
+	'categorie_choix_label' => 'Beschränkte Auswahl',
+	'categorie_defaut_label' => 'Divers',
+	'categorie_libre_label' => 'Freies Feld',
+	'categorie_objet_label' => 'Redaktioneller Inhalt ',
+	'categorie_structure_label' => 'Struktur',
+	'configuration' => 'Konfiguration des Plugins Saisies',
+	'construire_action_annuler' => 'Abbrechen',
+	'construire_action_configurer' => 'Konfigurieren',
+	'construire_action_deplacer' => 'Verschieben',
+	'construire_action_dupliquer' => 'Duplizieren',
+	'construire_action_dupliquer_copie' => '(Kopie)',
+	'construire_action_supprimer' => 'Löschen',
+	'construire_ajouter_champ' => 'Feld hinzufügen',
+	'construire_ajouter_groupe' => 'eine Gruppe hinzufügen',
+	'construire_attention_enregistrer' => 'Vergessen Sie nicht, Ihre Änderungen zu speichern.',
+	'construire_attention_modifie' => 'Das untere Formular unterscheidet sich vom ursprünglichen. Sie können es in den Zustand vor den Änderungen zurücksetzen.',
+	'construire_attention_supprime' => 'Ihre Änderungen umfassen das Löschen von Feldern. Bitte bestätigen das Speichern dieser neuen Version des Formulars.',
+	'construire_aucun_champs' => 'Dieses Formular enthält noch keine Felder.',
+	'construire_configurer_globales_label' => 'Globale Optionen konfigurieren ',
+	'construire_confirmer_supprimer_champ' => 'Wollen Sie dieses Feld wirklich löschen?',
+	'construire_info_nb_champs_masques' => '@nb@ Feld/er während der Konfiguration der Gruppe ausgeblendet.',
+	'construire_position_explication' => 'Geben Sie an, vor welchem anderen Feld dieses erscheinen soll.',
+	'construire_position_fin_formulaire' => 'Am Ende des Formulars',
+	'construire_position_fin_groupe' => 'Am Ende der Gruppe @groupe@',
+	'construire_position_label' => 'Feldposition',
+	'construire_reinitialiser' => 'Formular neu initialisieren',
+	'construire_reinitialiser_confirmer' => 'Alle Ihre Änderungen werden verlorengehen. Wollen Sie wirklich das ursprüngliche Formular wieder herstellen?',
+	'construire_verifications_label' => 'Art der Überprüfung', # MODIF
+	'cvt_etapes_courante' => 'Schritt @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Mögliche Antworten (in Spalten) ',
+	'data_rows_label' => 'Fragen (in Zeilen)',
+
+	// E
+	'erreur_generique' => 'Fehler im folgenden Feld. Bitte überprüfen Sie Ihre Eingabe.',
+	'erreur_option_nom_unique' => 'Dieser Name wird bereits für ein anderes Feld verwendet; er kann in diesem Formular nur einmal verwendet werden.',
+
+	// I
+	'info_configurer_saisies' => 'Testseite der Eingabefelder.',
+
+	// L
+	'label_annee' => 'Jahr',
+	'label_jour' => 'Tag',
+	'label_mois' => 'Monat',
+
+	// O
+	'option_aff_art_interface_explication' => 'Ausschließlich Artikel in der Sprache des Nutzers anzeigen',
+	'option_aff_art_interface_label' => 'Mehrsprachige Anzeige',
+	'option_aff_langue_explication' => 'Sprache des ausgewählten Artikels oder der Rubrik vor dem Titel anzeigen',
+	'option_aff_langue_label' => 'Sprache anzeigen',
+	'option_aff_rub_interface_explication' => 'Ausschließlich Rubriken in der Sprache des Nutzers anzeigen',
+	'option_aff_rub_interface_label' => 'Mehrsprachige Anzeige',
+	'option_afficher_si_explication' => 'Bestimmt die Bedingungen zur Anzeige des Feldes in Abhängigkeit vom Wert eines anderen Feldes. Die Kennung des anderen Feldes steht zwischen <code>@</code>. <br />Beispiel <code>@selection_1@=="Toto"</code> das Feld wird angezeigt, wenn das Feld <code>selection_1</code> den Wert <code>Toto</code> hat.<br />Es ist möglich die Booleschen Operatoren <code>||</code> (oder) und <code>&&</code> (und) zu verwenden.
+<a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">Dokumentation der kompletten Syntax auf SPIP-Contrib</a>. ', # MODIF
+	'option_afficher_si_label' => 'Bedingte Anzeige',
+	'option_afficher_si_remplissage_uniquement_explication' => 'Bei Aktivierung wird die bedingte Anzeige nur während des Ausfüllens angewendet, nicht beim Anzeigen der Ergebnisse.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Nur während des Ausfüllens',
+	'option_attention_explication' => 'Nachricht wichtiger als Meldung',
+	'option_attention_label' => 'Achtung',
+	'option_attribut_title_label' => 'Wert im Attribut Titel',
+	'option_autocomplete_defaut' => 'Standardeinstellung belassen',
+	'option_autocomplete_explication' => 'Beim Laden der Seite kann Ihr Browser das Feld mit bereits verwendeten Werten vorausfüllen.',
+	'option_autocomplete_label' => 'Feld vorausfüllen',
+	'option_autocomplete_off' => 'Deaktivieren',
+	'option_autocomplete_on' => 'Aktivieren',
+	'option_cacher_option_intro_label' => 'Erste leere Auswahl ausblenden',
+	'option_choix_alternatif_label' => 'Alternative Auswahl anbieten',
+	'option_choix_alternatif_label_defaut' => 'Andere Auswahl',
+	'option_choix_alternatif_label_label' => 'Label dieser alternativen Auswahl',
+	'option_choix_destinataires_explication' => 'Liste von Autoren und Autorinnen für eine Auswahl von Empfängern durch den Internetnutzer, andernfalls ist es die Person, die die Seite installiert hat.',
+	'option_choix_destinataires_label' => 'Mögliche Empfänger',
+	'option_class_label' => 'Zusätzliche CSS-Klassen',
+	'option_cols_explication' => 'Breite des Blocks in Zeichen. Diese Option kann durch ihre CSS-Stile unwirksam grmacht werden.',
+	'option_cols_label' => 'Breite',
+	'option_datas_explication' => 'Sie müssen eine Auswahl pro Zeile in der Form "Schlüssel|Label der Auswahl" angeben.<br /> Der Schlüssel muss eindeutig, kurz und klar sein und darf später nicht mehr geändert werden.',
+	'option_datas_label' => 'Mögliche Angaben',
+	'option_datas_sous_groupe_explication' => 'Sie müssen eine Auswahl pro Zeile in der Form "Schlüssel|Label" der Auswahl angeben.<br />Der Schlüssel muss einmalig, kurz und klar sein und darf später nicht mehr geändert werden.<br /> Den Beginn einer Untergruppe können Sie in der Form "*Titel der Untergruppe" angeben. Um eine Untergruppe zu beenden, können Sie eine neue Untergruppe beginnen oder eine Zeile einfügen, die nur "/*" enthält.',
+	'option_defaut_label' => 'Standardwert',
+	'option_disable_avec_post_explication' => 'Identisch mit voriger Option, jedoch wird der Wert in ein verstecktes Feld eingefügt.',
+	'option_disable_avec_post_label' => 'Senden trotz Deaktivierung',
+	'option_disable_explication' => 'Das Feld erhält keinen Fokus.',
+	'option_disable_label' => 'Feld deaktivieren',
+	'option_erreur_obligatoire_explication' => 'Sie können eine eigene Fehlermeldung bei nicht ausgefüllten Pflichtfeldern eingeben oder darauf verzichten.',
+	'option_erreur_obligatoire_label' => 'Hinweis Pflichtfeld',
+	'option_explication_explication' => 'Falls erforderlich kurze Beschreibung des Feldobjekts',
+	'option_explication_label' => 'Erläuterung',
+	'option_groupe_affichage' => 'Anzeige',
+	'option_groupe_description' => 'Beschreibung',
+	'option_groupe_utilisation' => 'Verwendung',
+	'option_groupe_validation' => 'Bestätigung',
+	'option_heure_pas_explication' => 'Wenn Sie das Zeitfeld verwenden, wird ein Menü für die Eingabe von Stunde und Minute angezeigt. Sie können hier den Abstand zwischen den möglichen Zeitpunkten angeben. Grundeinstellung sind 30 Minuten.',
+	'option_heure_pas_label' => 'Dauer der Zeitintervalle in Minuten bei der Eingabe',
+	'option_horaire_label' => 'Zeit',
+	'option_horaire_label_case' => 'Eingabe der Uhrzeit ebenfalls ermöglichen',
+	'option_id_groupe_label' => 'Schlagwortgruppe',
+	'option_info_obligatoire_explication' => 'Sie können die Standardbezeichnung für Pflichtfelder ändern:<i>[Pflichtfeld]</i>.
+Um den Standard beizubehalten, setzen Sie nichts. Um nichts anzuzeigen, setzen Sie einen Text, der nur aus Leerzeichen besteht. ',
+	'option_info_obligatoire_label' => 'Pflichtfeld-Anzeige',
+	'option_inserer_barre_choix_edition' => 'Vollständige Symbolleiste "Bearbeiten"',
+	'option_inserer_barre_choix_forum' => 'Symbolleiste "Foren"',
+	'option_inserer_barre_explication' => 'Eine Symbolleiste hinzufügen, wenn das Plugin Porte-Plume aktiviert ist.',
+	'option_inserer_barre_label' => 'Symbolleiste einfügen',
+	'option_label_case_label' => 'Bezeichnung neben dem Feld',
+	'option_label_explication' => 'Anzeigetitel',
+	'option_label_label' => 'Bezeichnung',
+	'option_label_non_explication' => 'Wird zusammen mit den Ergebnissen angezeigt.',
+	'option_label_non_label' => 'Bezeichnung für nicht markiertes Kästchen',
+	'option_label_oui_explication' => 'Wird mit den Ergebnissen angezeigt.',
+	'option_label_oui_label' => 'Bezeichnung bei markiertem Kästchen',
+	'option_limite_branche_explication' => 'Beschränkt die Auswahl auf eine bestimmte Hauptrubrik der Website',
+	'option_limite_branche_label' => 'Auf eine Hauptrubrik einschränken',
+	'option_maxlength_explication' => 'Der Besucher kann maximal diese Anzahl Zeichen eingeben',
+	'option_maxlength_label' => 'Zeichen maximal',
+	'option_multiple_explication' => 'Der Nutzer kann mehrere Optionen auswählen',
+	'option_multiple_label' => 'Mehrfachauswahl',
+	'option_nom_explication' => 'Reserviertes Wort für das Feld. Darf nur alphanumerische klein geschriebene und das Zeichen "_" (Unterstrich) enthalten.',
+	'option_nom_label' => 'Feldname',
+	'option_obligatoire_label' => 'Pflichtfeld',
+	'option_option_destinataire_intro_label' => 'Bezeichnung der ersten leeren Auswahl (bei Listenansicht)',
+	'option_option_intro_label' => 'Bezeichnung der ersten leeren Auswahl',
+	'option_option_statut_label' => 'Status anzeigen',
+	'option_placeholder_label' => 'Platzhalter',
+	'option_pliable_label' => 'Klappbar',
+	'option_pliable_label_case' => 'Die Feldgruppe kann zugeklappt werden',
+	'option_plie_label' => 'Bereits zugeklappt',
+	'option_plie_label_case' => 'Wen die Feldgruppe klappbar ist, wird sie beim Anzeigen des Formulars zunächst zugeklappt angezeigt.',
+	'option_previsualisation_explication' => 'Reiter "Vorschau" hinzufügen, wenn das Plugin Porte-Plume aktiviert ist.',
+	'option_previsualisation_label' => 'Vorschau aktivieren',
+	'option_readonly_explication' => 'Dieses Feld kann angezeigt aber nicht bearbeitet werden.',
+	'option_readonly_label' => 'Nur Lesen',
+	'option_rows_explication' => 'Höhe des Blocks in Zeilen. Diese Option ist nicht immer wirksam, da sie von individuellen CSS-Stilen abgeschaltet werden kann.',
+	'option_rows_label' => 'Anzahl Zeilen',
+	'option_size_explication' => 'Breite des Felds in Zeichen. Diese Option ist nicht immer wirksam, da sie durch individuelle CSS.Stile abgeschaltet werden kann.',
+	'option_size_label' => 'Feldgröße',
+	'option_statut_label' => 'Spezielle(r) Status',
+	'option_type_choix_plusieurs' => 'Auswahl <strong>mehrerer</strong> Empfänger erlauben',
+	'option_type_choix_tous' => '<strong>Alle</strong> diese Autoren als Empfänger hinzufügen. Der Besucher kann keine Auswahl treffen.',
+	'option_type_choix_un' => 'Besucher dürfen <strong>einen einzigen</strong> Empfänger aus einer Dropdown-Liste auswählen.',
+	'option_type_choix_un_radio' => 'Dem Benutzer die Wahl <strong>eines einzigen</strong> Empfängers aus einer Liste (Radiobutton) ermöglichen.',
+	'option_type_explication' => 'Im "versteckten" Modus wird der Inhalt dieses Felds nicht angezeigt.',
+	'option_type_label' => 'Feldtyp',
+	'option_type_password' => 'Bei der Eingabe verborgener Text (z.B. Passwort)',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Wert nein',
+	'option_valeur_oui_label' => 'Wert ja',
+
+	// P
+	'plugin_yaml_inactif' => 'Das Plugin YAML ist inaktiv. Sie müssen es einschalten, damit diese Seite funktioniert.',
+
+	// S
+	'saisie_auteurs_explication' => 'Ermöglicht die Auswahl eines Autors, einer Autorin oder mehrerer ',
+	'saisie_auteurs_titre' => 'Autorinnen und Autoren',
+	'saisie_case_explication' => 'Ermöglicht Dinge zu aktivieren und deaktivieren',
+	'saisie_case_titre' => 'Nur eine Option',
+	'saisie_checkbox_explication' => 'Erlaubt mehrer Optionen auszuwählen',
+	'saisie_checkbox_titre' => 'Kästchen zum Abhaken',
+	'saisie_date_explication' => 'Ermöglicht die Eingabe eines Datums mithilfe eines Kalenders',
+	'saisie_date_titre' => 'Datum',
+	'saisie_destinataires_explication' => 'Ermöglicht mehrere Empfänger aus den vorgeschlagenen Autoren auszuwählen', # MODIF
+	'saisie_destinataires_titre' => 'Empfänger',
+	'saisie_email_explication' => 'Erlaubt die Nutzung eines Mail-Felds im HTML5-Format.',
+	'saisie_email_titre' => 'Mailadresse',
+	'saisie_explication_explication' => 'Allgemeine Beschreibung',
+	'saisie_explication_titre' => 'Beschreibung',
+	'saisie_fieldset_explication' => 'Ein Rahmen, der mehrere Felder enthalten kann',
+	'saisie_fieldset_titre' => 'Feldgruppe',
+	'saisie_file_explication' => 'Datei senden',
+	'saisie_file_titre' => 'Datei',
+	'saisie_hidden_explication' => 'Ein für den Nutzer unsichtbares, vorausgefülltes Feld',
+	'saisie_hidden_titre' => 'Verborgenes Feld',
+	'saisie_input_explication' => 'Eine einfache Textzeile, kann angezeigt oder ausgeblendet werden (Passwort)',
+	'saisie_input_titre' => 'Textzeile',
+	'saisie_mot_explication' => 'Ein oder mehrere Schlagwörter einer Gruppe', # MODIF
+	'saisie_mot_titre' => 'Schlagwort',
+	'saisie_oui_non_explication' => 'Ja oder nein, alle klar ? :)',
+	'saisie_oui_non_titre' => 'Ja oder nein',
+	'saisie_radio_defaut_choix1' => 'Eins',
+	'saisie_radio_defaut_choix2' => 'Zwei',
+	'saisie_radio_defaut_choix3' => 'Drei',
+	'saisie_radio_explication' => 'Ermöglicht eine Option aus mehreren verfügbaren auszuwählen', # MODIF
+	'saisie_radio_titre' => 'Radioknöpfe',
+	'saisie_selecteur_article' => 'Werkzeug zur Auswahl eines Artikels anzeigen',
+	'saisie_selecteur_document' => 'Dateiauswahl-Dialog anzeigen',
+	'saisie_selecteur_rubrique' => 'Werkzeug zur Auswahl einer Rubrik anzeigen',
+	'saisie_selecteur_rubrique_article' => 'Werkzeug zur Auswahl einer Rubrik oder eines Artikels anzeigen',
+	'saisie_selecteur_rubrique_article_titre' => 'Rubrik- oder Artikelwahl', # MODIF
+	'saisie_selection_explication' => 'Eine Option aus einer Drop-Down-Liste auswählen.',
+	'saisie_selection_multiple_explication' => 'Mehrere Optionen aus einer Liste auswählen',
+	'saisie_selection_multiple_titre' => 'Mehrfachauswahl',
+	'saisie_selection_titre' => 'Drop-Down-Liste', # MODIF
+	'saisie_textarea_explication' => 'Mehrzeiliges Textfeld',
+	'saisie_textarea_titre' => 'Textblock',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentation der Eingabefunktionen',
+	'tous_visiteurs' => 'Alle Besucher (auch nicht eingeschriebene)',
+	'tout_selectionner' => 'Alles aus/abwählen',
+
+	// V
+	'verifier_valeurs_acceptables_label' => 'Mögliche Werte überprüfen',
+	'vue_sans_reponse' => '<i>Ohne Antwort</i>',
+
+	// Z
+	'z' => 'Zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_en.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_en.php
new file mode 100644
index 0000000000000000000000000000000000000000..af1bc05b4b87a857280706f9e2436e13034f89ba
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_en.php
@@ -0,0 +1,280 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Display',
+	'assets_global' => 'Charger le javascript et les CSS sur toutes les pages, dans la balise &lt;head&gt;
+Load javascript and CSS on all pages, in the &lt;head&gt; tag',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Browse through the article',
+	'bouton_parcourir_docs_breve' => 'Browse through the news item',
+	'bouton_parcourir_docs_rubrique' => 'Browse through the section',
+	'bouton_parcourir_mediatheque' => 'Browse through the multimedia library',
+
+	// C
+	'caracteres_restants' => 'remaining characters  ',
+	'categorie_choix_label' => 'Limited selection',
+	'categorie_defaut_label' => 'miscellaneous', # RELIRE
+	'categorie_libre_label' => 'Free field',
+	'categorie_objet_label' => 'Editorial content',
+	'categorie_structure_label' => 'Structure',
+	'configuration' => 'Configuration of the plugin Saisies', # RELIRE
+	'construire_action_annuler' => 'Cancel',
+	'construire_action_configurer' => 'Set up',
+	'construire_action_deplacer' => 'Move',
+	'construire_action_dupliquer' => 'Duplicate',
+	'construire_action_dupliquer_copie' => '(copy)',
+	'construire_action_supprimer' => 'Delete',
+	'construire_ajouter_champ' => 'Add a field',
+	'construire_ajouter_groupe' => 'Add a group',
+	'construire_attention_enregistrer' => 'Remember to save your changes!',
+	'construire_attention_modifie' => 'The form below is different from the initial form. You can reset it to the state before the changes.',
+	'construire_attention_supprime' => 'Your changes include deletions of fields. Please confirm the registration of the new version of the form.',
+	'construire_aucun_champs' => 'There is currently no field in this form.',
+	'construire_configurer_globales_label' => 'Configure global options',
+	'construire_confirmer_supprimer_champ' => 'Do you really want to delete this field?',
+	'construire_info_nb_champs_masques' => '@nb@ hidden field(s) the time to set up the group.',
+	'construire_position_explication' => 'Specify before which other field this one should be placed.',
+	'construire_position_fin_formulaire' => 'At the end of the form',
+	'construire_position_fin_groupe' => 'At the end of the group @groupe@',
+	'construire_position_label' => 'Position of the field',
+	'construire_reinitialiser' => 'Reset form',
+	'construire_reinitialiser_confirmer' => 'You will lose all your changes. Are you sure you want to go back to the original form?',
+	'construire_verifications_label' => 'Checking to be performed',
+	'cvt_etapes_courante' => 'Step @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Possible answers (down)',
+	'data_rows_label' => 'Questions ( across)',
+
+	// E
+	'erreur_generique' => 'There are errors in the fields below, please check your inputs',
+	'erreur_option_nom_unique' => 'This name is already used by another field and it must be unique in this form.',
+	'erreur_syntaxe_afficher_si' => 'Wrong syntax of the test',
+	'erreur_valeur_inacceptable' => 'Entered value cannot be accepted.',
+	'etapes_formulaire' => 'Steps of the form',
+	'etapes_recapitulatif_label' => 'Overview',
+	'etapes_recapitulatif_texte' => 'Please review your answers and check them before final validation.',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'You can resend a new file, or submit the form as is, the old file is not kept.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'You can send another file.',
+	'format_date_attendu' => 'Enter a date in dd/mm/yyyy format.',
+	'format_email_attendu' => 'Enter an email address in the format you@provider.tld',
+
+	// I
+	'info_configurer_saisies' => 'Test page for Entries',
+
+	// L
+	'label_annee' => 'Year',
+	'label_jour' => 'Day',
+	'label_mois' => 'Month',
+
+	// M
+	'masquer' => 'Hide',
+
+	// O
+	'option_aff_art_interface_explication' => 'Display only the articles in the user’s language',
+	'option_aff_art_interface_label' => 'Multilingual display',
+	'option_aff_langue_explication' => 'Display the selected language of the article or section before the title',
+	'option_aff_langue_label' => 'Display the language',
+	'option_aff_rub_interface_explication' => 'Display only the sections in the user’s language',
+	'option_aff_rub_interface_label' => 'Multilingual display',
+	'option_afficher_si_avec_post_explication' => 'By default, the values of entries hidden by the conditional display are not posted, and therefore not saved. Check this box to change this behaviour.',
+	'option_afficher_si_avec_post_label' => 'Post anyway',
+	'option_afficher_si_avec_post_label_case' => 'Post the value in case of entry masking',
+	'option_afficher_si_explication' => 'Specify the conditions to display the field based on the value of the other fields. The identifier of the other fields has to be entered between <code>@</code>. <br />Example <code>@selection_1@=="Toto"</code> conditions the display of the field only when field <code>selection_1</code> has a value of <code>Toto</code>.<br />
+It is possible to use Boolean operators <code> || </code> (or) and <code> && </code> (and).<br/>
+You will find <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">the full documentation of the syntax on contrib.spip</a>.', # MODIF
+	'option_afficher_si_label' => 'Conditional display',
+	'option_afficher_si_remplissage_uniquement_explication' => 'By checking this box, the conditional display will only apply when filling in the form, not when displaying the results.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Only when filling the form',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Hide entries only during filling ',
+	'option_attention_explication' => 'A message more important than the explanation.',
+	'option_attention_label' => 'Warning',
+	'option_attribut_title_label' => 'Title attribute value',
+	'option_attribut_title_label_case' => 'Put a title attribute in the label, containing the technical value of the field. Use sparingly.',
+	'option_autocomplete_defaut' => 'Keep default',
+	'option_autocomplete_explication' => 'At page load, your browser may pre-fill the field based on its history',
+	'option_autocomplete_label' => 'Pre-fill the field',
+	'option_autocomplete_off' => 'Disable',
+	'option_autocomplete_on' => 'Enable',
+	'option_cacher_option_intro_label' => 'Hide the first empty choice',
+	'option_case_valeur_non_explication' => 'Posted value if the checkbox is not selected. Attention, this is a technical value and not a displayed value.',
+	'option_case_valeur_oui_explication' => 'Posted value if the checkbox is selected. Attention, this is a technical value and not a displayed value.',
+	'option_choix_alternatif_label' => 'Suggest an alternative choice',
+	'option_choix_alternatif_label_defaut' => 'Other choice',
+	'option_choix_alternatif_label_label' => 'Label for this alternative choice',
+	'option_choix_destinataires_explication' => 'One or several authors among which the user can select as recipients. Otherwise, it will be the person who installed the site.',
+	'option_choix_destinataires_label' => 'Possible recipients',
+	'option_class_label' => 'Additional CSS Classes',
+	'option_cols_explication' => 'Field width in characters. This option is not always applied/used because the CSS styles of your site may override it.',
+	'option_cols_label' => 'Width',
+	'option_conteneur_class_label' => 'Additional CSS classes on the container',
+	'option_datas_explication' => 'You must specify a choice for each row in the form of "key|label of the choice".<br />The key must be unique, short, unambiguous and not prone to be changed later.<br />', # MODIF
+	'option_datas_grille_explication' => 'You must indicate one choice per line in the form "key|choice label" or "key|left label|right label"<br />The key must be unique, short, clear and must not be changed afterwards.<br />', # MODIF
+	'option_datas_label' => 'List of the available choices',
+	'option_datas_sous_groupe_explication' => 'You can indicate a choice by line using the format "key|Label" of the choice. <br />The key must be unique, brief, clear and must not be changed afterwards.<br />You can indicate the start of a subgroup using the format "*Subgroup title". To end a subgroup you can start another one, or put a line containing only  "/*".',
+	'option_defaut_label' => 'Default value',
+	'option_disable_avec_post_explication' => 'Same as previous option position but still post value in a hidden field.',
+	'option_disable_avec_post_label' => 'Disabled but posted.',
+	'option_disable_choix_explication' => 'Indicate the choices separated by a comma, example: choix1,choix3', # MODIF
+	'option_disable_choix_label' => 'Disable some choices',
+	'option_disable_explication' => 'The field can not get the focus.',
+	'option_disable_label' => 'Disable the field',
+	'option_erreur_obligatoire_explication' => 'You can customize the error message displayed to show an obligation (otherwise leave blank).',
+	'option_erreur_obligatoire_label' => 'Error message for the obligation',
+	'option_explication_explication' => 'If necessary, a short sentence describing the subject field.',
+	'option_explication_label' => 'Explanation',
+	'option_forcer_select_explication' => 'If a group of words is selected, by default it will be a radio entry. You can force the use of a select.',
+	'option_forcer_select_label_case' => 'Force the use of a select',
+	'option_groupe_affichage' => 'Display',
+	'option_groupe_description' => 'Description',
+	'option_groupe_utilisation' => 'Usage',
+	'option_groupe_validation' => 'Validation',
+	'option_heure_pas_explication' => 'When using the schedule, a menu is displayed to help enter hours and minutes. Here you can choose the time interval between each option (default 30 minutes).',
+	'option_heure_pas_label' => 'Interval of the minutes in the help menu of the input',
+	'option_horaire_label' => 'Schedule',
+	'option_horaire_label_case' => 'Allow to fill in the time',
+	'option_id_groupe_label' => 'Keyword group',
+	'option_info_obligatoire_explication' => 'You can change the default required indication: <i>[Required]</i>. To keep the default information, leave it blank. To display nothing, put a text composed only of space.',
+	'option_info_obligatoire_label' => 'Indication of obligation',
+	'option_inserer_barre_choix_edition' => 'complete editing toolbar',
+	'option_inserer_barre_choix_forum' => 'forums toolbar',
+	'option_inserer_barre_explication' => 'Insert a porte-plume toolbar if that tool is activated.',
+	'option_inserer_barre_label' => 'Insert a toolbar',
+	'option_label_case_label' => 'Label located beside the check box',
+	'option_label_explication' => 'The title that will be displayed.',
+	'option_label_label' => 'Label',
+	'option_label_non_explication' => 'Will be visible when displaying the results.',
+	'option_label_non_label' => 'Label if the box is not checked',
+	'option_label_oui_explication' => 'Will be visible when displaying the results.',
+	'option_label_oui_label' => 'Label if the box is checked',
+	'option_limite_branche_explication' => 'Limit the choice to one specific branch of the site',
+	'option_limite_branche_label' => 'Limit to one branch',
+	'option_maximum_choix_explication' => 'Maximum number of choices?',
+	'option_maximum_choix_label' => 'Limit the number of choices',
+	'option_maxlength_explication' => 'The user can not type more characters than this number.',
+	'option_maxlength_label' => 'Maximum number of characters',
+	'option_multiple_explication' => 'The user will be able to select several values',
+	'option_multiple_label' => 'Multiple selection',
+	'option_nom_explication' => 'A computer ID name that identifies the field. It may only contain lowercase alphanumeric characters or the underscore character "_".',
+	'option_nom_label' => 'Field name',
+	'option_obligatoire_label' => 'Required field',
+	'option_onglet_label' => 'Tab',
+	'option_onglet_label_case' => 'Display as a tab.',
+	'option_option_destinataire_intro_label' => 'Label of first choice empty (in list format)',
+	'option_option_intro_label' => 'Label for the first empty choice',
+	'option_option_statut_label' => 'Show the status',
+	'option_oui_non_valeur_non_explication' => 'Posted value if no is selected.',
+	'option_oui_non_valeur_oui_explication' => 'Posted value if yes is selected.',
+	'option_placeholder_label' => 'Placeholder',
+	'option_pliable_label' => 'Expandable',
+	'option_pliable_label_case' => 'The group of fields can be expanded or shrunk.',
+	'option_plie_label' => 'Already shrunk',
+	'option_plie_label_case' => 'If the group of fields can be expanded and shrunk, then this option will make it already shrink with the form displays.',
+	'option_poster_afficher_si_label_case' => 'Post the values of all hidden entries',
+	'option_previsualisation_explication' => 'If porte-plume is activated, add a tab to preview the appearance of the text entered.',
+	'option_previsualisation_label' => 'Activate previews',
+	'option_readonly_explication' => 'The field can be viewed, selected, but not modified.',
+	'option_readonly_label' => 'Read only',
+	'option_rows_explication' => 'Field height in lines. This option is not always applied/used because the CSS styles of your site can cancel it.',
+	'option_rows_label' => 'Lines number',
+	'option_size_explication' => 'Field width in characters. This option is not always applied/used because the CSS styles of your site can cancel it.',
+	'option_size_label' => 'Field size',
+	'option_statut_label' => 'Specific status',
+	'option_type' => 'Type of entry',
+	'option_type_choix_label' => 'Type of choice',
+	'option_type_choix_plusieurs' => 'Allow the user to choose <strong>several</ strong> message recipients.',
+	'option_type_choix_tous' => 'Put <strong>all</strong> of these people as recipients. The user will have no choice.',
+	'option_type_choix_un' => 'Allow the user to choose <strong>one person</strong> (as a drop-down list).',
+	'option_type_choix_un_radio' => 'Allow the user to select <strong>only</strong>  one person (in checklist format).',
+	'option_type_color' => 'Color',
+	'option_type_explication' => 'In "disguised" mode, the field contents as typed will be replaced with asterisks.',
+	'option_type_label' => 'Field type',
+	'option_type_password' => 'Text, hidden during input (eg. password)',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Value No',
+	'option_valeur_oui_label' => 'Value Yes',
+	'option_vue_masquer_sous_groupe' => 'When displaying the result, show only the value, without the subgroup',
+
+	// P
+	'plugin_yaml_inactif' => 'The YAML plugin is inactive. You must enable it for this page to be functional.',
+
+	// S
+	'saisie_auteurs_explication' => 'Allows you to select one or more authors',
+	'saisie_auteurs_titre' => 'Authors',
+	'saisie_case_explication' => 'Used to activate or deactivate a particular option.',
+	'saisie_case_titre' => 'Single check box',
+	'saisie_checkbox_explication' => 'Used to select several options using check boxes.',
+	'saisie_checkbox_titre' => 'Check boxes',
+	'saisie_choix_grille_explication' => 'Allows a series of multiple-choice questions to be asked in a standardized manner and in a grid format',
+	'saisie_choix_grille_titre' => 'Question grid',
+	'saisie_date_explication' => 'Allows you to enter a date using a calendar',
+	'saisie_date_titre' => 'Date',
+	'saisie_destinataires_explication' => 'Allows you to choose recipients from pre-selected accounts.',
+	'saisie_destinataires_titre' => 'Recipients',
+	'saisie_email_explication' => 'Allows to have an email type field in HTML5.',
+	'saisie_email_titre' => 'E-mail adress',
+	'saisie_explication_explication' => 'A general explanatory description.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Open links in the same window',
+	'saisie_explication_masquer_label' => 'Add a show/hide explanation button',
+	'saisie_explication_texte_label' => 'Text of the explanation',
+	'saisie_explication_titre' => 'Explanation',
+	'saisie_explication_titre_label' => 'Title of the explanation',
+	'saisie_fieldset_explication' => 'A frame which may include several fields.',
+	'saisie_fieldset_titre' => 'Fieldset',
+	'saisie_file_explication' => 'Send a file',
+	'saisie_file_titre' => 'File',
+	'saisie_hidden_explication' => 'A pre-filled field that the user will never see.',
+	'saisie_hidden_titre' => 'Hidden field',
+	'saisie_input_explication' => 'A simple line of text that can be visible or hidden (password).',
+	'saisie_input_titre' => 'Textfield',
+	'saisie_mot_explication' => 'Keywords from a word group',
+	'saisie_mot_titre' => 'Keyword',
+	'saisie_oui_non_explication' => 'Either a Yes or No response',
+	'saisie_oui_non_titre' => 'Yes or No',
+	'saisie_radio_defaut_choix1' => 'One',
+	'saisie_radio_defaut_choix2' => 'Two',
+	'saisie_radio_defaut_choix3' => 'Three',
+	'saisie_radio_explication' => 'Allows you to choose one of several available options.',
+	'saisie_radio_titre' => 'Radio buttons',
+	'saisie_selecteur_article' => 'Display an article selection browser',
+	'saisie_selecteur_document' => 'Display a document selector',
+	'saisie_selecteur_rubrique' => 'Display a section selector browser',
+	'saisie_selecteur_rubrique_article' => 'Display an article or section selector browser',
+	'saisie_selecteur_rubrique_article_titre' => 'Article or section',
+	'saisie_selection_explication' => 'Select an option from a dropdown list box.',
+	'saisie_selection_multiple_explication' => 'Used for selecting several options from a list.',
+	'saisie_selection_multiple_titre' => 'Multiple selection',
+	'saisie_selection_titre' => 'Drop-down list (or selection)', # MODIF
+	'saisie_textarea_explication' => 'A multilines text field.',
+	'saisie_textarea_titre' => 'Textarea',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@: @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentation of input fields',
+	'tous_visiteurs' => 'All visitors (even if not registered)',
+	'tout_selectionner' => '(Un)select all',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Incorrect syntax. Are you mixing up the pipe character (|) with the lower case L (l)?',
+	'verifier_saisies_option_data_cles_doubles' => 'At least one key is defined as duplicate.',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Incorrect syntax. Subgroups are not allowed.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Incorrect syntax. Some keys do not meet the criteria.',
+	'verifier_valeurs_acceptables_explication' => 'Check that the posted value is among those allowed when defining fields. Do not use this option if you dynamically fill fields in your templates or fill them with javascript.', # MODIF
+	'verifier_valeurs_acceptables_label' => 'Check the acceptable values', # MODIF
+	'vue_sans_reponse' => '<i>(no data entered)</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_es.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_es.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f4d583ad2292e920df015f2727d07c0a2dc8ad8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_es.php
@@ -0,0 +1,301 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Mostrar',
+	'assets_global' => 'Cargue el javascript y CSS en todas las páginas, en la etiqueta &lt;head&gt;',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Buscar artículo',
+	'bouton_parcourir_docs_breve' => 'Buscar breve',
+	'bouton_parcourir_docs_rubrique' => 'Buscar la sección',
+	'bouton_parcourir_mediatheque' => 'Examinar mediateca',
+
+	// C
+	'caracteres_restants' => 'caracteres restantes',
+	'categorie_choix_label' => 'Opción limitada',
+	'categorie_defaut_label' => 'Diverso',
+	'categorie_libre_label' => 'Campo libre',
+	'categorie_objet_label' => 'Contenido editorial',
+	'categorie_structure_label' => 'Estructura',
+	'coherence_afficher_si_appel' => '@label@ : llamada incorrecta a @erreurs@',
+	'coherence_afficher_si_erreur_pluriel' => 'Los campos condicionales que se muestran a continuación requieren campos no existentes:',
+	'coherence_afficher_si_erreur_singulier' => 'El campo condicional que se muestra a continuación utiliza campos que no existen:',
+	'configuration' => 'Configuración del plugin Saisies',
+	'construire_action_annuler' => 'Anular',
+	'construire_action_configurer' => 'Configurar',
+	'construire_action_deplacer' => 'Mover',
+	'construire_action_dupliquer' => 'Duplicar',
+	'construire_action_dupliquer_copie' => '(copia)',
+	'construire_action_supprimer' => 'Eliminar',
+	'construire_ajouter_champ' => 'Añadir un campo',
+	'construire_ajouter_groupe' => 'Agregar un grupo',
+	'construire_attention_enregistrer' => '¡No olvide guardar sus cambios!',
+	'construire_attention_modifie' => 'Este formulario es diferente al original. Tiene la posibilidad de restablecerlo conforme a su estado inical. ',
+	'construire_attention_supprime' => 'Sus cambios implican suprimir campos. Confirme por favor esta nueva versión del formulario. ',
+	'construire_aucun_champs' => 'Actualmente no existen campos en este formulario. ',
+	'construire_configurer_globales_label' => 'Configurar opciones globales',
+	'construire_confirmer_supprimer_champ' => '¿Desea eliminar realmente este campo?',
+	'construire_info_nb_champs_masques' => '@nb@ campo(s) oculto(s) el tiempo de configurar el grupo.',
+	'construire_position_explication' => 'Indique delante de qué otro campo se colocará.',
+	'construire_position_fin_formulaire' => 'Al final del formulario',
+	'construire_position_fin_groupe' => 'Al final del grupo @groupe@',
+	'construire_position_label' => 'Posición del campo',
+	'construire_reinitialiser' => 'Restablecer el formulario',
+	'construire_reinitialiser_confirmer' => 'Va a perder todos los cambios. ¿Está seguro de volver al formulario original?',
+	'construire_verifications_label' => 'Tipo de verificación a efectuar', # MODIF
+	'cvt_etapes_courante' => 'Escenario @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Posibles respuestas (en columna)',
+	'data_rows_label' => 'Preguntas (en línea)',
+
+	// E
+	'erreur_generique' => 'Hay errores en los siguientes campos, revise por favor sus entradas',
+	'erreur_option_nom_unique' => 'Este nombre ya ha sido utilizado en otro campo, y ha de ser único en el formulario.',
+	'erreur_syntaxe_afficher_si' => 'Sintaxis de prueba incorrecta',
+	'erreur_valeur_inacceptable' => 'Valor publicado no es aceptable.',
+	'etapes_formulaire' => 'Pasos del formulario',
+	'etapes_recapitulatif_label' => 'Resumen',
+	'etapes_recapitulatif_texte' => 'Por favor lea sus respuestas y verifíquelas antes de la validación final.',
+	'explication_dev' => 'para los devs',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Puede volver a enviar un archivo nuevo o enviar el formulario tal cual, el archivo antiguo no se conserva.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Necesitas enviar otro archivo.',
+	'format_date_attendu' => 'Ingrese una fecha en el formato dd/mm/aaaa.',
+	'format_email_attendu' => 'Ingrese una dirección de correo electrónico en el formato vous@fournisseur.fr',
+
+	// I
+	'info_configurer_saisies' => 'Página de prueba de las entradas',
+
+	// L
+	'label_annee' => 'Año',
+	'label_jour' => 'Día',
+	'label_mois' => 'Mes',
+
+	// M
+	'masquer' => 'Ocultar',
+
+	// O
+	'option_aff_art_interface_explication' => 'Mostrar sólo los artículos en el idioma del usuario',
+	'option_aff_art_interface_label' => 'Aparencia multilingüe',
+	'option_aff_langue_explication' => 'Muestra el idioma del artículo o de la sección delante del título',
+	'option_aff_langue_label' => 'Mostrar el idioma',
+	'option_aff_rub_interface_explication' => 'Mostrar sólo las secciones en el idioma del usuario',
+	'option_aff_rub_interface_label' => 'Apariencia multilingüe',
+	'option_afficher_si_avec_post_explication' => 'De forma predeterminada, los valores de las entradas ocultas por la visualización condicional no se publican y, por lo tanto, no se guardan. Marque esta casilla para cambiar este comportamiento.',
+	'option_afficher_si_avec_post_label' => 'Publica todo igual',
+	'option_afficher_si_avec_post_label_case' => 'Publicar valor en caso de enmascaramiento de entrada',
+	'option_afficher_si_explication' => 'Indique las condiciones para mostrar el campo en función del valor de los otros campos. El identificador de los otros campos debe ser indicarse entre <code>@</code>. <br />Ejemplo <code>@selection_1@=="Toto"</code> condiciona la visualización del campo con la condición de que el campo <code>selection_1</code> tenga por valor <code>Toto</code>.
+Es posible utilizar los operadores booleanos <code>||</code> (o) y <code>&&</code> (and). <br />
+Encontrará la <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">documentación completa de la sintaxis en SPIP-contrib</a>.', # MODIF
+	'option_afficher_si_label' => 'Visualización condicional',
+	'option_afficher_si_remplissage_uniquement_explication' => 'Al marcar esta casilla, la visualización condicional se aplicará solo al completar el formulario, no al mostrar los resultados.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Solo al llenar',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Ocultar entrada solo al llenar',
+	'option_attention_explication' => 'Un mensaje más importante que la explicación.',
+	'option_attention_label' => 'Aviso',
+	'option_attribut_title_label' => 'Valor del atributo title',
+	'option_attribut_title_label_case' => 'Ponga un atributo de título en la etiqueta, que contenga el valor técnico del campo. Para ser usado con moderación.',
+	'option_attributs_explication' => 'Los atributos se relacionan con cada campo html, incluso para entradas con varios campos (<code>radio</code>, <code>checkbox</code>, etc.).',
+	'option_attributs_label' => 'Atributos HTML adicionales',
+	'option_autocomplete_defaut' => 'Dejar por defecto',
+	'option_autocomplete_explication' => 'Al cargar la página, su navegador puede rellenar el campo en función de su historial',
+	'option_autocomplete_label' => 'Pre-relleno del campo',
+	'option_autocomplete_off' => 'Desactivar',
+	'option_autocomplete_on' => 'Activar',
+	'option_cacher_option_intro_label' => 'Esconder la primera opción vacía',
+	'option_case_valeur_non_explication' => 'Valor publicado si la casilla no está marcada. Tenga en cuenta que este es un valor técnico y no un valor mostrado.',
+	'option_case_valeur_oui_explication' => 'Valor publicado si la casilla está marcada. Tenga en cuenta que este es un valor técnico y no un valor mostrado.',
+	'option_choix_alternatif_label' => 'Proponer una opción alternativa',
+	'option_choix_alternatif_label_defaut' => 'Otra elección',
+	'option_choix_alternatif_label_label' => 'Etiqueta de esta elección alternativa',
+	'option_choix_destinataires_explication' => 'Lista de autores para una selección de destinatarios por parte del usuario de Internet, en su defecto será la persona que instaló el sitio.',
+	'option_choix_destinataires_label' => 'Destinatarios posibles',
+	'option_class_label' => 'Clases CSS adicionales',
+	'option_cols_explication' => 'Ancho del bloque (en número de caracteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de tu sitio.',
+	'option_cols_label' => 'Ancho',
+	'option_conteneur_class_label' => 'Clases CSS adicionales en el contenedor',
+	'option_datas_explication' => 'Debe indicar una opción por línea en el formulario "clave|Etiqueta de elección".<br />La clave debe ser única, breve, clara y no debe modificarse posteriormente.',
+	'option_datas_explication_dev' => 'Proporcione una lista de opciones en forma de una matriz PHP (<code>array()</code>) o SPIP (<code>#ARRAY</code>) de tipo <code>"clave"=>"Etiqueta de elección"</código>.',
+	'option_datas_grille_explication' => 'Debe indicar una opción por línea en el formulario "clave|Etiqueta de elección" o "clave|Etiqueta a la izquierda|Etiqueta a la derecha"<br />La clave debe ser única, breve, clara y no debe modificarse posteriormente.',
+	'option_datas_grille_explication_dev' => 'Proporcione una lista de opciones en forma de una matriz PHP (<code>array()</code>) o SPIP (<code>#ARRAY</code>) de tipo <code>"clave"=>"Etiqueta de elección"</code> o <code>"key"=>"Etiqueta a la izquierda|Etiqueta a la derecha"</code>.',
+	'option_datas_label' => 'Lista de opciones posibles',
+	'option_datas_sous_groupe_explication' => 'Debe indicar una opción por línea en el formulario "clave|Etiqueta" de la elección.<br />La clave debe ser única, breve, clara y no debe modificarse posteriormente.<br />Puede indicar el comienzo de una subgrupo en la forma "*Título del subgrupo". Para finalizar un subgrupo puede iniciar otro, o poner una línea que contenga solo "/*".',
+	'option_datas_sous_groupe_explication_dev' => 'Proporcione una lista de opciones en forma de una tabla PHP (<code>array()</code>) o SPIP (<code>#ARRAY</code>) en forma de <code>"clave" => "valor"</code>.<br />Puede agrupar en subgrupos. Para hacer esto, la <code>clave</code> debe ser el título del subgrupo, y el valor en sí mismo debe ser una table asociativa de tipo <code>"clave" => "valor"</code>.',
+	'option_defaut_label' => 'Valor por defecto',
+	'option_disable_avec_post_explication' => 'Como la opción anterior, pero publica el valor en un campo escondido.',
+	'option_disable_avec_post_label' => 'Deactivar pero enviar',
+	'option_disable_choix_explication' => 'Indique las opciones separadas por una coma, ejemplo: <code>elección1, elección3</code>.',
+	'option_disable_choix_explication_dev' => 'Indique las opciones en forma de tabla, ejemplo: <code>["elección1","elección3"]</code>.',
+	'option_disable_choix_label' => 'Deshabilitar ciertas opciones',
+	'option_disable_explication' => 'El campo ya no puede obtener el foco.',
+	'option_disable_label' => 'Deactivar el campo',
+	'option_erreur_obligatoire_explication' => 'Puede personalizar el mensaje de error mostrado para indicar una obligación (sino dejar en blanco).',
+	'option_erreur_obligatoire_label' => 'Mensaje de error obligatorio',
+	'option_explication_apres_attention' => 'Por razones de accesibilidad, las explicaciones importantes siempre deben estar antes de escribir.',
+	'option_explication_apres_label' => 'Explicación después del campo',
+	'option_explication_explication' => 'Si hace falta, una frase corta que describe el campo',
+	'option_explication_label' => 'Explicación',
+	'option_forcer_select_explication' => 'Si se selecciona un grupo de palabras, por defecto será una entrada de radio. Puede forzar el uso de una selección.',
+	'option_forcer_select_label_case' => 'Forzar el uso de un select',
+	'option_groupe_affichage' => 'Apariencia',
+	'option_groupe_conditions' => 'Condiciones',
+	'option_groupe_description' => 'Descripción',
+	'option_groupe_utilisation' => 'Uso',
+	'option_groupe_validation' => 'Validación',
+	'option_heure_pas_explication' => 'Cuando usa el horario, se muestra un menú para ayudar a introducir horas y minutos. Aquí puede elegir el intervalo de tiempo entre cada opción (por defecto 30 minutos).',
+	'option_heure_pas_label' => 'Intervalo de minutos en el menú de ayuda a la entrada',
+	'option_horaire_label' => 'Horario',
+	'option_horaire_label_case' => 'Permite introducir también la hora',
+	'option_id_explication' => 'Tendrá automáticamente el prefijo <code>campo_</code>.',
+	'option_id_groupe_label' => 'Grupo de palabras-claves',
+	'option_id_label' => 'Atributo <code>id</code> de la entrada',
+	'option_info_obligatoire_explication' => 'Puede cambiar la indicación de requisito predeterminada: <i>[Obligatorio]</i>. Para mantener la información predeterminada, no deje nada. Para mostrar nada, coloque un texto compuesto solo de espacios.',
+	'option_info_obligatoire_label' => 'Indicación de campo obligatorio',
+	'option_inserer_barre_choix_edition' => 'Barra de edición completa',
+	'option_inserer_barre_choix_forum' => 'barra de los foros',
+	'option_inserer_barre_explication' => 'Insertar una barra tipográfica si ésta está activada.',
+	'option_inserer_barre_label' => 'Insertar una barra de herramientas',
+	'option_inserer_debut_label' => 'Código a insertar al principio de la entrada',
+	'option_inserer_fin_label' => 'Código a insertar al final de la entrada',
+	'option_label_case_label' => 'Etiqueta posicionada al lado de la casilla',
+	'option_label_explication' => 'El título que se mostrará.',
+	'option_label_label' => 'Etiqueta',
+	'option_label_non_explication' => 'Será visible cuando se muestren los resultados.',
+	'option_label_non_label' => 'Etiquetar si la casilla no está marcada',
+	'option_label_oui_explication' => 'Será visible cuando se muestren los resultados.',
+	'option_label_oui_label' => 'Etiqueta si la casilla está marcada',
+	'option_limite_branche_explication' => 'Limitar la elección a una rama específica de un sitio',
+	'option_limite_branche_label' => 'Limitar a una rama',
+	'option_maximum_choix_explication' => '¿Número máximo de opciones?',
+	'option_maximum_choix_label' => 'Limitar el número de opciones',
+	'option_maxlength_explication' => 'El usuario no puede ingresar más caracteres que este número.',
+	'option_maxlength_label' => 'Número máximo de caracteres',
+	'option_multiple_explication' => 'El usuario puede seleccionar varios valores',
+	'option_multiple_label' => 'Selección múltiple',
+	'option_nom_explication' => 'Un nombre informático que identificará el campo. Sólo puede contener caracteres alfanuméricos minúsculos o el carácter "_".',
+	'option_nom_label' => 'Nombre del campo',
+	'option_obligatoire_label' => 'Campo obligatorio',
+	'option_onglet_label' => 'Pestaña',
+	'option_onglet_label_case' => 'Mostrar como una pestaña.',
+	'option_onglet_vertical_explication' => 'Solo se necesita marcar una pestaña en un grupo como vertical para que todas las pestañas sean verticales.',
+	'option_onglet_vertical_label_case' => 'Pestaña vertical',
+	'option_option_destinataire_intro_label' => 'Etiqueta de la primera opción vacía (cuando esté en forma de lista)',
+	'option_option_intro_label' => 'Etiqueta de la primera opción vacía',
+	'option_option_statut_label' => 'Mostrar el estatus',
+	'option_oui_non_valeur_non_explication' => 'Valor publicado si no se selecciona.',
+	'option_oui_non_valeur_oui_explication' => 'Valor publicado si se selecciona sí.',
+	'option_placeholder_label' => 'Placeholder',
+	'option_pliable_label' => 'Desplegable',
+	'option_pliable_label_case' => 'El grupo de campos se podrá contraer y desplegar.',
+	'option_plie_label' => 'Ya está contraido',
+	'option_plie_label_case' => 'Si el grupo de campos se puede contraer, ya estará contraido cuando se enseñe el formulario.',
+	'option_poster_afficher_si_label_case' => '
+Publicar valores de todas las entradas ocultas',
+	'option_previsualisation_explication' => 'Si la barra tipográfica es activa, añade una pestaña de previsualización del texto.',
+	'option_previsualisation_label' => 'Activar la previsualización',
+	'option_readonly_explication' => 'El campo se puede leer, seleccionar, pero no se puede modificar.',
+	'option_readonly_label' => 'Sólo lectura',
+	'option_rows_explication' => 'Altura del bloque en número de líneas. Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de su sitio.',
+	'option_rows_label' => 'Número de líneas',
+	'option_size_explication' => 'Ancho del campo (número de caracteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS del sitio.',
+	'option_size_label' => 'Tamaño del campo',
+	'option_statut_label' => '
+Estado(s) especial(es)',
+	'option_type' => 'Tipo de entrada',
+	'option_type_choix_label' => 'Tipo de elección',
+	'option_type_choix_plusieurs' => 'Permitir que el internauta elija <strong>varios</strong> destinatarios.',
+	'option_type_choix_tous' => 'Ponga a <strong>todas</strong> estas personas como destinatarios. El usuario no tendrá elección.',
+	'option_type_choix_un' => 'Permitir que el usuario de Internet elija <strong>una sola persona</strong> (en forma de lista desplegable).',
+	'option_type_choix_un_radio' => 'Permitir que el usuario de Internet elija <strong>solo una</strong> persona (en forma de lista con viñetas).',
+	'option_type_color' => 'Color',
+	'option_type_explication' => 'En modo "escondido", el contenido del campo no será visible.',
+	'option_type_label' => 'Tipo del campo',
+	'option_type_password' => 'Texto escondido mientras tecleando (por ej. contraseña)',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Sin valor',
+	'option_valeur_oui_label' => 'Valor si',
+	'option_vue_masquer_sous_groupe' => 'Al mostrar el resultado, mostrar solo el valor, sin el subgrupo',
+	'options_dev_titre' => 'Opciones para devs',
+
+	// P
+	'plugin_yaml_inactif' => 'El complemento YAML está inactivo. Debe activarlo para que esta página sea funcional.',
+
+	// S
+	'saisie_auteurs_explication' => 'Le permite seleccionar un autor, una autora o varios',
+	'saisie_auteurs_titre' => 'Autores',
+	'saisie_case_explication' => 'Permite activar o desactivar algo.',
+	'saisie_case_titre' => 'Casilla única',
+	'saisie_checkbox_explication' => 'Permite elegir varias opciones con las casillas a marcar.',
+	'saisie_checkbox_titre' => 'Casillas a marcar',
+	'saisie_choix_grille_explication' => 'Permite realizar una serie de preguntas de opción múltiple de forma estandarizada y en forma de cuadrícula',
+	'saisie_choix_grille_titre' => 'Grilla de preguntas',
+	'saisie_date_explication' => 'Le permite ingresar una fecha usando un calendario',
+	'saisie_date_titre' => 'Fecha',
+	'saisie_destinataires_explication' => 'Le permite elegir destinatarios de cuentas preseleccionadas.',
+	'saisie_destinataires_titre' => 'Personas destinatarias',
+	'saisie_email_explication' => 'Permite tener un campo de tipo de correo electrónico en HTML5.',
+	'saisie_email_titre' => 'Dirección de correo electrónico',
+	'saisie_explication_explication' => 'Una explicación general.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Abrir enlaces en la misma ventana',
+	'saisie_explication_masquer_label' => 'Agregar un botón de explicación para mostrar/ocultar',
+	'saisie_explication_texte_label' => 'Texto de explicación',
+	'saisie_explication_titre' => 'Explicación',
+	'saisie_explication_titre_label' => 'Explicación del título',
+	'saisie_fieldset_explication' => 'Un marco que podrá englobar varios campos.',
+	'saisie_fieldset_titre' => 'Grupo de campos',
+	'saisie_file_explication' => 'Mandar un archivo',
+	'saisie_file_titre' => 'Archivo',
+	'saisie_hidden_explication' => 'Un campo precompletado que el usuario no podrá ver.',
+	'saisie_hidden_titre' => 'Campo escondido',
+	'saisie_input_explication' => 'Una sola línea de texto, que puede ser visible u ocultada (contraseña).',
+	'saisie_input_titre' => 'Línea de texto',
+	'saisie_mot_explication' => 'Palabras clave de un grupo de palabras',
+	'saisie_mot_titre' => 'Palabra-clave',
+	'saisie_oui_non_explication' => 'Sí o no, ¿está claro? :)',
+	'saisie_oui_non_titre' => 'Sí o no',
+	'saisie_radio_defaut_choix1' => 'Uno',
+	'saisie_radio_defaut_choix2' => 'Dos',
+	'saisie_radio_defaut_choix3' => 'Tres',
+	'saisie_radio_explication' => 'Le permite elegir una de varias opciones disponibles.',
+	'saisie_radio_titre' => 'Botones de opción',
+	'saisie_selecteur_article' => 'Muestra un navegador de selección de artículo',
+	'saisie_selecteur_document' => 'Muestra un selector de documento',
+	'saisie_selecteur_rubrique' => 'Muestra un navegador de selección de sección',
+	'saisie_selecteur_rubrique_article' => 'Muestra un navegador de selección de artículo o de sección',
+	'saisie_selecteur_rubrique_article_titre' => 'Artículo o sección',
+	'saisie_selection_explication' => 'Elegir una opción dentro de una lista desplegable.',
+	'saisie_selection_multiple_explication' => 'Permite elegir varias opciones con una lista.',
+	'saisie_selection_multiple_titre' => 'Selección múltiple',
+	'saisie_selection_titre' => 'Lista desplegable / selección',
+	'saisie_textarea_explication' => 'Un campo de texto sobre varias líneas.',
+	'saisie_textarea_titre' => 'Bloque de texto',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@ : @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentación de saisies',
+	'tous_visiteurs' => 'Todos los visitantes (incluso no registrados)',
+	'tout_selectionner' => '(Des) elección todo',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Sintaxis incorrecta. ¿Confundiría el carácter de barra vertical (|) con la L minúscula (l)?',
+	'verifier_saisies_option_data_cles_doubles' => 'Al menos una clave está duplicada.',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Sintaxis incorrecta. No se permiten subgrupos.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Sintaxis incorrecta. Algunas claves no cumplen los criterios.',
+	'verifier_valeurs_acceptables_explication' => 'Verificar que el valor publicado esté entre los autorizados al definir el(los) campo(s). No use esta opción si llena dinámicamente los campos en sus plantillas o los llena usando javascript.',
+	'verifier_valeurs_acceptables_label' => 'Comprobar posibles valores',
+	'vue_sans_reponse' => '<i>Sin respuesta</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_fa.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a1109608cb37d27602675923b6830a90e9323d8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_fa.php
@@ -0,0 +1,133 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_parcourir_docs_article' => 'مرور مقاله',
+	'bouton_parcourir_docs_breve' => 'مرور خبر',
+	'bouton_parcourir_docs_rubrique' => 'مرور بخش',
+	'bouton_parcourir_mediatheque' => 'مرور كتابخانه چندرسانه‌اي',
+
+	// L
+	'label_annee' => 'سال',
+	'label_jour' => 'روز',
+	'label_mois' => 'ماه',
+
+	// O
+	'option_aff_art_interface_explication' => 'نمايش مقالات فقط به زبان كاربر', # MODIF
+	'option_aff_art_interface_label' => 'نمايش چندزبانه',
+	'option_aff_langue_explication' => 'نمايش زبان مقاله يا بخش انتخاب شده‌ پيش از تيتر',
+	'option_aff_langue_label' => 'نمايش زبان',
+	'option_aff_rub_interface_explication' => 'نمايش بخش‌ها فقط به زبان كاربر', # MODIF
+	'option_aff_rub_interface_label' => 'نمايش چندزبانه',
+	'option_attention_explication' => 'پيامي مهم‌تر از توضيح.',
+	'option_attention_label' => 'هشدار',
+	'option_cacher_option_intro_label' => 'پنهان‌سازي نخستين انتخاب خالي ',
+	'option_choix_destinataires_explication' => 'يك يا چند نويسنده كه كاربر مي‌تواند از ميانشان انتخاب كند. اگر كسي انتخاب نشود،‌ نويسنده‌اي كه سايت را نصب كرده انتخاب خواهد شد.<NEW>Un ou plusieurs auteurs parmis lesquels l’utilisateur pourra faire son choix. Si rien n’est sélectionné, c’est l’auteur qui a installé le site qui sera choisi.', # MODIF
+	'option_choix_destinataires_label' => '<دريافت‌ كنندگان محتمل',
+	'option_class_label' => 'كلاس‌هاي سي.اس.اس اضافي ',
+	'option_cols_explication' => 'پهناي بلوك به تعداد كارآكترها. اين گزينه هميشه كاربرد ندارد چرا كه شيوه‌هاي سي.اس.اس سايت شما مي‌تواند آن را منتفي سازد.',
+	'option_cols_label' => 'پهنا',
+	'option_datas_explication' => 'لازم است براي هر رديف يك گزينه در قالب «گزينه‌ي كليد|برچسبِ» انتخاب كنيد.', # MODIF
+	'option_datas_label' => 'فهرست گزينه‌هاي ممكن ',
+	'option_defaut_label' => 'مقدار پيش‌ گزيده',
+	'option_disable_avec_post_explication' => 'همانند وضعيت گزينه‌ي قبلي اما هنوز مقدار در ميدان مخفي پست شود.',
+	'option_disable_avec_post_label' => 'غيرفعال اما پست شده',
+	'option_disable_explication' => 'ميدان نمي‌‌تواند تمركز بيشتري بگيرد.',
+	'option_disable_label' => 'غيرفعال سازي ميدن',
+	'option_explication_explication' => 'در هنگام نياز، يك عبارت كوتاه موضوع ميدان را بيان كند.',
+	'option_explication_label' => 'توضيح',
+	'option_groupe_affichage' => 'نمايش ',
+	'option_groupe_description' => 'توصيف',
+	'option_groupe_utilisation' => 'كاربرد',
+	'option_groupe_validation' => 'ارزش‌گذاري',
+	'option_info_obligatoire_explication' => 'مي‌توانيد كاربرد پيش‌ گزيده‌ي الزامي را اصلاح كنيد: <i>[Obligatoire]</i>.', # MODIF
+	'option_info_obligatoire_label' => 'نشان الزام',
+	'option_inserer_barre_choix_edition' => 'ميل‌ابزار ويرايش كامل ',
+	'option_inserer_barre_choix_forum' => 'ميل‌ابزار سخنگاه‌ها',
+	'option_inserer_barre_explication' => 'گنجاندن يك ميل‌‌ابزار «چوب قلم» «porte-plume» اگر آن ابزار فعال باشد.',
+	'option_inserer_barre_label' => 'گنجاندن يك ميل‌ابزار',
+	'option_label_case_label' => 'برچسب كنار چك باكس ',
+	'option_label_explication' => 'تيتري كه نمايش داده خواهد شد.',
+	'option_label_label' => 'برچسب',
+	'option_maxlength_explication' => 'كاربر نمي‌تواند كارآكترهايي بيش از اين تعداد تايپ كند.', # MODIF
+	'option_maxlength_label' => 'تعداد بيشترين كارآكتر',
+	'option_multiple_explication' => 'توانايي كاربر در انتخاب چند مقدار', # MODIF
+	'option_multiple_label' => 'چندگزينه‌اي',
+	'option_nom_explication' => 'يك اسم انفورماتيك كه اين ميدان را معرفي كند. اين اسم فقط بايد مركب از حروف كوچك و يا آندر لاين «_» باشد. ',
+	'option_nom_label' => 'اسم ميدان',
+	'option_obligatoire_label' => 'ميدان الزامي',
+	'option_option_intro_label' => 'برچسب نخستين گزينه‌ي خالي ',
+	'option_pliable_label' => 'گسترشي ',
+	'option_pliable_label_case' => 'گروه‌ ميدان‌هاي چين خور.',
+	'option_plie_label' => 'چين خورده',
+	'option_plie_label_case' => 'اگر گروه ميدان‌ها چين خور باشد، اين گزينه آن‌ها را در نمايش فرم چين خور كرده است. ',
+	'option_previsualisation_explication' => 'اگر چوب قلم فعال باشد، يك تب براي پيش‌ نمايش متن ورودي اضافه كن.',
+	'option_previsualisation_label' => 'فعال سازي پيش نمايش ',
+	'option_readonly_explication' => 'ميدان قابل مشاهده و گزينش، اما ناويرايشي.',
+	'option_readonly_label' => 'فقط خوانداني',
+	'option_rows_explication' => 'بلندي ميدان در پيوند‌ها. اين گزينه كاربردي/كاربستي نيست زيرا سي.اس.اس سايت شما آن را رد مي‌كند.',
+	'option_rows_label' => 'تعداد پيوندها',
+	'option_size_explication' => 'پهناي ميدان بر اساس تعدا كارآكتر. اين گزينه هميشه كاربردي/كاربستي نيست زيرا سي.اس.اس سايت شما آن را رد مي‌كند.',
+	'option_size_label' => 'اندازه‌ي ميدان',
+	'option_type_choix_plusieurs' => 'اجازه به كاربر در انتخاب <strong> چند</strong> دريافت كننده‌ي ايميل.', # MODIF
+	'option_type_choix_tous' => '<strong>تمام</strong> مؤلفان دريافت‌كننده شوند. كاربر گزينه‌اي نخواهد داشت.', # MODIF
+	'option_type_choix_un' => 'اجازه به كاربر براي گزينش <strong> فقط يك </strong> دريافت‌كننده ', # MODIF
+	'option_type_explication' => 'در حالت «پوشيده»، محتواي ميدان قابل رؤيت نخواهد بود. ',
+	'option_type_label' => 'نوع ميدان',
+	'option_type_password' => 'پوشيده', # MODIF
+	'option_type_text' => 'عادي',
+
+	// S
+	'saisie_case_explication' => 'فعال يا غيرفعال‌سازي يك گزينه‌ي مشخص.',
+	'saisie_case_titre' => 'تك چك‌ باكش',
+	'saisie_checkbox_explication' => 'اجازه‌ي گزينش چك‌ باكس چندگزينه‌اي.',
+	'saisie_checkbox_titre' => 'چك باكس‌ها',
+	'saisie_date_explication' => 'اجازه واردسازي داده با كمك تقويم', # MODIF
+	'saisie_date_titre' => 'تاريخ',
+	'saisie_destinataires_explication' => 'اجازه‌ي گزينش يك يا چند دريافت كننده از ميان نويسندگان پيش‌ گزيده.', # MODIF
+	'saisie_destinataires_titre' => 'دريافت‌ كنندگان',
+	'saisie_explication_explication' => 'يك متن توصيفي كلي.',
+	'saisie_explication_titre' => 'توصيف',
+	'saisie_fieldset_explication' => 'كادري كه ممكن است چند ميدان داشته باشد.',
+	'saisie_fieldset_titre' => 'گروه ميدان',
+	'saisie_file_explication' => 'ارسال پرونده',
+	'saisie_file_titre' => 'پرونده',
+	'saisie_hidden_explication' => 'ميدان از‌پيش‌‌ پُري كه بازديدكننده هرگز نخواهد ديد.', # MODIF
+	'saisie_hidden_titre' => 'ميدان پوشيده',
+	'saisie_input_explication' => 'خط ساده‌اي از متن كه مي‌تواند پوشيده يا آشكار باشد (گذرواژه)',
+	'saisie_input_titre' => 'ميدان متني',
+	'saisie_oui_non_explication' => 'بله يا نه، روشن است؟ :)',
+	'saisie_oui_non_titre' => 'بله يا نه',
+	'saisie_radio_defaut_choix1' => 'يك ',
+	'saisie_radio_defaut_choix2' => 'دو',
+	'saisie_radio_defaut_choix3' => 'سه',
+	'saisie_radio_explication' => 'اجازه‌ي گزينش يك تك گزينه‌اي از ميان چند امكان.', # MODIF
+	'saisie_radio_titre' => 'دكمه راديويي',
+	'saisie_selecteur_article' => 'نمايش يك مرورگر گزينش مقاله',
+	'saisie_selecteur_rubrique' => 'نمايش مرورگر گزينشگر مقاله',
+	'saisie_selecteur_rubrique_article' => 'نمايش مرورگر گزينشگر يك مقاله يا يك بخش',
+	'saisie_selecteur_rubrique_article_titre' => 'گزينشگر مقاله يا بخش', # MODIF
+	'saisie_selection_explication' => 'گزينش يك گزينه از فهرست آبشاري.',
+	'saisie_selection_multiple_explication' => 'اجازه‌ي گزينش چند گزينه با يك فهرست.',
+	'saisie_selection_multiple_titre' => 'چندگزينه‌اي',
+	'saisie_selection_titre' => 'فهرست‌دان آبشاري ', # MODIF
+	'saisie_textarea_explication' => 'ميدان متن چندخطي.',
+	'saisie_textarea_titre' => 'بلوك‌متن',
+
+	// T
+	'tous_visiteurs' => 'تمام بازديدكنندگان (حتي ثبت ‌نام ناشدگان)',
+
+	// V
+	'vue_sans_reponse' => '<i>بي‌ پاسخ</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_fr.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..30dba594da044c7a5a07f4505178b87a4cb0115c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_fr.php
@@ -0,0 +1,317 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/saisies.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Afficher',
+	'assets_global' => 'Charger le javascript et les CSS sur toutes les pages, dans la balise &lt;head&gt;',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Parcourir l’article',
+	'bouton_parcourir_docs_breve' => 'Parcourir la brève',
+	'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
+	'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
+
+	// C
+	'caracteres_restants' => 'caractères restants',
+	'categorie_choix_label' => 'Choix restreint',
+	'categorie_defaut_label' => 'Divers',
+	'categorie_libre_label' => 'Champ libre',
+	'categorie_objet_label' => 'Contenu éditorial',
+	'categorie_structure_label' => 'Structure',
+	'coherence_afficher_si_appel' => '@label@ : appel incorrect à @erreurs@',
+	'coherence_afficher_si_erreur_pluriel' => 'Les affichages conditionnels des champs ci-dessous font appel à des champs inexistants :',
+	'coherence_afficher_si_erreur_singulier' => 'L’affichage conditionnel du champ ci-dessous fait appel à des champs inexistants :',
+	'configuration' => 'Configuration du plugin Saisies',
+	'construire_action_annuler' => 'Annuler',
+	'construire_action_configurer' => 'Configurer',
+	'construire_action_deplacer' => 'Déplacer',
+	'construire_action_dupliquer' => 'Dupliquer',
+	'construire_action_dupliquer_copie' => '(copie)',
+	'construire_action_supprimer' => 'Supprimer',
+	'construire_ajouter_champ' => 'Ajouter un champ',
+	'construire_ajouter_groupe' => 'Ajouter un groupe',
+	'construire_attention_enregistrer' => 'N’oubliez pas d’enregistrer vos modifications !',
+	'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.',
+	'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l’enregistrement de cette nouvelle version du formulaire.',
+	'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
+	'construire_configurer_globales_label' => 'Configurer les options globales',
+	'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
+	'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
+	'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.',
+	'construire_position_fin_formulaire' => 'À la fin du formulaire',
+	'construire_position_fin_groupe' => 'À la fin du groupe @groupe@',
+	'construire_position_label' => 'Position du champ',
+	'construire_reinitialiser' => 'Réinitialiser le formulaire',
+	'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?',
+	'construire_verifications_label' => 'Vérification(s) à effectuer',
+	'conteneur_inline_explication' => 'Pour regrouper visuellement des champs en ligne.',
+	'conteneur_inline_titre' => 'Affichage en ligne',
+	'cvt_etapes_courante' => 'Étape @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Réponses possibles (en colonne)',
+	'data_rows_label' => 'Questions (en ligne)',
+
+	// E
+	'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies',
+	'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
+	'erreur_syntaxe_afficher_si' => 'Syntaxe incorrecte du test',
+	'erreur_valeur_inacceptable' => 'Valeur postée non acceptable.',
+	'etapes_formulaire' => 'Étapes du formulaire',
+	'etapes_recapitulatif_label' => 'Récapitulatif',
+	'etapes_recapitulatif_texte' => 'Merci de relire vos réponses et de les vérifier avant la validation finale.',
+	'explication_dev' => 'Pour les devs',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Vous pouvez renvoyer un nouveau fichier, ou bien soumettre le formulaire tel quel, l’ancien fichier n’est pas conservé.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Vous devez envoyer un autre fichier.',
+	'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
+	'format_email_attendu' => 'Saisir une adresse email au format vous@fournisseur.fr',
+
+	// I
+	'info_configurer_saisies' => 'Page de test des Saisies',
+
+	// L
+	'label_annee' => 'Année',
+	'label_jour' => 'Jour',
+	'label_mois' => 'Mois',
+
+	// M
+	'masquer' => 'Masquer',
+
+	// O
+	'option_1ligne' => 'Largeur automatique, sur une seule ligne, prendre le moins de place',
+	'option_1ligne_max' => 'Largeur automatique, sur une seule ligne, prendre le plus de place',
+	'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l’internaute',
+	'option_aff_art_interface_label' => 'Affichage multilingue',
+	'option_aff_langue_explication' => 'Affiche la langue de l’article ou rubrique sélectionné devant le titre',
+	'option_aff_langue_label' => 'Afficher la langue',
+	'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l’internaute',
+	'option_aff_rub_interface_label' => 'Affichage multilingue',
+	'option_afficher_si_avec_post_explication' => 'Par défaut les valeurs des saisies masquées par l’affichage conditionnel ne sont pas postées, donc pas enregistrées. Cochez cette case pour changer ce comportement.',
+	'option_afficher_si_avec_post_label' => 'Poster tout de même',
+	'option_afficher_si_avec_post_label_case' => 'Poster la valeur en cas de masquage de saisie',
+	'option_afficher_si_explication' => 'Indiquez les conditions pour afficher le champ en fonction de la valeur des autres champs. L’identifiant des autres champs doit être mis entre <code>@</code>. <br />Exemple <code>@selection_1@=="Toto"</code> conditionne l’affichage du champ à ce que le champ <code>selection_1</code> ait pour valeur la clé <code>Toto</code>. <br />
+	Il est possible d’utiliser les opérateurs booléens <code>||</code> (ou) et  <code>&&</code> (et). <br />
+	Vous trouverez la <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">documentation complète de la syntaxe sur SPIP-contrib</a>.',
+	'option_afficher_si_label' => 'Affichage conditionnel',
+	'option_afficher_si_remplissage_uniquement_explication' => 'En cochant cette case, l’affichage conditionnel s’appliquera uniquement lors du remplissage du formulaire, pas lors de l’affichage des résultats.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Uniquement lors du remplissage',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Masquer la saisie uniquement lors du remplissage',
+	'option_attention_explication' => 'Un message plus important que l’explication.',
+	'option_attention_label' => 'Avertissement',
+	'option_attribut_title_label' => 'Valeur en attribut title',
+	'option_attribut_title_label_case' => 'Mettre un attribut title dans le label, contenant la valeur technique du champ. À utiliser avec modération.',
+	'option_attributs_explication' => 'Les attributs portent sur chaque champ html, y compris pour les saisies avec plusieurs champs (<code>radio</code>, <code>checkbox</code>, etc.).',
+	'option_attributs_label' => 'Attributs HTML supplémentaires',
+	'option_autocomplete_defaut' => 'Laisser par défaut',
+	'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique',
+	'option_autocomplete_label' => 'Pré-remplissage du champ',
+	'option_autocomplete_off' => 'Désactiver',
+	'option_autocomplete_on' => 'Activer',
+	'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
+	'option_case_valeur_non_explication' => 'Valeur postée si la case n’est pas cochée. Attention, il s’agit d’une valeur technique et non d’une valeur affichée.',
+	'option_case_valeur_oui_explication' => 'Valeur postée si la case est cochée. Attention, il s’agit d’une valeur technique et non d’une valeur affichée.',
+	'option_choix_alternatif_label' => 'Proposer un choix alternatif',
+	'option_choix_alternatif_label_defaut' => 'Autre choix',
+	'option_choix_alternatif_label_label' => 'Label de ce choix alternatif',
+	'option_choix_destinataires_explication' => 'Liste d’auteurs et d’autrices pour une sélection de destinataires par l’internaute, à défaut ce sera la personne qui a installé le site.',
+	'option_choix_destinataires_label' => 'Destinataires possibles',
+	'option_class_label' => 'Classes CSS supplémentaires',
+	'option_col2' => 'Deux champs par ligne',
+	'option_col3' => 'Trois champs par ligne',
+	'option_col4' => 'Quatre champs par ligne',
+	'option_colonnes_label' => 'Mode d’affichage',
+	'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
+	'option_cols_label' => 'Largeur',
+	'option_conteneur_class_label' => 'Classes CSS supplémentaires sur le conteneur',
+	'option_datas_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label du choix".<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.',
+	'option_datas_explication_dev' => 'Fournir un liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) de type <code>"cle"=>"Label du choix"</code>.',
+	'option_datas_grille_explication' => 'Vous devez indiquer un choix par ligne sous la forme "cle|Label du choix" ou bien "cle|Label à gauche|Label à droite"<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.',
+	'option_datas_grille_explication_dev' => 'Fournir une liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) de type <code>"cle"=>"Label du choix"</code> ou bien <code>"cle"=>"Label à gauche|Label à droite"</code>.',
+	'option_datas_label' => 'Liste des choix possibles',
+	'option_datas_sous_groupe_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label" du choix.<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.<br />Vous pouvez indiquer le début d’un sous-groupe sous la forme "*Titre du sous-groupe". Pour finir un sous-groupe vous pouvez en entamez un autre, ou bien mettre une ligne contenant uniquement "/*".',
+	'option_datas_sous_groupe_explication_dev' => 'Fournir une liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) sous forme <code>"clé" => "valeur"</code>.<br />Vous pouvez regrouper en sous groupe. Pour ce faire, la <code>clé</code> doit être le titre du sous groupe, et la valeur doit être elle-même un tableau associatif de type <code>"clé" => "valeur"</code>.',
+	'option_defaut_label' => 'Valeur par défaut',
+	'option_defaut_session_explication' => 'Mettre le champ de session à utiliser. Si ce champ existe dans la session courante, sa valeur l’emportera sur la valeur par défaut.',
+	'option_defaut_session_label' => 'Valeur par défaut depuis la session de l’internaute',
+	'option_disable_avec_post_explication' => 'Identique à l’option précédente mais poste quand même la valeur dans un champ caché.',
+	'option_disable_avec_post_label' => 'Désactiver mais poster',
+	'option_disable_choix_explication' => 'Indiquer les choix séparés par une virgule, exemple : <code>choix1,choix3</code>.',
+	'option_disable_choix_explication_dev' => 'Indiquer les choix sous forme de tableau, exemple : <code>["choix1","choix3"]</code>.',
+	'option_disable_choix_label' => 'Désactiver certains choix',
+	'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
+	'option_disable_label' => 'Désactiver le champ',
+	'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d’erreur affiché pour indiquer l’obligation (sinon laisser vide).',
+	'option_erreur_obligatoire_label' => 'Message d’erreur pour l’obligation',
+	'option_explication_apres_attention' => 'Pour des raisons d’accessibilité, les explications importantes doivent toujours être avant la saisie.',
+	'option_explication_apres_label' => 'Explication après le champ',
+	'option_explication_explication' => 'Si besoin, une courte phrase décrivant l’objet du champ.',
+	'option_explication_label' => 'Explication',
+	'option_forcer_select_explication' => 'Si un groupe de mots est sélectionné, par défaut il s’agira d’une saisie radio. Vous pouvez forcer l’utilisation d’un select.',
+	'option_forcer_select_label_case' => 'Forcer l’utilisation d’un select',
+	'option_groupe_affichage' => 'Affichage',
+	'option_groupe_conditions' => 'Conditions',
+	'option_groupe_description' => 'Description',
+	'option_groupe_utilisation' => 'Utilisation',
+	'option_groupe_validation' => 'Validation',
+	'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).',
+	'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie',
+	'option_horaire_label' => 'Horaire',
+	'option_horaire_label_case' => 'Permettre de saisir aussi l’horaire',
+	'option_id_explication' => 'Sera automatiquement préfixé par <code>champ_</code>.',
+	'option_id_groupe_label' => 'Groupe de mots',
+	'option_id_label' => 'Attribut <code>id</code> de la saisie',
+	'option_info_obligatoire_explication' => 'Vous pouvez modifier l’indication d’obligation par défaut : <i>[Obligatoire]</i>. Pour garder l’information par défaut, ne rien mettre. Pour ne rien afficher, mettre un texte composé uniquement d’espace.',
+	'option_info_obligatoire_label' => 'Indication d’obligation',
+	'option_inserer_barre_choix_edition' => 'barre d’édition complète',
+	'option_inserer_barre_choix_forum' => 'barre des forums',
+	'option_inserer_barre_explication' => 'Insère une barre d’outils du porte-plume si ce dernier est activé.',
+	'option_inserer_barre_label' => 'Insérer une barre d’outils',
+	'option_inserer_debut_label' => 'Code à insérer en début de saisie',
+	'option_inserer_fin_label' => 'Code à insérer en fin de saisie',
+	'option_label_case_label' => 'Label placé à côté de la case',
+	'option_label_explication' => 'Le titre qui sera affiché.',
+	'option_label_label' => 'Label',
+	'option_label_non_explication' => 'Sera visible lors de l’affichage des résultats.',
+	'option_label_non_label' => 'Label si la case n’est pas cochée',
+	'option_label_oui_explication' => 'Sera visible lors de l’affichage des résultats.',
+	'option_label_oui_label' => 'Label si la case est cochée',
+	'option_limite_branche_explication' => 'Limitera le choix à une branche spécifique du site',
+	'option_limite_branche_label' => 'Limiter à une branche',
+	'option_maximum_choix_explication' => 'Nombre de choix maximum ?',
+	'option_maximum_choix_label' => 'Limiter le nombre de choix',
+	'option_maxlength_explication' => 'L’internaute ne pourra pas saisir plus de caractères que ce nombre.',
+	'option_maxlength_label' => 'Nombre de caractères maximum',
+	'option_minlength_explication' => 'L’internaute ne pourra pas saisir moins de caractères que ce nombre.',
+	'option_minlength_label' => 'Nombre de caractères minimum',
+	'option_multiple_explication' => 'L’internaute pourra sélectionner plusieurs valeurs',
+	'option_multiple_label' => 'Sélection multiple',
+	'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
+	'option_nom_label' => 'Nom du champ',
+	'option_obligatoire_label' => 'Champ obligatoire',
+	'option_onglet_label' => 'Onglet',
+	'option_onglet_label_case' => 'Afficher sous forme d’onglet.',
+	'option_onglet_vertical_explication' => 'Il suffit qu’un seul onglet dans un groupe soit marqué comme vertical pour que l’ensemble des onglets soient verticaux.',
+	'option_onglet_vertical_label_case' => 'Onglet vertical',
+	'option_option_destinataire_intro_label' => 'Label du premier choix vide (lorsque sous forme de liste)',
+	'option_option_intro_label' => 'Label du premier choix vide',
+	'option_option_statut_label' => 'Afficher les statuts',
+	'option_oui_non_valeur_non_explication' => 'Valeur postée si le non est sélectionné.',
+	'option_oui_non_valeur_oui_explication' => 'Valeur postée si le oui est sélectionné.',
+	'option_placeholder_label' => 'Placeholder',
+	'option_pliable_label' => 'Pliable',
+	'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
+	'option_plie_label' => 'Déjà plié',
+	'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l’affichage du formulaire.',
+	'option_poster_afficher_si_label_case' => 'Poster les valeurs de toutes les saisies masquées',
+	'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
+	'option_previsualisation_label' => 'Activer la prévisualisation',
+	'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
+	'option_readonly_label' => 'Lecture seule',
+	'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
+	'option_rows_label' => 'Nombre de lignes',
+	'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
+	'option_size_label' => 'Taille du champ',
+	'option_statut_label' => 'Statut(s) particulier(s)',
+	'option_type' => 'Type de saisie',
+	'option_type_choix_label' => 'Type de choix',
+	'option_type_choix_plusieurs' => 'Permettre à l’internaute de choisir <strong>plusieurs</strong> destinataires.',
+	'option_type_choix_tous' => 'Mettre <strong>toutes</strong> ces personnes en destinataires. L’internaute n’aura aucun choix.',
+	'option_type_choix_un' => 'Permettre à l’internaute de choisir <strong>une seule personne</strong> (sous forme de liste déroulante).',
+	'option_type_choix_un_radio' => 'Permettre à l’internaute de choisir <strong>une seule  </strong> personne (sous forme de liste à puce).',
+	'option_type_color' => 'Couleur',
+	'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
+	'option_type_label' => 'Type du champ',
+	'option_type_password' => 'Texte masqué lors de la saisie (ex : mot de passe)',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Valeur non',
+	'option_valeur_oui_label' => 'Valeur oui',
+	'option_vue_masquer_sous_groupe' => 'Lors de l’affichage du résultat, n’afficher que la valeur, sans le sous-groupe',
+	'option_xlignes' => 'Largeur automatique, sur plusieurs lignes, prendre le moins de place',
+	'option_xlignes_max' => 'Largeur automatique, sur plusieurs lignes, prendre le plus de place',
+	'options_dev_titre' => 'Options pour les dev',
+
+	// P
+	'plugin_yaml_inactif' => 'Le plugin YAML est inactif. Vous devez l’activer pour que cette page soit fonctionnelle.',
+
+	// S
+	'saisie_auteurs_explication' => 'Permet de sélectionner un auteur, une autrice, ou plusieurs',
+	'saisie_auteurs_titre' => 'Autrices et auteurs',
+	'saisie_case_explication' => 'Permet d’activer ou de désactiver quelque chose.',
+	'saisie_case_titre' => 'Case unique',
+	'saisie_champ_option_aucun' => 'Aucun',
+	'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
+	'saisie_checkbox_titre' => 'Cases à cocher',
+	'saisie_choix_grille_explication' => 'Permet de poser une série de questions à choix multiple d’une manière uniformisé et sous forme de grille',
+	'saisie_choix_grille_titre' => 'Grille de questions',
+	'saisie_date_explication' => 'Permet de saisir une date à l’aide d’un calendrier',
+	'saisie_date_titre' => 'Date',
+	'saisie_destinataires_explication' => 'Permet de choisir des destinataires parmi des comptes pré-sélectionnés.',
+	'saisie_destinataires_titre' => 'Destinataires',
+	'saisie_email_explication' => 'Permet d’avoir un champ de type email en HTML5.',
+	'saisie_email_titre' => 'Adresse email',
+	'saisie_explication_alerte_role_explication' => 'Si besoin, pour l’espace privé uniquement choisir un rôle d’alerte (attribut html role : alert, status, etc.).',
+	'saisie_explication_alerte_role_label' => 'Rôle d’alerte',
+	'saisie_explication_alerte_type_explication' => 'Si besoin, pour l’espace privé uniquement choisir un type d’alerte parmis ceux proposés par SPIP (notice, error, success, info).',
+	'saisie_explication_alerte_type_label' => 'Type d’alerte',
+	'saisie_explication_explication' => 'Un texte explicatif général.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Ouvrir les liens dans la même fenêtre',
+	'saisie_explication_masquer_label' => 'Ajouter un bouton afficher/masquer l’explication',
+	'saisie_explication_texte_label' => 'Texte de l’explication',
+	'saisie_explication_titre' => 'Explication',
+	'saisie_explication_titre_label' => 'Titre de l’explication',
+	'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
+	'saisie_fieldset_titre' => 'Groupe de champs',
+	'saisie_file_explication' => 'Envoi d’un fichier',
+	'saisie_file_titre' => 'Fichier',
+	'saisie_hidden_explication' => 'Un champ pré-rempli que l’internaute ne pourra pas voir.',
+	'saisie_hidden_titre' => 'Champ caché',
+	'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
+	'saisie_input_titre' => 'Ligne de texte',
+	'saisie_mot_explication' => 'Des mots-clés d’un groupe de mot',
+	'saisie_mot_titre' => 'Mot-clé',
+	'saisie_oui_non_explication' => 'Oui ou non, c’est clair ? :)',
+	'saisie_oui_non_titre' => 'Oui ou non',
+	'saisie_radio_defaut_choix1' => 'Un',
+	'saisie_radio_defaut_choix2' => 'Deux',
+	'saisie_radio_defaut_choix3' => 'Trois',
+	'saisie_radio_explication' => 'Permet de choisir une option parmi plusieurs disponibles.',
+	'saisie_radio_titre' => 'Boutons radios',
+	'saisie_selecteur_article' => 'Affiche un navigateur de sélection d’article',
+	'saisie_selecteur_document' => 'Affiche un sélecteur de document',
+	'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
+	'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d’article ou de rubrique',
+	'saisie_selecteur_rubrique_article_titre' => 'Article ou rubrique',
+	'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
+	'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
+	'saisie_selection_multiple_titre' => 'Sélection multiple',
+	'saisie_selection_titre' => 'Liste déroulante / sélection',
+	'saisie_textarea_explication' => 'Un champ de texte sur plusieurs lignes.',
+	'saisie_textarea_titre' => 'Bloc de texte',
+	'saisies_aide_memoire' => 'Aide mémoire',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@ : @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentation des saisies',
+	'tous_visiteurs' => 'Tous les visiteurs (même non enregistrés)',
+	'tout_selectionner' => 'Tout (dé)sélectionner',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Syntaxe incorrecte. Confondriez vous le caractère pipe (|) le le L minuscule (l) ?',
+	'verifier_saisies_option_data_cles_doubles' => 'Au moins une clé est définie en double.',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Syntaxe incorrecte. Les sous-groupes ne sont pas autorisés.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Syntaxe incorrecte. Certaines clés ne répondent pas aux critères.',
+	'verifier_valeurs_acceptables_explication' => 'Vérifier que la valeur postée se trouve parmi celles autorisées lors de la définition du/des champs. Ne pas utiliser cette option si vous remplissez dynamiquement le(s) champs dans vos squelettes ou les remplissez grâce à javascript.',
+	'verifier_valeurs_acceptables_label' => 'Vérifier les valeurs possibles',
+	'vue_sans_reponse' => '<i>Sans réponse</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_fr_tu.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_fr_tu.php
new file mode 100644
index 0000000000000000000000000000000000000000..d3861c9ce5835594356fa233b9f3cca1736d94e1
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_fr_tu.php
@@ -0,0 +1,301 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Afficher',
+	'assets_global' => 'Charger le javascript et les CSS sur toutes les pages, dans la balise &lt;head&gt;',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Parcourir l’article',
+	'bouton_parcourir_docs_breve' => 'Parcourir la brève',
+	'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
+	'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
+
+	// C
+	'caracteres_restants' => 'caractères restants',
+	'categorie_choix_label' => 'Choix restreint',
+	'categorie_defaut_label' => 'Divers',
+	'categorie_libre_label' => 'Champ libre',
+	'categorie_objet_label' => 'Contenu éditorial',
+	'categorie_structure_label' => 'Structure',
+	'coherence_afficher_si_appel' => '@label@ : appel incorrect à @erreurs@',
+	'coherence_afficher_si_erreur_pluriel' => 'Les affichages conditionnels des champs ci-dessous font appel à des champs inexistants :',
+	'coherence_afficher_si_erreur_singulier' => 'L’affichage conditionnel du champ ci-dessous fait appel à des champs inexistants :',
+	'configuration' => 'Configuration du plugin Saisies',
+	'construire_action_annuler' => 'Annuler',
+	'construire_action_configurer' => 'Configurer',
+	'construire_action_deplacer' => 'Déplacer',
+	'construire_action_dupliquer' => 'Dupliquer',
+	'construire_action_dupliquer_copie' => '(copie)',
+	'construire_action_supprimer' => 'Supprimer',
+	'construire_ajouter_champ' => 'Ajouter un champ',
+	'construire_ajouter_groupe' => 'Ajouter un groupe',
+	'construire_attention_enregistrer' => 'N’oublie pas d’enregistrer tes modifications !',
+	'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Tu as la possibilité de le réinitialiser à son état avant tes modifications.',
+	'construire_attention_supprime' => 'Tes modifications comportent des suppressions de champs. Confirme l’enregistrement de cette nouvelle version du formulaire.',
+	'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
+	'construire_configurer_globales_label' => 'Configurer les options globales',
+	'construire_confirmer_supprimer_champ' => 'Veux-tu vraiment supprimer ce champ ?',
+	'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
+	'construire_position_explication' => 'Indique devant quel autre champ sera placé celui-ci.',
+	'construire_position_fin_formulaire' => 'À la fin du formulaire',
+	'construire_position_fin_groupe' => 'À la fin du groupe @groupe@',
+	'construire_position_label' => 'Position du champ',
+	'construire_reinitialiser' => 'Réinitialiser le formulaire',
+	'construire_reinitialiser_confirmer' => 'Tu vas perdre toutes tes modifications. Es-tu sûr de vouloir revenir au formulaire initial ?',
+	'construire_verifications_label' => 'Vérification(s) à effectuer',
+	'cvt_etapes_courante' => 'Étape @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Réponses possibles (en colonne)',
+	'data_rows_label' => 'Questions (en ligne)',
+
+	// E
+	'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, vérifie tes saisies',
+	'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
+	'erreur_syntaxe_afficher_si' => 'Syntaxe incorrecte du test',
+	'erreur_valeur_inacceptable' => 'Valeur postée non acceptable.',
+	'etapes_formulaire' => 'Étapes du formulaire',
+	'etapes_recapitulatif_label' => 'Récapitulatif',
+	'etapes_recapitulatif_texte' => 'Merci de relire tos réponses et de les vérifier avant la validation finale.',
+	'explication_dev' => 'Pour les devs',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Tu peux renvoyer un nouveau fichier, ou bien soumettre le formulaire tel quel, l’ancien fichier n’est pas conservé.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Tu dois envoyer un autre fichier.',
+	'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
+	'format_email_attendu' => 'Saisir une adresse email au format toi@fournisseur.fr',
+
+	// I
+	'info_configurer_saisies' => 'Page de test des Saisies',
+
+	// L
+	'label_annee' => 'Année',
+	'label_jour' => 'Jour',
+	'label_mois' => 'Mois',
+
+	// M
+	'masquer' => 'Masquer',
+
+	// O
+	'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l’internaute',
+	'option_aff_art_interface_label' => 'Affichage multilingue',
+	'option_aff_langue_explication' => 'Affiche la langue de l’article ou rubrique sélectionné devant le titre',
+	'option_aff_langue_label' => 'Afficher la langue',
+	'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l’internaute',
+	'option_aff_rub_interface_label' => 'Affichage multilingue',
+	'option_afficher_si_avec_post_explication' => 'Par défaut les valeurs des saisies masquées par l’affichage conditionnel ne sont pas postées, donc pas enregistrées. Coche cette case pour changer ce comportement.',
+	'option_afficher_si_avec_post_label' => 'Poster tout de même',
+	'option_afficher_si_avec_post_label_case' => 'Poster la valeur en cas de masquage de saisie',
+	'option_afficher_si_explication' => 'Indique les conditions pour afficher le champ en fonction de la valeur des autres champs. L’identifiant des autres champs doit être mis entre <code>@</code>. <br />Exemple <code>@selection_1@=="Toto"</code> conditionne l’affichage du champ à ce que le champ <code>selection_1</code> ait pour valeur la clé <code>Toto</code>. <br />
+Il est possible d’utiliser les opérateurs booléens <code>||</code> (ou) et  <code>&&</code> (et). <br />
+Tu trouveras la <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">documentation complète de la syntaxe sur SPIP-contrib</a>.', # MODIF
+	'option_afficher_si_label' => 'Affichage conditionnel',
+	'option_afficher_si_remplissage_uniquement_explication' => 'En cochant cette case, l’affichage conditionnel s’appliquera uniquement lors du remplissage du formulaire, pas lors de l’affichage des résultats.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Uniquement lors du remplissage',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Masquer la saisie uniquement lors du remplissage',
+	'option_attention_explication' => 'Un message plus important que l’explication.',
+	'option_attention_label' => 'Avertissement',
+	'option_attribut_title_label' => 'Valeur en attribut title',
+	'option_attribut_title_label_case' => 'Mettre un attribut title dans le label, contenant la valeur technique du champ. À utiliser avec modération.',
+	'option_attributs_explication' => 'Les attributs portent sur chaque champ HTML, y compris pour les saisies avec plusieurs champs (<code>radio</code>, <code>checkbox</code>, etc.).',
+	'option_attributs_label' => 'Attributs HTML supplémentaires',
+	'option_autocomplete_defaut' => 'Laisser par défaut',
+	'option_autocomplete_explication' => 'Au chargement de la page, ton navigateur peut pré-remplir le champ en fonction de son historique',
+	'option_autocomplete_label' => 'Pré-remplissage du champ',
+	'option_autocomplete_off' => 'Désactiver',
+	'option_autocomplete_on' => 'Activer',
+	'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
+	'option_case_valeur_non_explication' => 'Valeur postée si la case n’est pas cochée. Attention, il s’agit d’une valeur technique et non d’une valeur affichée.',
+	'option_case_valeur_oui_explication' => 'Valeur postée si la case est cochée. Attention, il s’agit d’une valeur technique et non d’une valeur affichée.',
+	'option_choix_alternatif_label' => 'Proposer un choix alternatif',
+	'option_choix_alternatif_label_defaut' => 'Autre choix',
+	'option_choix_alternatif_label_label' => 'Label de ce choix alternatif',
+	'option_choix_destinataires_explication' => 'Liste de plumes pour une sélection de destinataires par l’internaute, à défaut ce sera la personne qui a installé le site.',
+	'option_choix_destinataires_label' => 'Destinataires possibles',
+	'option_class_label' => 'Classes CSS supplémentaires',
+	'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de ton site peuvent l’annuler.',
+	'option_cols_label' => 'Largeur',
+	'option_conteneur_class_label' => 'Classes CSS supplémentaires sur le conteneur',
+	'option_datas_explication' => 'Tu dois indiquer un choix par ligne sous la forme "cle|Label du choix".<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.',
+	'option_datas_explication_dev' => 'Fournir une liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) de type <code>"cle"=>"Label du choix"</code>.',
+	'option_datas_grille_explication' => 'Tu dois indiquer un choix par ligne sous la forme "cle|Label du choix" ou bien "cle|Label à gauche|Label à droite"<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.',
+	'option_datas_grille_explication_dev' => 'Fournir une liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) de type <code>"cle"=>"Label du choix"</code> ou bien <code>"cle"=>"Label à gauche|Label à droite"</code>.',
+	'option_datas_label' => 'Liste des choix possibles',
+	'option_datas_sous_groupe_explication' => 'Tu dois indiquez un choix par ligne sous la forme "cle|Label" du choix. <br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.<br />Tu peux indiquer le début d’un sous-groupe sous la forme "*Titre du sous-groupe". Pour finir un sous-groupe tu peux en entamez un autre, ou bien mettre une ligne contenant uniquement "/*".',
+	'option_datas_sous_groupe_explication_dev' => 'Fournir une liste de choix sous la forme d’un tableau PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) sous forme <code>"clé" => "valeur"</code>.<br />Vous pouvez regrouper en sous groupe. Pour ce faire, la <code>clé</code> doit être le titre du sous groupe, et la valeur doit être elle-même un tableau associatif de type <code>"clé" => "valeur"</code>.',
+	'option_defaut_label' => 'Valeur par défaut',
+	'option_disable_avec_post_explication' => 'Identique à l’option précédente mais poste quand même la valeur dans un champ caché.',
+	'option_disable_avec_post_label' => 'Désactiver mais poster',
+	'option_disable_choix_explication' => 'Indiquer les choix séparés par une virgule, exemple : <code>choix1,choix3</code>.',
+	'option_disable_choix_explication_dev' => 'Indiquer les choix sous forme de tableau, exemple : <code>["choix1","choix3"]</code>.',
+	'option_disable_choix_label' => 'Désactiver certains choix',
+	'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
+	'option_disable_label' => 'Désactiver le champ',
+	'option_erreur_obligatoire_explication' => 'Tu peux personnaliser le message d’erreur affiché pour indiquer l’obligation (sinon laisser vide).',
+	'option_erreur_obligatoire_label' => 'Message d’erreur pour l’obligation',
+	'option_explication_apres_attention' => 'Pour des raisons d’accessibilité, les explications importantes doivent toujours être avant la saisie.',
+	'option_explication_apres_label' => 'Explication après le champ',
+	'option_explication_explication' => 'Si besoin, une courte phrase décrivant l’objet du champ.',
+	'option_explication_label' => 'Explication',
+	'option_forcer_select_explication' => 'Si un groupe de mots est sélectionné, par défaut il s’agira d’une saisie radio. Tu peux forcer l’utilisation d’un select.',
+	'option_forcer_select_label_case' => 'Forcer l’utilisation d’un select',
+	'option_groupe_affichage' => 'Affichage',
+	'option_groupe_conditions' => 'Conditions',
+	'option_groupe_description' => 'Description',
+	'option_groupe_utilisation' => 'Utilisation',
+	'option_groupe_validation' => 'Validation',
+	'option_heure_pas_explication' => 'Lorsque tu utilises l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Tu peux ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).',
+	'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie',
+	'option_horaire_label' => 'Horaire',
+	'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire',
+	'option_id_explication' => 'Sera automatiquement préfixé par <code>champ_</code>.',
+	'option_id_groupe_label' => 'Groupe de mots',
+	'option_id_label' => 'Attribut <code>id</code> de la saisie',
+	'option_info_obligatoire_explication' => 'Tu peux modifier l’indication d’obligation par défaut : <i>[Obligatoire]</i>. Pour garder l’information par défaut, ne rien mettre. Pour ne rien afficher, mettre un texte composé uniquement d’espace.',
+	'option_info_obligatoire_label' => 'Indication d’obligation',
+	'option_inserer_barre_choix_edition' => 'barre d’édition complète',
+	'option_inserer_barre_choix_forum' => 'barre des forums',
+	'option_inserer_barre_explication' => 'Insère une barre d’outils du porte-plume si ce dernier est activé.',
+	'option_inserer_barre_label' => 'Insérer une barre d’outils',
+	'option_inserer_debut_label' => 'Code à insérer en début de saisie',
+	'option_inserer_fin_label' => 'Code à insérer en fin de saisie',
+	'option_label_case_label' => 'Label placé à côté de la case',
+	'option_label_explication' => 'Le titre qui sera affiché.',
+	'option_label_label' => 'Label',
+	'option_label_non_explication' => 'Sera visible lors de l’affichage des résultats.',
+	'option_label_non_label' => 'Label si la case n’est pas cochée',
+	'option_label_oui_explication' => 'Sera visible lors de l’affichage des résultats.',
+	'option_label_oui_label' => 'Label si la case est cochée',
+	'option_limite_branche_explication' => 'Limitera le choix à une branche spécifique du site',
+	'option_limite_branche_label' => 'Limiter à une branche',
+	'option_maximum_choix_explication' => 'Nombre de choix maximum ?',
+	'option_maximum_choix_label' => 'Limiter le nombre de choix',
+	'option_maxlength_explication' => 'L’internaute ne pourra pas saisir plus de caractères que ce nombre.',
+	'option_maxlength_label' => 'Nombre de caractères maximum',
+	'option_minlength_explication' => 'L’internaute ne pourra pas saisir moins de caractères que ce nombre.',
+	'option_minlength_label' => 'Nombre de caractères minimum',
+	'option_multiple_explication' => 'L’internaute pourra sélectionner plusieurs valeurs',
+	'option_multiple_label' => 'Sélection multiple',
+	'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
+	'option_nom_label' => 'Nom du champ',
+	'option_obligatoire_label' => 'Champ obligatoire',
+	'option_onglet_label' => 'Onglet',
+	'option_onglet_label_case' => 'Afficher sous forme d’onglet.',
+	'option_onglet_vertical_explication' => 'Il suffit qu’un seul onglet dans un groupe soit marqué comme vertical pour que l’ensemble des onglets soient verticaux.',
+	'option_onglet_vertical_label_case' => 'Onglet vertical',
+	'option_option_destinataire_intro_label' => 'Label du premier choix vide (lorsque sous forme de liste)',
+	'option_option_intro_label' => 'Label du premier choix vide',
+	'option_option_statut_label' => 'Afficher les statuts',
+	'option_oui_non_valeur_non_explication' => 'Valeur postée si le non est sélectionné.',
+	'option_oui_non_valeur_oui_explication' => 'Valeur postée si le oui est sélectionné.',
+	'option_placeholder_label' => 'Placeholder',
+	'option_pliable_label' => 'Pliable',
+	'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
+	'option_plie_label' => 'Déjà plié',
+	'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l’affichage du formulaire.',
+	'option_poster_afficher_si_label_case' => 'Poster les valeurs de toutes les saisies masquées',
+	'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
+	'option_previsualisation_label' => 'Activer la prévisualisation',
+	'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
+	'option_readonly_label' => 'Lecture seule',
+	'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
+	'option_rows_label' => 'Nombre de lignes',
+	'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de ton site peuvent l’annuler.',
+	'option_size_label' => 'Taille du champ',
+	'option_statut_label' => 'Statut(s) particulier(s)',
+	'option_type' => 'Type de saisie',
+	'option_type_choix_label' => 'Type de choix',
+	'option_type_choix_plusieurs' => 'Permettre à l’internaute de choisir <strong>plusieurs</strong> destinataires.',
+	'option_type_choix_tous' => 'Mettre <strong>toutes</strong> ces personnes en destinataires. L’internaute n’aura aucun choix.',
+	'option_type_choix_un' => 'Permettre à l’internaute de choisir <strong>une seule personne</strong> (sous forme de liste déroulante).',
+	'option_type_choix_un_radio' => 'Permettre à l’internaute de choisir <strong>une seule  </strong> personne (sous forme de liste à puce).',
+	'option_type_color' => 'Couleur',
+	'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
+	'option_type_label' => 'Type du champ',
+	'option_type_password' => 'Texte masqué lors de la saisie (ex : mot de passe)',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Valeur non',
+	'option_valeur_oui_label' => 'Valeur oui',
+	'option_vue_masquer_sous_groupe' => 'Lors de l’affichage du résultat, n’afficher que la valeur, sans le sous-groupe',
+	'options_dev_titre' => 'Options pour les dev',
+
+	// P
+	'plugin_yaml_inactif' => 'Le plugin YAML est inactif. Tu dois l’activer pour que cette page soit fonctionnelle.',
+
+	// S
+	'saisie_auteurs_explication' => 'Permet de sélectionner une plume, ou plusieurs',
+	'saisie_auteurs_titre' => 'Plumes',
+	'saisie_case_explication' => 'Permet d’activer ou de désactiver quelque chose.',
+	'saisie_case_titre' => 'Case unique',
+	'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
+	'saisie_checkbox_titre' => 'Cases à cocher',
+	'saisie_choix_grille_explication' => 'Permet de poser une série de questions à choix multiple d’une manière uniformisé et sous forme de grille',
+	'saisie_choix_grille_titre' => 'Grille de questions',
+	'saisie_date_explication' => 'Permet de saisir une date à l’aide d’un calendrier',
+	'saisie_date_titre' => 'Date',
+	'saisie_destinataires_explication' => 'Permet de choisir des destinataires parmi des comptes pré-sélectionnés. ',
+	'saisie_destinataires_titre' => 'Destinataires',
+	'saisie_email_explication' => 'Permet d’avoir un champ de type email en HTML5.',
+	'saisie_email_titre' => 'Adresse email',
+	'saisie_explication_explication' => 'Un texte explicatif général.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Ouvrir les liens dans la même fenêtre',
+	'saisie_explication_masquer_label' => 'Ajouter un bouton afficher/masquer l’explication',
+	'saisie_explication_texte_label' => 'Texte de l’explication',
+	'saisie_explication_titre' => 'Explication',
+	'saisie_explication_titre_label' => 'Titre de l’explication',
+	'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
+	'saisie_fieldset_titre' => 'Groupe de champs',
+	'saisie_file_explication' => 'Envoi d’un fichier',
+	'saisie_file_titre' => 'Fichier',
+	'saisie_hidden_explication' => 'Un champ pré-rempli que l’internaute ne pourra pas voir. ',
+	'saisie_hidden_titre' => 'Champ caché',
+	'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
+	'saisie_input_titre' => 'Ligne de texte',
+	'saisie_mot_explication' => 'Des mots-clés d’un groupe de mot',
+	'saisie_mot_titre' => 'Mot-clé',
+	'saisie_oui_non_explication' => 'Oui ou non, c’est clair ? :)',
+	'saisie_oui_non_titre' => 'Oui ou non',
+	'saisie_radio_defaut_choix1' => 'Un',
+	'saisie_radio_defaut_choix2' => 'Deux',
+	'saisie_radio_defaut_choix3' => 'Trois',
+	'saisie_radio_explication' => 'Permet de choisir une option parmi plusieurs disponibles. ',
+	'saisie_radio_titre' => 'Boutons radios',
+	'saisie_selecteur_article' => 'Affiche un navigateur de sélection d’article',
+	'saisie_selecteur_document' => 'Affiche un sélecteur de document',
+	'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
+	'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d’article ou de rubrique',
+	'saisie_selecteur_rubrique_article_titre' => 'Article ou rubrique',
+	'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
+	'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
+	'saisie_selection_multiple_titre' => 'Sélection multiple',
+	'saisie_selection_titre' => 'Liste déroulante / sélection',
+	'saisie_textarea_explication' => 'Un champ de texte sur plusieurs lignes.',
+	'saisie_textarea_titre' => 'Bloc de texte',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@ : @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentation des saisies',
+	'tous_visiteurs' => 'Tous les visiteurs (même non enregistrés)',
+	'tout_selectionner' => 'Tout (dé)sélectionner',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Syntaxe incorrecte. Confonds-tu le caractère pipe (|) le le L minuscule (l) ?',
+	'verifier_saisies_option_data_cles_doubles' => 'Au moins une clé est définie en double.',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Syntaxe incorrecte. Les sous-groupes ne sont pas autorisés.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Syntaxe incorrecte. Certaines clés ne répondent pas aux critères.',
+	'verifier_valeurs_acceptables_explication' => 'Vérifier que la valeur postée se trouve parmi celles autorisées lors de la définition du/des champs. Ne pas utiliser cette option si tu remplis dynamiquement le(s) champs dans tes squelettes ou les remplis grâce à JavaScript.',
+	'verifier_valeurs_acceptables_label' => 'Vérifier les valeurs possibles',
+	'vue_sans_reponse' => '<i>Sans réponse</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_it.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_it.php
new file mode 100644
index 0000000000000000000000000000000000000000..88cf0ee80549a8d3c08c88bd5cdf8b216d511ef4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_it.php
@@ -0,0 +1,285 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Visualizzare',
+	'assets_global' => 'Carica javascript e CSS su tutte le pagine, nel tag &lt;head&gt;',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Sfoglia l’articolo',
+	'bouton_parcourir_docs_breve' => 'Sfoglia la breve',
+	'bouton_parcourir_docs_rubrique' => 'Sfoglia la rubrica',
+	'bouton_parcourir_mediatheque' => 'Sfoglia la mediateca',
+
+	// C
+	'caracteres_restants' => 'caratteri rimanenti',
+	'categorie_choix_label' => 'Scelta limitata',
+	'categorie_defaut_label' => 'Varie',
+	'categorie_libre_label' => 'Campo libero',
+	'categorie_objet_label' => 'Contenuti editoriali',
+	'categorie_structure_label' => 'Struttura',
+	'configuration' => 'Configurazione del plugin Saisies',
+	'construire_action_annuler' => 'Annulla',
+	'construire_action_configurer' => 'Configura',
+	'construire_action_deplacer' => 'Sposta',
+	'construire_action_dupliquer' => 'Duplica',
+	'construire_action_dupliquer_copie' => '(copia)',
+	'construire_action_supprimer' => 'Elimina',
+	'construire_ajouter_champ' => 'Aggiungi un campo',
+	'construire_ajouter_groupe' => 'Aggiungi gruppo',
+	'construire_attention_enregistrer' => 'Non dimenticare di salvare le tue modifiche!',
+	'construire_attention_modifie' => 'Il modulo in oggetto è diverso dal modulo iniziale. Hai la possibilità di reinizializzare il suo stato a quello precedente alle modifiche.',
+	'construire_attention_supprime' => 'Le modifiche includono l’eliminazione di alcuni campi. Conferma il salvataggio di questa nuova versione del modulo.',
+	'construire_aucun_champs' => 'Al momento non è presente alcun campo in questo modulo.',
+	'construire_configurer_globales_label' => 'Configura le opzioni globali',
+	'construire_confirmer_supprimer_champ' => 'Vuoi veramente eliminare questo campo?',
+	'construire_info_nb_champs_masques' => '@nb@ campo(i) con maschera. Configura il gruppo.',
+	'construire_position_explication' => 'Indica prima di quale altro campo sarà spostato quello corrente.',
+	'construire_position_fin_formulaire' => 'Alla fine del modulo',
+	'construire_position_fin_groupe' => 'Alla fine del gruppo @groupe@',
+	'construire_position_label' => 'Posizione del campo',
+	'construire_reinitialiser' => 'Reinizializza il modulo',
+	'construire_reinitialiser_confirmer' => 'Perderai tutte le modifiche. Sei sicuro di voler tornare al modulo iniziale?',
+	'construire_verifications_label' => 'Tipo di verifica da effettuare', # MODIF
+	'cvt_etapes_courante' => 'Step @etape@ / @etapes@ :  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Possibili risposte (in colonna)',
+	'data_rows_label' => 'Domande (in linea)',
+
+	// E
+	'erreur_generique' => 'Ci sono degli errori nei campi di seguito, si prega di verificare gli inserimenti',
+	'erreur_option_nom_unique' => 'Questo nome è già utilizzato da un altro campo e deve essere univoco all’interno del modulo.',
+	'erreur_syntaxe_afficher_si' => 'Sintassi errata del test',
+	'erreur_valeur_inacceptable' => 'Valore inserito non valido',
+	'etapes_formulaire' => 'Step del modulo',
+	'etapes_recapitulatif_label' => 'Riepilogo',
+	'etapes_recapitulatif_texte' => 'Si prega di rivedere le risposte e verificarle prima della convalida finale.',
+	'explication_dev' => 'Per gli sviluppatori',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Puoi inviare nuovamente un nuovo file o inviare il modulo così com’è, il vecchio file non viene mantenuto.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Devi inviare un altro file.',
+	'format_date_attendu' => 'Immettere una data nel formato gg/mm/aaaa.',
+	'format_email_attendu' => 'Inserisci un indirizzo email nel formato nome@indirizzo.it',
+
+	// I
+	'info_configurer_saisies' => 'Pagina di test di Saisies',
+
+	// L
+	'label_annee' => 'Anno',
+	'label_jour' => 'Giorno',
+	'label_mois' => 'Mese',
+
+	// M
+	'masquer' => 'Nascondi',
+
+	// O
+	'option_aff_art_interface_explication' => 'Mostra unicamente gli articoli della lingua dell’utente',
+	'option_aff_art_interface_label' => 'Visualizzazione multilingua',
+	'option_aff_langue_explication' => 'Mostra la lingua dell’articolo o della rubrica selezionata davanti al titolo',
+	'option_aff_langue_label' => 'Mostra la lingua',
+	'option_aff_rub_interface_explication' => 'Mostra unicamente le rubriche della lingua dell’utente',
+	'option_aff_rub_interface_label' => 'Visualizzazione multilingua',
+	'option_afficher_si_avec_post_explication' => 'Per default, i valori delle voci nascoste dalla visualizzazione condizionale non vengono pubblicati e quindi non salvati. Seleziona questa casella per modificare questo comportamento.',
+	'option_afficher_si_avec_post_label' => 'Posta comunque',
+	'option_afficher_si_avec_post_label_case' => 'Mostra valore in caso di mascheramento dell’input',
+	'option_afficher_si_explication' => 'Specificare le condizioni per visualizzare il campo in base al valore degli altri campi. L’identificatore degli altri campi deve essere inserito tra <code>@</code>. <br />Esempio<code>@selezione_1@=="Tizio"</code> condiziona la visualizzazione del campo in modo che il campo <code>selezione_1</code> abbia la chiave <code>Tizio</code>. <br />
+Puoi usare gli operatori booleani <code>||</code> (or) e  <code>&&</code> (e). <br />
+Troverai la <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">documentazione completa sulla sintassi su SPIP-contrib</a>.', # MODIF
+	'option_afficher_si_label' => 'Visualizzazione condizionata',
+	'option_afficher_si_remplissage_uniquement_explication' => 'Selezionando questa casella, la visualizzazione condizionale verrà applicata solo durante la compilazione del modulo, non durante la visualizzazione dei risultati.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Solo durante il riempimento',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Nascondi input solo durante il riempimento',
+	'option_attention_explication' => 'Un messaggio più importante dei una spiegazione.',
+	'option_attention_label' => 'Avvertimento',
+	'option_attribut_title_label' => 'Valore attributo titolo',
+	'option_attribut_title_label_case' => 'Inserisci un attributo title nell’etichetta, contenente il valore tecnico del campo. Utilizzare con moderazione.',
+	'option_attributs_explication' => 'Gli attributi si riferiscono a ciascun campo html, anche per le voci con più campi (<code>radio</code>, <code>checkbox</code>, ecc...).',
+	'option_attributs_label' => 'Attributi HTML aggiuntivi',
+	'option_autocomplete_defaut' => 'Lascia predefinito',
+	'option_autocomplete_explication' => 'Al caricamento della pagina, il tuo navigatore può preimpostare il campo in funzione della sua storia',
+	'option_autocomplete_label' => 'Preimpostazione del campo',
+	'option_autocomplete_off' => 'Disattiva',
+	'option_autocomplete_on' => 'Attiva',
+	'option_cacher_option_intro_label' => 'Nascondi la prima scelta vuota',
+	'option_case_valeur_non_explication' => 'Valore pubblicato se la casella non è selezionata. Si prega di notare che questo è un valore tecnico e non un valore visualizzato.',
+	'option_case_valeur_oui_explication' => 'Valore pubblicato se la casella è selezionata. Si prega di notare che questo è un valore tecnico e non un valore visualizzato.',
+	'option_choix_alternatif_label' => 'Offri una scelta alternativa',
+	'option_choix_alternatif_label_defaut' => 'Altra scelta',
+	'option_choix_alternatif_label_label' => 'Etichetta di scelta alternativa',
+	'option_choix_destinataires_explication' => 'Uno o più autori tra i quali l’utente potrà fare una scelta. Se non si seleziona niente, è l’autore che ha installato il sito che sarà scelto.',
+	'option_choix_destinataires_label' => 'Possibili destinatari',
+	'option_class_label' => 'Classi CSS supplementari',
+	'option_cols_explication' => 'Larghezza del blocco in numero di caratteri. Questa opzione non è sempre applicata poichè gli stili CSS la possono annullare.',
+	'option_cols_label' => 'Larghezza',
+	'option_conteneur_class_label' => 'Classi CSS aggiuntive sul contenitore',
+	'option_datas_explication' => 'E’ necessario indicare una scelta per riga nel modulo "cle|etichetta_scelta"<br />. La chiave deve essere univoca, breve, chiara e non deve essere modificata in seguito.<br />',
+	'option_datas_grille_explication' => 'Devi indicare una scelta per riga nel modulo "chiave|Etichetta di scelta" oppure "chiave|Etichetta a sinistra|Etichetta a destra"<br />. La chiave deve essere unica, breve chiara e non deve essere modificata successivamente<br />',
+	'option_datas_grille_explication_dev' => 'Fornire un elenco di scelte sotto forma di matrice PHP (<code>array()</code>) o SPIP (<code>#ARRAY</code>) di tipo <code>"cle"=>"Etichetta di scelta"</code> oppure <code>"cle"=>"Etichetta a sinistra|Etichetta a destra"</code>.',
+	'option_datas_label' => 'Elenco delle scelte possibili',
+	'option_datas_sous_groupe_explication' => 'E’ necessario indicare una scelta per riga nel modulo "chiave|Etichetta" della scelta.<br />La chiave deve essere univoca, breve, chiara e non deve essere modificata successivamente.<br />E’ possibile indicare l’inizio di una sottogruppo nella forma "*Titolo del sottogruppo". Per terminare un sottogruppo puoi iniziarne un altro, oppure inserire una riga contenente solo "/*".',
+	'option_defaut_label' => 'Valore predefinito',
+	'option_disable_avec_post_explication' => 'Identica all’opzione precedente ma invia lo stesso il valore in un campo nascosto.',
+	'option_disable_avec_post_label' => 'Disattiva ma invia',
+	'option_disable_choix_explication' => 'Indica le scelte separate da una virgola, esempio: <code>scelta1,scelta3</code>.',
+	'option_disable_choix_explication_dev' => 'Indicare le scelte sotto forma di tabella, per esempio: <code>["scelta1","scelta3"]</code>.',
+	'option_disable_choix_label' => 'Disabilita alcune scelte',
+	'option_disable_explication' => 'Il campo non può ottenere il focus.',
+	'option_disable_label' => 'Disattiva il campo',
+	'option_erreur_obligatoire_explication' => 'È possibile personalizzare il messaggio di errore visualizzato per indicare l’obbligo (altrimenti lasciare vuoto).',
+	'option_erreur_obligatoire_label' => 'Messaggio di errore per indicare l’obbligo',
+	'option_explication_explication' => 'Se necessario, una frase breve che descrive il campo.',
+	'option_explication_label' => 'Spiegazione',
+	'option_forcer_select_explication' => 'Se viene selezionato un gruppo di parole, per impostazione predefinita sarà una voce radio. È possibile forzare l’uso di un select.',
+	'option_forcer_select_label_case' => 'Forza l’uso di un select',
+	'option_groupe_affichage' => 'Visualizzazione',
+	'option_groupe_description' => 'Descrizione',
+	'option_groupe_utilisation' => 'Utilizzazione',
+	'option_groupe_validation' => 'Validazione',
+	'option_heure_pas_explication' => 'Quando si utilizza il programma, apparirà un menu per aiutare ad inserire ore e minuti. Qui puoi scegliere l’intervallo di tempo tra ogni scelta (per impostazione predefinita 30 minuti).',
+	'option_heure_pas_label' => 'Intervallo di minuti nel menu di aiuto di input',
+	'option_horaire_label' => 'Orario',
+	'option_horaire_label_case' => 'Consenti anche l’inserimento dell’ora',
+	'option_id_groupe_label' => 'Gruppo di parole',
+	'option_info_obligatoire_explication' => 'E’ possibile modificare l’indicazione di obbligo per impostazione predefinita: <i>[Obbligatorio]</i>. Per mantenere le informazioni di default, non inserire niente. Per non visualizzare niente, metti un testo composto solo da spazio.',
+	'option_info_obligatoire_label' => 'Indicazione obbligatorio',
+	'option_inserer_barre_choix_edition' => 'barra del testo completa',
+	'option_inserer_barre_choix_forum' => 'barra dei forum',
+	'option_inserer_barre_explication' => 'Inserisci una barra del testo se disponibile (porte-plume attivo).',
+	'option_inserer_barre_label' => 'Inserisci una barra di utility',
+	'option_label_case_label' => 'Etichetta a lato della casella',
+	'option_label_explication' => 'Il titolo che sarà mostrato.',
+	'option_label_label' => 'Etichetta',
+	'option_label_non_explication' => 'Sarà visibile durante la visualizzazione dei risultati.',
+	'option_label_non_label' => 'Etichetta se la casella non è selezionata',
+	'option_label_oui_explication' => 'Sarà visibile durante la visualizzazione dei risultati.',
+	'option_label_oui_label' => 'Etichetta se la casella è selezionata',
+	'option_limite_branche_explication' => 'Limitare la scelta a un ramo specifico del sito',
+	'option_limite_branche_label' => 'Limita ad un ramo',
+	'option_maximum_choix_explication' => 'Numero massimo di scelte?',
+	'option_maximum_choix_label' => 'Limita il numero di scelte',
+	'option_maxlength_explication' => 'L’utente non può digitare più caratteri del numero qui indicato.',
+	'option_maxlength_label' => 'Numero massimo di caratteri',
+	'option_multiple_explication' => 'L’utente può selezionare più valori',
+	'option_multiple_label' => 'Scelta multipla',
+	'option_nom_explication' => 'Un nome informatico che indentifica il campo. Deve contentere solo caratteri alfanumerici minuscoli o il carattere "_".',
+	'option_nom_label' => 'Nome del campo',
+	'option_obligatoire_label' => 'Campo obbligatorio',
+	'option_onglet_label' => 'Scheda',
+	'option_onglet_label_case' => 'Visualizza come scheda.',
+	'option_option_destinataire_intro_label' => 'Etichetta di prima scelta vuota (quando in forma di elenco)',
+	'option_option_intro_label' => 'Etichetta del primo campo vuoto',
+	'option_option_statut_label' => 'Mostra gli stati',
+	'option_oui_non_valeur_non_explication' => 'Valore pubblicato se è selezionato no.',
+	'option_oui_non_valeur_oui_explication' => 'Valore pubblicato se è selezionato si.',
+	'option_placeholder_label' => 'Segnaposto',
+	'option_pliable_label' => 'Richiudibile',
+	'option_pliable_label_case' => 'Il gruppo di campi può essere chiuso.',
+	'option_plie_label' => 'Già chiuso',
+	'option_plie_label_case' => 'Se il gruppo di campi è richiudibile, sarà già chiuso alla visualizzazione del modulo.',
+	'option_poster_afficher_si_label_case' => 'Mostra i valori di tutte le voci nascoste',
+	'option_previsualisation_explication' => 'Se porte-plume è attivo, aggiungi una scheda per previsualizzare la resa del testo inserito.',
+	'option_previsualisation_label' => 'Attiva la previsualizzazione',
+	'option_readonly_explication' => 'Il campo può essere letto, selezionato, ma non modificato.',
+	'option_readonly_label' => 'Sola lettura',
+	'option_rows_explication' => 'Altezza del blocco in numero ri righe. Questa opzione non è sempre applicata poichè gli stili CSS del sito potrebbero annullarla.',
+	'option_rows_label' => 'Numero di righe',
+	'option_size_explication' => 'Larghezza del campo in numero di caratteri. Questa opzione non è sempre applicata poich%egrave; gli stili CSS del sito potrebbero annullarla.',
+	'option_size_label' => 'Dimensione del campo',
+	'option_statut_label' => 'Stato/i speciale/i',
+	'option_type' => 'Tipo di input',
+	'option_type_choix_label' => 'Tipo di scelta',
+	'option_type_choix_plusieurs' => 'Consenti all’utente di scegliere <strong>più</strong> destinatari.',
+	'option_type_choix_tous' => 'Imposta <strong>tutti</strong> questi autori come destinatari. L’utente non avrà alcuna scelta.',
+	'option_type_choix_un' => 'Consenti all’utente di scegliere <strong>un solo</strong> destinatario (sotto forma di elenco a discesa)',
+	'option_type_choix_un_radio' => 'Consenti all’utente di scegliere <strong>una singola</strong> persona (sotto forma di elenco puntato).',
+	'option_type_color' => 'Colore',
+	'option_type_explication' => 'In modalità "mascherata", il contenuto del campo non sarà visibile.',
+	'option_type_label' => 'Tipo del campo',
+	'option_type_password' => 'Testo nascosto durante l’inserimento (per esempio una password)',
+	'option_type_text' => 'Normale',
+	'option_valeur_non_label' => 'Valore no',
+	'option_valeur_oui_label' => 'Valore si',
+	'option_vue_masquer_sous_groupe' => 'Quando si visualizza il risultato, visualizzare solo il valore, senza il sottogruppo',
+	'options_dev_titre' => 'Opzioni per gli sviluppatori',
+
+	// P
+	'plugin_yaml_inactif' => 'Il plugin YAML non è attivo. Devi attivarlo per far funzionare questa pagina.',
+
+	// S
+	'saisie_auteurs_explication' => 'Consente di selezionare uno o più autori',
+	'saisie_auteurs_titre' => 'Autori',
+	'saisie_case_explication' => 'Consente di attivare o disattivare qualcosa.',
+	'saisie_case_titre' => 'Casella di spunta',
+	'saisie_checkbox_explication' => 'Consente di scegliere più opzioni da spuntare.',
+	'saisie_checkbox_titre' => 'Caselle di spunta',
+	'saisie_choix_grille_explication' => 'Ti consente di porre una serie di domande a scelta multipla in un formato standard e a griglia',
+	'saisie_choix_grille_titre' => 'Griglia delle domande',
+	'saisie_date_explication' => 'Consente di inserire una data con l’aiuto di un calendario',
+	'saisie_date_titre' => 'Data',
+	'saisie_destinataires_explication' => 'Consente di scegliere uno o più destinatari tra gli autori selezionati.',
+	'saisie_destinataires_titre' => 'Destinatari',
+	'saisie_email_explication' => 'Permette di avere un campo di tipo email in HTML5.',
+	'saisie_email_titre' => 'Indirizzo email',
+	'saisie_explication_explication' => 'Un testo esplicativo generale.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Apri i link nella stessa finestra',
+	'saisie_explication_masquer_label' => 'Aggiungi un pulsante mostra/nascondi spiegazione',
+	'saisie_explication_texte_label' => 'Testo esplicativo',
+	'saisie_explication_titre' => 'Spiegazione',
+	'saisie_explication_titre_label' => 'Titolo esplicativo',
+	'saisie_fieldset_explication' => 'Un blocco che può contenere più campi.',
+	'saisie_fieldset_titre' => 'Gruppo di campi',
+	'saisie_file_explication' => 'Invio di un file',
+	'saisie_file_titre' => 'File',
+	'saisie_hidden_explication' => 'Un campo preimpostato che l’utente non potrà vedere.',
+	'saisie_hidden_titre' => 'Campo nascosto',
+	'saisie_input_explication' => 'Una semplice riga di testo, che può essere visibile o mascherata (password).',
+	'saisie_input_titre' => 'Riga di testo',
+	'saisie_mot_explication' => 'Parole chiave da un gruppo di parole',
+	'saisie_mot_titre' => 'Parola chiave',
+	'saisie_oui_non_explication' => 'Si o no',
+	'saisie_oui_non_titre' => 'Si o no',
+	'saisie_radio_defaut_choix1' => 'Uno',
+	'saisie_radio_defaut_choix2' => 'Due',
+	'saisie_radio_defaut_choix3' => 'Tre',
+	'saisie_radio_explication' => 'Consente di scegliere un’opzione tra più disponibili.',
+	'saisie_radio_titre' => 'Scelta unica',
+	'saisie_selecteur_article' => 'Mostra un navigatore per la selezione di un articolo',
+	'saisie_selecteur_document' => 'Visualizza un selettore di documenti',
+	'saisie_selecteur_rubrique' => 'Mostra un navigatore per la selezione di una rubrica',
+	'saisie_selecteur_rubrique_article' => 'Mostra un navigatore per la selezione di un articolo o di una rubrica',
+	'saisie_selecteur_rubrique_article_titre' => 'Selettore di articolo o di rubrica',
+	'saisie_selection_explication' => 'Scegli una opzione nel menu a tendina.',
+	'saisie_selection_multiple_explication' => 'Consente di scegliere più opzioni con un elenco.',
+	'saisie_selection_multiple_titre' => 'Scelta multipla',
+	'saisie_selection_titre' => 'Elenco a discesa/selezione',
+	'saisie_textarea_explication' => 'Un campo di testo su più linee.',
+	'saisie_textarea_titre' => 'Blocco di testo',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@ : @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentazione',
+	'tous_visiteurs' => 'Tutti gli utenti (anche non registrati)',
+	'tout_selectionner' => '(De)seleziona tutto',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Sintassi errata. Forse hai scambiato il ​​carattere pipe (|) con la L minuscola (l)?',
+	'verifier_saisies_option_data_cles_doubles' => 'Almeno una chiave è definita in duplicato.',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Sintassi errata. Non sono ammessi sottogruppi.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Sintassi errata. Alcune chiavi non soddisfano i criteri.',
+	'verifier_valeurs_acceptables_explication' => 'Verificare che il valore inserito sia tra quelli autorizzati in fase di definizione del/i campo/i. Non utilizzare questa opzione se riempi dinamicamente i campi nei tuoi modelli o li riempi con Javascript.', # MODIF
+	'verifier_valeurs_acceptables_label' => 'Verificare i valori possibili',
+	'vue_sans_reponse' => '<i>Senza risposta</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_nl.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_nl.php
new file mode 100644
index 0000000000000000000000000000000000000000..07d5c1cfcfb71530a665ae6dec2521fb45a8dfda
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_nl.php
@@ -0,0 +1,248 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Tonen',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Blader door het artikel',
+	'bouton_parcourir_docs_breve' => 'Blader door de nieuwsflits',
+	'bouton_parcourir_docs_rubrique' => 'Blader door de rubriek',
+	'bouton_parcourir_mediatheque' => 'Blader door de mediatheek',
+
+	// C
+	'construire_action_annuler' => 'Annuleren',
+	'construire_action_configurer' => 'Instellen',
+	'construire_action_deplacer' => 'Verplaats',
+	'construire_action_dupliquer' => 'Kopieer',
+	'construire_action_dupliquer_copie' => '(copy)',
+	'construire_action_supprimer' => 'Verwijder',
+	'construire_ajouter_champ' => 'Voeg veld toe',
+	'construire_ajouter_groupe' => 'Een groep toevoegen',
+	'construire_attention_enregistrer' => 'Sla je wijzingen op!',
+	'construire_attention_modifie' => 'Het onderstaande formulier wijkt van het oorspronkelijke af. Je kunt het naar de oorspronkelijke staat herstellen.',
+	'construire_attention_supprime' => 'Je wijzigingen bevatten verwijderingen van velden. Bevestig de nieuwe formulierversie.',
+	'construire_aucun_champs' => 'Dit formulier heeft geen velden.',
+	'construire_configurer_globales_label' => 'Globale opties configureren',
+	'construire_confirmer_supprimer_champ' => 'Wil je dit veld echt verwijderen?',
+	'construire_info_nb_champs_masques' => '@nb@ verborgen veld(en) bij het opzetten van de groep.',
+	'construire_position_explication' => 'Geef aan voor welk veld dit veld moet worden geplaatst.',
+	'construire_position_fin_formulaire' => 'Aan het eind van het formulier',
+	'construire_position_fin_groupe' => 'Aan het eind van groep @groupe@',
+	'construire_position_label' => 'Positie van het veld',
+	'construire_reinitialiser' => 'Formulier resetten',
+	'construire_reinitialiser_confirmer' => 'Je verliest alle aanpassingen. Weet je zeker dat je naar het originele formulier terug wilt?',
+	'construire_verifications_label' => 'Toe te passen verificatie', # MODIF
+
+	// D
+	'data_cols_label' => 'Reacties mogelijk (in kolom)',
+	'data_rows_label' => 'Vragen (online)',
+
+	// E
+	'erreur_generique' => 'Er zitten fouten in onderstaande velden. Controleer je invoer',
+	'erreur_option_nom_unique' => 'Deze naam wordt al door een ander veld gebruikt. Het moet binnen het formulier een unieke naam hebben.',
+	'erreur_syntaxe_afficher_si' => 'Onjuiste syntaxis van de test',
+	'erreur_valeur_inacceptable' => 'Ingevoerde waarde is onacceptabel.',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Je kunt een nieuw bestand versturen, of het formulier als zodanig. Het oude bestand wordt niet bewaard.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Je moet een ander bestand sturen.',
+
+	// I
+	'info_configurer_saisies' => 'Testbladzijde voor invoer',
+
+	// L
+	'label_annee' => 'Jaar',
+	'label_jour' => 'Dag',
+	'label_mois' => 'Maand',
+
+	// M
+	'masquer' => 'Verbergen',
+
+	// O
+	'option_aff_art_interface_explication' => 'Toon uitsluitend artikelen in de gebruikerstaal', # MODIF
+	'option_aff_art_interface_label' => 'Meertalige display',
+	'option_aff_langue_explication' => 'Toon de gekozen taal voor de titel van het artikel of de rubriek',
+	'option_aff_langue_label' => 'Toon de taal',
+	'option_aff_rub_interface_explication' => 'Toon alleen rubrieken in de gebruikerstaal', # MODIF
+	'option_aff_rub_interface_label' => 'Meertalige display',
+	'option_afficher_si_explication' => 'Geef de voorwaarde op voor het vertonen van het veld in functie van de waarde van andere velden. De identificatie van de andere velden moet tussen <code>@</code> worden geplaatst. <br />Bijvoorbeeld <code>@selection_1@=="Toto"</code> geeft de voorwaarde aan dat het veld moet worden getoond wanneer veld <code>selection_1</code> de waarde <code>Toto</code> heeft.<br/>Je kunt daarbij de booleaanse operators <code>||</code> (of) en <code>&&</code> (en) gebruiken.<br />
+Je vindt <a href="https://contrib.spip.net/5080" target="_blank"  rel="noopener noreferrer">volledige documentatie van de syntax op spip-contrib</a>.', # MODIF
+	'option_afficher_si_label' => 'Tonen onder voorwaarde',
+	'option_afficher_si_remplissage_uniquement_explication' => 'Door het aanvinken van dit vakje wordt de voorwaardelijke weergave alleen toegepast bij het invullen van het formulier en niet bij het weergeven van de resultaten.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Alleen bij het invullen van het formulier',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Verberg de invoer uitsluitend tijdens het invullen', # MODIF
+	'option_attention_explication' => 'Een boodschap die belangrijker is dan de uitleg.',
+	'option_attention_label' => 'Waarschuwing',
+	'option_attribut_title_label' => 'Zet een title attribuut op het label, dat de waarde van het veld bevat. Gebruiken met voorbehoud.', # MODIF
+	'option_autocomplete_defaut' => 'Neem de standaardwaarde',
+	'option_autocomplete_explication' => 'Bij het laden kan de webbrowser de velden met historische informatie vullen',
+	'option_autocomplete_label' => 'Vul de velden vooraf in',
+	'option_autocomplete_off' => 'Niet',
+	'option_autocomplete_on' => 'Wel',
+	'option_cacher_option_intro_label' => 'Verberg de eerste lege keuze',
+	'option_case_valeur_non_explication' => 'Geposte waarde wanneer de checkbox niet wordt geselecteerd. Let op: het gaat om een technische waarde, niet om een weergegeven waarde.',
+	'option_case_valeur_oui_explication' => 'Geposte waarde wanneer de checkbox is geselecteerd. Let op: het gaat om een technische waarde, niet om een weergegeven waarde.',
+	'option_choix_alternatif_label' => 'Toelaten een andere keuze voor te stellen', # MODIF
+	'option_choix_alternatif_label_defaut' => 'Andere keuze',
+	'option_choix_alternatif_label_label' => 'Label voor deze alternatieve keuze',
+	'option_choix_destinataires_explication' => 'Een of meer auteurs waaruit de gebruiker kan kiezen. Standaard wordt de auteur die de site maakte gekozen.', # MODIF
+	'option_choix_destinataires_label' => 'Mogelijke ontvangers',
+	'option_class_label' => 'Extra CSS Classes',
+	'option_cols_explication' => 'Veldbreedte in tekens. Deze optie kan door CSS overschreven worden.',
+	'option_cols_label' => 'Breedte',
+	'option_conteneur_class_label' => 'Aanvullende CSS classes op de container',
+	'option_datas_explication' => 'Je moet voor elke rij in het formulier een keuze opgeven in het formaat "key|label of the choice"', # MODIF
+	'option_datas_grille_explication' => 'Je moet per regel een keuze aangeven in de vorm "sleutel|Label naar keuze" ofwel "sleutel|Label links|Label rechts"', # MODIF
+	'option_datas_label' => 'Lijst van mogelijke keuzes',
+	'option_datas_sous_groupe_explication' => 'Je moet per regel een keuze aangeven in de vorm van "sleutel|Label" van de keuze. <br />Je kunt het begin van een subgroep aangeven met "*Titel van de subgroep". Om een subgroep af te sluiten kun je een nieuwe beginnen of een regel met uitsluitend "/*" invoegen.', # MODIF
+	'option_defaut_label' => 'Standaardwaarde',
+	'option_disable_avec_post_explication' => 'Als de vorige optie maar de waarde gaat in een verborgen veld.',
+	'option_disable_avec_post_label' => 'Geblokkeerd maar gepost.',
+	'option_disable_choix_explication' => 'Vermeld de keuzes gescheiden door een komma, bv.: keuze1,keuze3', # MODIF
+	'option_disable_choix_label' => 'Deactiveer bepaalde keuzes',
+	'option_disable_explication' => 'Dit veld kan geen focus krijgen.',
+	'option_disable_label' => 'Blokkeer het veld',
+	'option_erreur_obligatoire_explication' => 'Hier kun je de standaard tekst voor een foutboodschap ivm verplichte invoer instellen (anders leeglaten).',
+	'option_erreur_obligatoire_label' => 'Foutmelding verplicht veld',
+	'option_explication_explication' => 'Indien nodig, een korte omschrijving van het betroffen veld.',
+	'option_explication_label' => 'Uitleg',
+	'option_forcer_select_explication' => 'Wanneer een groep trefwoorden is gekozen, wordt standaard een radio-knop toegepast. Je kunt het gebruik van een select forceren.',
+	'option_forcer_select_label_case' => 'Forceer het gebruik van een select',
+	'option_groupe_affichage' => 'Weergave',
+	'option_groupe_description' => 'Omschrijving',
+	'option_groupe_utilisation' => 'Gebruik',
+	'option_groupe_validation' => 'Validatie',
+	'option_heure_pas_explication' => 'Een hulpmenu laat je het tijdstip in een uurrooster kiezen. Je kunt hier de tijdinterval tussen twee tijdstippen instellen (standaard 30 min).',
+	'option_heure_pas_label' => 'Interval in minuten in het hulpmenu',
+	'option_horaire_label' => 'Uurrooster',
+	'option_horaire_label_case' => 'Ook het uurrooster opnemen',
+	'option_id_groupe_label' => 'Trefwoordengroep',
+	'option_info_obligatoire_explication' => 'Je kan de standaard indicatie van verplichting aanpassen: <i>[Verplicht]</i>. Doe niets wanneer de standaardwaarde wilt behouden. En wil je niets aangeven, vul dan uitsluitend een spatie in.',
+	'option_info_obligatoire_label' => 'Indicatie verplichting',
+	'option_inserer_barre_choix_edition' => 'edit toolbar compleet',
+	'option_inserer_barre_choix_forum' => 'forum toolbar',
+	'option_inserer_barre_explication' => 'Voeg een porte-plume toolbar toe indien geactiveerd.',
+	'option_inserer_barre_label' => 'Voeg een toolbar toe',
+	'option_label_case_label' => 'Label staat naast de checkbox',
+	'option_label_explication' => 'De titel die zal worden weergegeven.',
+	'option_label_label' => 'Label',
+	'option_label_non_explication' => 'Zal bij weergave van de resultaten zichtbaar zijn.',
+	'option_label_non_label' => 'Label wanneer de checkbox niet is geselecteerd',
+	'option_label_oui_explication' => 'Zal bij weergave van de resultaten zichtbaar zijn.',
+	'option_label_oui_label' => 'Label wanneer de checkbox is geselecteerd',
+	'option_limite_branche_explication' => 'Beperk de keuze tot een specifieke tak van de site',
+	'option_limite_branche_label' => 'Tot één tak (hoofdrubriek) beperken',
+	'option_maximum_choix_explication' => 'Maximum aantal keuzes?',
+	'option_maximum_choix_label' => 'Begrens het aantal keuzes',
+	'option_maxlength_explication' => 'De gebruikers kan niet meer tekens invoeren dan dit aantal.', # MODIF
+	'option_maxlength_label' => 'Maximum aantal tekens',
+	'option_multiple_explication' => 'De gebruiker kan meerdere waardes kiezen', # MODIF
+	'option_multiple_label' => 'Meerdere keuzes',
+	'option_nom_explication' => 'Een ID-naam dat het veld identificeert. Het mag bestaan uit kleine letters of een underscore teken "_".',
+	'option_nom_label' => 'Veldnaam',
+	'option_obligatoire_label' => 'Verplicht veld',
+	'option_option_destinataire_intro_label' => 'Label voor de eerste lege keuze (wanneer in lijstvorm)',
+	'option_option_intro_label' => 'Label voor de eerste lege keuze',
+	'option_option_statut_label' => 'Toon de status',
+	'option_oui_non_valeur_non_explication' => 'Geposte waarde wanneer nee werd geselecteerd.',
+	'option_oui_non_valeur_oui_explication' => 'Geposte waarde wanneer ja werd geselecteerd.',
+	'option_placeholder_label' => 'Placeholder',
+	'option_pliable_label' => 'Uitvouwbaar',
+	'option_pliable_label_case' => 'De group velden kan worden uit- en ingevouwen.',
+	'option_plie_label' => 'Al ingevouwen',
+	'option_plie_label_case' => 'Als de groep kan worden in- en uitgevouwen, zorgt deze optie ervoor dat hij zal zijn ingevouwen wanneer het formulier wordt getoond.',
+	'option_previsualisation_explication' => 'Wanneer porte-plume actief is, wordt een preview tab toegevoegd.',
+	'option_previsualisation_label' => 'Preview activeren',
+	'option_readonly_explication' => 'Het veld kan worden bekeken, geselecteerd, maar niet worden aangepast.',
+	'option_readonly_label' => 'Alleen lezen',
+	'option_rows_explication' => 'Veldhoogte in regels. Deze optie kan door CSS worden overschreven.',
+	'option_rows_label' => 'Aantal regels',
+	'option_size_explication' => 'Veldbreedte in tekens. Deze optie kan door CSS worden overschreven.',
+	'option_size_label' => 'Veldbreedte',
+	'option_statut_label' => 'Specifieke status(sen)',
+	'option_type_choix_plusieurs' => 'Laat de gebruiker <strong>meerdere</ strong> ontvangers kiezen.', # MODIF
+	'option_type_choix_tous' => 'Maak <strong>alle</strong> auteurs ontvanger. De gebruiker kan niet kiezen.', # MODIF
+	'option_type_choix_un' => 'Laat de gebruiker <strong>een enkele</strong> ontvanger kiezen.', # MODIF
+	'option_type_choix_un_radio' => 'Sta de gebruiker toe <strong>een enkele</strong> geadresseerde te kiezen (door middel van een lijst).', # MODIF
+	'option_type_explication' => 'In "discrete" modus wordt de inhoud door sterretjes vervangen.',
+	'option_type_label' => 'Veldtype',
+	'option_type_password' => 'Verborgen tekst tijdens invoer (bv: wachtwoord)',
+	'option_type_text' => 'Normaal',
+	'option_valeur_non_label' => 'Waarde non',
+	'option_valeur_oui_label' => 'Waarde oui',
+
+	// P
+	'plugin_yaml_inactif' => 'Plugin YAML is inactief. Je moet hem activeren om deze pagina te kunnen laten functioneren.',
+
+	// S
+	'saisie_auteurs_explication' => 'Laat je een of meer auteurs kiezen', # MODIF
+	'saisie_auteurs_titre' => 'Auteurs', # MODIF
+	'saisie_case_explication' => 'Activeer of disactiveer een bepaalde optie.',
+	'saisie_case_titre' => 'Enkele checkbox',
+	'saisie_checkbox_explication' => 'Voor het kiezen van verschillende opties met checkboxes.',
+	'saisie_checkbox_titre' => 'Checkboxes',
+	'saisie_choix_grille_explication' => 'Maakt het mogelijk een serie multiple choice vragen te stellen op een standaard manier in de vorm van een raster',
+	'saisie_choix_grille_titre' => 'Vragenraster',
+	'saisie_date_explication' => 'Datuminvoer via een kalender-tool', # MODIF
+	'saisie_date_titre' => 'Datum',
+	'saisie_destinataires_explication' => 'Voor het kiezen van een of meer ontvangers uit voorgeselecteerde auteurs.', # MODIF
+	'saisie_destinataires_titre' => 'Ontvangers',
+	'saisie_email_explication' => 'Laat een veld van het type email toe in HTML5.',
+	'saisie_email_titre' => 'Email-adres',
+	'saisie_explication_explication' => 'Een algemene omschrijving.',
+	'saisie_explication_masquer_label' => 'Een knop toevoegen om de uitleg te tonen/verbergen',
+	'saisie_explication_texte_label' => 'Tekst van de uitleg',
+	'saisie_explication_titre' => 'Uitleg',
+	'saisie_explication_titre_label' => 'Titel van de uitleg',
+	'saisie_fieldset_explication' => 'Een kader dat meerdere velden kan bevatten.',
+	'saisie_fieldset_titre' => 'Fieldset',
+	'saisie_file_explication' => 'Zend een bestand',
+	'saisie_file_titre' => 'Bestand',
+	'saisie_hidden_explication' => 'Een vooraf ingevuld veld dat de gebruiker niet ziet.', # MODIF
+	'saisie_hidden_titre' => 'Verborgen veld',
+	'saisie_input_explication' => 'Een enkele tekstregel die zichtbaar of verborgen (wachtwoord) kan zijn.',
+	'saisie_input_titre' => 'Tekstveld',
+	'saisie_mot_explication' => 'Een of meer trefwoorden uit een groep', # MODIF
+	'saisie_mot_titre' => 'Trefwoord',
+	'saisie_oui_non_explication' => 'Ja of nee antwoord',
+	'saisie_oui_non_titre' => 'Ja of Nee',
+	'saisie_radio_defaut_choix1' => 'Een',
+	'saisie_radio_defaut_choix2' => 'Twee',
+	'saisie_radio_defaut_choix3' => 'Drie',
+	'saisie_radio_explication' => 'Voor het kiezen van een enkele optie uit meerder mogelijkheden.', # MODIF
+	'saisie_radio_titre' => 'Radio knop',
+	'saisie_selecteur_article' => 'Toon een artikelkeuze',
+	'saisie_selecteur_document' => 'Toont een documentkeuze',
+	'saisie_selecteur_rubrique' => 'Toon een rubriekkeuze',
+	'saisie_selecteur_rubrique_article' => 'Toon een artikel- of rubriekkeuze',
+	'saisie_selecteur_rubrique_article_titre' => 'Artikel- of rubriekkeuze', # MODIF
+	'saisie_selection_explication' => 'Kies een waarde uit een dropdown list box.',
+	'saisie_selection_multiple_explication' => 'Voor het keizen van meerder waardes uit een lijst.',
+	'saisie_selection_multiple_titre' => 'Meerkeuze',
+	'saisie_selection_titre' => 'Dropdown listbox', # MODIF
+	'saisie_textarea_explication' => 'Een tekstveld meet meerder regels.',
+	'saisie_textarea_titre' => 'Textarea',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@: @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentatie van saisies',
+	'tous_visiteurs' => 'Alle bezoekers (ook niet-geregistreerde)',
+	'tout_selectionner' => 'Alles/niets selecteren',
+
+	// V
+	'verifier_valeurs_acceptables_explication' => 'Controleer of de geposte waarde zich bevindt binnen de toegelaten waardes zoals gedefinieerd voor het veld. Gebruik deze optie niet wanneer velden dynamisch of door middel van Javascript worden gevuld.', # MODIF
+	'verifier_valeurs_acceptables_label' => 'Toegelaten waarden verifiëren', # MODIF
+	'vue_sans_reponse' => '<i>Zonder antwoord</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_pt_br.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_pt_br.php
new file mode 100644
index 0000000000000000000000000000000000000000..5353eba36610c7f5dee400ca7b62e22798bb0171
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_pt_br.php
@@ -0,0 +1,311 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// A
+	'afficher' => 'Exibir',
+	'assets_global' => 'Carregar o javascript e os CSS em todas as páginas, na tag &lt;head&gt;',
+
+	// B
+	'bouton_parcourir_docs_article' => 'Procurar na matéria',
+	'bouton_parcourir_docs_breve' => 'Procurar na nota',
+	'bouton_parcourir_docs_rubrique' => 'Procurar na seção',
+	'bouton_parcourir_mediatheque' => 'Procurar na mídiateca',
+
+	// C
+	'caracteres_restants' => 'caracteres restantes',
+	'categorie_choix_label' => 'Escolha restrita',
+	'categorie_defaut_label' => 'Diversos',
+	'categorie_libre_label' => 'Campo livre',
+	'categorie_objet_label' => 'Conteúdo editorial',
+	'categorie_structure_label' => 'Estrutura',
+	'coherence_afficher_si_appel' => '@label@: chamada incorreta a @erreurs@',
+	'coherence_afficher_si_erreur_pluriel' => 'As exibições condicionais dos campos abaixo chamam campos inexistentes:',
+	'coherence_afficher_si_erreur_singulier' => 'A exibição condicional do campo abaixo chama campos inexistentes:',
+	'configuration' => 'Configuração do plugin Entradas de Formulário',
+	'construire_action_annuler' => 'Cancelar',
+	'construire_action_configurer' => 'Configurar',
+	'construire_action_deplacer' => 'Mover',
+	'construire_action_dupliquer' => 'Duplicar',
+	'construire_action_dupliquer_copie' => '(cópia)',
+	'construire_action_supprimer' => 'Excluir',
+	'construire_ajouter_champ' => 'Incluir um campo',
+	'construire_ajouter_groupe' => 'Incluir um grupo',
+	'construire_attention_enregistrer' => 'Lembre-se de gravar as suas alterações!',
+	'construire_attention_modifie' => 'O formulário abaixo é diferente do formulário inicial.Você tem a possibilidade de revertê-lo ao estado em que estava, antes das suas alterações.',
+	'construire_attention_supprime' => 'As suas alterações incluem exclusões de campos. Por favor, confirme a gravação desta nova versão do formulário.',
+	'construire_aucun_champs' => 'No momento, não há nenhum campo no formulário.',
+	'construire_configurer_globales_label' => 'Configurar as opções globais',
+	'construire_confirmer_supprimer_champ' => 'Você quer realmente excluir este campo?',
+	'construire_info_nb_champs_masques' => '@nb@ campo(s) invisível(eis) o tempo de configurar o grupo.',
+	'construire_position_explication' => 'Indique qual campo este deve preceder.',
+	'construire_position_fin_formulaire' => 'No fim do formulário',
+	'construire_position_fin_groupe' => 'No fim do grupo @groupe@',
+	'construire_position_label' => 'Posição do campo',
+	'construire_reinitialiser' => 'Reverter o formulário',
+	'construire_reinitialiser_confirmer' => 'Você perderá todas as suas modificações. Quer realmente reverter à versão inicial do formulário?',
+	'construire_verifications_label' => 'Verificação(ões) a realizar',
+	'cvt_etapes_courante' => 'Passo @etape@ / @etapes@:  @label_etape@',
+
+	// D
+	'data_cols_label' => 'Respostas possíveis (em coluna)',
+	'data_rows_label' => 'Perguntas (em linha)',
+
+	// E
+	'erreur_generique' => 'Há erros nos campos abaixo. Por favor, verifique as informações digitadas',
+	'erreur_option_nom_unique' => 'Este nome já está sendo usado por outro campo e deve ser único, neste formulário.',
+	'erreur_syntaxe_afficher_si' => 'Sintaxe incorreta do teste',
+	'erreur_valeur_inacceptable' => 'Valor postado é inaceitável.',
+	'etapes_formulaire' => 'Passos do formulário',
+	'etapes_recapitulatif_label' => 'Resumo',
+	'etapes_recapitulatif_texte' => 'Por favor, releia e verifique as suas respostas antes da validação final.',
+	'explication_dev' => 'Para os devs',
+
+	// F
+	'fichier_erreur_explication_renvoi_alternative' => 'Você pode reenviar um novo arquivo, ou submeter o formulário assim como está, o arquivo anterior não é conservado.',
+	'fichier_erreur_explication_renvoi_pas_alternative' => 'Você deve enviar um outro arquivo.',
+	'format_date_attendu' => 'Informar uma data no formato dd/mm/aaaa.',
+	'format_email_attendu' => 'Informar um endereço de e-mail no formato nome@dominio.com.br',
+
+	// I
+	'info_configurer_saisies' => 'Página de teste das entradas de dados',
+
+	// L
+	'label_annee' => 'Ano',
+	'label_jour' => 'Dia',
+	'label_mois' => 'Mês',
+
+	// M
+	'masquer' => 'Ocultar',
+
+	// O
+	'option_aff_art_interface_explication' => 'Exibir somente as matérias do idioma do visitante',
+	'option_aff_art_interface_label' => 'Exibição multilíngue',
+	'option_aff_langue_explication' => 'Exibe o idioma da matéria ou da seção selecionada antes do titulo',
+	'option_aff_langue_label' => 'Exibir o idioma',
+	'option_aff_rub_interface_explication' => 'Exibir apenas as seções do idioma do visitante',
+	'option_aff_rub_interface_label' => 'Exibição multilíngue',
+	'option_afficher_si_avec_post_explication' => 'Por padrão os valores das entradas ocultas pela exibição condicional não são postadas e, consequentemente, não são gravadas. Marque esta opção para alterar esse comportamento.',
+	'option_afficher_si_avec_post_label' => 'Postar mesmo assim',
+	'option_afficher_si_avec_post_label_case' => 'Postar o valor no caso de entrada ocultada',
+	'option_afficher_si_explication' => 'Informe as condições para exibir o campo, em função do valor de outros campos. O identificador dos outros campos deve ser inserido entre <code>@</code>.<br />
+Exemplo: <code>@selection_1@=="Toto"</code> condiciona a exibição do campo a que o campo  <code>selection_1</code> tenha o valor <code>Toto</code>.<br />
+Pode-se usar operadores boleanos <code>||</code> (ou) e  <code>&&</code> (e)<br />
+Você encontrará a <a href="https://contrib.spip.net/5080" target="_blank" rel="noopener noreferrer">documentação completa da sintaxe no site SPIP-contrib</a>.',
+	'option_afficher_si_label' => 'Exibição condicional',
+	'option_afficher_si_remplissage_uniquement_explication' => 'Marcando este checkbox, a exibição condicioinal se aplicará unicamente no preenchimento do formulário e não na exibição dos resultados.',
+	'option_afficher_si_remplissage_uniquement_label' => 'Unicamente no preenchimento',
+	'option_afficher_si_remplissage_uniquement_label_case' => 'Ocultar a entrada apenas no preenchimento',
+	'option_attention_explication' => 'Uma mensagem mais importante que a explicação.',
+	'option_attention_label' => 'Aviso',
+	'option_attribut_title_label' => 'Valor com atributo title',
+	'option_attribut_title_label_case' => 'Incluir um atributo title no label, contendo o valor técnico do campo. Use com moderação.',
+	'option_attributs_explication' => 'Os atributos referem-se a cada campo HTML, inclusive para entradas com vários campos (<code>radio</code>, <code>checkbox</code> etc.).',
+	'option_attributs_label' => 'Atributos HTML adicionais',
+	'option_autocomplete_defaut' => 'Deixar por padrão',
+	'option_autocomplete_explication' => 'Ao carregar a página, o seu navegador pode preencher previamente o campo em função do seu histórico',
+	'option_autocomplete_label' => 'Preenchimento prévio do campo',
+	'option_autocomplete_off' => 'Desativar',
+	'option_autocomplete_on' => 'Ativar',
+	'option_cacher_option_intro_label' => 'Esconder a primeira opção em branco.',
+	'option_case_valeur_non_explication' => 'Valor postado se o checkbox não estiver selecionado. Atenção, trata-se de um valor técnico e não de um valor exibido.',
+	'option_case_valeur_oui_explication' => 'Valor postado se o checkbox estiver selecionado. Atenção, trata-se de um valor técnico e não de um valor exibido.',
+	'option_choix_alternatif_label' => 'Oferecer uma opção alternativa',
+	'option_choix_alternatif_label_defaut' => 'Outra opção',
+	'option_choix_alternatif_label_label' => 'Rótulo desta outra opção',
+	'option_choix_destinataires_explication' => 'Lista de autores para seleção de destinatários pelo visitante que, por padrão, será a pessoa que configurou o site.',
+	'option_choix_destinataires_label' => 'Destinatários possíveis',
+	'option_class_label' => 'Classes CSS adicionais',
+	'option_cols_explication' => 'Largura do bloco (em números de caracteres). Este opção não é sempre aplicável, já que os estilos CSS do seu site podem se sobrepor.',
+	'option_cols_label' => 'Largura',
+	'option_conteneur_class_label' => 'Classes CSS adicionais no container',
+	'option_datas_explication' => 'Você deve informar uma opção por linha, no formato "chave|Label da opção".<br />
+A chave deve ser única, curta, clara e não poderá ser alterada posteriormente.',
+	'option_datas_explication_dev' => 'Disponibilizar uma lista de opções no formato de um vetor PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) do tipo <code>"chave"=>"Label da opção"</code>.',
+	'option_datas_grille_explication' => 'Você deve informar uma opção por linha, no formato "chave|Label da opção" ou "chave|Label à esquerda|Label à direita"<br />
+A chave deve ser única, curta, clara e não poderá ser alterada posteriormente.',
+	'option_datas_grille_explication_dev' => 'Disponibilizar uma lista de opções, no formato de um vetor PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>) do tipo <code>"chave"=>"Label da opção"</code> ou  <code>"chave"=>"Label à esquerda|Label à direita"</code>.',
+	'option_datas_label' => 'Lista de opções aceitáveis',
+	'option_datas_sous_groupe_explication' => 'Você deve indicar uma opção por linha, no formato "chave|Label" da opção.<br />
+A chave deve ser única, curta, clara e não poderá ser alterada posteriormente.<br />
+Você pode indicar o início de um subgrupo, no formato "*Título do subgrupo". Para encerrar um subgrupo, você pode iniciar um outro ou inserir uma linha contendo apenas "/*".',
+	'option_datas_sous_groupe_explication_dev' => 'Disponibilizar uma lista de opções, no formato de um vetor PHP (<code>array()</code>) ou SPIP (<code>#ARRAY</code>), no formato <code>"chave" => "valor"</code>.<br />
+Você pode reagrupar em subgrupo. Para isso, a <code>chave</code> deve ser o título do subgrupo, e o valor deve ser um vetor associativo do tipo <code>"chave" => "valor"</code>.',
+	'option_defaut_label' => 'Valor padrão',
+	'option_disable_avec_post_explication' => 'Igual na opção anterior, mas envia ainda o valor dentro um campo escondido.',
+	'option_disable_avec_post_label' => 'Desativar mas enviar',
+	'option_disable_choix_explication' => 'Informar as opções separadas por vírgulas, exemplo: <code>opção1,opção3</code>.',
+	'option_disable_choix_explication_dev' => 'Informar as opções no formato de vetor, exemplo <code>["opção1","opção3"]</code>.',
+	'option_disable_choix_label' => 'Desativar certas opções',
+	'option_disable_explication' => 'O campo não pode mais obter foco.',
+	'option_disable_label' => 'Desativar o campo',
+	'option_erreur_obligatoire_explication' => 'Você pode personalizar a mensagem de erro exibida para indicar a obrigatoriedade (se não, deixe em branco).',
+	'option_erreur_obligatoire_label' => 'Mensagem de erro pela obrigatoriedade',
+	'option_explication_apres_attention' => 'Por questões de acessibilidade, explicações importantes devem ser sempre exibidas antes da entrada.',
+	'option_explication_apres_label' => 'Explicações após o campo',
+	'option_explication_explication' => 'Se necessário, uma frase curta descrevendo o objeto do campo.',
+	'option_explication_label' => 'Explicação',
+	'option_forcer_select_explication' => 'Se um grupo de palavras for selecionado, por padrão será uma entrada radio. Você pode forçar o uso de select.',
+	'option_forcer_select_label_case' => 'Forçar o uso de select',
+	'option_groupe_affichage' => 'Exibição',
+	'option_groupe_conditions' => 'Condições',
+	'option_groupe_description' => 'Descrição',
+	'option_groupe_utilisation' => 'Utilização',
+	'option_groupe_validation' => 'Validação',
+	'option_heure_pas_explication' => 'Ao usar o horário, é exibido um menu para ajudar na entrada de horas e minutos. Você pode escolher o intervalo de tempo entre cada opção (30 min por padrão)',
+	'option_heure_pas_label' => 'Intervalo de minutos no menu de apoio à entrada de dados',
+	'option_horaire_label' => 'Horário',
+	'option_horaire_label_case' => 'Permitir informar também o horário',
+	'option_id_explication' => 'Será automaticamente prefixado por <code>champ_</code>.',
+	'option_id_groupe_label' => 'Grupo de palavras',
+	'option_id_label' => 'Atributo <code>id</code> da entrada',
+	'option_info_obligatoire_explication' => 'Você pode alterar o valor padrão da indicação de obrigatoriedade: <i>[Obrigatório]</i>. Para manter a informação padrão, deixar vazio. Para não exibir nada, insira apenas um espaço.',
+	'option_info_obligatoire_label' => 'Indicação de obrigatoriedade',
+	'option_inserer_barre_choix_edition' => 'barra de formatação completa',
+	'option_inserer_barre_choix_forum' => 'barra dos fóruns',
+	'option_inserer_barre_explication' => 'Inserir uma barra de ferramentas da Pena, se o plugin estiver ativo.',
+	'option_inserer_barre_label' => 'Inserir uma barra de ferramentas ',
+	'option_inserer_debut_label' => 'Código a inserir no início da entrada',
+	'option_inserer_fin_label' => 'Código a inserir no fim da entrada',
+	'option_label_case_label' => 'Rótulo localizado ao lado do checkbox',
+	'option_label_explication' => 'O titulo que será exibido.',
+	'option_label_label' => 'Rótulo',
+	'option_label_non_explication' => 'Será visível na exibição dos resultados.',
+	'option_label_non_label' => 'Label se o checkbox não estiver marcado',
+	'option_label_oui_explication' => 'Será visível na exibição dos resultados.',
+	'option_label_oui_label' => 'Label se o checkbox estiver marcado',
+	'option_limite_branche_explication' => 'Limita a escolha a um ramo específico do site',
+	'option_limite_branche_label' => 'Limitar a um ramo',
+	'option_maximum_choix_explication' => 'Número máximo de opções?',
+	'option_maximum_choix_label' => 'Limitar o número de opções',
+	'option_maxlength_explication' => 'O visitante não poderá digitar mais do que este número de caracteres.',
+	'option_maxlength_label' => 'Número máximo de caracteres.',
+	'option_minlength_explication' => 'O visitante não poderá informar menos caracteres do que esse número.',
+	'option_minlength_label' => 'Número mínimo de caracteres',
+	'option_multiple_explication' => 'O visitante poderá selecionar vários valores.',
+	'option_multiple_label' => 'Seleção múltipla',
+	'option_nom_explication' => 'Um nome que identificará o campo.  Só pode conter letras minúsculas, números e o caracter "_".',
+	'option_nom_label' => 'Nome do campo',
+	'option_obligatoire_label' => 'Campo obrigatório',
+	'option_onglet_label' => 'Aba',
+	'option_onglet_label_case' => 'Exibir no formato de aba',
+	'option_onglet_vertical_explication' => 'Basta que uma única aba num grupo seja definida como vertical para que o conjunto de abas seja vertical.',
+	'option_onglet_vertical_label_case' => 'Aba vertical',
+	'option_option_destinataire_intro_label' => 'Rótulo da primeira opção em branco (quando em formato de lista)',
+	'option_option_intro_label' => 'Rótulo da primeira opção em branco',
+	'option_option_statut_label' => 'Exibir os status',
+	'option_oui_non_valeur_non_explication' => 'Valor ostado se o não for selecionado.',
+	'option_oui_non_valeur_oui_explication' => 'Valor postado se o sim for selecionado.',
+	'option_placeholder_label' => 'Marcador de posição',
+	'option_pliable_label' => 'Expansível',
+	'option_pliable_label_case' => 'O grupo de campos poderá ser expandido',
+	'option_plie_label' => 'Já retraído',
+	'option_plie_label_case' => 'Se o grupo de campos é expansível, ele já estará contraído na exibição do formulário.',
+	'option_poster_afficher_si_label_case' => 'Postar os valores de todas as entradas ocultadas',
+	'option_previsualisation_explication' => 'Si o plugin Pena estiver ativo, adiciona uma aba para visualizar o texto digitado.',
+	'option_previsualisation_label' => 'Ativar a visualização',
+	'option_readonly_explication' => 'O campo pode ser lido, selecionado, mas não alterado.',
+	'option_readonly_label' => 'Só leitura',
+	'option_rows_explication' => 'Altura do bloco em número de linhas. Esta opção não é sempre aplicável, já que os estilos CSS do seu site poderão sobrepor-se.',
+	'option_rows_label' => 'Número de linhas',
+	'option_size_explication' => 'Largura do campo em número de caractéres. Esta opção não é sempre aplicável, já que os estilos CSS do seu site poderão sobrepor-se.',
+	'option_size_label' => 'Tamanho do campo',
+	'option_statut_label' => 'Status particular(es)',
+	'option_type' => 'Tipo de entrada',
+	'option_type_choix_label' => 'Tipo de opção',
+	'option_type_choix_plusieurs' => 'Permitir que o visitante escolha <strong>diversos</strong> destinatários.',
+	'option_type_choix_tous' => 'Incluir <strong>todos</strong> estes autores como destinatários. O usuário não terá nenhuma escolha.',
+	'option_type_choix_un' => 'Permitir ao visitante escolher <strong>um único</strong> destinatário (no formato de lista).',
+	'option_type_choix_un_radio' => 'Permite ao visitante escolher <strong>um único</strong> destinatário (no formato de checkboxes).',
+	'option_type_color' => 'Cor',
+	'option_type_explication' => 'Em modo "mascarado", o conteúdo do campo não será mostrado.',
+	'option_type_label' => 'Tipo do campo',
+	'option_type_password' => 'Texto mascarado durante o preenchimento (ex: senha).',
+	'option_type_text' => 'Normal',
+	'option_valeur_non_label' => 'Valor não',
+	'option_valeur_oui_label' => 'Valor sim',
+	'option_vue_masquer_sous_groupe' => 'Ao exibir o resultado, mostrar apenas o valor, sem o subgrupo',
+	'options_dev_titre' => 'Opções para os devs',
+
+	// P
+	'plugin_yaml_inactif' => 'O plugin YAML está desativado. Você precisa ativá-lo para que esta página fique funcional.',
+
+	// S
+	'saisie_auteurs_explication' => 'Permite selecionar um ou mais autores',
+	'saisie_auteurs_titre' => 'Autores',
+	'saisie_case_explication' => 'Permite ativar ou desativar algo.',
+	'saisie_case_titre' => 'Checkbox único',
+	'saisie_checkbox_explication' => 'Permite escolher varias opções com checkboxes.',
+	'saisie_checkbox_titre' => 'Checkboxes',
+	'saisie_choix_grille_explication' => 'Permite apresentar uma série de perguntas de múltipla escolha de modo uniformizado no formato de grade',
+	'saisie_choix_grille_titre' => 'Grade de perguntas',
+	'saisie_date_explication' => 'Permite informar uma data com a ajuda de um calendário.',
+	'saisie_date_titre' => 'Data',
+	'saisie_destinataires_explication' => 'Permite escolher um ou mais destinatários entre contas pré-selecionadas.',
+	'saisie_destinataires_titre' => 'Destinatários',
+	'saisie_email_explication' => 'Permite ter um campos do tipo e-mail em HTML5.',
+	'saisie_email_titre' => 'Endereço de e-mail',
+	'saisie_explication_alerte_role_explication' => 'Se necessário, para a área restrita escolher apenas uma função de alerta (atributo html role: alert, status etc.).',
+	'saisie_explication_alerte_role_label' => 'Função de alerta',
+	'saisie_explication_alerte_type_explication' => 'Se necessário, unicamente para a área restrita escolher um tipo de alerta entre os propostos pelo SPIP (notice, error, success, info).',
+	'saisie_explication_alerte_type_label' => 'Tipo de alerta',
+	'saisie_explication_explication' => 'Um texto explicativo geral.',
+	'saisie_explication_liens_meme_fenetre_label' => 'Abrir os links na mesma janela',
+	'saisie_explication_masquer_label' => 'Incluir um botão exibir/ocultar a explicação',
+	'saisie_explication_texte_label' => 'Texto da explicação',
+	'saisie_explication_titre' => 'Explicação',
+	'saisie_explication_titre_label' => 'Título da explicação',
+	'saisie_fieldset_explication' => 'Uma área que poderá englobar vários campos.',
+	'saisie_fieldset_titre' => 'Grupo de campos',
+	'saisie_file_explication' => 'Envio de um arquivo',
+	'saisie_file_titre' => 'Arquivo',
+	'saisie_hidden_explication' => 'Um campo preenchido previamente, que o usuário não poderá ver.',
+	'saisie_hidden_titre' => 'Campo invisível',
+	'saisie_input_explication' => 'Uma simples linha de texto podendo ser visível ou mascarada (senha).',
+	'saisie_input_titre' => 'Linha de texto',
+	'saisie_mot_explication' => 'Uma ou mais palavras-chave de um grupo de palavras',
+	'saisie_mot_titre' => 'Palavra-chave',
+	'saisie_oui_non_explication' => 'Sim ou não, está claro? ;)',
+	'saisie_oui_non_titre' => 'Sim ou não',
+	'saisie_radio_defaut_choix1' => 'Um',
+	'saisie_radio_defaut_choix2' => 'Dois',
+	'saisie_radio_defaut_choix3' => 'Três',
+	'saisie_radio_explication' => 'Permite escolher uma opção entre várias disponíveis.',
+	'saisie_radio_titre' => 'Botões rádio',
+	'saisie_selecteur_article' => 'Exibe um navegador de seleção de matéria',
+	'saisie_selecteur_document' => 'Exibe um seletor de documento',
+	'saisie_selecteur_rubrique' => 'Exibe um navegador de seleção de seção',
+	'saisie_selecteur_rubrique_article' => 'Exibe um navegador de seleção de matéria ou de seção',
+	'saisie_selecteur_rubrique_article_titre' => 'Matéria ou seção',
+	'saisie_selection_explication' => 'Escolher uma opção em uma lista',
+	'saisie_selection_multiple_explication' => 'Permite escolher várias opções em uma lista',
+	'saisie_selection_multiple_titre' => 'Seleção múltipla',
+	'saisie_selection_titre' => 'Lista dropdown / seleção',
+	'saisie_textarea_explication' => 'Um campo de texto em várias linhas.',
+	'saisie_textarea_titre' => 'Bloco de texto',
+	'saisies_aplatir_tableau_montrer_groupe' => '@groupe@: @valeur@',
+
+	// T
+	'titre_page_saisies_doc' => 'Documentação das entradas de dados',
+	'tous_visiteurs' => 'Todos os visitantes (mesmo os não registrados)',
+	'tout_selectionner' => '(De)Selecionar tudo',
+
+	// V
+	'verifier_saisies_option_data_cle_manquante' => 'Sintaxe incorreta. Você confundiu o caracter pipe (|) com o L minúsculo (l)?',
+	'verifier_saisies_option_data_cles_doubles' => 'Há pelo menos uma chave definida em duplicado',
+	'verifier_saisies_option_data_sous_groupes_interdits' => 'Sintaxe incorreta. Os subgrupos não estão permitidos.',
+	'verifier_saisies_option_data_verifier_cles_erreurs' => 'Sntaxe incorreta. Algumas chaves não correspondem aos critérios.',
+	'verifier_valeurs_acceptables_explication' => 'Verifique se o valor postado se encontra entre os autorizados na definição do(s) campo(s). Não use esta opção se você preencher dinamicamente o(s) campo(s) nos eus templates ou os preencher via  JavaScript.',
+	'verifier_valeurs_acceptables_label' => 'Verificar os valores possíveis',
+	'vue_sans_reponse' => '<i>Sem resposta</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_ru.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_ru.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb569310dde4f553ea984a339e94359d1cc86bc1
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_ru.php
@@ -0,0 +1,183 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_parcourir_docs_article' => 'Посмотреть статью',
+	'bouton_parcourir_docs_breve' => 'Посмотреть новость',
+	'bouton_parcourir_docs_rubrique' => 'Посмотреть раздел',
+	'bouton_parcourir_mediatheque' => 'Изменить библиотеку мультимедиа',
+
+	// C
+	'construire_action_annuler' => 'Отменить',
+	'construire_action_configurer' => 'Настройки',
+	'construire_action_deplacer' => 'Переместить',
+	'construire_action_dupliquer' => 'Скопировать',
+	'construire_action_dupliquer_copie' => '(копия)',
+	'construire_action_supprimer' => 'Удалить',
+	'construire_ajouter_champ' => 'Добавить поле',
+	'construire_attention_enregistrer' => 'Обязательно нажмите кнопку СОХРАНИТЬ, если вы что то изменяли!',
+	'construire_attention_modifie' => 'На этой странице у вас есть возможность редактировать форму. Чтобы вернуться к списку выбора форм, нажмите на кнопку ниже',
+	'construire_attention_supprime' => 'Изменения включают удаление полей. Пожалуйста, подтвердите регистрацию новой формы.',
+	'construire_aucun_champs' => 'На данный момент поля в форме отсутствуют',
+	'construire_confirmer_supprimer_champ' => 'Вы действительно хотите удалить это поле?',
+	'construire_info_nb_champs_masques' => '@nb@ скрытых полей',
+	'construire_position_explication' => 'На месте какого поля показывать?',
+	'construire_position_fin_formulaire' => 'В самом конце',
+	'construire_position_fin_groupe' => 'После группы @groupe@',
+	'construire_position_label' => 'Расположение',
+	'construire_reinitialiser' => 'Отменить изменения',
+	'construire_reinitialiser_confirmer' => 'Вы действительно хотите отменить все изменения? ',
+	'construire_verifications_label' => 'Тип проверки', # MODIF
+
+	// E
+	'erreur_generique' => 'Вы допустили ошибку при заполнении полей формы. Проверьте корректность введенной информации',
+	'erreur_option_nom_unique' => 'Такое название поля уже используется.',
+
+	// I
+	'info_configurer_saisies' => 'Тестовая страница формы',
+
+	// L
+	'label_annee' => 'Год',
+	'label_jour' => 'День',
+	'label_mois' => 'Месяц',
+
+	// O
+	'option_aff_art_interface_explication' => 'Отображать только статьи в настройках языка пользователя', # MODIF
+	'option_aff_art_interface_label' => 'Многоязычное отображение',
+	'option_aff_langue_explication' => 'Показать выбранный язык статьи или раздела перед названием',
+	'option_aff_langue_label' => 'Вывод языка статьи',
+	'option_aff_rub_interface_explication' => 'Отображать только разделы в языковых настройках пользователя.', # MODIF
+	'option_aff_rub_interface_label' => 'Многоязычное отображение',
+	'option_afficher_si_label' => 'Отображение по условию',
+	'option_attention_explication' => 'Сообщение, которое является более важным, нежели комментарий.',
+	'option_attention_label' => 'Предупреждение',
+	'option_autocomplete_defaut' => 'Оставить по умолчанию',
+	'option_autocomplete_explication' => 'При загрузке страницы браузер может предварительно заполнить поля на основании истории',
+	'option_autocomplete_label' => 'Предварительное заполнение поля',
+	'option_autocomplete_off' => 'Отключить',
+	'option_autocomplete_on' => 'Включить',
+	'option_cacher_option_intro_label' => 'Скрыть первый пустой вариант',
+	'option_choix_alternatif_label' => 'Предложить альтернативный выбор', # MODIF
+	'option_choix_alternatif_label_defaut' => 'Другой выбор',
+	'option_choix_alternatif_label_label' => 'Подпись для этого альтернативного выбора',
+	'option_choix_destinataires_explication' => 'Один или несколько авторов, среди которых пользователь может сделать свой ​​выбор. Если ничего не выбрано, то будет выбран автор по умолчанию (активный при инсталляции сайта).', # MODIF
+	'option_choix_destinataires_label' => 'Возможные получатели',
+	'option_class_label' => 'Дополнительные CSS классы',
+	'option_cols_explication' => 'Длина поля в символах. Эта опция не всегда работает, так CSS стили сайта могут отменять заданное значение.',
+	'option_cols_label' => 'Ширина',
+	'option_datas_explication' => 'Задайте элементы списка в  формате: ключ|название опции', # MODIF
+	'option_datas_label' => 'Значения списка',
+	'option_defaut_label' => 'Выводить по умолчанию',
+	'option_disable_avec_post_explication' => 'Такой же вариант как и предыдущий, но вносит значение в скрытое поле.', # MODIF
+	'option_disable_avec_post_label' => 'Отключено, но опубликовано.', # MODIF
+	'option_disable_explication' => 'Поле не может получить фокус',
+	'option_disable_label' => 'Отключить поле',
+	'option_erreur_obligatoire_explication' => 'Выводится, если поле не заполнено. Если оставить пустым - то выведется сообщение по умолчанию.', # MODIF
+	'option_erreur_obligatoire_label' => 'Сообщение о ошибке', # MODIF
+	'option_explication_explication' => 'Пояснение о назначении поля',
+	'option_explication_label' => 'Пояснение',
+	'option_groupe_affichage' => 'Вывод',
+	'option_groupe_description' => 'Основное',
+	'option_groupe_utilisation' => 'Свойства',
+	'option_groupe_validation' => 'Проверка',
+	'option_horaire_label' => 'Расписание',
+	'option_horaire_label_case' => 'Разрешить заполнить время',
+	'option_id_groupe_label' => 'Группа ключей',
+	'option_info_obligatoire_explication' => 'Вы можете изменить стандартные настройки обязательного заполнения полей.. ', # MODIF
+	'option_info_obligatoire_label' => 'Обязательное заполнение полей', # MODIF
+	'option_inserer_barre_choix_edition' => 'добавить полную панель',
+	'option_inserer_barre_choix_forum' => 'добавить сокращенную панель ',
+	'option_inserer_barre_explication' => 'Добавить панель для редактирования текста (кнопки стилей)?',
+	'option_inserer_barre_label' => 'Панель редактирования',
+	'option_label_case_label' => 'Позиция чекбокса', # MODIF
+	'option_label_explication' => 'Название поля', # MODIF
+	'option_label_label' => 'Название',
+	'option_maxlength_explication' => 'Максимальное к-во символов, которое можно ввести в поле:', # MODIF
+	'option_maxlength_label' => 'Максимальное к-во символов',
+	'option_multiple_explication' => 'Пользователь сможет выбрать несколько вариантов', # MODIF
+	'option_multiple_label' => 'Выбор нескольких значений',
+	'option_nom_explication' => 'Задать id поля. Латинские буквы, цифры и символ  "_". ',
+	'option_nom_label' => 'Название поля',
+	'option_obligatoire_label' => 'Обязательное поле',
+	'option_option_intro_label' => 'Название первого элемента списка',
+	'option_option_statut_label' => 'Показать статус',
+	'option_pliable_label' => 'Расширяемая',
+	'option_pliable_label_case' => 'Группа полей может быть развернута или сжата.',
+	'option_plie_label' => 'Уже сжато',
+	'option_plie_label_case' => 'Если группу полей можно расширить или сжать, тогда эта опция их сожмет с отображением полей.', # MODIF
+	'option_previsualisation_explication' => 'Добавить вкладку предварительного просмотра?',
+	'option_previsualisation_label' => 'Предварительный просмотр',
+	'option_readonly_explication' => 'Поле показывается, его можно выбрать, но нельзя изменить.',
+	'option_readonly_label' => 'Только для чтения',
+	'option_rows_explication' => 'Высота поля в строках. Эта опция не всегда работает, так CSS стили сайта могут отменять заданное значение.',
+	'option_rows_label' => 'Количество строк',
+	'option_size_explication' => 'Длина поля в символах. Эта опция не всегда работает, так CSS стили сайта могут отменять заданное значение.',
+	'option_size_label' => 'Размер поля',
+	'option_type_choix_plusieurs' => 'Позволяет выбрать <strong>несколько</strong> получателей.', # MODIF
+	'option_type_choix_tous' => 'Отметить <strong>всех</strong> авторов как получателей. Пользователю выбор не предоставляется.', # MODIF
+	'option_type_choix_un' => 'Сделать возможным выбор <strong>только одного</strong> получателя.', # MODIF
+	'option_type_explication' => 'Если выбран «ввод пароля», то символы в поле будут превращаться в звездочки',
+	'option_type_label' => 'Тип поля',
+	'option_type_password' => 'Текст, скрываемый во время ввода (например, пароль)',
+	'option_type_text' => 'Обычный',
+
+	// S
+	'saisie_auteurs_explication' => 'Выбор автора из зарегистрированных на сайте', # MODIF
+	'saisie_auteurs_titre' => 'Выбор автора', # MODIF
+	'saisie_case_explication' => 'Используется для включения/отключения определенной опции.',
+	'saisie_case_titre' => 'Единичный выбор ',
+	'saisie_checkbox_explication' => 'Используется для выбора нескольких вариантов при помощи check-box.',
+	'saisie_checkbox_titre' => 'Чекбокс',
+	'saisie_date_explication' => 'Используется для ввода даты при помощи календаря.', # MODIF
+	'saisie_date_titre' => 'Дата',
+	'saisie_destinataires_explication' => 'Используется для выбора одного или нескольких получателей из числа предварительно выбранных авторов.', # MODIF
+	'saisie_destinataires_titre' => 'Получатели',
+	'saisie_explication_explication' => 'Используется для вывода поясняющей информации',
+	'saisie_explication_titre' => 'Пояснение',
+	'saisie_fieldset_explication' => 'FIELDSET. Используется для группировки полей ',
+	'saisie_fieldset_titre' => 'Филдсет',
+	'saisie_file_explication' => 'Отправить файл',
+	'saisie_file_titre' => 'Файл',
+	'saisie_hidden_explication' => 'Значение этого поля не отображается для пользователя. INPUT TYPE=HIDDEN', # MODIF
+	'saisie_hidden_titre' => 'Невидимое (скрытое) поле',
+	'saisie_input_explication' => 'Основное поле для ввода информации',
+	'saisie_input_titre' => 'Текстовая строка',
+	'saisie_mot_explication' => 'Один или больше ключей из группы', # MODIF
+	'saisie_mot_titre' => 'Ключи',
+	'saisie_oui_non_explication' => 'Выбор только одного варианта ответа: ДА или НЕТ',
+	'saisie_oui_non_titre' => 'Да или Нет',
+	'saisie_radio_defaut_choix1' => 'Один',
+	'saisie_radio_defaut_choix2' => 'Два',
+	'saisie_radio_defaut_choix3' => 'Три',
+	'saisie_radio_explication' => 'Используется для выбора одной опции из нескольких.', # MODIF
+	'saisie_radio_titre' => 'Радио кнопка',
+	'saisie_selecteur_article' => 'Позволяет выбратью статью из структуры сайта',
+	'saisie_selecteur_document' => 'Показать селектор документа',
+	'saisie_selecteur_rubrique' => 'Позволяет выбратью раздел из структуры сайта',
+	'saisie_selecteur_rubrique_article' => 'Позволяет выбратью статью или раздел из структуры сайта',
+	'saisie_selecteur_rubrique_article_titre' => 'Выбор статьи или раздела', # MODIF
+	'saisie_selection_explication' => 'SELECT - позволяет выбрать один пункт из выпадающего списка',
+	'saisie_selection_multiple_explication' => 'SELECT - позволяет выбрать несколько пунктов из списка',
+	'saisie_selection_multiple_titre' => 'Выбор нескольких опций',
+	'saisie_selection_titre' => 'Выпадающий список', # MODIF
+	'saisie_textarea_explication' => 'Textarea - для работы с текстом большого размера',
+	'saisie_textarea_titre' => 'Текстовое поле',
+
+	// T
+	'tous_visiteurs' => 'Все посетители (в том числе не зарегистрированные)',
+	'tout_selectionner' => 'Выбрать все', # MODIF
+
+	// V
+	'vue_sans_reponse' => '<i>ничего не задано</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/lang/saisies_sk.php b/design_system_dependences/saisies/v5.2.0/lang/saisies_sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..38f5f726dcbf0cf410ad57762ff1f05418c5956f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/lang/saisies_sk.php
@@ -0,0 +1,192 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/saisies?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_parcourir_docs_article' => 'Prehľadať článok',
+	'bouton_parcourir_docs_breve' => 'Prehľadať novinku',
+	'bouton_parcourir_docs_rubrique' => 'Prehľadať rubriku',
+	'bouton_parcourir_mediatheque' => 'Prehľadať knižnicu multimédií',
+
+	// C
+	'construire_action_annuler' => 'Zrušiť',
+	'construire_action_configurer' => 'Nastaviť',
+	'construire_action_deplacer' => 'Presunúť',
+	'construire_action_dupliquer' => 'Duplikovať',
+	'construire_action_dupliquer_copie' => '(kópia)',
+	'construire_action_supprimer' => 'Odstrániť',
+	'construire_ajouter_champ' => 'Pridať pole',
+	'construire_ajouter_groupe' => 'Pridať skupinu',
+	'construire_attention_enregistrer' => 'Nezabudnite uložiť zmeny!',
+	'construire_attention_modifie' => 'Tento formulár sa odlišuje od pôvodného. Máte možnosť ho obnoviť do stavu pred svojimi zmenami.',
+	'construire_attention_supprime' => 'Medzi vašimi zmenami je vymazanie niekoľkých polí. Potvrďte, prosím, registráciu tejto verzie formulára.',
+	'construire_aucun_champs' => 'V tomto formulári nie je momentálne žiadne pole',
+	'construire_confirmer_supprimer_champ' => 'Chcete odstrániť toto pole?',
+	'construire_info_nb_champs_masques' => '@nb@ skryté (-ých) pole (-í/-ia) času na nastavenie skupiny.',
+	'construire_position_explication' => 'Uveďte akékoľvek ďalšie pole predtým, ako sa vloží.',
+	'construire_position_fin_formulaire' => 'Na koniec formulára',
+	'construire_position_fin_groupe' => 'Na koniec skupiny @groupe@',
+	'construire_position_label' => 'Umiestnenie poľa',
+	'construire_reinitialiser' => 'Znova načítať formulár',
+	'construire_reinitialiser_confirmer' => 'Stratíte všetky svoje zmeny. Určite sa chcete vrátiť na pôvodný formulár?',
+	'construire_verifications_label' => 'Typ overenia, ktorý sa má vykonať', # MODIF
+
+	// E
+	'erreur_generique' => 'V poliach sú chyby; prosím, skontrolujte údaje, ktoré ste zadali',
+	'erreur_option_nom_unique' => 'Tento názov už používa iné pole, a v tomto formulári musí byť jedinečný.',
+
+	// I
+	'info_configurer_saisies' => 'Testovacia stránka Saisies',
+
+	// L
+	'label_annee' => 'Rok',
+	'label_jour' => 'Deň',
+	'label_mois' => 'Mesiac',
+
+	// O
+	'option_aff_art_interface_explication' => 'Zobrazovať len články v jazyku používateľa', # MODIF
+	'option_aff_art_interface_label' => 'Viacjazyčné zobrazenie',
+	'option_aff_langue_explication' => 'Pred názvom zobraziť vybratý jazyk článku alebo rubriky',
+	'option_aff_langue_label' => 'Zobraziť jazyk',
+	'option_aff_rub_interface_explication' => 'Zobraziť len rubriky v jazyku používateľa', # MODIF
+	'option_aff_rub_interface_label' => 'Viacjazyčné zobrazenie',
+	'option_afficher_si_explication' => 'Uveďte podmienky zobrazenia poľa podľa hodnoty iných polí. Čísla iných polí musia byť medzi <code>@</code>. <br />Príklad <code>@selection_1@=="Toto"</code> prikazuje zobraziť pole, ktoré <code>selection_1</code> má hodnotu <code>Toto</code>.', # MODIF
+	'option_afficher_si_label' => 'Podmienené zobrazenie',
+	'option_attention_explication' => 'Správa je dôležitejšia ako vysvetlivka.',
+	'option_attention_label' => 'Varovanie',
+	'option_autocomplete_defaut' => 'Nechať ako predvolené',
+	'option_autocomplete_explication' => 'Pri nahrávaní stránky môže váš prehliadač automaticky vyplniť polia podľa histórie',
+	'option_autocomplete_label' => 'Automaticky vyplniť pole',
+	'option_autocomplete_off' => 'Deaktivovať',
+	'option_autocomplete_on' => 'Aktivovať',
+	'option_cacher_option_intro_label' => 'Skryť prvý prázdny výber',
+	'option_choix_alternatif_label' => 'Nastaviť možnosť vytvárania rozbaľovacích menu', # MODIF
+	'option_choix_alternatif_label_defaut' => 'Iný výber',
+	'option_choix_alternatif_label_label' => 'Pomenovanie výberu z viacerých možností',
+	'option_choix_destinataires_explication' => 'Jeden autor alebo viacerí, z ktorých si používateľ môže vybrať. Ak nie je vybratý žiaden, vyberie sa autor, ktorý nainštaloval stránku.', # MODIF
+	'option_choix_destinataires_label' => 'Možní príjemcovia',
+	'option_class_label' => 'Ďalšie triedy CSS',
+	'option_cols_explication' => 'Šírka poľa v znakoch. Táto možnosť sa vždy nepoužíva, lebo štýly CSS na vašej stránke ju môžu prepísať.',
+	'option_cols_label' => 'Šírka',
+	'option_datas_explication' => 'Musíte definovať výber pre každý riadok vo formulári "kľúč|označenie výberu"', # MODIF
+	'option_datas_label' => 'Zoznam dostupných možností',
+	'option_datas_sous_groupe_explication' => 'Online výber musíte zadať vo forme "kľúč|menovka" výberu. <br />Môžete označiť začiatok podskupiny formulára "*Nadpis podskupiny". Skupinu môžete skončiť na riadku alebo do ďalšieho riadka môžete napísať len "/*".', # MODIF
+	'option_defaut_label' => 'Predvolená hodnota',
+	'option_disable_avec_post_explication' => 'Rovnaká ako predošlá možnosť, ale hodnotu pošle v skrytom poli.',
+	'option_disable_avec_post_label' => 'Deaktivovať ale poslať.',
+	'option_disable_explication' => 'Na pole sa nedá zacieliť.',
+	'option_disable_label' => 'Deaktivovať pole',
+	'option_erreur_obligatoire_explication' => 'Zobrazovanú chybovú správu môžete upraviť tak, aby označovala povinnosť',
+	'option_erreur_obligatoire_label' => 'Správa s povinnosťou', # MODIF
+	'option_explication_explication' => 'Ak je to potrebné, krátka veta opisujúca zmysel daného poľa.',
+	'option_explication_label' => 'Vysvetlenie',
+	'option_groupe_affichage' => 'Zobraziť',
+	'option_groupe_description' => 'Opis',
+	'option_groupe_utilisation' => 'Použitie',
+	'option_groupe_validation' => 'Overenie',
+	'option_heure_pas_explication' => 'Pri používaní diára sa zobrazí menu, ktoré vám pomôže zadať hodiny a minúty. Tak môžete vybrať časový interval pre každý údaj (predvolený – 30 min).',
+	'option_heure_pas_label' => 'Interval v minútach v menu pomocníka k zápisu do poľa',
+	'option_horaire_label' => 'Diár',
+	'option_horaire_label_case' => 'Povoliť zápis do diára',
+	'option_id_groupe_label' => 'Skupina slov',
+	'option_info_obligatoire_explication' => 'Môžete zmeniť predvolenú povinnosť vyplniť polia: <i>[Povinné]</i>.', # MODIF
+	'option_info_obligatoire_label' => 'Označenie povinnosti',
+	'option_inserer_barre_choix_edition' => 'celý editovací panel s nástrojmi',
+	'option_inserer_barre_choix_forum' => 'panel s nástrojmi pre diskusné fóra',
+	'option_inserer_barre_explication' => 'Vložiť panel s nástrojmi porte-plume, ak je tento nástroj aktivovaný.',
+	'option_inserer_barre_label' => 'Vložiť panel s nástrojmi',
+	'option_label_case_label' => 'Označenie sa nachádza pod zaškrtávacím políčkom',
+	'option_label_explication' => 'Zobrazí sa titulok.',
+	'option_label_label' => 'Označenie',
+	'option_maxlength_explication' => 'Používateľ nemôže napísať viac znakov ako určuje toto číslo.', # MODIF
+	'option_maxlength_label' => 'Maximálny počet znakov',
+	'option_multiple_explication' => 'Používateľ si bude môcť vybrať niekoľko hodnôt', # MODIF
+	'option_multiple_label' => 'Výber z viacerých možností',
+	'option_nom_explication' => 'Počítačový názov, ktorý pomenúva pole. Môžu v ňom byť malé písmená abecedy alebo podčiarkovník "_".',
+	'option_nom_label' => 'Názov poľa',
+	'option_obligatoire_label' => 'Povinné pole',
+	'option_option_destinataire_intro_label' => 'Pomenovanie prvého prázdneho výberu(ak má formu zoznamu)',
+	'option_option_intro_label' => 'Označenie prvého prázdneho výberu',
+	'option_option_statut_label' => 'Zobraziť stav',
+	'option_pliable_label' => 'Roztiahnuteľné',
+	'option_pliable_label_case' => 'Skupina polí sa dá roztiahnuť alebo stiahnuť.',
+	'option_plie_label' => 'Už stiahnutá',
+	'option_plie_label_case' => 'Ak sa dá skupina polí stiahnuť a roztiahnuť, táto možnosť ju v zobrazeniach formulára nastaví ako už stiahnutú.',
+	'option_previsualisation_explication' => 'Ak je aktivovaný porte-plume, pridať kartu do ukážky vzhľadu zadaného textu.',
+	'option_previsualisation_label' => 'Aktivovať ukážky',
+	'option_readonly_explication' => 'Toto pole môžete zobraziť, vybrať, ale nie upravovať.',
+	'option_readonly_label' => 'Len na čítanie',
+	'option_rows_explication' => 'Výška poľa v riadkoch. Táto možnosť sa nepoužije vždy, pretože  štýly CSS na vašej stránke ju môžu zmeniť.',
+	'option_rows_label' => 'Počet riadkov',
+	'option_size_explication' => 'Šírka poľa v riadkoch. Táto možnosť sa nepoužije vždy, pretože štýly CSS na vašej stránke ju môžu zmeniť.',
+	'option_size_label' => 'Veľkosť poľa',
+	'option_type_choix_plusieurs' => 'Umožní používateľovi vybrať si <strong>mnohých</ strong> príjemcov.', # MODIF
+	'option_type_choix_tous' => 'Urobiť príjemcov zo <strong>všetkých</ strong> týchto autorov. Používateľ nebude mať na výber.', # MODIF
+	'option_type_choix_un' => 'Povoliť používateľovi vybrať si <strong>jedného</ strong> príjemcu (vo forme rozbaľovacieho menu).', # MODIF
+	'option_type_choix_un_radio' => 'Umožniť používateľovi vybrať si <strong>jediného</strong> príjemcu (vo forme zoznamu s odrážkami).', # MODIF
+	'option_type_explication' => 'V režime hesla sa obsah napísaný do poľa nahradí hviezdičkami.',
+	'option_type_label' => 'Typ poľa',
+	'option_type_password' => 'Skrývaný text pri písaní (napr. heslo)',
+	'option_type_text' => 'Normálny',
+	'option_valeur_non_label' => 'Hodnota nie',
+	'option_valeur_oui_label' => 'Hodnota áno',
+
+	// S
+	'saisie_auteurs_explication' => 'Umožňuje vám vybrať jedného alebo viacerých autorov', # MODIF
+	'saisie_auteurs_titre' => 'Autori', # MODIF
+	'saisie_case_explication' => 'Používa sa na aktivovanie alebo deaktivovanie konkrétnej možnosti.',
+	'saisie_case_titre' => 'Jedno zaškrtávacie políčko',
+	'saisie_checkbox_explication' => 'Používa sa na výber niekoľkých možností pomocou zaškrtávacích políčok.',
+	'saisie_checkbox_titre' => 'Zaškrtávacie políčka',
+	'saisie_date_explication' => 'Používa sa na zadávanie dátumu pomocou nástroja kalendára', # MODIF
+	'saisie_date_titre' => 'Dátum',
+	'saisie_destinataires_explication' => 'Používa sa na výber jedného príjemcu alebo viacerých z dopredu vybraných autorov.', # MODIF
+	'saisie_destinataires_titre' => 'Príjemcovia',
+	'saisie_email_titre' => 'E-mailová adresa',
+	'saisie_explication_explication' => 'Všeobecný vysvetľujúci text.',
+	'saisie_explication_titre' => 'Vysvetlenie',
+	'saisie_fieldset_explication' => 'Rám, v ktorom môže byť niekoľko polí.',
+	'saisie_fieldset_titre' => 'Skupina polí',
+	'saisie_file_explication' => 'Poslať súbor',
+	'saisie_file_titre' => 'Súbor',
+	'saisie_hidden_explication' => 'Predvyplnené pole, ktoré používateľ nikdy neuvidí.', # MODIF
+	'saisie_hidden_titre' => 'Skryté pole',
+	'saisie_input_explication' => 'Jednoduchý riadok s textom, ktorý môže byť viditeľný alebo skrytý (heslo).',
+	'saisie_input_titre' => 'Textové pole',
+	'saisie_mot_explication' => 'Jedno alebo viac kľúčových slov zo skupiny slov', # MODIF
+	'saisie_mot_titre' => 'Kľúčové slovo',
+	'saisie_oui_non_explication' => 'Odpoveď buď Áno alebo Nie',
+	'saisie_oui_non_titre' => 'Áno alebo Nie',
+	'saisie_radio_defaut_choix1' => 'Jeden',
+	'saisie_radio_defaut_choix2' => 'Dva',
+	'saisie_radio_defaut_choix3' => 'Tri',
+	'saisie_radio_explication' => 'Používa sa na výber jednej možnosti z viacerých dostupných.', # MODIF
+	'saisie_radio_titre' => 'Rádiové gombíky',
+	'saisie_selecteur_article' => 'Zobraziť prehliadač výberu článku',
+	'saisie_selecteur_rubrique' => 'Zobraziť prehliadač výberu rubriky',
+	'saisie_selecteur_rubrique_article' => 'Zobraziť prehliadač výberu článku alebo rubriky',
+	'saisie_selecteur_rubrique_article_titre' => 'Výber článku alebo rubriky', # MODIF
+	'saisie_selection_explication' => 'Vyberte možnosť z rozbaľovacieho zoznamu.',
+	'saisie_selection_multiple_explication' => 'Používa sa na výber niekoľkých možností zo zoznamu.',
+	'saisie_selection_multiple_titre' => 'Výber z viacerých možností',
+	'saisie_selection_titre' => 'Rozbaľovací zoznam', # MODIF
+	'saisie_textarea_explication' => 'Textové pole s viacerými riadkami.',
+	'saisie_textarea_titre' => 'Blok textu',
+
+	// T
+	'tous_visiteurs' => 'Všetci návštevníci (aj ne­za­re­gis­tro­va­ní)',
+	'tout_selectionner' => 'O(d)značiť všetko',
+
+	// V
+	'vue_sans_reponse' => '<i>Bez reakcie</i>',
+
+	// Z
+	'z' => 'zzz'
+);
diff --git a/design_system_dependences/saisies/v5.2.0/modeles/formulaire_aide_memoire.html b/design_system_dependences/saisies/v5.2.0/modeles/formulaire_aide_memoire.html
new file mode 100644
index 0000000000000000000000000000000000000000..c5f118cf55415736f2027a0e2ed3e8d6aeed4f0b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/modeles/formulaire_aide_memoire.html
@@ -0,0 +1,53 @@
+[(#REM)
+	<!-- affiche un aide mémoire listant les saisies d'un formulaire sous forme de série de @@
+	Options possible :
+		- `saisies` : liste des saisies
+		- `source` : si `constructeur`, rechercher les saisies dans `constructeur_id`, sinon prendre dans `saisies`
+		- pre_saisies: des choses à mettre dans l'aide mémoire avant les saisies, ex pour formidable:
+			\['nom_site_spip' => _T\('info_nom_site_spip'\),
+			 'message_retour' => _T\('formidable:editer_message_ok'\)
+			 \]
+	)
+	-->
+]
+<strong><:saisies:saisies_aide_memoire|label_ponctuer:></strong>
+
+[(#PIPELINE{
+	saisies_aide_memoire_inserer_debut,
+	#ARRAY{
+		data,#ENV*{inserer_debut},
+		args,#ARRAY{
+			type_aide_memoire,#ENV{type_aide_memoire},
+			id_aide_memoire,#ENV{id_aide_memoire}
+			}
+		}
+	})
+<hr />]
+#SET{source,#ENV{source,formulaire}}
+<BOUCLE_constructeur(CONDITION) {si #GET{source}|=={constructeur}}>
+[(#SET{saisies,#SESSION{constructeur_formulaire_#ENV{constructeur_id}}})]
+</BOUCLE_constructeur>
+#SET{saisies,#ENV{saisies}}
+<//B_constructeur>
+
+<B_champs>
+<dl>
+<BOUCLE_champs(DATA){source tableau, #PIPELINE{saisies_afficher_si_saisies, #GET{saisies}}|saisies_lister_par_nom{1}}>
+	[(#VALEUR|saisies_saisie_est_labelisable|oui)
+		[(#VALEUR|saisies_saisie_est_avec_sous_saisies|oui)
+		<hr />
+
+		]
+
+		<dt>@#CLE@</dt>
+		[<dd>(#VALEUR|saisies_saisie_get_label)</dd>]
+		[<dl style="margin-left:1em">
+			<dd>
+			<dt><:saisies:option_datas_label:></dt>
+			<dd>(#VALEUR|saisies_trouver_data|saisies_tableau2chaine|propre)</dd>
+			</dd>
+		</dl>]
+	]
+	</BOUCLE_champs>
+</dl>
+</B_champs>
diff --git a/design_system_dependences/saisies/v5.2.0/paquet.xml b/design_system_dependences/saisies/v5.2.0/paquet.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fa6b702a9c08350dd3172e4108f5eb5604617ce4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/paquet.xml
@@ -0,0 +1,51 @@
+<paquet
+	prefix="saisies"
+	categorie="outil"
+	version="5.2.0"
+	etat="stable"
+	compatibilite="[4.0.0;4.2.*]"
+	logo="saisies.svg"
+	documentation="https://contrib.spip.net/Saisies"
+	schema="1"
+>
+	<nom>Saisies</nom>
+	<auteur lien="https://contrib.spip.net/Matthieu-Marcillaud">Matthieu Marcillaud</auteur>
+	<auteur lien="https://contrib.spip.net/RastaPopoulos">RastaPopoulos</auteur>
+	<auteur lien="https://contrib.spip.net/Joseph">Joseph</auteur>
+	<auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
+	<auteur>Maïeul</auteur>
+	<licence>GNU/GPL</licence>
+
+	<traduire module="saisies" reference="fr" gestionnaire="salvatore" />
+
+	<pipeline nom="insert_head" inclure="saisies_pipelines.php" />
+	<pipeline nom="header_prive" inclure="saisies_pipelines.php" />
+	<pipeline nom="affichage_final" inclure="saisies_pipelines.php" />
+	<pipeline nom="saisies_autonomes" action="" />
+	<pipeline nom="saisies_aide_memoire_inserer_debut" />
+	<pipeline nom="saisie_est_tabulaire" action="" />
+	<pipeline nom="saisie_est_fichier" action="" />
+	<pipeline nom="saisies_lister_disponibles" action="" />
+	<pipeline nom="saisies_lister_categories" action="" />
+	<pipeline nom="saisies_construire_formulaire_config" action="" />
+	<pipeline nom="formulaire_verifier_post_saisies" action="" />
+	<pipeline nom="formulaire_verifier_etape_post_saisies" action="" />
+	<pipeline nom="formulaire_saisies" action="" />
+	<pipeline nom="saisies_verifier" action="" />
+	<pipeline nom="saisies_verifier_lister_disponibles" action="saisies_pipelines.php" />
+	<pipeline nom="saisies_afficher_si_saisies" inclure="saisies_pipelines.php"  />
+	<pipeline nom="formulaire_receptionner" inclure="saisies_pipelines.php" />
+	<pipeline nom="formulaire_charger" inclure="saisies_pipelines.php" />
+	<pipeline nom="formulaire_verifier" inclure="saisies_pipelines.php" />
+	<pipeline nom="formulaire_verifier_etape" inclure="saisies_pipelines.php" />
+	<pipeline nom="styliser" inclure="saisies_pipelines.php" />
+	<pipeline nom="formulaire_fond" inclure="saisies_pipelines.php" />
+
+	<menu nom="saisies_doc" titre="saisies:titre_page_saisies_doc" parent="menu_developpement"  icone="images/saisies-xx.svg" />
+
+	<utilise nom="verifier" compatibilite="[1.14.0;]" />
+	<utilise nom="spip_bonux" compatibilite="[3.5.0;]" />
+	<utilise nom="yaml" compatibilite="[1.5.0;]" />
+	<utilise nom="nospam" compatibilite="[2.3.0;]" />
+
+</paquet>
diff --git a/design_system_dependences/saisies/v5.2.0/phpstan.neon.dist b/design_system_dependences/saisies/v5.2.0/phpstan.neon.dist
new file mode 100644
index 0000000000000000000000000000000000000000..e30b2a446545d3ccf4e5c157b8a52d9463bf080f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/phpstan.neon.dist
@@ -0,0 +1,9 @@
+# phpstan.neon.dist
+parameters:
+	paths:
+		- .
+	excludePaths:
+		analyseAndScan:
+			- lang
+	level: 0
+
diff --git a/design_system_dependences/saisies/v5.2.0/phpunit.xml.dist b/design_system_dependences/saisies/v5.2.0/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..25dddf17736e525b1f759e8b48da82be02a7cf5c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/phpunit.xml.dist
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.1/phpunit.xsd" bootstrap="tests/bootstrap.php" executionOrder="depends,defects" beStrictAboutOutputDuringTests="true" failOnRisky="true" failOnWarning="true" cacheDirectory=".phpunit.cache" requireCoverageMetadata="true" displayDetailsOnTestsThatTriggerWarnings="true" beStrictAboutCoverageMetadata="true">
+  <source>
+    <include>
+      <directory suffix=".php">.</directory>
+    </include>
+    <exclude>
+			<directory suffix=".php">lang/</directory>
+			<directory suffix=".php">tests/</directory>
+			<directory suffix=".php">vendor/</directory>
+    </exclude>
+  </source>
+  <testsuites>
+    <testsuite name="default">
+      <directory>tests</directory>
+    </testsuite>
+  </testsuites>
+</phpunit>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/exec/construire_formulaire.html b/design_system_dependences/saisies/v5.2.0/prive/exec/construire_formulaire.html
new file mode 100644
index 0000000000000000000000000000000000000000..5cd05370a00dc05374a17fa7b735c67594ce0b46
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/exec/construire_formulaire.html
@@ -0,0 +1,3 @@
+<h1><:saisies:info_configurer_saisies:></h1>
+
+<div class="ajax">#FORMULAIRE_CONSTRUIRE_FORMULAIRE{test,#ARRAY,#ARRAY{modifier_nom,oui,nom_unique,oui}}</div>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/listes/articles_originaux_recursifs.html b/design_system_dependences/saisies/v5.2.0/prive/listes/articles_originaux_recursifs.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a7bd72f20742df9583f1e32a5cab2724d1628db
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/listes/articles_originaux_recursifs.html
@@ -0,0 +1,14 @@
+[(#SET{iteration,#ENV{iteration,1}})]
+[(#SET{separateur,[(#ENV{separateur}|concat{&nbsp;&rsaquo;&nbsp;})]})]
+<BOUCLE_rubriques(RUBRIQUES){id_parent}{tout}>
+	<optgroup label="#GET{separateur}[(#TITRE|supprimer_tags|attribut_html)]">
+		<BOUCLE_articles_originaux(ARTICLES){id_rubrique}{origine_traduction}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur,#ENV{defaut,#ARRAY}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+		<INCLURE{fond=prive/listes/articles_originaux_recursifs}{valeur=#ENV{valeur}}{id_rubrique=#ID_RUBRIQUE}{iteration=(#GET{iteration}|plus{1})}{separateur=#GET{separateur}}{_multiple}{defaut} />
+		</BOUCLE_articles_originaux>
+		<BOUCLE_ssrubriques(BOUCLE_rubriques)> </BOUCLE_ssrubriques>
+	</optgroup>
+</BOUCLE_rubriques>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/listes/rubriques_recursives.html b/design_system_dependences/saisies/v5.2.0/prive/listes/rubriques_recursives.html
new file mode 100644
index 0000000000000000000000000000000000000000..368e56b55492036df4449a2d0ac7347e9ca1ca7e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/listes/rubriques_recursives.html
@@ -0,0 +1,8 @@
+[(#SET{separateur,[(#ENV{separateur}|concat{&nbsp;&rsaquo;&nbsp;})]})]
+<BOUCLE_rubriques(RUBRIQUES){id_parent=#ENV{id_parent,#ENV{id_rubrique}}}{tout}>
+	[(#ENV{multiple}|oui)
+	<option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|in_array{#ENV{valeur,#ENV{defaut,#ARRAY}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+	[(#ENV{multiple}|non)
+	<option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+	<INCLURE{fond=prive/listes/rubriques_recursives,env,id_rubrique=#ID_RUBRIQUE,separateur=#GET{separateur}} />
+</BOUCLE_rubriques>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/configurer_saisies.html b/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/configurer_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..3a574705e0d0e142c19ffe2783ac2de0209ac2db
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/configurer_saisies.html
@@ -0,0 +1,5 @@
+[(#AUTORISER{saisies_configurer}|sinon_interdire_acces)]
+<h1 class="grostitre"><:saisies:configuration:></h1>
+<div class="ajax">
+	#FORMULAIRE_CONFIGURER_SAISIES
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/saisies_doc.html b/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/saisies_doc.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0a449d976ef0e19c93b6fc72d1fb50e45fa6546
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/squelettes/contenu/saisies_doc.html
@@ -0,0 +1,51 @@
+<h1 class="grostitre"><:saisies:titre_page_saisies_doc:></h1>
+<div class="nettoyeur"></div>
+
+<B_categorie>
+<BOUCLE_categorie (DATA) {source table, #VAL{saisies}|saisies_lister_disponibles{''}|saisies_regrouper_disponibles_par_categories} {si #PLUGIN{yaml}|oui}>
+	<h3 id="[categorie_(#CLE)]">[(#ICONE|balise_img|image_reduire{24})&nbsp;][(#NOM)]</h3>
+			<BOUCLE_saisies(DATA) {source table, #SAISIES}>
+			[(#BOITE_OUVRIR)]
+			<h4 id="[saisie_(#CLE)]">[(#ICONE|balise_img|image_reduire{24})&nbsp;][(#TITRE)]</h4>
+			<p>[(#DESCRIPTION)]</p>
+			<BOUCLE_options (DATA) {source table, #OPTIONS}>
+				<div class="info">
+					<h5>[(#VALEUR{options/label}|saisies_label)]</h5>
+					<B_saisies_options>
+						<ul class="spip">
+							<BOUCLE_saisies_options (DATA) {source table, #SAISIES}>
+							<li><strong>[(#VALEUR{options/label}|sinon{#VALEUR{options/label_case}}|saisies_label)] [((#VALEUR{options/nom}|=={datas}|?{data,#VALEUR{options/nom}}))]</strong>[(#VALEUR{options/label}|oui|et{#VALEUR{options/label_case}|oui})[(#VALEUR{options/label_case}|saisies_label)]]
+									[<br/>(#VALEUR{options/explication}|saisies_label)]
+									[<br/><strong><:saisies:explication_dev|label_ponctuer:></strong> (#VALEUR{options/explication_dev}|saisies_label)]
+									[<br/><strong><:saisies:option_attention_label|label_ponctuer:></strong> (#VALEUR{options/attention}|saisies_label)]
+									[<br/>Par défaut : (#VALEUR{options/defaut}|saisies_label)]
+									<B_saisies_data>
+										<br/>Choix possibles :
+										<ul class="spip"><BOUCLE_saisies_data (DATA) {source table, #VALEUR|saisies_trouver_data}>
+											<li class="item data_[(#CLE)]">[(#VALEUR|saisies_label)][ ((#CLE))]</li>
+									</BOUCLE_saisies_data></ul>
+									</B_saisies_data>
+								</li>
+							</BOUCLE_saisies_options>
+						</ul>
+					</B_saisies_options>
+				</div>
+			</BOUCLE_options>
+			<B_saisies_options_dev>
+			<h5><:saisies:options_dev_titre:></h5>
+			<ul class="spip">
+				<BOUCLE_saisies_options_dev (DATA) {source table, #OPTIONS_DEV}>
+				<li><strong>[(#VALEUR{options/label}|sinon{#VALEUR{options/label_case}}|saisies_label)] [((#VALEUR{options/nom}|=={datas}|?{data,#VALEUR{options/nom}}))]</strong>[(#VALEUR{options/label}|oui|et{#VALEUR{options/label_case}|oui})[(#VALEUR{options/label_case}|saisies_label)]]
+					[(#VALEUR{options/explication}|oui)<br/>[(#VALEUR{options/explication}|saisies_label)]]
+					[(#VALEUR{options/explication_dev}|oui)<br/><strong><:saisies:explication_dev|label_ponctuer:></strong> [(#VALEUR{options/explication_dev}|saisies_label)]]
+					[(#VALEUR{options/defaut}|oui)<br/>[Par défaut : (#VALEUR{options/defaut}|saisies_label)]]
+				</li>
+				</BOUCLE_saisies_options_dev>
+			</ul>
+			</B_saisies_options_dev>
+			[(#BOITE_FERMER)]
+			</BOUCLE_saisies>
+	</B_saisies>
+</BOUCLE_categorie>
+<:saisies:plugin_yaml_inactif:>
+<//B_categorie>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/squelettes/navigation/saisies_doc.html b/design_system_dependences/saisies/v5.2.0/prive/squelettes/navigation/saisies_doc.html
new file mode 100644
index 0000000000000000000000000000000000000000..2d55ac23769dcfb75c267ffd986c53a75569718d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/squelettes/navigation/saisies_doc.html
@@ -0,0 +1,17 @@
+<B_categories>
+	<div>
+		<ul class="liste_items navigation">
+			<BOUCLE_categories (DATA) {source table, #VAL{saisies}|saisies_lister_disponibles{''}|saisies_regrouper_disponibles_par_categories} {si #PLUGIN{yaml}|oui}>
+				<li class="item sous_navigation"><a href="#[categorie_(#CLE)]">[(#NOM)]</a>
+					<B_saisies>
+					<ul class="navigation">
+					<BOUCLE_saisies(DATA) {source table, #SAISIES}>
+						<li class="item"><a href="#[saisie_(#CLE)]" class="bando2_saisie_[(#CLE)]">[(#TITRE)] (#CLE)</a></li>
+					</BOUCLE_saisies>
+					</ul>
+					</B_saisies>
+				</li>
+			</BOUCLE_categories>
+		</ul>
+	</div>
+</B_categories>
diff --git a/design_system_dependences/saisies/v5.2.0/prive/style_prive_plugin_saisies.html b/design_system_dependences/saisies/v5.2.0/prive/style_prive_plugin_saisies.html
new file mode 100644
index 0000000000000000000000000000000000000000..55047ad5b3670866497710cebfd5f51f4ba03b2d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/style_prive_plugin_saisies.html
@@ -0,0 +1,201 @@
+[(#REM)<style>/*
+	Ce squelette definit les styles de l'espace prive
+
+	Note: l'entete "Vary:" sert a repousser l'entete par
+	defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
+	genant en cas de "rotation du cookie de session" apres
+	un changement d'IP (effet de clignotement).
+
+	ATTENTION: il faut absolument le charset sinon Firefox croit que
+	c'est du text/html !
+*/]#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+#wysiwyg .saisie_fieldset .champ {font-size: 1em;}
+
+<BOUCLE_si_yaml(CONDITION){si #PLUGIN{yaml}}>
+<BOUCLE_saisies (DATA) {source table, #VAL{saisies}|saisies_lister_disponibles{''}}>
+.navigation_avec_icones .bando2_saisie_[(#CLE)] { [background-image: url((#ICONE|image_reduire{16}|extraire_attribut{src}));] }
+</BOUCLE_saisies>
+</BOUCLE_si_yaml>
+
+/* Thème des saisies fieldsets en onglets
+ * La base mutualisée avec le public se trouve dans saisies.css.html
+ * On s'inspire de material design : https://material.io/components/tabs
+ */
+.formulaire_spip fieldset.fieldset_onglet {
+	border-top: 0;
+}
+.saisies-menu-onglets.saisies-menu-onglets {
+	border-bottom: 0;
+}
+/* pseudo-element pour avoir une bordure en bas à la fin */
+.saisies-menu-onglets__item:last-child {
+	flex: 1 1 auto;
+}
+.saisies-menu-onglets__item:last-child:after {
+	content: '';
+	flex: 1 1 auto;
+}
+.saisies-menu-onglets__item:last-child:after,
+.saisies-menu-onglets__lien {
+	border-bottom: 2px solid hsla(0, 0%, 0%, 0.066);
+}
+.saisies-onglets-verticaux .saisies-menu-onglets__lien {
+	border-#RIGHT: 2px solid hsla(0, 0%, 0%, 0.066);
+	border-bottom: 0;
+	width: 100%;
+}
+
+.saisies-menu-onglets__lien {
+	color: inherit;
+	white-space: nowrap;
+	text-transform: uppercase;
+	font-weight: 500;
+	font-size: 0.85em;
+	transition: 0.05s all;
+}
+.saisies-menu-onglets__item .saisies-menu-onglets__lien.actif {
+	color: [#(#ENV{foncee}|couleur_foncer{0.1})];
+	border-bottom-color: #ENV{foncee};
+	font-weight: 500;
+}
+.saisies-menu-onglets__lien:hover,
+.saisies-menu-onglets__lien:focus {
+	transition-duration: 0.2s;
+}
+.saisies-menu-onglets__lien:hover {
+	border-bottom-color: #ENV{foncee};
+}
+
+@media (min-width: 580px) {
+	.saisies-onglets-verticaux .saisies-menu-onglets {
+		max-width: var(--spip-form-label-width) !important; /**Ne pas se laisser surprendre par les styles par défaut en 15em **/
+		min-width: var(--spip-form-label-width) !important;
+	}
+}
+
+.saisies-onglets-verticaux .saisies-menu-onglets__lien.actif {
+	background-color: hsla(0, 0%, 0%, 0.05);
+	border-bottom-color: hsla(0, 0%, 0%, 0.066);
+	border-right-color: #ENV{foncee};
+}
+/**
+	Éviter d'avoir la toute première ligne
+	du contenu d'un onglet vertical décalée
+	vers le bas
+**/
+.saisies-onglets-verticaux .saisies-contenu-onglet > fieldset{
+	padding-top: 0;
+	padding-bottom: 0;
+}
+.saisies-onglets-verticaux .saisies-contenu-onglet > fieldset > .editer-groupe:first-of-type,
+.saisies-onglets-verticaux .saisies-contenu-onglet > fieldset > .editer-groupe:first-of-type > div.editer:first-of-type;/** On cible volontairement div.editer pour ne pas avoir .fieldset.editer, où il est nécessaire de garder un peu de padding-top pour pas que le libellé/legend soit collé à la suite**/
+{
+	padding-top: 0;
+}
+.saisies-onglets-verticaux .saisies-menu-onglets__lien {
+	white-space: normal;/* Les onglets horizontaux ont nowrap*/
+}
+
+.formulaire_spip .saisies-onglets fieldset + fieldset,
+.formulaire_spip .saisies-onglets .fieldset + .fieldset > fieldset {
+	margin-top: 0/* Annulation de style de SPIP pour les fieldset successifs */
+}
+.formulaire_spip .saisies-onglets fieldset + fieldset,
+.formulaire_spip .saisies-onglets .fieldset + .fieldset > fieldset,
+.formulaire_spip .afficher_si_masque + fieldset,
+.formulaire_spip .afficher_si_masque + .fieldset > fieldset
+{
+	margin-top: 0;/* Annulation de style de SPIP pour les fieldset successifs */
+}
+
+/* Dans les onglets, c'est seulement en troisième niveau qu'on va décaler à gauche */
+.formulaire_spip .saisies-onglets fieldset:not(.editer) fieldset:not(.editer) {
+	margin-left: 0;
+}
+.formulaire_spip .saisies-onglets fieldset:not(.editer) fieldset:not(.editer) fieldset:not(.editer) {
+	margin-left: var(--spip-form-fieldset-offset);
+}
+
+.saisies-menu-onglets__lien:focus {
+	background-color: hsla(0, 0%, 0%, 0.1);
+}
+.saisies-menu-onglets__lien.erreur {
+	color: red;
+}
+.saisies-menu-onglets__lien.erreur:after {
+	content: '';
+	display: block;
+	width: 1em;
+	height: 1em;
+	background: url(#CHEMIN_IMAGE{erreur-16.png}) no-repeat;
+	background-size: contain;
+	margin-#LEFT: 0.5em;
+}
+/* Menu scrollable quand les onglets dépassent */
+.saisies-menu-onglets.scrollable {
+	overflow-x: scroll;
+	scrollbar-width: thin;
+	scrollbar-color: transparent transparent;
+	transition: scrollbar-color 0.2s;
+	-webkit-mask-image: linear-gradient(
+		to right,
+		transparent 0%,
+		black 2em,
+		black calc(100% - 10em),
+		transparent 100%
+	);
+	mask-image: linear-gradient(
+		to right,
+		transparent 0%,
+		black 2em,
+		black calc(100% - 10em),
+		transparent 100%
+	);
+}
+.saisies-menu-onglets.scrollable .saisies-menu-onglets__item:first-child {
+	padding-#LEFT: 2em;
+}
+.saisies-menu-onglets.scrollable .saisies-menu-onglets__item:last-child {
+	padding-#RIGHT: 6em;
+}
+.saisies-menu-onglets.scrollable:hover {
+	scrollbar-color: black transparent;
+}
+@supports (-moz-appearance:none){/*CSS spécifique FF, cf issue 180 */
+	.saisies-menu-onglets.scrollable {
+		padding-bottom:8px;
+	}
+}
+.formulaire_spip__etapes {
+	padding: 0.75em;
+}
+
+/** recap des étapes **/
+.formulaire_spip .saisies_etapes_recapitulatif .editer_explication{
+  padding-left:0;
+  padding-right:0;
+}
+.saisies_etapes_recapitulatif {
+   margin:10px;
+}
+/* Saisie groupe inline
+ * La base mutualisée avec le public se trouve dans saisies.css.html
+ */
+.editer-groupe_inline > .editer:not(.en_configuration) {
+	padding-left: 0;
+	padding-right: 0;
+}
+.formulaire_construire_formulaire .conteneur_inline:not(.en_configuration)::before {
+	content: '<:saisies:conteneur_inline_titre:>';
+	font-style: italic;
+	font-size: 0.8em;
+}
+/* Que pour les legend des fieldset.editer */
+.editer-groupe_inline > fieldset.editer:not(.en_configuration) > .editer-label {
+	float: left;
+}
+.editer-groupe_inline > fieldset.editer:not(.en_configuration) > .editer-label + * {
+	clear: both;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-annuler-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-annuler-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..34601616529c1290ea2aa4c42407ed108ae195bb
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-annuler-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Turn back</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M13.542 4.865c-5.38 0-9.708 4.617-9.708 10.222v.759l-1.44-1.44a.964.964 0 0 0-.677-.284.964.964 0 0 0-.685.284.964.964 0 0 0 0 1.362l3.086 3.086a.964.964 0 0 0 1.362 0l3.086-3.086a.964.964 0 0 0 0-1.362.964.964 0 0 0-1.363 0l-1.44 1.44v-.759c0-4.62 3.502-8.294 7.78-8.294 4.277 0 7.779 3.673 7.779 8.294a.964.964 0 0 0 .963.964.964.964 0 0 0 .965-.964c0-5.605-4.327-10.222-9.708-10.222z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-configurer-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-configurer-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b820d419a2f2a040e9f3ce23beb858fca7b9a43
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-configurer-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Edit</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M18.133.75c-.94 0-1.879.356-2.59 1.067l-1.948 1.949a1.17 1.17 0 0 0-.03.029 1.17 1.17 0 0 0-.07.073l-12.402 12.4a1.17 1.17 0 0 0-.343.825v4.989a1.17 1.17 0 0 0 1.17 1.17h4.988a1.17 1.17 0 0 0 .826-.344l12.443-12.443.024-.022a1.17 1.17 0 0 0 .005-.008 1.17 1.17 0 0 0 .07-.073l1.908-1.905a3.679 3.679 0 0 0 0-5.179l-1.461-1.461A3.651 3.651 0 0 0 18.133.75zm0 2.324c.337 0 .674.13.938.395l1.462 1.461a1.31 1.31 0 0 1 0 1.876L19.38 7.958l-3.337-3.337 1.152-1.152c.264-.264.602-.395.938-.395zm-3.741 3.198l3.337 3.338L6.423 20.913H3.09v-3.335z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-deplacer-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-deplacer-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..eb782d5e6463bd4ff8f5695cc1961d2ecdfdc8d8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-deplacer-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Apps drawer</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M8.457 2.625a2.305 2.305 0 0 0-2.289 2.288 2.305 2.305 0 0 0 2.289 2.288 2.305 2.305 0 0 0 2.288-2.288 2.305 2.305 0 0 0-2.288-2.288zm7.086 0a2.305 2.305 0 0 0-2.288 2.288 2.305 2.305 0 0 0 2.288 2.288 2.305 2.305 0 0 0 2.289-2.288 2.305 2.305 0 0 0-2.289-2.288zM8.457 9.712A2.305 2.305 0 0 0 6.168 12a2.305 2.305 0 0 0 2.289 2.288A2.305 2.305 0 0 0 10.745 12a2.305 2.305 0 0 0-2.288-2.288zm7.086 0A2.305 2.305 0 0 0 13.255 12a2.305 2.305 0 0 0 2.288 2.288A2.305 2.305 0 0 0 17.832 12a2.305 2.305 0 0 0-2.289-2.288zm-7.086 7.087a2.305 2.305 0 0 0-2.289 2.288 2.305 2.305 0 0 0 2.289 2.288 2.305 2.305 0 0 0 2.288-2.288 2.305 2.305 0 0 0-2.288-2.288zm7.086 0a2.305 2.305 0 0 0-2.288 2.288 2.305 2.305 0 0 0 2.288 2.288 2.305 2.305 0 0 0 2.289-2.288 2.305 2.305 0 0 0-2.289-2.288z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-dupliquer-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-dupliquer-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fc5be69d2304780f555ecf53fec7805cb5c177bc
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-dupliquer-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Copy</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M2.943.75a1.061 1.061 0 0 0-1.061 1.061v15.85a1.061 1.061 0 0 0 1.061 1.061 1.061 1.061 0 0 0 1.061-1.061V2.873h12.524a1.061 1.061 0 0 0 1.061-1.062A1.061 1.061 0 0 0 16.528.75zm4.529 4.528a1.061 1.061 0 0 0-1.061 1.061v15.85a1.061 1.061 0 0 0 1.061 1.061h13.585a1.061 1.061 0 0 0 1.061-1.061V6.339a1.061 1.061 0 0 0-1.061-1.061zm1.061 2.123h11.463v13.726H8.533z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-enregistrer-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-enregistrer-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..364194e87fa1a4e1a4a954579860be321210bf1d
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-enregistrer-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Ok</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M21.069 4.707a1.062 1.062 0 0 0-.755.312L8.601 16.732l-4.915-4.915a1.062 1.062 0 0 0-1.5 0 1.062 1.062 0 0 0 0 1.5l5.665 5.666a1.062 1.062 0 0 0 1.5 0L21.815 6.519a1.062 1.062 0 0 0 0-1.5 1.062 1.062 0 0 0-.746-.312z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-reinitialiser-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-reinitialiser-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..84fd4f1880452f0cd194fe10a50b8458b6d9c0f4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-reinitialiser-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>History</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M13.028 1.778c-5.546 0-10.075 4.447-10.215 9.96l-.42-.42a.964.964 0 0 0-.676-.282.964.964 0 0 0-.685.283.964.964 0 0 0 0 1.362l2.057 2.058a.964.964 0 0 0 1.362 0L6.51 12.68a.964.964 0 0 0 0-1.362.964.964 0 0 0-1.362 0l-.406.405a8.277 8.277 0 0 1 8.287-8.017A8.279 8.279 0 0 1 21.32 12a8.279 8.279 0 0 1-8.293 8.293.964.964 0 0 0-.964.965.964.964 0 0 0 .964.964c5.634 0 10.222-4.588 10.222-10.222 0-5.634-4.588-10.222-10.222-10.222zm0 4.114a.964.964 0 0 0-.964.965V12a.964.964 0 0 0 .283.681l3.086 3.086a.964.964 0 0 0 1.362 0 .964.964 0 0 0 0-1.362L13.992 11.6V6.857a.964.964 0 0 0-.964-.965z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-supprimer-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-supprimer-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..103729092ed30b1261399b5aaf18618229a30302
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/formulaire-action-supprimer-xx.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" stroke="#444" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#444"><title>Close</title><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M4.691 3.75a.938.938 0 0 0-.666.275.938.938 0 0 0 0 1.325l6.65 6.65-6.65 6.65a.938.938 0 0 0 0 1.325.938.938 0 0 0 1.325 0l6.65-6.65 6.65 6.65a.938.938 0 0 0 1.325 0 .938.938 0 0 0 0-1.325L13.325 12l6.65-6.65a.938.938 0 0 0 0-1.325.938.938 0 0 0-1.325 0L12 10.675l-6.65-6.65a.938.938 0 0 0-.659-.275z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#444" stroke="none"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/saisies-xx.svg b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/saisies-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5ae66790b621d8f73650b25107c0795ff29b7233
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/prive/themes/spip/images/saisies-xx.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#666" d="M52 58H12c-3.3 0-6-2.7-6-6V12c0-3.3 2.7-6 6-6h40c3.3 0 6 2.7 6 6v40c0 3.3-2.7 6-6 6z"  />
+  <circle fill="#fff" cx="18.4" cy="19.9" r="7.7"/>
+  <circle fill="#fff" cx="47" cy="19.9" r="7.7"/>
+  <circle fill="#1d83d4" cx="47" cy="19.9" r="4.5"/>
+  <path fill="#fff" d="M51.3 52.2H12.7c-1.1 0-2-.9-2-2v-10c0-1.1.9-2 2-2h38.6c1.1 0 2 .9 2 2v10c0 1.1-.9 2-2 2z"/>
+  <path fill="#1d83d4" d="M14.1 40h3.8v10h-3.8z"/>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/_base.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/_base.html
new file mode 100644
index 0000000000000000000000000000000000000000..b7f248a6ce9b99e6030fce93919e2bbb2c49f097
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/_base.html
@@ -0,0 +1,61 @@
+[(#REM)
+
+Parametres :
+** : obligatoire
+* : fortement conseille
+
+- ** nom : nom du parametre
+- * label : nom joli
+- * valeur : valeur actuelle du parametre
+- valeur_uniquement : si présent, n'affichera pas le label ni le bloc englobant la valeur
+- sans_reponse : texte affiché s'il n'y a rien de saisi pour ce champ
+
+Hors option 'valeur_uniquement' :
+- conteneur_class : pour ajouter une classe CSS sur le conteneur
+- vue_class : pour ajouter une classe CSS sur le bloc englobant la valeur
+
+]
+[(#SET{sans_reponse,#ENV{sans_reponse}|is_null|?{<:saisies:vue_sans_reponse:>,#ENV{sans_reponse}}})]
+
+#SET{valeur_uniquement,#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|oui}
+#SET{enfants,#ENV*{saisies}|et{#ENV*{saisies}|is_array}}
+
+[(#REM) On génère la réponse et on l'enregistre dans une variable. Doit être VIDE s'il n'y a pas de réponse. ]
+	#SET{reponse,''}
+	[(#CHEMIN{saisies-vues/#ENV{type_saisie}.html}|oui)
+		#SET{reponse,#INCLURE{fond=saisies-vues/#ENV{type_saisie},env,sans_reponse=#GET{sans_reponse}}|trim}
+	]
+	[(#CHEMIN{saisies-vues/#ENV{type_saisie}.html}|non)
+		#SET{reponse,#ENV*{valeur}|saisie_traitement_vue{#ENV**}}
+	]
+
+[(#REM) Maintenant on affiche en encapsulant ou pas ]
+[(#REM) Cas normal avec présentation ]
+[(#GET{valeur_uniquement}|non)
+<div class="champ afficher[ afficher_(#ENV{nom}|saisie_nom2classe)][ saisie_(#ENV{type_saisie})][ (#ENV{conteneur_class,#ENV{li_class}})][ (#GET{reponse}|non)sans_reponse vide]"[ (#ENV{type_saisie}|=={fieldset}|oui) aria-labelledby="#ENV{nom}_label"]>
+	[(#REM) S'il y a des enfants on n'inclut que la vue ]
+	[(#GET{enfants}|oui)
+		#GET{reponse}
+	]
+	[(#GET{enfants}|non|et{#ENV{type_saisie}|!={explication}})
+		[<strong class="label">(#ENV*{label_case,#ENV*{label,#ENV{nom}}})</strong>]
+		<div class="valeur #ENV{vue_class}">
+		[(#GET{reponse}|sinon{#GET{sans_reponse}})]
+		</div>
+	]
+	[(#ENV{voir_explications,non}|!={non}|et{#ENV{type_saisie}|=={explication}}|oui)
+		<INCLURE{fond=saisies/explication,env} />
+	]
+</div>
+]
+
+[(#REM) Cas où on demande uniquement la valeur ]
+[(#GET{valeur_uniquement}|oui)
+	[(#REM) S'il y a des enfants on inclut que la vue ]
+	[(#GET{enfants}|oui)
+		#GET{reponse}
+	]
+	[(#GET{enfants}|non)
+		[(#GET{reponse}|sinon{#GET{sans_reponse}})]
+	]
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/auteurs.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/auteurs.html
new file mode 100644
index 0000000000000000000000000000000000000000..e46baf5f27f5f1bd92a191eb96760e9430267dca
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/auteurs.html
@@ -0,0 +1,16 @@
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
+	[(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]
+	<B_auteurs_selectionnes>
+	<ul>
+	<BOUCLE_auteurs_selectionnes(AUTEURS){id_auteur IN #GET*{valeur}}
+		{par num nom, nom}{statut ?}{statut != 5poubelle}{tout}>
+		<li class="choix">#NOM (#ID_AUTEUR)</li>
+	</BOUCLE_auteurs_selectionnes>
+	</ul>
+	</B_auteurs_selectionnes>
+</BOUCLE_test_multiple>
+	<BOUCLE_auteur_selectionne(AUTEURS){id_auteur=#ENV{valeur}}
+		{statut ?}{statut != 5poubelle}{tout}>
+	  	<p>#NOM (#ID_AUTEUR)</p>
+	</BOUCLE_auteur_selectionne>
+<//B_test_multiple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/case.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/case.html
new file mode 100644
index 0000000000000000000000000000000000000000..e5efa22b327ba74986e1e4e49ec820e7a630eac9
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/case.html
@@ -0,0 +1,6 @@
+[<p>(#ENV*{valeur}|=={#ENV*{valeur_oui,on}}|?{
+	#ENV{label_oui,<:item_oui:>}, 
+	#ENV{label_non,<:item_non:>}
+})
+</p>]
+
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/checkbox.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/checkbox.html
new file mode 100644
index 0000000000000000000000000000000000000000..78eeefd14992bdeb2e178fb3652fa98065ecada0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/checkbox.html
@@ -0,0 +1,15 @@
+[(#REM) data peut être une chaine qu'on sait décomposer ]
+#SET{data, #ENV*{data, #ENV*{datas}}|saisies_aplatir_tableau{#ENV{vue_masquer_sous_groupe}}}
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau{#GET{data}}}
+<B_choix>
+<ul class="spip">
+	<BOUCLE_choix(DATA){source tableau, #GET{valeur}}>
+	[(#ENV{cle_ou_valeur,valeur}|=={cle}|?{
+		[<li class="choix">(#VALEUR)</li>],
+		[<li class="choix">(#GET{data/#VALEUR})</li>]
+	})]
+	</BOUCLE_choix>
+
+	[<li class="choix"><em>#ENV{choix_alternatif_label}</em> : (#GET{valeur/choix_alternatif})</li>]
+</ul>
+</B_choix>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/choix_grille.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/choix_grille.html
new file mode 100644
index 0000000000000000000000000000000000000000..1cdc2a0ac7f11e4f5331c9b85ff521e52a555059
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/choix_grille.html
@@ -0,0 +1,35 @@
+[(#REM) data peut être une chaine qu'on sait décomposer ]
+#SET{data_cols, #ENV*{data_cols}|saisies_chaine2tableau}
+#SET{data_rows, #ENV*{data_rows}|saisies_chaine2tableau}
+<BOUCLE_test_export(CONDITION){si #ENV{valeur_uniquement}}{si #ENV{valeur_uniquement}|!={non}}>
+[(#REM) dans le cas d'un export des réponses, on construit des données structurées,exploitables par un script ]
+
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur_forcee, #ENV{valeur}}|saisies_valeur2tableau}
+
+#SET{separateur,'|'}
+
+<BOUCLE_lignes (DATA) {source table,#GET{data_rows}}{'<br>'}>
+	#SET{choix,#ARRAY}
+	#SET{libelles, #VALEUR|explode{'|'}}
+	<B_colonnes>
+	<BOUCLE_colonnes (DATA) {source table,#GET{data_cols}}>
+		#SET{coche, #CLE|=={#GET{valeur/#_lignes:CLE}}}
+		[(#ENV{multiple}|et{#ENV{multiple}|!={non}}|oui)
+			[(#REM)<!-- le saisie_chaine2tableau permet de s'assurer que la ligne est au bon format si avant l'option multiple n'était pas activé -->]
+			#SET{coche, #CLE|in_array{#GET{valeur/#_lignes:CLE}|saisies_chaine2tableau}}
+		]
+		[(#GET{coche}|oui)
+			[(#SET{valeur_choix,#ENV{cle_ou_valeur,valeur}|=={cle}|?{#CLE,#GET{data_cols/#CLE}}})]
+			#SET{choix,#GET{choix}|push{#GET{valeur_choix}}
+		]
+	</BOUCLE_colonnes>
+	[* (#GET{libelles}|table_valeur{0})#GET{separateur}][(#GET{separateur}|join{#GET{choix}})]
+	</B_colonnes>
+</BOUCLE_lignes>
+
+</BOUCLE_test_export>
+[(#REM) dans le cas d'un affichage de la réponse, on réaffiche la saisie en mode disabled ]
+#INCLURE{fond=saisies/choix_grille,env,disabled=disabled,data_rows=#GET{data_rows},data_cols=#GET{data_cols}}
+<//B_test_export>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/conteneur_inline.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/conteneur_inline.html
new file mode 100644
index 0000000000000000000000000000000000000000..1b1a62b025be7f119ac6de7f1e4db905f0bbbd4b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/conteneur_inline.html
@@ -0,0 +1,12 @@
+
+[(#ENV{saisies}|is_array|oui)
+	[
+		[(#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|non)
+			<div class="conteneur_inline_champs">
+		]
+			(#INCLURE{fond=inclure/voir_saisies, env, from_fieldset='on'})
+		[(#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|non)
+			</div>
+		]
+	]
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/couleur.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/couleur.html
new file mode 100644
index 0000000000000000000000000000000000000000..98caa939062d76c3bd3b237c945e2c29dea6dc32
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/couleur.html
@@ -0,0 +1,4 @@
+<p>
+	<span class='couleur'[ style="background-color:#(#ENV{valeur}|ltrim{#}); width:4em; border:1px solid #888; display:inline-block;"]>&nbsp;</span>
+	[(#ENV{valeur})]
+</p>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/date.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/date.html
new file mode 100644
index 0000000000000000000000000000000000000000..d91915753eca61fe32edd3d241abab36ab6d0748
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/date.html
@@ -0,0 +1,17 @@
+#SET{valeur, #ENV{valeur}}
+[(#GET{valeur}|=={0000-00-00 00:00:00}|oui)
+	#SET{valeur,''}
+]
+[(#GET{valeur}|=={0000-00-00}|oui)
+	#SET{valeur,''}
+]
+[(#REM) Seulement si c'est une date SQL, on transforme en format slash. Sinon ça continue d'afficher la valeur de départ ]
+#SET{date_mysql,([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])}
+[(#GET{valeur}|match{#GET{date_mysql}}|oui)
+	[(#ENV{horaire}|?{
+		#SET{valeur,#ENV{valeur}|affdate{'d/m/Y H:i:s'}}
+		,
+		#SET{valeur,#ENV{valeur}|affdate{'d/m/Y'}}
+	})]
+]
+[<p class="date">(#GET{valeur})</p>]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/date_jour_mois_annee.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/date_jour_mois_annee.html
new file mode 100644
index 0000000000000000000000000000000000000000..a6c63eeb8bcdbd77575d0b037a2e91da720c4c44
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/date_jour_mois_annee.html
@@ -0,0 +1 @@
+<INCLURE{fond=saisies-vues/date, env}>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/destinataires.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/destinataires.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f2725e1e3643a4d10fa1660d0843a88243b1f2c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/destinataires.html
@@ -0,0 +1,8 @@
+[(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]
+<B_destinataires>
+<ul>
+	<BOUCLE_destinataires(AUTEURS){tout}{id_auteur IN #GET*{valeur}}>
+	<li class="choix">#NOM</li>
+	</BOUCLE_destinataires>
+</ul>
+</B_destinataires>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/explication.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/explication.html
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/fieldset.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/fieldset.html
new file mode 100644
index 0000000000000000000000000000000000000000..24419644a43613fed41d6b016f37304aaa7840bd
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/fieldset.html
@@ -0,0 +1,15 @@
+
+[(#ENV{saisies}|is_array|oui)
+	[
+		[(#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|non)
+		<fieldset class="fieldset_valeurs">
+			[<legend [id="(#ENV{nom})_label"] class="fieldset_legend[ (#ENV{vue_class})]">(#ENV*{label})</legend>]
+			<div class="fieldset_champs">
+		]
+			(#INCLURE{fond=inclure/voir_saisies, env, from_fieldset='on'})
+		[(#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|non)
+			</div>
+		</fieldset>
+		]
+	]
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/groupe_mots.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/groupe_mots.html
new file mode 100644
index 0000000000000000000000000000000000000000..a820b0bc4aeb775006d45165cfc32b3559de0a0f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/groupe_mots.html
@@ -0,0 +1,9 @@
+[(#SET{valeurs,[(#ENV{multiple}|oui|?{#ENV*{valeur},#ARRAY{0,#ENV{valeur}}})]})]
+
+<B_choix>
+<ul>
+	<BOUCLE_choix(GROUPES_MOTS){id_groupe IN #GET{valeurs}}{par titre}>
+	<li class="choix">#TITRE</li>
+	</BOUCLE_choix>
+</ul>
+</B_choix>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/mot.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/mot.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce62d04e84a07dd624bed8530a8a1c0a4f8f3c61
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/mot.html
@@ -0,0 +1,2 @@
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+<B_mots><p><BOUCLE_mots(DATA){source tableau, #GET{valeur}}{', '}><a href="[(#VALEUR|generer_url_entite{mot})]">#INFO_TITRE{mot,#VALEUR}</a></BOUCLE_mots></p></B_mots>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/oui_non.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/oui_non.html
new file mode 100644
index 0000000000000000000000000000000000000000..dcd2157d8d33fa3662d093cba01111628e132f2f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/oui_non.html
@@ -0,0 +1 @@
+[<p>(#ENV*{valeur}|et{#ENV{valeur}|!={#ENV{valeur_non,non}}}|?{<:item_oui:>,<:item_non:>})</p>]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/radio.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/radio.html
new file mode 100644
index 0000000000000000000000000000000000000000..18d0009649b4aec02fa6c45faad22afaeb8ff1cf
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/radio.html
@@ -0,0 +1,6 @@
+[(#REM) data peut être une chaine qu'on sait décomposer ]
+#SET{data, #ENV*{data, #ENV*{datas}}|saisies_aplatir_tableau{#ENV{vue_masquer_sous_groupe}}}
+[(#ENV{cle_ou_valeur,valeur}|=={cle}|?{
+	[<p>(#ENV{valeur})</p>],
+	[<p>(#GET{data/#ENV{valeur}})</p>]
+})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/secteur.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/secteur.html
new file mode 100644
index 0000000000000000000000000000000000000000..2e21e2b79cec6b993452a316341831a1e617af6b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/secteur.html
@@ -0,0 +1,10 @@
+[(#REM) valeur peut être une chaine qu'on sait décomposer ]
+#SET{valeur, #ENV{valeur}|saisies_chaine2tableau}
+
+<B_choix>
+<ul>
+	<BOUCLE_choix(RUBRIQUES){id_rubrique IN #GET*{valeur}}>
+	<li class="choix">#TITRE</li>
+	</BOUCLE_choix>
+</ul>
+</B_choix>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur.html
new file mode 100644
index 0000000000000000000000000000000000000000..56794040298b67b03c6bc2f4ac099500df2e2631
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur.html
@@ -0,0 +1,30 @@
+[(#REM)
+
+  ### /!\ selecteur (spip Bonux) ###
+	  Attention, ce qui est retourne est un tableau :
+	  _request($name) = array('rubrique|3', 'rubrique|9', 'rubrique|10');
+	  Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :
+	  [(#CHAMP|picker_selected{article})]
+	  Cette fonction peut etre pratique dans une boucle en utilisant le critere IN
+
+]
+
+
+[(#SET{selection,#VALEUR|saisies_picker_selected_par_objet})]
+
+<BOUCLE_au_moins_un(CONDITION){si #GET{selection}}>
+	<BOUCLE_un(DATA){source table,#GET{selection}}{si (#GET{selection}|count|=={1})}>
+		<p>
+			[(#OBJET|objet_info{texte_objet}|_T)] #ID_OBJET&nbsp;: #INFO_TITRE{#OBJET,#ID_OBJET}
+		</p>
+	</BOUCLE_un>
+	<B_plusieurs>
+		<ul>
+	<BOUCLE_plusieurs(DATA){source table,#GET{selection}}{si (#GET{selection}|count|>{1})}>
+			<li class="choix">
+				[(#OBJET|objet_info{texte_objet}|_T)] #ID_OBJET&nbsp;: #INFO_TITRE{#OBJET,#ID_OBJET}
+			</li>
+	</BOUCLE_plusieurs>
+		</ul>
+	</B_plusieurs>
+</BOUCLE_au_moins_un>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..55c38dcc89e9410ee630f82ae4d5c43c71486bac
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article.html
@@ -0,0 +1,23 @@
+[(#REM) 
+	  
+  ### /!\ selecteur (spip Bonux) ###
+	  Attention, ce qui est retourne est un tableau :
+	  _request($name) = array('article|3', 'article|9', 'article|10');
+	  Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :
+	  [(#CHAMP|picker_selected{article})]
+	  Cette fonction peut etre pratique dans une boucle en utilisant le critere IN
+	  
+]
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
+	<B_articles_selectionnes>
+	<ul>
+	<BOUCLE_articles_selectionnes(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>
+		<li class="choix">#TITRE (<:article:> #ID_ARTICLE) - [(#STATUT|saisies_statut_titre{article})]</li>
+	</BOUCLE_articles_selectionnes>
+	</ul>
+	</B_articles_selectionnes>
+</BOUCLE_test_multiple>
+	<BOUCLE_article_selectionne(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>
+		<p>#TITRE (<:article:> #ID_ARTICLE) - [(#STATUT|saisies_statut_titre{article})]</p>
+	</BOUCLE_article_selectionne>
+<//B_test_multiple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article_fonctions.php b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..9dbb831c033fe89c31cfec3227455917249b3819
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_article_fonctions.php
@@ -0,0 +1,7 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('prive/formulaires/selecteur/selecteur_fonctions');
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_document.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_document.html
new file mode 100644
index 0000000000000000000000000000000000000000..9636f3252504502953f5c7b7233f3cd7d498a878
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_document.html
@@ -0,0 +1,3 @@
+<BOUCLE_doc(DOCUMENTS){id_document=#ENV{valeur}}{statut==.*}>
+<p>#ID_DOCUMENT - #TITRE (#TYPE_DOCUMENT [(#TAILLE|taille_en_octets)])</p>
+</BOUCLE_doc>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique.html
new file mode 100644
index 0000000000000000000000000000000000000000..4d100c13206a7909b2bd23eafe70dbc2db49eb78
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique.html
@@ -0,0 +1,24 @@
+[(#REM) 
+	  
+  ### /!\ selecteur (spip Bonux) ###
+	  Attention, ce qui est retourne est un tableau :
+	  _request($name) = array('rubrique|3', 'rubrique|9', 'rubrique|10');
+	  Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :
+	  [(#CHAMP|picker_selected{article})]
+	  Cette fonction peut etre pratique dans une boucle en utilisant le critere IN
+	  
+]
+
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
+	<B_rubriques_selectionnees>
+	<ul>
+	<BOUCLE_rubriques_selectionnees(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>
+		<li class="choix">#TITRE (<:rubrique:> #ID_RUBRIQUE) - [(#STATUT|saisies_statut_titre{rubrique})]</li>
+	</BOUCLE_rubriques_selectionnees>
+	</ul>
+	</B_rubriques_selectionnees>
+</BOUCLE_test_multiple>
+	<BOUCLE_rubrique_selectionnee(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>
+		<p>#TITRE (<:rubrique:> #ID_RUBRIQUE) - [(#STATUT|saisies_statut_titre{rubrique})]</p>
+	</BOUCLE_rubrique_selectionnee>
+<//B_test_multiple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique_article.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..1c005b5fa402e65f856fc77e7aaa434d28817d8c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_rubrique_article.html
@@ -0,0 +1,38 @@
+[(#REM) 
+	  
+  ### /!\ selecteur (spip Bonux) ###
+	  Attention, ce qui est retourne est un tableau :
+	  _request($name) = array('article|3', 'article|9', 'rubrique|10');
+	  Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :
+	  [(#CHAMP|picker_selected{article})]
+	  Cette fonction peut etre pratique dans une boucle en utilisant le critere IN
+	  
+]
+#SET{reponse,""}
+
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
+	<B_rubriques_selectionnees>
+	<ul>
+	<BOUCLE_rubriques_selectionnees(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>
+		<li class="choix">#TITRE (<:rubrique:> #ID_RUBRIQUE) - [(#STATUT|saisies_statut_titre{rubrique})]</li>
+	</BOUCLE_rubriques_selectionnees>
+	</ul>
+	</B_rubriques_selectionnees>
+
+	<B_articles_selectionnes>
+	<ul>
+	<BOUCLE_articles_selectionnes(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>
+		<li class="choix">#TITRE (<:article:> #ID_ARTICLE) - [(#STATUT|saisies_statut_titre{article})]</li>
+	</BOUCLE_articles_selectionnes>
+	</ul>
+	</B_articles_selectionnes>
+
+</BOUCLE_test_multiple>
+	<BOUCLE_rubrique_selectionnee(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>
+		<p>#TITRE (<:rubrique:> #ID_RUBRIQUE) - [(#STATUT|saisies_statut_titre{rubrique})]</p>
+	</BOUCLE_rubrique_selectionnee>
+
+	<BOUCLE_article_selectionne(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>
+		<p>#TITRE (<:article:> #ID_ARTICLE) - [(#STATUT|saisies_statut_titre{article})]</p>
+	</BOUCLE_article_selectionne>
+<//B_test_multiple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_site.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_site.html
new file mode 100644
index 0000000000000000000000000000000000000000..8b1c25f5e167efca99ee0392c058481adac476cc
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selecteur_site.html
@@ -0,0 +1,13 @@
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|oui}>
+	<B_sites_selectionnes>
+	<ul>
+	<BOUCLE_sites_selectionnes(SITES){id_syndic IN #ENV*{valeur}}>
+		<li class="choix">#NOM SITE (#ID_SYNDIC)</li>
+	</BOUCLE_sites_selectionnes>
+	</ul>
+	</B_sites_selectionnes>
+</BOUCLE_test_multiple>
+	<BOUCLE_site_selectionne(SITES){id_syndic=#ENV{valeur}}>
+	  	<p>#NOM_SITE (#ID_SYNDIC)</p>
+	</BOUCLE_site_selectionne>
+<//B_test_multiple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selection.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selection.html
new file mode 100644
index 0000000000000000000000000000000000000000..cb47ca7f9569c808f715e7aa29749f910f3e0925
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selection.html
@@ -0,0 +1,10 @@
+[(#REM) data peut être une chaine qu'on sait décomposer ]
+<BOUCLE_simple(CONDITION){si #ENV{multiple}|non}>
+#SET{data, #ENV*{data, #ENV*{datas}}|saisies_aplatir_tableau{#ENV{vue_masquer_sous_groupe}}}
+[(#ENV{cle_ou_valeur,valeur}|=={cle}|?{
+	[<p>(#ENV{valeur})</p>],
+	[<p>(#GET{data/#ENV{valeur}})</p>]
+})]
+</BOUCLE_simple>
+<INCLURE{fond=saisies-vues/selection_multiple,env} />
+<//B_simple>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies-vues/selection_multiple.html b/design_system_dependences/saisies/v5.2.0/saisies-vues/selection_multiple.html
new file mode 100644
index 0000000000000000000000000000000000000000..007a4c78c407e31cc168272685aa5bdb3d77cd17
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies-vues/selection_multiple.html
@@ -0,0 +1,10 @@
+[(#REM) data peut être une chaine qu'on sait décomposer ]
+#SET{data, #ENV*{data, #ENV*{datas}}|saisies_aplatir_tableau}
+#SET{valeur, #ENV*{valeur}|saisies_valeur2tableau{#ENV{vue_masquer_sous_groupe}}}
+<B_choix>
+<ul>
+	<BOUCLE_choix(DATA){source tableau, #GET{valeur}}>
+	<li class="choix">#GET{data/#VALEUR}</li>
+	</BOUCLE_choix>
+</ul>
+</B_choix>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies.svg b/design_system_dependences/saisies/v5.2.0/saisies.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5ae66790b621d8f73650b25107c0795ff29b7233
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#666" d="M52 58H12c-3.3 0-6-2.7-6-6V12c0-3.3 2.7-6 6-6h40c3.3 0 6 2.7 6 6v40c0 3.3-2.7 6-6 6z"  />
+  <circle fill="#fff" cx="18.4" cy="19.9" r="7.7"/>
+  <circle fill="#fff" cx="47" cy="19.9" r="7.7"/>
+  <circle fill="#1d83d4" cx="47" cy="19.9" r="4.5"/>
+  <path fill="#fff" d="M51.3 52.2H12.7c-1.1 0-2-.9-2-2v-10c0-1.1.9-2 2-2h38.6c1.1 0 2 .9 2 2v10c0 1.1-.9 2-2 2z"/>
+  <path fill="#1d83d4" d="M14.1 40h3.8v10h-3.8z"/>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/_base.html b/design_system_dependences/saisies/v5.2.0/saisies/_base.html
new file mode 100644
index 0000000000000000000000000000000000000000..1ddf2cc354eceea6794695567a4d48ccfa048eb4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/_base.html
@@ -0,0 +1,117 @@
+[(#REM)
+
+  Parametres :
+  ** : obligatoire
+  * : fortement conseille
+
+  - ** nom : nom du parametre
+  - * label : nom joli
+  (- * erreurs : tableau des erreurs) (transmis par defaut avec SAISIE)
+  (- * valeur : valeur actuelle du parametre) (transmis par defaut avec SAISIE : valeur=#ENV{nom du parametre}})
+  - defaut : valeur par defaut du parametre
+  - obligatoire : est-ce un parametre obligatoire ? (defaut: non, valeurs : null/"non"/autre=oui )
+  - info_obligatoire : si obligatoire, ajoute ce contenu apres le label (defaut : "")
+  - explication : texte d'explication suppplementaire
+  - explication_apres : une explication après la saisie
+  - attention : texte pour les cas graves !
+  - disable : est-ce que le champ est desactive ? (pas de saisie possible, selection impossible, contenus non postes)
+              (defaut: non, valeurs : null/"non"/autre=oui ) n'est peut etre pas valable pour toutes les saisies.
+  - disable_avec_post : idem disable, mais en envoyant en hidden le champ tout de meme.
+  - readonly : est-ce que le champ est non modifiable ? (pas de saisie possible, selection possible, contenus postes)
+              (defaut: non, valeurs : null/"non"/autre=oui ) n'est peut etre pas valable pour toutes les saisies.
+  - conteneur_class : Classe CSS à ajouter au conteneur
+  - li_class : pour compatibilité. Voir conteneur_class
+  - label_class : pour mettre des styles sur les labels
+
+
+  Exemples d'appels :
+	[(#SAISIE{input, couleur_foncee,
+		label=<:spa:couleur_foncee:>,
+		obligatoire=oui})]
+
+]
+[(#REM)<!-- on ne génère une saisie que si elle a un nom -->]
+[(#ENV{nom}|oui)
+
+	[(#REM)<!-- Plusieurs formatage possible pour les noms tabulaires passé à #ENV{nom}
+		1. Syntaxe SPIP avec slash
+		2. Syntaxe HTML avec crochets
+		On stock 1. dans nom et 2 dans name. -->
+	]
+	[(#SET{name,#ENV{nom}|saisie_nom2name})]
+	[(#SET{nom,#ENV{nom}|saisie_name2nom})]
+
+	[(#REM)<!-- caractère obligatoire, désactivé ou readonly de la saisie-->]
+	#SET{obligatoire,#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|?{obligatoire,''}}
+	#SET{disable,#ENV{disable,#ENV{disable_avec_post}}|et{#ENV{disable,#ENV{disable_avec_post}}|!={non}}|?{#ENV{disable}|is_array|?{#ENV{disable,#ARRAY},disabled},''}}
+	#SET{readonly,#ENV{readonly}|et{#ENV{readonly}|!={non}}|?{readonly,''}}
+
+
+
+	[(#REM)<!-- Si la saisie est autonome, ne pas l'encapusler-->]
+	#SET{saisies_autonomes,#VAL|saisies_autonomes}
+	[(#ENV{type_saisie}|in_array{#GET{saisies_autonomes}}|oui)
+		[(#INCLURE{fond=saisies/#ENV{type_saisie},env,nom=#GET{name},obligatoire=#GET{obligatoire},disable=#GET{disable},readonly=#GET{readonly}})]
+	]
+
+
+	[(#ENV{type_saisie}|in_array{#GET{saisies_autonomes}}|non)
+
+
+		[(#REM)<!-- définir l'encapsulation de la saisie et du label (problèmatique d'accessibilité)-->]
+		#SET{conteneur_tag,div}
+		#SET{conteneur_label,label}
+		[(#ENV{type_saisie}|in_array{#LISTE{oui_non,radio,checkbox,case,choix_grille}}|oui)
+			#SET{conteneur_tag,fieldset}
+			#SET{conteneur_label,legend}
+		]
+
+		[(#REM)<!-- affichage des erreur -->]
+
+		[(#REM)<!-- Plusieurs formatage possible pour les noms tabulaires
+			1. Syntaxe SPIP avec slash
+			2. Syntaxe HTML avec crochets
+
+			De même pour erreurs on peut avoir
+			1. Syntaxe SPIP avec slash (ex. form de config où le nomme avev slash)
+			2. Syntaxe PHP array(entre=> array(sous-entre=>array())) (ex. formidable)
+			3. Syntaxe HTML avec crochets (ex. form de config où l'on nomme avec crochet)
+
+			On utilise la fonction dédié pour cela
+		-->
+		]
+		#SET{erreur,#ENV{erreurs}|saisies_trouver_erreur{#GET{nom}}}
+
+
+
+		[(#REM)<!-- gestion des describedby -->]
+		#SET{describedby, ''}
+		[(#ENV*{explication}|oui) #SET{describedby, #GET{describedby}|concat{' ',explication_#ENV{nom}|saisie_nom2classe} ]
+
+		[(#REM)<!-- et maintenant début de la saisie -->]
+		<!--!inserer_saisie_editer-->
+		<[(#GET{conteneur_tag})] class="editer editer_[(#ENV{nom}|saisie_nom2classe)][ (#GET{obligatoire})][ (#GET{erreur}|oui)erreur][ (#GET{disable}|oui)disabled][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)]"[ data-id="(#ENV{id_saisie})"][ data-afficher_si="(#ENV*{afficher_si}|saisies_afficher_si_js{#ENV{_saisies}})"]>
+			#ENV**{inserer_debut}
+
+
+			[(#REM)<!-- tout ce qui se trouve avant les champs de form au sens html -->]
+			[<[(#GET{conteneur_label})]  class="editer-label[ (#GET{conteneur_label}|=={legend}|oui)label][ (#ENV{label_class})]"[(#ENV{type_saisie}|match{oui_non|radio|checkbox|case|fichiers}|non) for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"][(#ENV{type_saisie}|=={fichiers}|et{#ENV{nb_fichiers,1}|=={1}}) for="[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_0"]>(#ENV*{label})[(#ENV{aide}|oui)#AIDER{#ENV{aide}}][<span class='obligatoire'>(#GET{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</[(#GET{conteneur_label})]>]
+
+			[<span class='erreur_message' id="[erreur_(#ENV{nom}|saisie_nom2classe)]">(#GET{erreur})</span> #SET{describedby, #GET{describedby}|concat{' ',erreur_#ENV{nom}|saisie_nom2classe} ]
+			[<p class="explication" id="[explication_(#ENV{nom}|saisie_nom2classe)]">(#ENV*{explication})</p>]
+			[<em class='attention'>(#ENV*{attention})</em>]
+
+			[(#REM)<!-- appeler la saisie proprement dite -->]
+			[(#INCLURE{fond=saisies/#ENV{type_saisie},env,nom=#GET{name}, disable=#GET{disable},readonly=#GET{readonly},describedby=#GET{describedby}|trim})]
+
+
+			[<p class="explication explication_apres" id="[explication_apres(#ENV{nom}|saisie_nom2classe)]">(#ENV*{explication_apres})</p>]
+
+			[(#REM)<!-- gerer le disable avec post -->]
+			[(#ENV{disable_avec_post}|et{#ENV{disable_avec_post}|!={non}}|et{#ENV{type_saisie}|in_array{#LISTE{case,checkbox}}|non}|oui)<input type='hidden' name='#GET{name}' value="#ENV{valeur,#ENV{defaut}}" />]
+
+			[(#REM)<!-- finir la saisie -->]
+			#ENV**{inserer_fin}
+		</[(#GET{conteneur_tag})]>
+	]
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/_base/afficher_si.yaml b/design_system_dependences/saisies/v5.2.0/saisies/_base/afficher_si.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2b0c32ae9e7f5950ea4f5e9ef65984f467975d08
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/_base/afficher_si.yaml
@@ -0,0 +1,25 @@
+-
+  saisie: 'textarea'
+  options:
+    nom: 'afficher_si'
+    label: '<:saisies:option_afficher_si_label:>'
+    explication: '<:saisies:option_afficher_si_explication:>'
+    rows: 5
+  verifier:
+    type: 'afficher_si'
+-
+  saisie: 'case'
+  options:
+    nom: 'afficher_si_remplissage_uniquement'
+    label: '<:saisies:option_afficher_si_remplissage_uniquement_label:>'
+    label_case: '<:saisies:option_afficher_si_remplissage_uniquement_label_case:>'
+    explication: '<:saisies:option_afficher_si_remplissage_uniquement_explication:>'
+    afficher_si: '@afficher_si@'
+-
+  saisie: 'case'
+  options:
+    nom: 'afficher_si_avec_post'
+    label: '<:saisies:option_afficher_si_avec_post_label:>'
+    label_case: '<:saisies:option_afficher_si_avec_post_label_case:>'
+    explication: '<:saisies:option_afficher_si_avec_post_explication:>'
+    afficher_si: '@afficher_si@'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/_base/explication.yaml b/design_system_dependences/saisies/v5.2.0/saisies/_base/explication.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6cfc34d11a379190b1025fc88f95d2851e0ae68e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/_base/explication.yaml
@@ -0,0 +1,14 @@
+-
+  saisie: 'input'
+  options:
+    nom: 'explication'
+    label: '<:saisies:option_explication_label:>'
+    explication: '<:saisies:option_explication_explication:>'
+    size: 50
+-
+  saisie: 'input'
+  options:
+    nom: 'explication_apres'
+    label: '<:saisies:option_explication_apres_label:>'
+    attention: '<:saisies:option_explication_apres_attention:>'
+    size: 50
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/_base/obligatoire.yaml b/design_system_dependences/saisies/v5.2.0/saisies/_base/obligatoire.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..911a805ae9c02bb385c698df3d7a8fca6391dee6
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/_base/obligatoire.yaml
@@ -0,0 +1,20 @@
+-
+  saisie: 'case'
+  options:
+    nom: 'obligatoire'
+    label_case: '<:saisies:option_obligatoire_label:>'
+    conteneur_class: 'pleine_largeur'
+-
+  saisie: 'input'
+  options:
+    nom: 'info_obligatoire'
+    label: '<:saisies:option_info_obligatoire_label:>'
+    explication: '<:saisies:option_info_obligatoire_explication:>'
+    afficher_si: '@obligatoire@'
+-
+  saisie: 'input'
+  options:
+    nom: 'erreur_obligatoire'
+    label: '<:saisies:option_erreur_obligatoire_label:>'
+    explication: '<:saisies:option_erreur_obligatoire_explication:>'
+    afficher_si: '@obligatoire@'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/_base/options_dev.yaml b/design_system_dependences/saisies/v5.2.0/saisies/_base/options_dev.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5ae56ed886869aaed7ae25746913c1ce22c7b339
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/_base/options_dev.yaml
@@ -0,0 +1,22 @@
+-
+  saisie: 'input'
+  options:
+    nom: 'inserer_debut'
+    label: '<:saisies:option_inserer_debut_label:>'
+-
+  saisie: 'input'
+  options:
+    nom: 'inserer_fin'
+    label: '<:saisies:option_inserer_fin_label:>'
+-
+  saisie: 'input'
+  options:
+    nom: 'id'
+    label: '<:saisies:option_id_label:>'
+    explication: '<:saisies:option_id_explication:>'
+-
+  saisie: 'input'
+  options:
+    nom: 'attributs'
+    label: '<:saisies:option_attributs_label:>'
+    explication: '<:saisies:option_attributs_explication:>'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/articles_originaux.html b/design_system_dependences/saisies/v5.2.0/saisies/articles_originaux.html
new file mode 100644
index 0000000000000000000000000000000000000000..b32dc5eae9af36546a1cbd245ce14be79dfb634c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/articles_originaux.html
@@ -0,0 +1,51 @@
+[(#REM)
+
+Saisies qui liste les articles originaux (origine_traduction) du site
+Par défaut ne liste que ceux des rubriques à la racine (secteurs)
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+  	Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int
+  - recursif : si oui liste les articles des rubriques de facon recursive, et pas uniquement les secteurs
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{articles_originaux,articles,
+		label=<:plugin:label_articles:>,
+		multiple=oui})]
+]
+<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+		<option value="0">[(#ENV{option_intro})]</option>]
+		<BOUCLE_articles_originaux_racine(ARTICLES){id_rubrique}{origine_traduction}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+		</BOUCLE_articles_originaux_racine>
+	<BOUCLE_articles_page(ARTICLES){id_secteur<1}{origine_traduction}>
+	[(#ENV{multiple}|oui)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+	</BOUCLE_articles_page>
+	<BOUCLE_secteurs(RUBRIQUES){id_parent = #ENV{id_rubrique,0}}{par num titre, titre}{tout}>
+	<optgroup label="[(#TITRE|supprimer_tags|attribut_html)]">
+		<B_articles_originaux>
+		<BOUCLE_articles_originaux(ARTICLES){id_rubrique}{origine_traduction}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+		</BOUCLE_articles_originaux>
+		</B_articles_originaux>
+		[(#ENV{recursif}|oui)
+		<INCLURE{fond=prive/listes/articles_originaux_recursifs,valeur=#ENV{valeur_forcee,#ENV{valeur}},id_rubrique,multiple} />]
+	</optgroup>
+	</BOUCLE_secteurs>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/auteurs.html b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.html
new file mode 100644
index 0000000000000000000000000000000000000000..da3c9bafcfb065e5a89cad19fbfd99bc62b1081c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.html
@@ -0,0 +1,42 @@
+[(#REM)
+
+	Permet de sélectionner un·e ou plusieurs auteur·trices
+	Réutilise le fond des saisies selection et selection_multiple.
+
+	Paramètres :
+
+	- statut : un tableau des statuts listés
+	- tri : champ sur lequel effectuer le tri (par défaut par nom)
+	- webmestre : si oui, ne selectionne que les webmestres
+	- multiple : « oui » pour permettre de choisir pusieurs valeurs
+
+	+ voir les params des saisies selection et selection_multiple
+
+	Exemple d'appel :
+
+	[(#SAISIE{auteurs,auteurs_site,
+		label=<:plugin:auteurs_du_site:>,
+		multiple=oui,
+		statut=0minirezo})]
+
+]
+#SET{type_saisie, #ENV{multiple}|?{selection_multiple, selection}}
+#SET{data, #ARRAY}
+#SET{defaut_tri,#ARRAY{
+	statut,1,
+	multi nom,1,
+	num nom,1,
+	nom,1,
+	id_auteur,1,
+}}
+<BOUCLE_auteurs(AUTEURS)
+	{statut ?}
+	{statut != 5poubelle}
+	{webmestre ?}
+	{tri #ENV{tri,multi nom},#GET{defaut_tri}}
+	{tout}
+>
+#SET{data, #GET{data}|plus{#ARRAY{#ID_AUTEUR,#NOM}}}
+</BOUCLE_auteurs>
+
+<INCLURE{fond=saisies/#GET{type_saisie}, data=#GET{data}, env}>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/auteurs.php b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb3ab43dc7e91bb8cac8f416a5e33c90126030be
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\auteurs
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function auteurs_valeurs_acceptables($valeur, $description) {
+	$type_saisie = (empty($description['multiple']) ? 'selection' : 'selection_multiple');
+	include_spip("saisies/$type_saisie");
+	$valeurs_acceptables = "{$type_saisie}_valeurs_acceptables";
+	return $valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/auteurs.yaml b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b93d1deba867a5cf3ee3b59dee3c285e2269cce5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/auteurs.yaml
@@ -0,0 +1,123 @@
+
+titre: '<:saisies:saisie_auteurs_titre:>'
+description: '<:saisies:saisie_auteurs_explication:>'
+icone: 'images/saisies_auteurs-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'selection_multiple'
+        options:
+          nom: 'statut'
+          label: '<:saisies:option_statut_label:>'
+          cacher_option_intro: 'oui'
+          size: 3
+          data:
+            0minirezo: '<:ecrire:info_administrateurs:>'
+            1comite: '<:ecrire:info_redacteurs:>'
+            6forum: '<:ecrire:info_visiteurs:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'option_statut'
+          label: '<:saisies:option_option_statut_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_auteurs_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/case.html b/design_system_dependences/saisies/v5.2.0/saisies/case.html
new file mode 100644
index 0000000000000000000000000000000000000000..8a22d99a0b3a613994c6e8099a26f5fc9477d67f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/case.html
@@ -0,0 +1,32 @@
+[(#REM)
+
+  Action :
+    - Rempli "on" si oui, "" si non.
+
+  Parametres :
+    - label_case : pour un label a cote de la case (defaut:"")
+	- defaut : valeur par defaut si pas présente dans l'environnement
+    - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{case, afficher_liste,
+		label=<:plugin:afficher_liste:>,
+		label_case=<:plugin:activer:>,
+		explication=<:plugin:explication_afficher_liste:>})]
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+#SET{obligatoire,#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|?{obligatoire,''}}
+[(#ENV{valeur_oui}|oui)
+	#SET{valeur,#GET{valeur}|in_array{#LISTE{on,#ENV{valeur_oui}}}|?{#ENV{valeur_oui,on},#ENV{valeur_non}}}
+]
+[(#ENV{valeur_oui}|non)
+	#SET{valeur,#GET{valeur}|=={on}|?{#ENV{valeur_oui,on},#ENV{valeur_non}}}
+]
+<div class="choix[ (#ENV{class})]">
+	[(#ENV{disable}|non)<input type="hidden" name="#ENV{nom}" value="#ENV{valeur_non,''}" />]
+	<input type="checkbox" name="#ENV{nom}" class="checkbox" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui) checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})][(#HTML5|et{#ENV{obligatoire}}|et{ #ENV{obligatoire}|!={non} }|oui) required="required"]/>
+	[<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)class="on"]>(#ENV*{label_case})[<span class='obligatoire'>(#GET{obligatoire}|et{#ENV*{label}|non})[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+	[(#ENV{disable_avec_post}|et{#ENV{disable_avec_post}|!={non}}|oui)
+		<input type="hidden" name="#ENV{nom}" value="#GET{valeur}" />
+	]
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/case.php b/design_system_dependences/saisies/v5.2.0/saisies/case.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4390367cdd1306310bd91c34ff449d28c4e23b8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/case.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\case
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function case_valeurs_acceptables($valeur, $description) {
+	$options = $description['options'];
+	$valeur_oui = isset($options['valeur_oui']) ? $options['valeur_oui'] : 'on';
+	$valeur_non = isset($options['valeur_non']) ? $options['valeur_non'] : '';
+	if (saisies_saisie_est_gelee($description)) {
+		if (isset($options['defaut'])) {
+			$defaut = $valeur_oui;
+		} else {
+			$defaut = $valeur_non;
+		}
+		return $valeur == $defaut;
+	} else {
+		return ($valeur == $valeur_oui || $valeur == $valeur_non);
+	}
+}
+
+/**
+ * Retourne le label de la saisie `case`
+ * Par ordre de priorité le `label_case`
+ * sinon le `label`
+ * @param array $saisie
+ * @return string
+**/
+function case_get_label(array $saisie): string {
+	$label_case = $saisie['options']['label_case'] ?? '';
+	if ($label_case) {
+		return $label_case;
+	} else {
+		return $saisie['options']['label'] ?? '';
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/case.yaml b/design_system_dependences/saisies/v5.2.0/saisies/case.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f656bb628af540a1b0be48c8183269976905145e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/case.yaml
@@ -0,0 +1,135 @@
+
+titre: '<:saisies:saisie_case_titre:>'
+description: '<:saisies:saisie_case_explication:>'
+icone: 'images/saisies_case-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'label_case'
+          label: '<:saisies:option_label_case_label:>'
+          size: 50
+
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'valeur_oui'
+          label: '<:saisies:option_valeur_oui_label:>'
+          explication: '<:saisies:option_case_valeur_oui_explication:>'
+          size: 50
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'valeur_non'
+          label: '<:saisies:option_valeur_non_label:>'
+          explication: '<:saisies:option_case_valeur_non_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'label_oui'
+          label: '<:saisies:option_label_oui_label:>'
+          explication: '<:saisies:option_label_oui_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'label_non'
+          label: '<:saisies:option_label_non_label:>'
+          explication: '<:saisies:option_label_non_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+          placeholder: 'pleine_largeur'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_case_titre:>'
+    label_case: '<:saisies:saisie_case_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "varchar(3) DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/champ.html b/design_system_dependences/saisies/v5.2.0/saisies/champ.html
new file mode 100644
index 0000000000000000000000000000000000000000..52678f414834051d4e800e4f926250d241f39e27
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/champ.html
@@ -0,0 +1,19 @@
+[(#REM)
+<!-- Saisie permettant de choisir un champ dans un tableau de saisie, typiquement utilisé par formidable pour la configuration des traitements -->
+]
+[(#SET{
+	data,
+	#ENV{formulaire}|saisies_lister_champs_par_section{
+		#ARRAY{
+		forcer_type,#ENV{forcer_type},
+		callback_section, saisies_saisie_get_label,
+		callback_champ, saisies_saisie_get_label,
+		profondeur_max_output,1
+			}
+		}
+	}
+)]
+[(#ENV{type_choix}|=={radio}|oui)
+	#SET{data,#ARRAY{'',#VAL{saisies:saisie_champ_option_aucun}|_T}|array_merge{#GET{data}}}
+]
+	<INCLURE{fond=saisies/_base,env,type_saisie=#ENV{type_choix,radio},data=#GET{data},option_intro=<:saisies:saisie_champ_option_aucun:>}>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/checkbox.html b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.html
new file mode 100644
index 0000000000000000000000000000000000000000..9504e1b1d3550043e559b2d3e537deab0db1895e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.html
@@ -0,0 +1,94 @@
+[(#REM)
+
+  Parametres :
+  - data : tableau de donnees cle=>valeur
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{checkbox, criteres,
+		label=<:plugin:choisir_criteres:>,
+		defaut=#ARRAY{0,cle1,1,cle3},
+		defaut=cle2,
+		data=#ARRAY{
+			cle1,valeur1,
+			cle2,valeur2,
+			cle3,valeur3}})]
+]
+
+#SET{data, #ENV*{data, #ENV*{datas}}}
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau{#GET{data}}}
+
+[(#REM) lorsque qu'on donne un 'disabled' qui est une chaine,
+	il faut la transformer en tableau.
+		- Ce tableau est vide si la chaine valait '' sinon une clé 0 serait considérée disabled à tord
+		- Ce tableau correspond au tablau #DATA si jamais  la chaîne vaut "disabled" (typiquement avec le constructeur .yaml)
+]
+#SET{disabled,#ENV{disable}}
+[(#GET{disabled}|=={disabled}|oui)
+	#SET{disabled,#GET{data}|array_keys}
+]
+[(#GET{disabled}|is_string|oui)
+	[(#GET{disabled}|strlen|non) #SET{disabled,#ARRAY} ]
+	[(#GET{disabled}|oui) #SET{disabled,#ARRAY|push{#GET{disabled}}} ]
+]
+[(#ENV{disable_choix,''}|oui)
+
+	#SET{disabled, #ENV{disable_choix}|saisies_normaliser_disable_choix}
+]
+[(#ENV{tout_selectionner}|oui)
+	<div class="[(#ENV{choix,choix})][ (#ENV{choix,choix})_tout_selectionner ][ (#ENV{class}) ]none-nojs">
+		<input type="checkbox" name="#ENV{nom}_tout" class="checkbox" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_tout" value="on" onChange="if (jQuery(this).prop('checked')==true) jQuery(this).parent('div').parent().find('input').prop('checked',true); else jQuery(this).parent('div').parent().find('input').prop('checked',false);"/>
+		<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_tout"[ class="(#ENV{label_class})"]><:saisies:tout_selectionner:></label>
+	</div>
+]
+
+<BOUCLE_checkbox(DATA){source tableau, #GET{data}}>
+	[(#REM) Soit il y a des sous-groupes ]
+	<BOUCLE_groupes(CONDITION) {si #VALEUR|is_array}>
+	<div class="choix-groupe">
+		<p class="editer-label">#CLE</p>
+		#SET{data,#VALEUR}
+		<BOUCLE_recursive(BOUCLE_checkbox) />
+	</div>
+	</BOUCLE_groupes>
+	[(#REM) Soit c'est un tableau simple ]
+	<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE][ (#CLE|in_array{#GET{disabled}}|oui)disabled][ (#ENV{class})]">[(#SET{id,champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#COMPTEUR_BOUCLE|concat{'-',#CLE}|md5)]})]
+		<input type="checkbox" name="#ENV{nom}[]" class="checkbox checkbox_[(#ENV{nom}|saisie_nom2classe)]" id="#GET{id}"[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"] value="#CLE"[(#CLE|in_array{#GET{disabled}}|oui) disabled="disabled"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})] />
+		[(#ENV{disable_avec_post}|et{#ENV{disable_avec_post}|!={non}}|oui)
+			[(#CLE|in_array{#GET{defaut}}|oui)
+			<input type="hidden" name="#ENV{nom}\[\]" value="#CLE" />
+			]
+		]
+		<label for="#GET{id}"[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)class="on"][(#ENV{attribut_title}|oui) title="#CLE"]>#VALEUR</label>
+	</div>
+	<//B_groupes>
+</BOUCLE_checkbox>
+
+[(#ENV{choix_alternatif}|oui)
+<div class="[(#ENV{choix,choix}) ]choix_alternatif[(#ENV{choix}|oui)[ (#ENV{choix})_alternatif]][ (#ENV{class})]">
+    <input name="#ENV{nom}\[choix_alternatif\]" id="[champ_(#ENV{id,#ENV{nom}}|saisie_nom2classe)_choix_alternatif]"[ value="(#GET{data}|saisies_trouver_choix_alternatif{#GET{valeur}})"] />
+
+    <label for="[champ_(#ENV{id,#ENV{nom}}|saisie_nom2classe)_choix_alternatif]"[ class="(#ENV{label_class})"]>
+         [(#ENV{choix_alternatif_label, <:saisies:option_choix_alternatif_label_defaut:>})]
+    </label>
+    [<p class="explication">
+      (#ENV{choix_alternatif_explication})
+    </p>]
+</div>
+]
+</B_checkbox>
+[(#ENV{maximum_choix}|intval|oui)
+<script type="text/javascript">
+	$('input.checkbox_[(#ENV{nom}|saisie_nom2classe)]').on('change', function() {
+		if($('input.checkbox_[(#ENV{nom}|saisie_nom2classe)]:checked').length > [(#ENV{maximum_choix}|intval)]) {
+			this.checked = false;
+		}
+	});
+</script>
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/checkbox.php b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.php
new file mode 100644
index 0000000000000000000000000000000000000000..6eeff0495a82b7a924fffc93b5e7a36abab7c500
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\checkbox
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function checkbox_valeurs_acceptables($valeur, $description) {
+	include_spip('saisies/selection_multiple');
+	return selection_multiple_valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/checkbox.yaml b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..da214ddd9e543f0fc20452a1a682b6968b6b4299
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/checkbox.yaml
@@ -0,0 +1,146 @@
+
+titre: '<:saisies:saisie_checkbox_titre:>'
+description: '<:saisies:saisie_checkbox_explication:>'
+icone: 'images/saisies_checkbox-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          explication_dev: '<:saisies:option_datas_sous_groupe_explication_dev:>'
+          rows: 10
+          cols: 50
+        verifier:
+          type: 'saisies_option_data'
+      -
+        saisie: 'case'
+        options:
+          nom: 'vue_masquer_sous_groupe'
+          label_case: '<:saisies:option_vue_masquer_sous_groupe:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: "@datas@ MATCH '/^\\*/m'"
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 10
+          cols: 50
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'choix_alternatif'
+          label: '<:saisies:option_choix_alternatif_label:>'
+          defaut: ''
+      -
+        saisie: 'input'
+        options:
+          nom: 'choix_alternatif_label'
+          label: '<:saisies:option_choix_alternatif_label_label:>'
+          defaut: '<:saisies:option_choix_alternatif_label_defaut:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'disable_choix'
+          label: '<:saisies:option_disable_choix_label:>'
+          explication: '<:saisies:option_disable_choix_explication:>'
+          explication_dev: '<:saisies:option_disable_choix_explication_dev:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'maximum_choix'
+          label: '<:saisies:option_maximum_choix_label:>'
+          explication: '<:saisies:option_maximum_choix_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'attribut_title'
+          label: '<:saisies:option_attribut_title_label:>'
+          label_case: '<:saisies:option_attribut_title_label_case:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_checkbox_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/choisir_objet.html b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objet.html
new file mode 100644
index 0000000000000000000000000000000000000000..c28aef2f8a82e8692a5fe85b1b20b28a55c4a766
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objet.html
@@ -0,0 +1,23 @@
+[(#REM)
+	Saisie spécifique à SPIP 3
+	qui permet de choisir un objet parmis les
+	objets éditoriaux éditables de SPIP,
+	les affichant dans un sélecteur
+
+
+  Exemple d'appel :
+	[(#SAISIE{choisir_objet, mon_objet,
+		label=<:plugin:quel_objet:>})]
+
+]
+
+[(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
+#SET{valeur,#ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
+
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_objets(DATA){source tableau, #REM|lister_tables_objets_sql}{cle !IN #ENV{exclus,''}}>[(#VALEUR{editable}|oui)
+	<option value="#CLE"[(#CLE|=={#GET{valeur}}|oui)selected="selected"]>[(#VALEUR{texte_objets}|_T)]</option>
+]</BOUCLE_objets>
+</select>
+
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets.html b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets.html
new file mode 100644
index 0000000000000000000000000000000000000000..c29e3322bad31cdf4f4b1d142c76eb26fbdd3431
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets.html
@@ -0,0 +1,20 @@
+[(#REM)
+	Saisie spécifique à SPIP 3
+	qui permet de choisir parmis des
+	objets éditoriaux éditables de SPIP,
+	les affichant avec des checkbox
+
+
+  Exemple d'appel :
+	[(#SAISIE{choisir_objets, gis_objets,
+		label=<:gis:cfg_lbl_activer_objets:>,
+		defaut=#LISTE{spip_articles,spip_rubriques},
+		exclus=spip_gis})]
+
+]
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur,#GET{defaut}}|saisies_valeur2tableau}
+#INCLURE{fond=formulaires/inc-choisir-objets,name=#ENV{nom},selected=#GET{valeur},exclus=#ENV{exclus}}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets_edit.html b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..ccf56c6a4bceb3e91b75317db408818821cb37ee
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/choisir_objets_edit.html
@@ -0,0 +1,21 @@
+[(#REM)
+    Saisie spécifique à SPIP 3
+    qui permet de choisir parmis des
+    objets éditoriaux éditables de SPIP,
+    les affichant avec des checkbox
+]
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+
+<BOUCLE_objets(DATA){source tableau, #REM|lister_tables_objets_edit}{cle !IN #ENV{exclus,''}}>
+#SET{id,#ENV{nom}|replace{\W,'_'}|concat{'_',#VALEUR{url_edit}}}
+<div class="choix choix_#VALEUR{url_edit}">
+    <input type="checkbox"  id="#GET{id}" name="#ENV{nom}\[\]" value="#VALEUR{url_edit}"[(#ENV{selected}|=={all}|ou{#VALEUR{url_edit}|in_any{#ENV{selected}}})checked="checked"] />
+    <label for="#GET{id}">[(#VALEUR{texte_objets}|_T)]</label>
+</div>
+</BOUCLE_objets>
+<input type="hidden" name="#ENV{nom}[]" value="" />
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.html b/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.html
new file mode 100644
index 0000000000000000000000000000000000000000..b78bf1e2dfdd894fa2810b9a86cd2c4997b4a349
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.html
@@ -0,0 +1,82 @@
+[(#REM)
+  Parametres :
+  - data_cols : tableau de donnees cle=>valeur des colonnes
+  - data_rows : tableau de donnees cle=>valeur des lignes
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{choix_grille, criteres,
+		label=<:plugin:choisir_criteres:>,
+		defaut=#ARRAY{0,cle1,1,cle3}, ??? à corriger
+		data_cols=#ARRAY{
+			col1,valeur1,
+			col2,valeur2,
+			col3,valeur3},
+		data_rows=#ARRAY{
+			row1,valeur1,
+			row2,valeur2,
+			row3,valeur3}})]
+]
+
+
+[(#REM) Détecter le label de droite s'il y a au moins une barre | dans toutes les définitions ]
+#SET{utiliser_label_droite, #VAL{','}|join{#ENV{data_rows}}|strpos{'|'}|is_int}
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur_forcee, #ENV{valeur}}|saisies_valeur2tableau}
+
+[(#REM) lorsque qu'on donne un 'disabled' qui est une chaine,
+	il faut la transformer en tableau. Ce tableau est vide si la chaine valait ''
+	sinon une clé 0 serait considérée disabled à tord
+]
+#SET{disabled, #ENV{disable}}
+[(#GET{disabled}|is_string|oui)
+	[(#GET{disabled}|strlen|non) #SET{disabled,#ARRAY} ]
+	[(#GET{disabled}|oui) #SET{disabled,#ARRAY|push{#GET{disabled}}} ]
+]
+
+<B_lignes>
+<div class="choix_grille_wrapper">
+<table class="spip choix_grille" role="presentation">
+	[<caption>(#ENV{caption})</caption>]
+	<B_colonnes_entete>
+	<tr>
+		<td></td>
+		<BOUCLE_colonnes_entete (DATA) {source table, #ENV{data_cols}}>
+		<td id="choix_grille_reponse_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#CLE)]">#VALEUR</td>
+		</BOUCLE_colonnes_entete>
+		[(#GET{utiliser_label_droite}|oui)<td></td>]
+	</tr>
+	</B_colonnes_entete>
+	<tbody>
+		<BOUCLE_lignes (DATA) {source table, #ENV{data_rows}}>
+		<B_colonnes>
+		<tr>
+			#SET{libelles, #VALEUR|explode{'|'}}
+			<td id="choix_grille_question_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#CLE)]">[(#GET{libelles}|table_valeur{0})]</td>
+			<BOUCLE_colonnes (DATA) {source table, #ENV{data_cols}}>
+			<td>
+				#SET{type, radio}
+				#SET{name, #ENV{nom}\[#_lignes:CLE\]}
+				#SET{coche, #CLE|=={#GET{valeur/#_lignes:CLE}}}
+				[(#ENV{multiple}|et{#ENV{multiple}|!={non}}|oui)
+					#SET{type, checkbox}
+					#SET{name, #GET{name}\[\]}
+					[(#REM)<!-- le saisie_chaine2tableau permet de s'assurer que la ligne est au bon format si avant l'option multiple n'était pas activé -->]
+					#SET{coche, #CLE|in_array{#GET{valeur/#_lignes:CLE}|saisies_chaine2tableau}}
+				]
+				<input type="#GET{type}"[ (#ENV{disabled}|oui)disabled="disabled"] name="#GET{name}" value="#CLE"[ (#GET{coche}|oui)checked="checked"] aria-labelledby="choix_grille_question_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#_lignes:CLE)] choix_grille_reponse_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#CLE)]"[ (#ENV*{attributs})]/>
+			</td>
+			</BOUCLE_colonnes>
+			[(#GET{utiliser_label_droite}|oui)<td>[(#GET{libelles}|table_valeur{1})]</td>]
+		</tr>
+		</B_colonnes>
+		</BOUCLE_lignes>
+	</tbody>
+</table>
+</div>
+</B_lignes>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.yaml b/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..11c5ca23b9595714ce01acea1e951f8c6917803b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/choix_grille.yaml
@@ -0,0 +1,102 @@
+titre: '<:saisies:saisie_choix_grille_titre:>'
+description: '<:saisies:saisie_choix_grille_explication:>'
+icone: 'images/saisies_grille-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 50
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'data_rows'
+          label: '<:saisies:data_rows_label:>'
+          explication: '<:saisies:option_datas_grille_explication:>'
+          explication_dev: '<:saisies:option_datas_grille_explication_dev:>'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'data_cols'
+          label: '<:saisies:data_cols_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          explication_dev: '<:saisies:option_datas_explication_dev:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_choix_grille_titre:>'
+    size: 40
+    data_cols:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    data_rows:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.html b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.html
new file mode 100644
index 0000000000000000000000000000000000000000..ba32541d068e86d544f8f10d6afe277c0121990c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.html
@@ -0,0 +1,13 @@
+#SET{colonnes, #ENV{colonnes, 1ligne}|replace{'col',''}}
+[(#SET{subdiv_class,editer-groupe editer-groupe_inline[ editer-groupe_(#GET{colonnes})_colonnes][ (#ENV{class})]})]
+<div class="avec_sous_saisies conteneur_inline[ conteneur_inline_(#ENV{nom}|saisie_nom2classe)][ (#ENV{conteneur_class})][ (#ENV{type_saisie}|saisie_type2classe)][(#ENV{constructeur}|non) #GET{subdiv_class}][ (#ENV{class})]"[ data-id="(#ENV{id_saisie})"]>
+	#ENV*{inserer_debut}
+	[(#ENV{constructeur}|oui)
+		<div class="#GET{subdiv_class}">
+	]
+			#INCLURE{fond=#ENV{fond_generer,"inclure/generer_saisies"}, env, saisies=#ENV{saisies}, from_conteneur_inline='on'}
+	[(#ENV{constructeur}|oui)
+		</div>
+	]
+	#ENV*{inserer_fin}
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.php b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.php
new file mode 100644
index 0000000000000000000000000000000000000000..1301af6525df31b6acc1eb4ae6b12962492537e2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Obtenir des informations sur la saisie conteneur_inline
+ *
+ * @return SPIP\Saisies\Listes
+ **/
+
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Un conteneur_inline, c'est une saisie contenante
+ * @param array $saisie
+ * @return bool true
+**/
+function conteneur_inline_est_avec_sous_saisies(array $saisie): bool {
+	// Type de retour à changer en true lorsqu'on sera dans version de PHP qui l'autorise
+	return true;
+}
+
+
+/**
+ * Un conteneur_inline, ca n'a pas de label
+ * @param array $saisie
+ * @return bool false
+**/
+function conteneur_inline_est_labelisable(array $saisie): bool {
+	// Type de retour à changer en false lorsqu'on sera dans version de PHP qui l'autorise
+	return false;
+}
+
+/**
+ * Un conteneur_inline, ca n'est pas un champ
+ * @param array $saisie
+ * @return bool false
+**/
+function conteneur_inline_est_champ(array $saisie): bool {
+	// Type de retour à changer en false lorsqu'on sera dans version de PHP qui l'autorise
+	return false;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.yaml b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b9ca6eea6666257c173af6449d6aac95e2a11056
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/conteneur_inline.yaml
@@ -0,0 +1,36 @@
+titre: '<:saisies:conteneur_inline_titre:>'
+description: '<:saisies:conteneur_inline_explication:>'
+icone: 'images/saisies_conteneur_inline.svg'
+categorie:
+  type: 'structure'
+  rang: 50
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie : 'radio'
+        options:
+          nom: 'colonnes'
+          label: '<:saisies:option_colonnes_label:>'
+          data:
+            1ligne_max: '<:saisies:option_1ligne_max:>'
+            1ligne: '<:saisies:option_1ligne:>'
+            xlignes_max: '<:saisies:option_xlignes_max:>'
+            xlignes: '<:saisies:option_xlignes:>'
+            col2: '<:saisies:option_col2:>'
+            col3: '<:saisies:option_col3:>'
+            col4: '<:saisies:option_col4:>'
+          defaut: '1ligne_max'
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+defaut:
+  saisies: []
+  colonnes: '1ligne_max'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/couleur.html b/design_system_dependences/saisies/v5.2.0/saisies/couleur.html
new file mode 100644
index 0000000000000000000000000000000000000000..4d1b02a8c3a87de80c800d547ce93e3082748bf5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/couleur.html
@@ -0,0 +1,12 @@
+[(#REM)
+
+    ### /!\ En Couleur si plugin Palette ###
+	
+	Memes parametres que saisies/input, mais redefinit
+	size et class.
+]
+[(#INCLURE{fond=saisies/input,
+			env,
+            type=#HTML5|?{color,text},
+            size=7,
+            class=[(#ENV{readonly}|?{[(#ENV{class}) ]text,[(#ENV{class}) ]palette})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/date.html b/design_system_dependences/saisies/v5.2.0/saisies/date.html
new file mode 100644
index 0000000000000000000000000000000000000000..d07d1e290e64f16ef07930f2b1539f81decfa6d5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/date.html
@@ -0,0 +1,76 @@
+[(#REM)
+	Zone de saisie de date utilsant le dateur de Bonux si présent.
+	Sur les sites en HTML5, utilise type="date"
+	sur le input, et type="text" par défaut pour les autres.
+	Pour tous on utilise class="date" et class="heure" pour activer le dateur.
+
+	La valeur fournie peut être :
+	- au format spip jj/mm/aaaa (date uniquement)
+	- au format SQL aaaa-mm-jj (date uniquement)
+	- au format SQL aaaa-mm-jj hh:mm:ss (date et heure)
+	- un tableau avec une entrée "date" et une entrée "heure" séparée, au format SQL (date et heure obligatoire)
+
+	Pour utiliser les heures, il faut utiliser l'option "horaire=oui".
+
+	La date est proposée à l'affichage au format jj/mm/aaaa.
+
+	La valeur retournée n'est pas nécessairement au format SQL.
+	Le cas échéant, il faut la normaliser avant enregistrement en base.
+]
+
+[(#REM) Initialisation de la valeur ]
+#SET{autodater,''}
+[(#ENV{class}|=={'autodater'}|oui)
+	#SET{autodater,#VAL{Y-m-d H:i:s}|date}
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#GET{autodater}}}}}
+
+[(#REM) Regex de date SQL ]
+#SET{date_sql,"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?"}
+
+[(#REM) Si la valeur est un tableau, on considère que c'est date et heure dans un format déjà reconnu (j/m/a ou SQL) ]
+[(#GET{valeur}|is_array|oui)
+	#SET{date, #GET{valeur/date}}
+	#SET{heure, #GET{valeur/heure}}
+]
+
+[(#REM) Si la valeur est une chaîne, on regarde si SQL ]
+[(#GET{valeur}|is_string|oui)
+	[(#REM) Par défaut (date uniquement au format SPIP) la date c'est toute la valeur ]
+	#SET{date, #GET{valeur}}
+	#SET{heure, ''}
+
+	[(#REM) Si c'est bien une date SQL ]
+	[(#GET{valeur}|match{#GET{date_sql}}|oui)
+		[(#REM) Si la date est complètement 0, on met des valeurs vides ]
+		[(#GET{valeur}|=={0000-00-00 00:00:00}|oui)
+			#SET{date, ''}
+			#SET{heure, ''}
+		]
+		[(#GET{valeur}|=={0000-00-00 00:00:00}|non)
+			#SET{date, #GET{valeur}|affdate{d/m/Y}}
+			#SET{heure, #GET{valeur}|affdate{H:i}}
+		]
+	]
+]
+
+<p hidden id="[format_date_(#ENV{nom}|saisie_nom2classe)]"><:saisies:format_date_attendu:></p>
+#SET{describedby, #ENV{describedby}|concat{' ',format_date_#ENV{nom}|saisie_nom2classe} }
+
+[(#INCLURE{fond=saisies/input,
+	env,
+	nom=#ENV{nom}[(#ENV{horaire}|?{\[date\]})],
+	describedby=#GET{describedby},
+	valeur=#GET{date},
+	type=text,
+	class=[(#ENV{class}) ]date})]
+[(#ENV{horaire}|oui)
+[(#INCLURE{fond=saisies/input,
+	env,
+	nom=#ENV{nom}\[heure\],
+	valeur=#GET{heure},
+	size=4,
+	maxlength=5,
+	class=[(#ENV{class}) ]heure})]
+]
+[(#ENV{disable}|non|et{#ENV{readonly}|non})[(#INCLURE{fond=formulaires/dateur/inc-dateur, heure_pas=#ENV{heure_pas,30}})]]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/date.php b/design_system_dependences/saisies/v5.2.0/saisies/date.php
new file mode 100644
index 0000000000000000000000000000000000000000..0cbc3a86224424afd02217f1d676383e6badd30e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/date.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\date
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function date_valeurs_acceptables($valeur, $description) {
+	if (saisies_saisie_est_gelee($description) && isset($description['options']['defaut'])) {
+		$defaut = $description['options']['defaut'];
+		include_spip('inc/filtres');
+		$defaut = recup_date($defaut);
+		$valeur = recup_date($valeur);
+		foreach ($valeur as &$element) {
+			if ($element === 0) {
+				$element = '00';
+			}
+		}
+		foreach ($defaut as &$element) {
+			if ($element === 0) {
+				$element = '00';
+			}
+		}
+		if (array_diff_assoc($defaut, $valeur)) {
+			return false;
+		}
+	}
+	return true;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/date.yaml b/design_system_dependences/saisies/v5.2.0/saisies/date.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4da8655a8d523d619b86df440c5767ff32fd59b6
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/date.yaml
@@ -0,0 +1,128 @@
+
+titre: '<:saisies:saisie_date_titre:>'
+description: '<:saisies:saisie_date_explication:>'
+icone: 'images/saisies_input_date-xx.svg'
+categorie:
+  type: 'libre'
+  rang: 20
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'case'
+        options:
+          nom: 'horaire'
+          label: '<:saisies:option_horaire_label:>'
+          label_case: '<:saisies:option_horaire_label_case:>'
+          valeur_oui: 'oui'
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'selection'
+        options:
+          nom: 'heure_pas'
+          label: '<:saisies:option_heure_pas_label:>'
+          explication: '<:saisies:option_heure_pas_explication:>'
+          data:
+            1: '1 minute'
+            2: '2 minutes'
+            5: '5 minutes'
+            15: '15 minutes'
+            30: '30 minutes'
+          defaut: 30
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+            max: 30
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_date_titre:>'
+    size: 40
+    # champs extras (definition du champ sql)
+    sql: "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"
+  verifier:
+    type: 'date'
+    options:
+      normaliser: 'datetime'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/date_jour_mois_annee.html b/design_system_dependences/saisies/v5.2.0/saisies/date_jour_mois_annee.html
new file mode 100644
index 0000000000000000000000000000000000000000..f993736aabe7374e13db138abe6b154b018bbd05
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/date_jour_mois_annee.html
@@ -0,0 +1,56 @@
+[(#REM)
+
+	/!\ Cette saisie nécessite du javascript pour fonctionner.
+		En absence de JS, seul un champ de saisie texte est affiché.
+
+	Cette saisie cree 3 champs a partir d'une date au format datetime mysql.
+	A chaque modification, un champ cache est modifie, contenant la date au format datetime.
+
+	Options :
+	- label_(jour|mois|annee)
+	- size_(jour|mois|annee)
+	- maxlength_(jour|mois|annee)
+	- datetime, par défaut oui. Si pas oui, utilisera une date au format aaaa-mm-jj au lieu d'un datetime mysql
+
+	[(#SAISIE{date_jour_mois_annee, date_naissance,
+		label=Date de naissance
+	})]
+]
+#SET{valeur,#ENV{valeur,#ENV{defaut}}}
+[(#SET{id,[(#ENV**|md5|substr{0,6})]})]
+<input type='text' name="#ENV{nom}" id="#GET{id}" value="[(#GET{valeur}|sinon{0000-00-00[(#ENV{datetime,oui}|=={oui}|oui)00:00:00]})]" class='datetime' />
+
+<script type='text/javascript'>
+function activer_dateur_#GET{id}() {
+	jour = '\
+		<div class="choix">\
+			[<label for="champ_[(#ENV{nom}|saisie_nom2classe)_jour]">(#ENV{label_jour,<:saisies:label_jour:>})</label>]\
+			<input type="text" name="[(#ENV{nom}|saisie_nom2classe)_jour]" class="text date_jour[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)_jour]"[ value="(#GET{valeur}|journum)"][ size="(#ENV{size_jour, 2})"][ maxlength="(#ENV{maxlength_jour, 2})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="saisies_date_jour_mois_annee_changer_date(this, \'#ENV{datetime,oui}\');" onkeyup="if (this.value.length == 2 && jQuery.inArray(event.keyCode, [9,16]) == -1) {jQuery(this).parent().next().find(\'input\').focus();}" />\
+		</div>\
+	';
+
+	mois = '\
+		<div class="choix">\
+			[<label for="champ_[(#ENV{nom}|saisie_nom2classe)_mois]">(#ENV{label_mois,<:saisies:label_mois:>})</label>]\
+			<input type="text" name="[(#ENV{nom}|saisie_nom2classe)_mois]" class="text date_mois[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)_mois]"[ value="(#GET{valeur}|mois)"][ size="(#ENV{size_mois, 2})"][ maxlength="(#ENV{maxlength_mois, 2})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="saisies_date_jour_mois_annee_changer_date(this, \'#ENV{datetime,oui}\');" onkeyup="if (this.value.length == 2 && jQuery.inArray(event.keyCode, [9,16]) == -1) {jQuery(this).parent().next().find(\'input\').focus();}" />\
+		</div>\
+	';
+
+	annee = '\
+		<div class="choix">\
+			[<label for="champ_[(#ENV{nom}|saisie_nom2classe)_annee]">(#ENV{label_annee,<:saisies:label_annee:>})</label>]\
+			<input type="text" name="[(#ENV{nom}|saisie_nom2classe)_annee]" class="text date_annee[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)_annee]"[ value="(#GET{valeur}|annee)"][ size="(#ENV{size_annee, 4})"][ maxlength="(#ENV{maxlength_annee, 4})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="saisies_date_jour_mois_annee_changer_date(this, \'#ENV{datetime,oui}\');" />\
+		</div>\
+	';
+
+	if(!$.browser.msie || parseInt($.browser.version) >= 9)
+		jQuery('##GET{id}')[0].type = 'hidden';
+	else
+		jQuery('##GET{id}').css({'height':'0px','width':'0px','border':'none'});
+	jQuery('##GET{id}').after(jour + mois + annee);
+}
+
+jQuery(document).ready(function(){
+	activer_dateur_#GET{id}();
+});
+</script>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/destinataires.html b/design_system_dependences/saisies/v5.2.0/saisies/destinataires.html
new file mode 100644
index 0000000000000000000000000000000000000000..5193f64ec94f5dafd0c7eb717d8143547fcc66e7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/destinataires.html
@@ -0,0 +1,68 @@
+	#SET{type_choix, #ENV{type_choix,tous}}
+#SET{choix_destinataires, #ENV*{choix_destinataires,#ARRAY}}
+#SET{erreurs,#ENV**{erreurs/#ENV{nom}}}
+<BOUCLE_choix(CONDITION){si #GET{choix_destinataires}|count|<{2}|ou{#GET{type_choix}|=={tous}}}>
+<div class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{disable}|oui)disabled][ (#GET{erreurs}|oui)erreur][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"]>
+	#ENV*{inserer_debut}
+	[(#REM) Si 0 ou 1 destinataire possible ou si c'est tous, le destinataire est défini automatiquement ]
+	<BOUCLE_tous(AUTEURS){tous}{id_auteur IN #GET*{choix_destinataires}}{par num nom,nom}>
+	[(#ENV{tout_afficher}|!={oui}|oui)
+	<input type="hidden" name="#ENV{nom}\[\]" value="#ID_AUTEUR" />
+	]
+	[(#ENV{tout_afficher}|!={oui}|non)
+	[<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+	[<span class='erreur_message'>(#GET{erreurs})</span>]
+	[<p class='explication'>(#ENV*{explication})</p>]
+	[<em class='attention'>(#ENV*{attention})</em>]
+	<div class="choix">
+		<input type="checkbox" name="#ENV{nom}\[\]" class="checkbox"
+			readonly="readonly" checked="checked"
+			id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+			value="#ID_AUTEUR"[ (#ENV*{attributs})][ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
+		/>
+		<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR">#NOM</label>
+	</div>
+	]
+	</BOUCLE_tous>
+	<input [(#ENV{tout_afficher}|!={oui}|?{type="hidden",type="text" readonly="readonly"})] name="#ENV{nom}[]" value="1" />
+	<//B_tous>
+	#ENV*{inserer_fin}
+</div>
+</BOUCLE_choix>
+
+[(#SET{valeur,[(#ENV*{valeur}|is_array|?{#ENV*{valeur},[(#ENV*{valeur}|explode{','})]})]})]
+<div class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)]">
+
+	#ENV*{inserer_debut}
+	[<label[(#GET{type_choix}|=={un}|ou{#GET{type_choix}|=={un_radio}}|oui)for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"]>(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+	[<span class='erreur_message'>(#GET{erreurs})</span>]
+	[<p class='explication'>(#ENV*{explication})</p>]
+	[<em class='attention'>(#ENV*{attention})</em>]
+	[(#REM) Sinon on propose le choix, en select ou en checkbox suivant l'option "type_choix" ]
+	<B_destinataires>
+		[(#GET{type_choix}|=={un}|oui)
+			<select name="#ENV{nom}\[\]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">
+				[<option value="">(#ENV{option_intro})</option>]
+		]
+		<BOUCLE_destinataires(AUTEURS){tous}{id_auteur IN #GET*{choix_destinataires}}{par num nom,nom}>
+			[(#GET{type_choix}|=={plusieurs}|ou{#GET{type_choix}|=={un_radio}}|oui)
+				<div class="choix">
+					<input type="[(#GET{type_choix}|=={plusieurs}|?{checkbox,radio})]" name="#ENV{nom}\[\]" class="checkbox"
+						id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+						value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#GET*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
+					/>
+					<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#GET*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)class="on"]>#NOM</label>
+				</div>
+			]
+			[(#GET{type_choix}|=={un}|oui)
+				<option value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#GET*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)selected="selected"]>#NOM</option>
+			]
+
+		</BOUCLE_destinataires>
+		[(#GET{type_choix}|=={un}|oui)
+			</select>
+		]
+	</B_destinataires>
+	#ENV*{inserer_fin}
+</div>
+<//B_choix>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/destinataires.yaml b/design_system_dependences/saisies/v5.2.0/saisies/destinataires.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..dfe23bc2f516411efb20953b6a191e50688f3d86
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/destinataires.yaml
@@ -0,0 +1,83 @@
+
+titre: '<:saisies:saisie_destinataires_titre:>'
+description: '<:saisies:saisie_destinataires_explication:>'
+icone: 'images/saisies_destinataires-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 30
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'auteurs'
+        options:
+          nom: 'choix_destinataires'
+          label: '<:saisies:option_choix_destinataires_label:>'
+          explication: '<:saisies:option_choix_destinataires_explication:>'
+          multiple: 'oui'
+          option_statut: 'oui'
+      -
+        saisie: 'radio'
+        options:
+          nom: 'type_choix'
+          label: '<:saisies:option_type_choix_label:>'
+          data:
+            tous: '<:saisies:option_type_choix_tous:>'
+            un: '<:saisies:option_type_choix_un:>'
+            un_radio: '<:saisies:option_type_choix_un_radio:>'
+            plusieurs: '<:saisies:option_type_choix_plusieurs:>'
+          defaut: 'tous'
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_destinataire_intro_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_destinataires_titre:>'
+    choix_destinataires: [1,2,3,4]
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/email.html b/design_system_dependences/saisies/v5.2.0/saisies/email.html
new file mode 100644
index 0000000000000000000000000000000000000000..8098ca0cf3ae399e9ffeb41e170c0fc6846eb1c0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/email.html
@@ -0,0 +1,15 @@
+[(#REM)
+
+		Zone de saisie d'adresse mail. Sur les sites en HTML5, utilise type="email"
+		sur le input, et type="text" par défaut pour les autres.
+		Dans ce dernier cas, on renseigne quand même class="email".
+
+]
+<p hidden id="[format_email_(#ENV{nom}|saisie_nom2classe)]"><:saisies:format_email_attendu:></p>
+#SET{describedby, #ENV{describedby}|concat{' ',format_email_#ENV{nom}|saisie_nom2classe} }
+
+[(#INCLURE{fond=saisies/input,
+			env,
+			describedby=#GET{describedby},
+            type=#HTML5|?{email,text},
+            class=[(#HTML5|?{[(#ENV{class}) ],[(#ENV{class}) ]email})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/email.php b/design_system_dependences/saisies/v5.2.0/saisies/email.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8c3d393cd003ce4931c748b032b7e3c17a3b559
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/email.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\email
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function email_valeurs_acceptables($valeur, $description) {
+	include_spip('saisies/textarea');
+	return textarea_valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/email.yaml b/design_system_dependences/saisies/v5.2.0/saisies/email.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2f90ae664c8c0583bc7a0d201c1d4ec71729306b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/email.yaml
@@ -0,0 +1,153 @@
+titre: '<:saisies:saisie_email_titre:>'
+description: '<:saisies:saisie_email_explication:>'
+icone: 'images/saisies_input_email-xx.svg'
+categorie:
+  type: 'libre'
+  rang: 10
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut_session'
+          label: '<:saisies:option_defaut_session_label:>'
+          explication: '<:saisies:option_defaut_session_explication:>'
+          size: 50
+          data: ['email', 'nom']
+          placeholder: 'email'
+      -
+        saisie: 'input'
+        options:
+          nom: 'placeholder'
+          label: '<:saisies:option_placeholder_label:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'case'
+        options:
+          nom: 'type'
+          label_case: '<:saisies:option_type_password:>'
+          valeur_oui: 'password'
+          valeur_non: 'text'
+          defaut: 'text'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'maxlength'
+          label: '<:saisies:option_maxlength_label:>'
+          explication: '<:saisies:option_maxlength_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'case'
+        options:
+          nom: 'disable'
+          label_case: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'disable_avec_post'
+          label_case: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'readonly'
+          label_case: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'radio'
+        options:
+          nom: 'autocomplete'
+          label: '<:saisies:option_autocomplete_label:>'
+          explication: '<:saisies:option_autocomplete_explication:>'
+          data:
+            defaut: '<:saisies:option_autocomplete_defaut:>'
+            'on': '<:saisies:option_autocomplete_on:>'
+            'off': '<:saisies:option_autocomplete_off:>'
+          defaut: 'defaut'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_email_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
+  verifier:
+    type: 'email'
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/explication.html b/design_system_dependences/saisies/v5.2.0/saisies/explication.html
new file mode 100644
index 0000000000000000000000000000000000000000..26ec9d284864ef8e21e3f43f28bd1717b9f0632a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/explication.html
@@ -0,0 +1,56 @@
+[(#SET{selector,[explication_(#ENV{nom}|saisie_nom2classe)]})]
+<div class="editer pleine_largeur editer_explication[ explication_(#ENV{nom}|saisie_nom2classe)][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)]"[ data-id="(#ENV{id_saisie})"][ data-afficher_si="(#ENV*{afficher_si}|saisies_afficher_si_js{#ENV{_saisies}})"]>
+	#ENV*{inserer_debut}
+
+	[(#ENV{alerte_role}|non)
+		<div class="explication"[ (#ENV*{attributs})]>
+			[<strong class="explication_titre">(#ENV*{titre})</strong>]
+			[(#ENV{liens_meme_fenetre}|?{
+				[<div id="#GET{selector}_texte" class="explication_texte">(#ENV*{texte}|propre)</div>],
+				[<div id="#GET{selector}_texte" class="explication_texte">(#ENV*{texte}|propre|saisies_liens_ouvrants)</div>]
+			})]
+		</div>
+	]
+	[(#ENV{alerte_role}|oui)
+		[(#ENV{titre}|oui)
+			#ALERTE_OUVRIR{#ENV{titre},#ENV{alerte_type},#ENV{alerte_role},#GET{selector}}
+			#ENV{texte}
+			#ALERTE_FERMER
+		]
+		[(#ENV{titre}|non)
+			#ALERTE_MESSAGE{#ENV{texte},'',#ENV{alerte_type},#ENV{alerte_role},#GET{selector}}
+		]
+	]
+
+	#ENV*{inserer_fin}
+</div>
+
+
+
+[(#ENV{masquer}|oui)
+<script>
+	function masquer_#GET{selector}(){
+		$("[.(#GET{selector})] .explication_texte").#CONST{_SAISIES_AFFICHER_SI_JS_HIDE}.attr('aria-hidden','true');
+		$("[.(#GET{selector})] button\[aria-controls=#GET{selector}_texte\]").text('<:saisies:afficher:>').attr('aria-expanded', 'false');
+	};
+	function afficher_#GET{selector}(){
+		$("[.(#GET{selector})] .explication_texte").#CONST{_SAISIES_AFFICHER_SI_JS_SHOW}.attr('aria-hidden','false');
+		$("[.(#GET{selector})] button\[aria-controls=#GET{selector}_texte\]").text('<:saisies:masquer:>').attr('aria-expanded', 'true');
+	};
+	function basculer_#GET{selector}(){
+		if (est_masque_#GET{selector} == true) {
+			est_masque_#GET{selector} = false;
+			afficher_#GET{selector}();
+		} else {
+			est_masque_#GET{selector} = true;
+			masquer_#GET{selector}();
+		}
+	};
+
+	est_masque_#GET{selector} = true;
+	$("[.(#GET{selector})] .explication_texte").css('display','none');
+	$("[.(#GET{selector})] .explication_titre").append("<span class='boutons'><button aria-expanded='false' aria-controls='#GET{selector}_texte' type='button'><:saisies:afficher:></button></span>");
+	$("[.(#GET{selector})] .explication_titre button").click(function(){basculer_#GET{selector}();});
+</script>
+]
+
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/explication.php b/design_system_dependences/saisies/v5.2.0/saisies/explication.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fdb55e0f1bf43a6745ff7432d9754819ecf3915
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/explication.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Obtenir des informations sur la saisie champ
+ *
+ * @return SPIP\Saisies\Listes
+ **/
+
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Une explication, ca n'est pas un champ
+ * @param array $saisie
+ * @return bool false
+**/
+function explication_est_champ(array $saisie): bool {
+	// Type de retour à changer en false lorsqu'on sera dans version de PHP qui l'autorise
+	return false;
+}
+
+
+/**
+ * Retourne le label de la saisie `explication`
+ * Par ordre de priorité le `titre`
+ * sinon le `texte`
+ * @param array $saisie
+ * @return string
+**/
+function explication_get_label(array $saisie): string {
+	$titre = $saisie['options']['titre'] ?? '';
+	if ($titre) {
+		return $titre;
+	} else {
+		return $saisie['options']['texte'] ?? '';
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/explication.yaml b/design_system_dependences/saisies/v5.2.0/saisies/explication.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..dd0bd39890fdadfb9998cac765c6e0d5dd27c0a7
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/explication.yaml
@@ -0,0 +1,80 @@
+
+titre: '<:saisies:saisie_explication_titre:>'
+description: '<:saisies:saisie_explication_explication:>'
+icone: 'images/saisies_explication-xx.svg'
+categorie:
+  type: 'structure'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'texte'
+          label: '<:saisies:saisie_explication_texte_label:>'
+          explication: '<:saisies:saisie_explication_explication:>'
+          class: 'inserer_barre_edition'
+          cols: 40
+          rows: 5
+      -
+        saisie: 'case'
+        options:
+          nom: 'liens_meme_fenetre'
+          label_case: '<:saisies:saisie_explication_liens_meme_fenetre_label:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: '@texte@ MATCH "/->|href|\/\//"'
+      -
+        saisie: 'input'
+        options:
+          nom: 'titre'
+          label: '<:saisies:saisie_explication_titre_label:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'masquer'
+          label_case: '<:saisies:saisie_explication_masquer_label:>'
+          conteneur_class: 'pleine_largeur'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+      -
+        saisie: 'input'
+        options:
+          nom: 'alerte_type'
+          label: '<:saisies:saisie_explication_alerte_type_label:>'
+          explication: '<:saisies:saisie_explication_alerte_type_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'alerte_role'
+          label: '<:saisies:saisie_explication_alerte_role_label:>'
+          explication: '<:saisies:saisie_explication_alerte_role_explication:>'
+defaut:
+  options:
+    texte: '<:saisies:saisie_explication_titre:>'
+    # champs extras (definition du champ sql)
+    # Non, cette saisie n'a rien à saisir en bdd !
+    # sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/fieldset.html b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.html
new file mode 100644
index 0000000000000000000000000000000000000000..10938eb8882a832bccef9cee387a8f243e5c04ab
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.html
@@ -0,0 +1,35 @@
+#SET{classe_pliable,#ENV{pliable}|et{#ENV{pliable}|!=={non}}|?{pliable}}
+#SET{classe_plie,#ENV{plie}|et{#ENV{plie}|!=={non}}|?{plie}}
+#SET{classe_onglet,#ENV{onglet}|et{#ENV{onglet}|!=={non}}|?{fieldset_onglet}}
+#SET{classe_onglet_vertical,''}
+[(#GET{classe_onglet}|oui)
+	[(#ENV{onglet_vertical}|et{#ENV{onglet_vertical}|!=={non}}|oui)
+		#SET{classe_onglet_vertical,fieldset_onglet_vertical}
+	]
+]
+
+[(#REM) S'il y a des erreurs pour au moins un des champs internes, on ne plie pas ! ]
+#SET{champs_internes, #ENV{saisies}|saisies_lister_par_nom}
+#SET{erreurs, #ENV**{erreurs}|sinon{#ARRAY}}
+#SET{erreurs_fieldset, #GET{erreurs}|array_intersect_key{#GET{champs_internes}}}
+[(#GET{erreurs_fieldset}|oui)
+	#SET{plie, ''}
+]
+#SET{erreur_ici,#ENV**{erreurs/#ENV{nom}}}
+
+<fieldset id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" class="avec_sous_saisies fieldset[ fieldset_(#ENV{nom}|saisie_nom2classe)][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)][ (#GET{classe_pliable})[ (#GET{classe_plie})]][ (#GET{classe_onglet})][ (#GET{classe_onglet_vertical})]"[ data-id="(#ENV{id_saisie})"][ data-afficher_si="(#ENV*{afficher_si}|saisies_afficher_si_js{#ENV{_saisies}})"][ (#ENV*{attributs})]>
+	#ENV*{inserer_debut}
+
+	[<legend>(#ENV*{label})</legend>]
+
+	[<span class='erreur_message'>(#GET{erreur_ici})</span>]
+	[<p class='explication'>(#ENV*{explication})</p>]
+	[<em class='attention'>(#ENV*{attention})</em>]
+	[(#ENV{saisies}|is_array|oui)
+		<div class="editer-groupe">
+	#INCLURE{fond=#ENV{fond_generer,"inclure/generer_saisies"}, env, saisies=#ENV{saisies}, from_fieldset='on'}
+		</div>
+	]
+
+	#ENV*{inserer_fin}
+</fieldset>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/fieldset.php b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.php
new file mode 100644
index 0000000000000000000000000000000000000000..25e8fcc9b2aa6802cd8d728f5bfcbac528cfbb90
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Obtenir des informations sur la saisie fieldset
+ *
+ * @return SPIP\Saisies\Listes
+ **/
+
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Un fieldset, c'est une saisie contenante
+ * @param array $saisie
+ * @return bool true
+**/
+function fieldset_est_avec_sous_saisies(array $saisie): bool {
+	// Type de retour à changer en true lorsqu'on sera dans version de PHP qui l'autorise
+	return true;
+}
+
+
+/**
+ * Un fieldset, ca n'est pas un champ
+ * @param array $saisie
+ * @return bool false
+**/
+function fieldset_est_champ(array $saisie): bool {
+	// Type de retour à changer en false lorsqu'on sera dans version de PHP qui l'autorise
+	return false;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/fieldset.yaml b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a58dd85567166b2aa4f20b0d9dbc6d127f19ffd6
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/fieldset.yaml
@@ -0,0 +1,86 @@
+
+titre: '<:saisies:saisie_fieldset_titre:>'
+description: '<:saisies:saisie_fieldset_explication:>'
+icone: 'images/saisies_fieldset-xx.svg'
+categorie:
+  type: 'structure'
+  rang: -10
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'pliable'
+          label: '<:saisies:option_pliable_label:>'
+          label_case: '<:saisies:option_pliable_label_case:>'
+          afficher_si: '!@onglet@'
+      -
+        saisie: 'case'
+        options:
+          nom: 'plie'
+          label: '<:saisies:option_plie_label:>'
+          label_case: '<:saisies:option_plie_label_case:>'
+          afficher_si: '@pliable@=="on"'
+      -
+        saisie: 'case'
+        options:
+          nom: 'onglet'
+          label: '<:saisies:option_onglet_label:>'
+          label_case: '<:saisies:option_onglet_label_case:>'
+          afficher_si: '!@pliable@'
+      -
+        saisie: 'case'
+        options:
+          nom: 'onglet_vertical'
+          label_case: '<:saisies:option_onglet_vertical_label_case:>'
+          explication: '<:saisies:option_onglet_vertical_explication:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: '!@pliable@ && @onglet@'
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_fieldset_titre:>'
+    # champs extras (definition du champ sql)
+    # Non, cette saisie n'a rien à saisir en bdd !
+    # sql: "text DEFAULT '' NOT NULL"
+  saisies: []
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/groupe_mots.html b/design_system_dependences/saisies/v5.2.0/saisies/groupe_mots.html
new file mode 100644
index 0000000000000000000000000000000000000000..7df9c9db3505afd945c975d842e8d8c5370c2b57
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/groupe_mots.html
@@ -0,0 +1,32 @@
+[(#REM) 
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+  	Dans le cas multiple, defaut et valeur doivent être un array, sinon un int
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - table_liaison : permet de ne lister que les groupes de mots liés à une table en particulier
+    (champs tables_liees de spip_groupes_mots)
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - groupes_exclus : tableau de groupes exclus
+  - afficher_id_groupe : afficher le numero du groupe en plus de son titre
+
+  Exemple d'appel :
+	[(#SAISIE{groupe_mots,groupes,
+		label=<:plugin:secteur_region:>,
+		multiple=oui,
+		table_liaison=articles})] 
+]
+<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+		<option value="">[(#ENV{option_intro})]</option>]
+	<BOUCLE_groupes(GROUPES_MOTS){id_groupe !IN #ENV{groupes_exclus,#ARRAY}}{par num titre, titre}{tables_liees==#VAL{'(^|,)'}|concat{#ENV{table_liaison,.*},'($|,)'}}{tout}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_GROUPE"[(#ID_GROUPE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE[ \(<:info_numero_abbreviation:>(#ENV{afficher_id_groupe,''}|?{#ID_GROUPE})\)]</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_GROUPE"[(#ID_GROUPE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE[ \(<:info_numero_abbreviation:>(#ENV{afficher_id_groupe,''}|?{#ID_GROUPE})\)]</option>]
+	</BOUCLE_groupes>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/hidden.html b/design_system_dependences/saisies/v5.2.0/saisies/hidden.html
new file mode 100644
index 0000000000000000000000000000000000000000..878e684c4857fbd776ce8371bc67862d7bf62b46
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/hidden.html
@@ -0,0 +1,13 @@
+<div class="editer editer_[(#ENV{nom}|saisie_nom2classe)][ (#ENV{conteneur_class,#ENV{li_class}})][ (#ENV{type_saisie}|saisie_type2classe)]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"][ data-afficher_si="(#ENV*{afficher_si}|saisies_afficher_si_js{#ENV{_saisies}})"]>
+	#ENV*{inserer_debut}
+	[(#ENV{tout_afficher}|!={oui}|oui)
+	[<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
+	<input type="hidden"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}"[ (#ENV*{attributs})] />
+	]
+	[(#ENV{tout_afficher}|!={oui}|non)
+	[<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+	[<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
+	<input type="text"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}" readonly="readonly" />
+	]
+	#ENV*{inserer_fin}
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/hidden.php b/design_system_dependences/saisies/v5.2.0/saisies/hidden.php
new file mode 100644
index 0000000000000000000000000000000000000000..4783680e34f1a87b2d6d7c937dc28175919ff76a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/hidden.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\hidden
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function hidden_valeurs_acceptables($valeur, $description) {
+	if (isset($description['options']['defaut']) && $description['options']['defaut'] != $valeur) {
+		return false;
+	} else {
+		return true;
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/hidden.yaml b/design_system_dependences/saisies/v5.2.0/saisies/hidden.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..626e1ed517721726a25e4dc8b120e624a5d608d8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/hidden.yaml
@@ -0,0 +1,53 @@
+
+titre: '<:saisies:saisie_hidden_titre:>'
+description: '<:saisies:saisie_hidden_explication:>'
+icone: 'images/saisies_hidden-xx.svg'
+categorie:
+  type: 'defaut'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_hidden_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/input.html b/design_system_dependences/saisies/v5.2.0/saisies/input.html
new file mode 100644
index 0000000000000000000000000000000000000000..9182122e4fe2a64ea208655d9fdeb04aa9785218
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/input.html
@@ -0,0 +1,61 @@
+[(#REM)
+
+  Parametres supplementaire :
+  - ** data : tableau de donnees indice=>valeur
+  - defaut : valeur par defaut du parametre
+  - type : type de l'input (defaut: text)
+  - class : classe(s) css ajoutes a l'input
+  - size : taille du champ
+  - minlength : nombre de caracteres minimal
+  - maxlength : nombre de caracteres maximum
+  - disable : champ insaisissable ? 'oui' (defaut : '')
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - autofocus : indique si le champ prend le focus a l'affichage (HTML5 requis)
+  - placeholder : texte du placeholder
+  - cle_secrete : l'input est une cle secrete. On n'affiche pas la valeur mais simplement un placeholder indiquant éventuellement quelque morceaux de la clé (s'appuie sur fonction native de SPIP)
+
+
+  Exemple d'appel :
+	[(#SAISIE{input,couleur_foncee,
+		label=<:spa:couleur_foncee:>,
+		size=7,
+		data=#ARRAY{
+				0,valeur0,
+				1,valeur1,
+				2,valeur2}})]
+]
+
+#SET{type,#ENV{type,text}}
+
+#SET{data, #ENV*{data, #ENV*{datas}}}
+
+[(#REM) Pas de HTML5, pas de data]
+#SET{data, #HTML5|?{#GET{data}}}
+
+[(#REM)  l'attribut autocomplete ne peut avoir pour valeur que on ou off ]
+#SET{val_autocomplete, #ARRAY}
+#SET{val_autocomplete, #GET{val_autocomplete}|push{on}}
+#SET{val_autocomplete, #GET{val_autocomplete}|push{off}}
+
+[(#REM) cle secrete > on modifie le place holder]
+#SET{placeholder,''}
+[(#ENV{cle_secrete}|oui)
+	#SET{placeholder,#ENV{valeur_forcee,#ENV{valeur,#ENV{{default}}}|spip_affiche_mot_de_passe_masque{true}}
+]
+[(#ENV{cle_secrete}|non)
+	#SET{placeholder,#ENV{placeholder}}
+]
+
+[(#REM) permettre de donner un identifiant de list specifique en option de la saisie
+]#SET{list_id,#ENV{list}}
+[(#REM) Détecter si le tableau est séquentiel ou associatif, pour choisir s'il faut prendre la clé en valeur
+]#SET{data_is_sequential,#GET{data}|is_array|?{#GET{data}|array_keys|=={#VAL{0}|range{#GET{data}|count|moins{1}}}}}
+<B_selection>
+[(#SET{list_id,[(#GET{list_id,[champ_(#ENV{nom})_data]})]})]
+<datalist id="#GET{list_id}">
+<BOUCLE_selection(DATA){source tableau, #GET{data}}>
+  [<option value="(#GET{data_is_sequential}|?{#VALEUR,#CLE}|attribut_html)">[(#VALEUR|attribut_html)]</option>]
+</BOUCLE_selection>
+</datalist>
+</B_selection>
+<input type="#GET{type}" name="#ENV{nom}" class="text[ (#GET{type}|=={text}|non)#GET{type}[ text_(#GET{type})]][ (#ENV{class})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ list="(#GET{list_id})"][ value="(#ENV{cle_secrete}|?{'',#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|saisies_utf8_restaurer_planes)"][ size="(#ENV{size})"][ minlength="(#ENV{minlength})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#GET{placeholder})"][(#HTML5|oui)[(#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|oui) required="required"][ min="(#ENV{min})"][ max="(#ENV{max})"][ step="(#ENV{step})"][(#ENV{autofocus}|et{#ENV{autofocus}|!={non}}|oui) autofocus="autofocus"]][(#GET{val_autocomplete}|find{#ENV{autocomplete}}|oui) autocomplete="#ENV{autocomplete}"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})] />
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/input.php b/design_system_dependences/saisies/v5.2.0/saisies/input.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ecdbb3885ec425b1d26785b8b6dff953a67d2af
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/input.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\input
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function input_valeurs_acceptables($valeur, $description) {
+	include_spip('saisies/textarea');
+	return textarea_valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/input.yaml b/design_system_dependences/saisies/v5.2.0/saisies/input.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9fc58b496a0475d16989b71be480c786a1a29269
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/input.yaml
@@ -0,0 +1,164 @@
+
+titre: '<:saisies:saisie_input_titre:>'
+description: '<:saisies:saisie_input_explication:>'
+icone: 'images/saisies_input-xx.svg'
+categorie:
+  type: 'libre'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut_session'
+          label: '<:saisies:option_defaut_session_label:>'
+          explication: '<:saisies:option_defaut_session_explication:>'
+          size: 50
+          data: ['email', 'nom']
+          placeholder: 'email'
+      -
+        saisie: 'input'
+        options:
+          nom: 'placeholder'
+          label: '<:saisies:option_placeholder_label:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'radio'
+        options:
+          nom: 'type'
+          label: '<:saisies:option_type:>'
+          data:
+            text: '<:saisies:option_type_text:>'
+            password: '<:saisies:option_type_password:>'
+            color: '<:saisies:option_type_color:>'
+          defaut: 'text'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'minlength'
+          label: '<:saisies:option_minlength_label:>'
+          explication: '<:saisies:option_minlength_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'maxlength'
+          label: '<:saisies:option_maxlength_label:>'
+          explication: '<:saisies:option_maxlength_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'case'
+        options:
+          nom: 'disable'
+          label_case: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'disable_avec_post'
+          label_case: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'readonly'
+          label_case: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'radio'
+        options:
+          nom: 'autocomplete'
+          label: '<:saisies:option_autocomplete_label:>'
+          explication: '<:saisies:option_autocomplete_explication:>'
+          data:
+            'defaut': '<:saisies:option_autocomplete_defaut:>'
+            'on': '<:saisies:option_autocomplete_on:>'
+            'off': '<:saisies:option_autocomplete_off:>'
+          defaut: 'defaut'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_input_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/mot.html b/design_system_dependences/saisies/v5.2.0/saisies/mot.html
new file mode 100644
index 0000000000000000000000000000000000000000..502bced01ff7b3470807fde29bfe6eb089b1fb76
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/mot.html
@@ -0,0 +1,71 @@
+[(#REM) 
+
+	Produit soit un select, soit des checkbox.
+
+	Par défaut, c'est un select avec valeur unique.
+	Si on donne un id_groupe configuré pour du multiple, alors c'est un checkbox.
+
+	On peut forcer la saisie select avec le paramètre forcer_select.
+	On peut forcer unqiue/multiple avec le parametre multiple.
+
+	Parametres :
+	- forcer_select : forcer l'utilisation d'un select
+	- multiple : si quelquechose est passe, la saisie est multiple
+	- id_groupe : groupe des mots clés à afficher
+                Note : si ce groupe de mot est configuré pour avoir plusieurs
+                mots possibles, alors une liste de cases à cocher est
+                affichée au lieu du sélecteur habituel.
+                Utiliser `forcer_select=oui` pour éviter ce comportement
+                (par exemple en utilisation avec Chosen)
+	- groupes_exclus : liste d'ids de groupe dont on ne veut pas les mots
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - size : la taille du sélecteur (seulement si multiple)
+
+  Exemple d'appel :
+	[(#SAISIE{mot, en_region,
+		label=<:plugin:en_region:>})]
+]
+[(#REM)
+	Si groupe précis demandé, on affiche les mots à plat
+	Sinon, on regroupe par groupe de mots
+]
+#SET{data,#ARRAY}
+<BOUCLE_data(MOTS)
+	{id_groupe?}
+	{!id_groupe IN #ENV{groupes_exclus}}
+	{par id_groupe, num titre, titre}
+>
+[(#ENV{id_groupe}|intval|oui)
+	#SET{data,#GET{data}|plus{#ARRAY{#ID_MOT,#TITRE}}}
+][(#ENV{id_groupe}|intval|non)
+	#SET{data_groupe,#GET{data/#TYPE}|sinon{#ARRAY}|plus{#ARRAY{#ID_MOT,#TITRE}}}
+	#SET{data,#GET{data}|array_merge{#ARRAY{#TYPE,#GET{data_groupe}}}}
+	]
+</BOUCLE_data>
+
+[(#REM)
+	Valeurs multiples :
+	- on prend le paramètre 'multiple' en priorité
+	- sinon, vrai par défaut s'il y a un groupe d'indiqué et que sa conf est ok
+]
+#SET{multiple,#ENV{multiple}|is_null|non|?{
+	#ENV{multiple},
+	#ENV{id_groupe}|?{#INFO_UNSEUL{groupemots,#ENV{id_groupe}}|!={oui}}
+}}
+
+[(#REM)
+	Type de saisie :
+	- select si valeur unique ou option 'forcer_select'
+	- checkbox si multiple
+]
+#SET{saisie, #GET{multiple}|?{
+		#ENV{forcer_select}|?{selection_multiple,checkbox},
+		selection}
+}
+
+[(#REM) Inclusion de la saisie choisie ]
+<INCLURE{fond=saisies/#GET{saisie}, data=#GET{data}, env}>
\ No newline at end of file
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/mot.yaml b/design_system_dependences/saisies/v5.2.0/saisies/mot.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..94b5fc38c1b9bf3c6523ebf25738a27cacda6453
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/mot.yaml
@@ -0,0 +1,123 @@
+
+titre: '<:saisies:saisie_mot_titre:>'
+description: '<:saisies:saisie_mot_explication:>'
+icone: 'images/saisies_mots-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'groupe_mots'
+        options:
+          nom: 'id_groupe'
+          label: '<:saisies:option_id_groupe_label:>'
+          afficher_id_groupe: ' '
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'multiple'
+          label_case: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'forcer_select'
+          label_case: '<:saisies:option_forcer_select_label_case:>'
+          explication: '<:saisies:option_forcer_select_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_mot_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/oui_non.html b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.html
new file mode 100644
index 0000000000000000000000000000000000000000..0eac98fae9ed23b3e44e81eb80e4dfee36a9d5a2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.html
@@ -0,0 +1,23 @@
+[(#REM) 
+
+  Action :
+  - Rempli "on" si oui, "" si non.
+  
+  Parametres :
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+	[(#SAISIE{oui_non, afficher_liste,
+		label=<:plugin:afficher_liste:>,
+		explication=<:plugin:explication_afficher_liste:>})]
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+<div class="choix[ (#ENV{class})]">
+	<input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_oui"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"] />
+	<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_oui"[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)class="on"]><:item_oui:></label>
+</div>
+<div class="choix[ (#ENV{class})]">
+	<input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_non"[ (#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})checked="checked"] value="#ENV{valeur_non,''}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"] />
+	<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_non"[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})class="on"]><:item_non:></label>
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/oui_non.php b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5bc0837d69665dcc8e29c3b1175cbf8b8c05913
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\oui_non
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function oui_non_valeurs_acceptables($valeur, $description) {
+	include_spip('saisies/case');
+	return case_valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/oui_non.yaml b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ce582f79aa1d48a6c14beeec8576ecd04982ff14
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/oui_non.yaml
@@ -0,0 +1,95 @@
+
+titre: '<:saisies:saisie_oui_non_titre:>'
+description: '<:saisies:saisie_oui_non_explication:>'
+icone: 'images/saisies_toggle-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 1
+obsolete: true
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'valeur_oui'
+          label: '<:saisies:option_valeur_oui_label:>'
+          explication: '<:saisies:option_oui_non_valeur_oui_explication:>'
+          size: 50
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'valeur_non'
+          label: '<:saisies:option_valeur_non_label:>'
+          explication: '<:saisies:option_valeur_non_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_oui_non_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "varchar(3) DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/pays.html b/design_system_dependences/saisies/v5.2.0/saisies/pays.html
new file mode 100644
index 0000000000000000000000000000000000000000..c1c85b828e3a49679c1af0aec23539cacb1ca228
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/pays.html
@@ -0,0 +1,21 @@
+[(#REM) 
+
+  ### /!\ table GEO_PAYS (geographie) ###
+	
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+	[(#SAISIE{pays, pays,
+		label=<:plugin:info_pays:>})] 
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_pays(GEO_PAYS){par multi nom}>
+	<option value="#ID_PAYS"[(#ID_PAYS|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#NOM</option>
+</BOUCLE_pays>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/police.html b/design_system_dependences/saisies/v5.2.0/saisies/police.html
new file mode 100644
index 0000000000000000000000000000000000000000..08f52b9831b608b8732c6b376f65b592fd60090b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/police.html
@@ -0,0 +1,20 @@
+[(#REM)
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{police, couleur_foncee,
+		label=<:spa:couleur_foncee:>,
+		obligatoire=non})]
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+	<BOUCLE_police(DATA){source tableau, #VAL{polices/}|find_all_in_path{\w+\.ttf}}{par cle}>
+		<option value="#CLE"[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)selected="selected"]>#CLE</option>
+	</BOUCLE_police>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/position_construire_formulaire.html b/design_system_dependences/saisies/v5.2.0/saisies/position_construire_formulaire.html
new file mode 100644
index 0000000000000000000000000000000000000000..4ec8bc876a6f72748b1e6a0f07d2b48a8b63e1d0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/position_construire_formulaire.html
@@ -0,0 +1,53 @@
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">
+	#SET{tab,#ENV{formulaire}}
+	#SET{tab_par_nom,#ENV{formulaire}|saisies_lister_par_nom}
+	#SET{indent,0}
+	#SET{liste_parents,#ARRAY{0,''}}
+	<BOUCLE_parcours(DATA){source tableau, #GET{tab}}>
+	#SET{saisie,#VALEUR}
+	<option value="#GET{saisie/options/nom}" [(#ENV{valeur,#ENV{saisie_a_positionner}}|=={#GET{saisie/options/nom}}|oui)selected="selected"]>
+		[(#VAL{&nbsp;}|str_repeat{#GET{indent}})]
+		[(#GET{saisie/options/label}
+			|sinon{#GET{saisie/options/label_case}}
+			|sinon{#GET{saisies/options/titre}}
+			|sinon{#GET{saisies/option/texte}}
+			|sinon{#GET{saisie/options/nom}}
+			|sinon{''}
+			|couper{60})]
+	</option>
+		<BOUCLE_test_enfants(CONDITION){si #GET{saisie/options/nom}|!={#ENV{saisie_a_positionner}}|et{#GET{saisie/saisies}|is_array}}>
+		#SET{tab,#GET{saisie/saisies}}
+		#SET{indent,#GET{indent}|plus{2}}
+		#SET{liste_parents,#GET{liste_parents}|push{#GET{saisie/options/nom}}}
+		<BOUCLE_parcours_recursif(BOUCLE_parcours)/>
+		#SET{indent,#GET{indent}|moins{2}}
+		#SET{liste_parents,#GET{liste_parents}|array_slice{0,-1}}
+		</BOUCLE_test_enfants>
+	</BOUCLE_parcours>
+	#SET{parent, #GET{liste_parents}|table_valeur{#GET{liste_parents}|count|moins{1}}}
+	<option value="[#GET{parent}]" style="font-style:italic">
+		[(#VAL{&nbsp;}|str_repeat{#GET{indent}})]
+		[(#GET{parent}|non)
+			<:saisies:construire_position_fin_formulaire:>
+		]
+		[(#GET{parent}|oui)
+			#SET{groupe,#GET{tab_par_nom/#GET{parent}}}
+			#SET{groupe,#GET{groupe/options/label}|sinon{#GET{groupe/options/nom}}|sinon{''}|couper{60}}
+			<:saisies:construire_position_fin_groupe{groupe=#GET{groupe}}:>
+		]
+	</option>
+	</B_parcours>
+	#SET{parent, #GET{liste_parents}|table_valeur{#GET{liste_parents}|count|moins{1}}}
+	<option value="\[#GET{parent}\]" style="font-style:italic">
+		[(#VAL{&nbsp;}|str_repeat{#GET{indent}})]
+		[(#GET{parent}|non)
+			<:saisies:construire_position_fin_formulaire:>
+		]
+		[(#GET{parent}|oui)
+			#SET{groupe,#GET{tab_par_nom/#GET{parent}}}
+			#SET{groupe,#GET{groupe/options/label}|sinon{#GET{groupe/options/nom}}|sinon{''}|couper{60}}
+			<:saisies:construire_position_fin_groupe{groupe=#GET{groupe}}:>
+		]
+	</option>
+	<//B_parcours>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/radio.html b/design_system_dependences/saisies/v5.2.0/saisies/radio.html
new file mode 100644
index 0000000000000000000000000000000000000000..2c076297229f97fe68a125a7ce8ee4458c1763f3
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/radio.html
@@ -0,0 +1,40 @@
+[(#REM)
+
+  Parametres :
+  - data : tableau de donnees cle=>valeur
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{radio, afficher_liste,
+		label=<:plugin:afficher_liste:>,
+		explication=<:plugin:explication_afficher_liste:>,
+		data=#ARRAY{
+			cle1,valeur1,
+			cle2,valeur2,
+			cle3,valeur3}})]
+]
+
+#SET{data, #ENV*{data, #ENV*{datas}}}
+
+#SET{disable_choix, #ENV{disable_choix}|saisies_normaliser_disable_choix}
+
+#SET{compteur_id,0}
+<BOUCLE_radio(DATA){source tableau, #GET{data}}>
+	[(#REM) Soit il y a des sous-groupes ]
+	#SET{compteur_id,#GET{compteur_id}|plus{1}}
+	<BOUCLE_groupes(CONDITION) {si #VALEUR|is_array}>
+	<div class="choix-groupe">
+		<p class="editer-label">#CLE</p>
+		#SET{data,#VALEUR}
+		<BOUCLE_inclusion(BOUCLE_radio) />
+	</div>
+	</BOUCLE_groupes>
+	[(#REM) Soit c'est un tableau simple ]
+	#SET{disabled, #ENV{disable}|is_string|?{#ENV{disable}, #ENV{disable/#CLE}}}
+	<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE][ (#GET{disabled}|ou{#CLE|in_array{#GET{disable_choix}}})disabled][ (#ENV{class})]">
+		<input type="radio" name="#ENV{nom}" class="radio"[ (#HTML5|oui)[(#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|oui) required="required"]] id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_#GET{compteur_id}"[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|strval|=={#CLE|strval}|oui)checked="checked"] value="#CLE"[(#GET{disabled}|ou{#CLE|in_array{#GET{disable_choix}}}) disabled="disabled"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})] />
+		<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_#GET{compteur_id}"[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)class="on"]>#VALEUR</label>
+	</div>
+	<//B_groupes>
+</BOUCLE_radio>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/radio.php b/design_system_dependences/saisies/v5.2.0/saisies/radio.php
new file mode 100644
index 0000000000000000000000000000000000000000..28c6e8abdb5c367238de99c37a9caa074c4904c0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/radio.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une valeur
+ *
+ * @package SPIP\valeurs\radio
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function radio_valeurs_acceptables($valeur, $description) {
+	include_spip('saisies/selection');
+	// Structurellement, une saisie radio ou une saisie select, c'est un choix parmis N options.
+	// Donc la vérif des données postées est la même
+	return selection_valeurs_acceptables($valeur, $description);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/radio.yaml b/design_system_dependences/saisies/v5.2.0/saisies/radio.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f1185e6c9fc1ff8798e87e2e2143e55ab5d36122
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/radio.yaml
@@ -0,0 +1,121 @@
+
+titre: '<:saisies:saisie_radio_titre:>'
+description: '<:saisies:saisie_radio_explication:>'
+icone: 'images/saisies_radio-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_sous_groupe_explication:>'
+          explication_dev: '<:saisies:option_datas_sous_groupe_explication_dev:>'
+          rows: 10
+          cols: 50
+        verifier:
+          type: 'saisies_option_data'
+      -
+        saisie: 'case'
+        options:
+          nom: 'vue_masquer_sous_groupe'
+          label_case: '<:saisies:option_vue_masquer_sous_groupe:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: "@datas@ MATCH '/^\\*/m'"
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'disable_choix'
+          label: '<:saisies:option_disable_choix_label:>'
+          explication: '<:saisies:option_disable_choix_explication:>'
+          explication_dev: '<:saisies:option_disable_choix_explication_dev:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_radio_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/recherche.html b/design_system_dependences/saisies/v5.2.0/saisies/recherche.html
new file mode 100644
index 0000000000000000000000000000000000000000..78c676aafa2f33849467685cf7fc9f3314ceda7c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/recherche.html
@@ -0,0 +1,10 @@
+[(#REM) 
+		Zone de recherche. Sur les sites en HTML5, utilise type="search"
+		sur le input, et type="text" par défaut pour les autres.
+		Dans ce dernier cas, on renseigne quand même class="search"
+		("recherche" serait mieux, mais la saisie input utilise automatiquement
+		la valeur de #ENV{type}).
+][(#INCLURE{fond=saisies/input,
+			env,
+            type=#HTML5|?{search,text},
+            class=[(#HTML5|?{[(#ENV{class})],[(#ENV{class}) ]search})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/secteur.html b/design_system_dependences/saisies/v5.2.0/saisies/secteur.html
new file mode 100644
index 0000000000000000000000000000000000000000..17707e74fa867c858308d74fc979ca51755ad276
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/secteur.html
@@ -0,0 +1,31 @@
+[(#REM) 
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+  	Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int
+  - recursif : si oui liste les rubriques de facon recursive, et pas uniquement les secteurs
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - size : la taille du sélecteur (seulement si multiple)
+	 
+  Exemple d'appel :
+	[(#SAISIE{secteur,secteur_region,
+		label=<:plugin:secteur_region:>,
+		multiple=oui})] 
+]
+<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple"[ size="(#ENV{size})"]][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+		<option value="">[(#ENV{option_intro})]</option>]
+	<BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+		[(#ENV{recursif}|oui)
+		<INCLURE{fond=prive/listes/rubriques_recursives,valeur=#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}},id_rubrique=#ID_RUBRIQUE,multiple} />]
+	</BOUCLE_secteurs>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur.html
new file mode 100644
index 0000000000000000000000000000000000000000..01d8e89df3220d66301c36bcfcf69891862e91d8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur.html
@@ -0,0 +1,16 @@
+
+[(#REM) Attention ! Nécessite SPIP 3 ! ]
+
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]
+
+[(#INCLURE{fond=formulaires/selecteur/generique,
+	selected=#GET{val},
+	name=#ENV{nom},
+	afficher_langue=#ENV{afficher_langue,''},
+	select=[(#ENV{multiple}|?{'',' '})],
+	whitelist=#ENV{whitelist,#ARRAY},
+	blacklist=#ENV{blacklist,#ARRAY},
+	racine=#ENV{racine},
+	objet=#ENV{objet,racine},
+	id_objet=#ENV{id_objet,0},
+	env})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..a4627b6d4ff45f9ac7e5272ba7e69eaf7411265b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.html
@@ -0,0 +1,45 @@
+[(#REM)
+
+	Affiche un navigateur de sélection d’articles par le biais du sélecteur générique de Spip.
+
+	### /!\ Format des données ###
+	Attention, le picker ajax du sélecteur générique retourne toujours un tableau :
+	_request($name) = array('article|3', 'article|9', 'rubrique|10');
+	Une fonction de SPIP 3 permet de récupérer un tableau d'identifiants par type d'objet :
+	[(#CHAMP|picker_selected{article})]
+	Cette fonction peut être pratique dans une boucle en utilisant le critere IN
+	(picker_selected est dans prive/formulaires/selecteur/generique_fonctions.php de SPIP 3)
+	La valeur en entrée peut être un simple id ou un tableau d'ids, elle sera convertie au bon format.
+
+  Parametres :
+  - multiple : si oui, on peut selectionner plusieurs articles
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne
+  - afficher_art_dans_langue_interface : si oui, on n'affiche que les articles de la langue de l'interface
+  - limite_branche : branche dans laquelle on limite le selecteur
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement. Doit être de type #ARRAY{'article|3','article|9',etc}
+
+  Exemple d'appel :
+	[(#SAISIE{selecteur_article,id_article,
+		label=<:plugin:article_en_une:>})]
+]
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|saisies_picker_preselect_objet{article}})]
+
+[(#SET{filtrer_langue_article,[(#ENV{afficher_art_dans_langue_interface,0}|oui) #ENV{lang}]})]
+
+[(#REM) input necessaire au tag label for
+	Mais si on le garde, la saisie enregistree en base, n'est pas correcte
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML
+   Yffic
+]
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" value="" />-->
+[(#INCLURE{fond=formulaires/selecteur/articles,
+	selected=#GET{val},
+	name=#ENV{nom},
+	afficher_langue=#ENV{afficher_langue,''},
+	filtrer_langue_article=#GET{filtrer_langue_article,''},
+	select=[(#ENV{multiple}|?{0,1})],
+	limite_branche=#ENV{limite_branche,''},
+	rubriques=0})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..aeaa399521e986cd528990f658adeabb239361c8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_article.yaml
@@ -0,0 +1,104 @@
+
+titre: '<:public:article:>'
+description: '<:saisies:saisie_selecteur_article:>'
+icone: 'images/saisies_articles-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_langue'
+          label: '<:saisies:option_aff_langue_label:>'
+          explication: '<:saisies:option_aff_langue_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_art_dans_langue_interface'
+          label: '<:saisies:option_aff_art_interface_label:>'
+          explication: '<:saisies:option_aff_art_interface_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'limite_branche'
+          label: '<:saisies:option_limite_branche_label:>'
+          explication: '<:saisies:option_limite_branche_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:public:article:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.html
new file mode 100644
index 0000000000000000000000000000000000000000..818759f54698bec9fd42a6bd058d79f0125fc484
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.html
@@ -0,0 +1,82 @@
+[(#REM)
+
+  Parametres supplementaire :
+  - defaut : valeur par defaut du parametre
+  - class : classe(s) css ajoutes a l'input
+  - size : taille du champ
+  - maxlength : nombre de caracteres maximum
+  - disable : champ insaisissable ? 'oui' (defaut : '')
+  - media : pour restreindre la modalboxe a un type de media particulier
+  - extension : pour restreindre a un type de fichier
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - multiple : si "oui", permet de lister plusieurs id_document séparés par des virgules
+
+  Note : dans les options, il faut definir 'env' a 'oui' pour que le selecteur puisse recuperer id_article, id_rubrique ou id_breve.
+]
+
+<input type="text" name="#ENV{nom}" class="text[ (#ENV{class})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"][ (#ENV*{attributs})] />
+
+[(#REM) Si la mediatheque est presente ]
+[(#PLUGIN{medias}|oui)
+
+
+[(#REM) Parcourir les documents de l'article ]
+[(#ENV{id_article}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_article:>"
+	onclick="jQuery.modalboxload(
+		'[(#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect_#ENV{nom}&id_article=#ENV{id_article}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+		{autoResize: true}
+	);"
+/></p>
+]
+
+[(#REM) Parcourir les documents de la rubrique ]
+[(#ENV{id_rubrique}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_rubrique:>"
+	onclick="jQuery.modalboxload(
+		'[(#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect_#ENV{nom}&id_rubrique=#ENV{id_rubrique}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+		{autoResize: true}
+	);"
+/></p>
+]
+
+[(#REM) Parcourir les documents de la breve ]
+[(#ENV{id_breve}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_breve:>"
+	onclick="jQuery.modalboxload(
+		'[(#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect_#ENV{nom}&id_breve=#ENV{id_breve}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+		{autoResize: true}
+	);"
+/></p>
+]
+
+[(#REM) Parcourir toute la mediatheque ]
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_mediatheque:>"
+	onclick="jQuery.modalboxload(
+		'[(#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect_#ENV{nom}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+		{autoResize: true}
+	);"
+/></p>
+
+
+<script type="text/javascript">
+	function mediaselect_#ENV{nom}(id){
+		jQuery.modalboxclose();
+
+		[(#REM) Si multiple, on fait une liste à virgules ]
+		[(#ENV{multiple}|=={oui}|oui)
+		var valeur_actuelle = jQuery("#champ_#ENV{id,#ENV{nom}}").val();
+		valeur_actuelle = valeur_actuelle.split(',').filter(Boolean);
+		valeur_actuelle.push(id);
+		valeur_actuelle = valeur_actuelle.join(',');
+		jQuery("#champ_#ENV{id,#ENV{nom}}").val(valeur_actuelle).focus();
+		]
+		[(#ENV{multiple}|=={oui}|non)
+		jQuery("#champ_#ENV{id,#ENV{nom}}").val(id).focus();
+		]
+	};
+</script>
+
+
+]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d7352a8c2e26aa8b774bcbb5acbcaa37c2ffb038
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_document.yaml
@@ -0,0 +1,55 @@
+titre: '<:medias:objet_document:>'
+description: '<:saisies:saisie_selecteur_document:>'
+icone: 'images/saisies_documents-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+ -
+   saisie: 'fieldset'
+   options:
+     nom: 'description'
+     label: '<:saisies:option_groupe_description:>'
+   saisies:
+     -
+       saisie: 'input'
+       options:
+         nom: 'label'
+         label: '<:saisies:option_label_label:>'
+         explication: '<:saisies:option_label_explication:>'
+         size: 50
+     - 'inclure:saisies/_base/explication.yaml'
+ -
+   saisie: 'fieldset'
+   options:
+     nom: 'affichage'
+     label: '<:saisies:option_groupe_affichage:>'
+   saisies:
+     -
+       saisie: 'input'
+       options:
+         nom: 'attention'
+         label: '<:saisies:option_attention_label:>'
+         explication: '<:saisies:option_attention_explication:>'
+         size: 50
+ -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+ -
+   saisie: 'fieldset'
+   options:
+     nom: 'validation'
+     label: '<:saisies:option_groupe_validation:>'
+   saisies:
+     -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+ options:
+   label: '<:medias:objet_document:>'
+   # champs extras (definition du champ sql)
+   sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_langue.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_langue.html
new file mode 100644
index 0000000000000000000000000000000000000000..af90cf5ca7dd5df0eea3d2ef2be715288ca923e6
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_langue.html
@@ -0,0 +1,16 @@
+[(#REM) 
+	
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+	[(#SAISIE{selecteur_langue,lang,
+		label=<:plugin:info_langue:>})] 
+]
+[(#SET{valeur,[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,''}}})]})]
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+[(#INCLURE{fond=prive/formulaires/inc-options-langues,name=#ENV{type_lang, changer_lang},default=#GET{valeur}})]
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.html
new file mode 100644
index 0000000000000000000000000000000000000000..3a4059c89611bc744b526a16b7dd7670bc4a69c5
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.html
@@ -0,0 +1,45 @@
+[(#REM)
+
+	Affiche un navigateur de sélection de rubriques par le biais du sélecteur générique de Spip.
+
+	### /!\ Format des données ###
+	Attention, le picker ajax du sélecteur générique retourne toujours un tableau :
+	_request($name) = array('article|3', 'article|9', 'rubrique|10');
+	Une fonction de SPIP 3 permet de récupérer un tableau d'identifiants par type d'objet :
+	[(#CHAMP|picker_selected{rubrique})]
+	Cette fonction peut être pratique dans une boucle en utilisant le critere IN
+	(picker_selected est dans prive/formulaires/selecteur/generique_fonctions.php de SPIP 3)
+	La valeur en entrée peut être un simple id ou un tableau d'ids, elle sera convertie au bon format.
+
+  Parametres :
+  - multiple : si oui, on peut selectionner plusieurs rubriques
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne
+  - limite_branche : branche dans laquelle on limite le selecteur
+  - afficher_rub_dans_langue_interface : si oui, on n'affiche que les rubriques de la langue de l'interface
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{selecteur_rubrique,rubriques_menu,
+		multiple=oui,
+		label=<:plugin:article_en_une:>})]
+]
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|saisies_picker_preselect_objet{rubrique}})]
+
+[(#SET{filtrer_langue_rubrique,[(#ENV{afficher_rub_dans_langue_interface,0}|oui) #ENV{lang}]})]
+
+[(#REM) input necessaire au tag label for
+	Mais si on le garde, la saisie enregistree en base, n'est pas correcte
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML
+   Yffic
+]
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" id="[champ_(#ENV{nom,id_item})]" value="" />-->
+[(#INCLURE{fond=formulaires/selecteur/rubriques,
+	selected=#GET{val},
+	name=#ENV{nom},
+	afficher_langue=#ENV{afficher_langue,''},
+	filtrer_langue_rubrique=#GET{filtrer_langue_rubrique,''},
+	limite_branche=#ENV{limite_branche,''},
+	select=[(#ENV{multiple}|?{0,1})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..53fe5eb4a14c6e6bbeb81713886995c3bf2c0ec9
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique.yaml
@@ -0,0 +1,104 @@
+
+titre: '<:public:rubrique:>'
+description: '<:saisies:saisie_selecteur_rubrique:>'
+icone: 'images/saisies_rubriques-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_langue'
+          label: '<:saisies:option_aff_langue_label:>'
+          explication: '<:saisies:option_aff_langue_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_rub_dans_langue_interface'
+          label: '<:saisies:option_aff_rub_interface_label:>'
+          explication: '<:saisies:option_aff_rub_interface_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'limite_branche'
+          label: '<:saisies:option_limite_branche_label:>'
+          explication: '<:saisies:option_limite_branche_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:public:rubrique:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..fded1df4fe3d31bf17a79dbbbaa52590d8d9e61f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.html
@@ -0,0 +1,48 @@
+[(#REM)
+
+	Affiche un navigateur de sélection d’articles ou de rubriques par le biais du sélecteur générique de Spip.
+
+	### /!\ Format des données ###
+	Attention, le sélecteur générique retourne toujours un tableau :
+	_request($name) = array('article|3', 'article|9', 'rubrique|10');
+	Une fonction de SPIP 3 permet de récupérer un tableau d'identifiants par type d'objet :
+	[(#CHAMP|picker_selected{article})]
+	Cette fonction peut être pratique dans une boucle en utilisant le critere IN
+	(picker_selected est dans prive/formulaires/selecteur/generique_fonctions.php de SPIP 3)
+
+  Parametres :
+  - multiple : si oui, on peut selectionner plusieurs rubriques
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne
+  - afficher_art_dans_langue_interface : si oui, on n'affiche que les articles de la langue de l'interface
+  - afficher_rub_dans_langue_interface : si oui, on n'affiche que les rubriques de la langue de l'interface
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+	 
+  Exemple d'appel :
+	[(#SAISIE{selecteur_rubrique_article,menu,
+		multiple=1,
+		label=<:plugin:choisir_le_menu:>})] 
+]
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]
+
+[(#SET{filtrer_langue_article,[(#ENV{afficher_art_dans_langue_interface,0}|oui) #ENV{lang}]})]
+[(#SET{filtrer_langue_rubrique,[(#ENV{afficher_rub_dans_langue_interface,0}|oui) #ENV{lang}]})]
+
+[(#REM) input necessaire au tag label for 
+	Mais si on le garde, la saisie enregistree en base, n'est pas correcte
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML
+   Yffic
+]
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" id="[champ_(#ENV{nom,id_item})]" value="" /> -->
+
+[(#INCLURE{fond=formulaires/selecteur/articles,
+	selected=#GET{val},
+	name=#ENV{nom},
+	afficher_langue=#ENV{afficher_langue,''},
+	filtrer_langue_article=#GET{filtrer_langue_article,''},
+	filtrer_langue_rubrique=#GET{filtrer_langue_rubrique,''},
+	select=[(#ENV{multiple}|?{0,1})],
+	rubriques=1})]
+
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bc51e3d3211e3ffc8c06c7a31422244c192f08af
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_rubrique_article.yaml
@@ -0,0 +1,104 @@
+
+titre: '<:saisies:saisie_selecteur_rubrique_article_titre:>'
+description: '<:saisies:saisie_selecteur_rubrique_article:>'
+icone: 'images/saisies_rubriques_articles-xx.svg'
+categorie:
+  type: 'objet'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_langue'
+          label: '<:saisies:option_aff_langue_label:>'
+          explication: '<:saisies:option_aff_langue_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_art_dans_langue_interface'
+          label: '<:saisies:option_aff_art_interface_label:>'
+          explication: '<:saisies:option_aff_art_interface_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'afficher_rub_dans_langue_interface'
+          label: '<:saisies:option_aff_rub_interface_label:>'
+          explication: '<:saisies:option_aff_rub_interface_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_selecteur_rubrique_article_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selecteur_site.html b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_site.html
new file mode 100644
index 0000000000000000000000000000000000000000..345380a08df35026075c3291d9d35170b2d58d84
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selecteur_site.html
@@ -0,0 +1,33 @@
+[(#REM)
+
+Saisies qui liste les sites syndiques
+Par défaut ne liste que ceux des rubriques à la racine (secteurs)
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+    Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - syndication : 'oui' ou 'non' (sélectionner uniquement les sites avec ou sans syndication)
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+]
+<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+		<option value="0">[(#ENV{option_intro})]</option>]
+	<BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>
+	<B_sites>
+	<optgroup label="#TITRE">
+		<BOUCLE_sites(SITES){id_secteur}{par nom_site}{syndication ?}>
+		[(#ENV{multiple}|oui)
+		<option value="#ID_SYNDIC"[(#ID_SYNDIC|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#NOM_SITE</option>]
+		[(#ENV{multiple}|non)
+		<option value="#ID_SYNDIC"[(#ID_SYNDIC|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#NOM_SITE</option>]
+		</BOUCLE_sites>
+	</optgroup>
+	</B_sites>
+	</BOUCLE_secteurs>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection.html b/design_system_dependences/saisies/v5.2.0/saisies/selection.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ced2816008d243922f18ae5513cb25d7f2a56a9
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection.html
@@ -0,0 +1,72 @@
+[(#REM)
+
+  Parametres :
+  - ** data : tableau de donnees
+               liste simple : cle=>valeur
+               liste avec groupes :  cle=> tableau (cle=>valeur)
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - disable_choix : liste de valeurs à désactiver, séparées par des virgules
+	- multiple: permettre une selection multiple
+
+  Exemples d'appels
+  pour une liste simple :
+	[(#SAISIE{selection,produits,
+		label=<:plugin:info_produits:>,
+		data=#ARRAY{
+			cle1,valeur1,
+			cle2,valeur2,
+			cle3,valeur3}})]
+  pour une liste avec groupes :
+	[(#SAISIE{selection,produits,
+		label=<:plugin:info_produits:>,
+		data=#ARRAY{
+			cle1,#ARRAY{
+				cle1,valeur1,
+				cle2,valeur2},
+			cle2,#ARRAY{
+				cle1,valeur1,
+				cle2,valeur2}}})]
+]
+
+#SET{data, #ENV*{data, #ENV*{datas}}}
+
+[(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
+#SET{valeur, #ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
+
+[(#REM) si multiple, la valeur doit être un tableau)]
+[(#ENV{multiple}|oui)
+	[(#ENV{multiple}|=={non}|non)
+		#SET{valeur,#GET{valeur}|saisies_valeur2tableau}
+	]
+]
+
+#SET{disabled, #ARRAY}
+[(#ENV{disable_choix,''}|strlen|oui) #SET{disabled, #ENV{disable_choix}|explode{','}}]
+#SET{disabled, #ENV{disable_choix}|saisies_normaliser_disable_choix}
+<select [(#HTML5|oui)[(#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|oui) required="required"]] name="#ENV{nom}[(#ENV{multiple}|?{\[\],''})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})][ multiple="(#ENV{multiple})"]>
+
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(DATA){source tableau, #GET{data}}>
+	<B_cond>
+	<optgroup label="#CLE">
+	<BOUCLE_cond(CONDITION){si #VALEUR|is_array}>
+		#SET{data,#VALEUR}
+		<BOUCLE_recursive(BOUCLE_selection) />
+	</BOUCLE_cond>
+	</optgroup>
+	</B_cond>
+	#SET{selected,''}
+	[(#ENV{multiple}|non)
+		[(#SET{selected,[(#CLE|=={#GET{valeur}}|oui)[(#GET{valeur}|strval|strlen|oui)selected="selected"]]})]
+	]
+	[(#ENV{multiple}|oui)
+		[(#SET{selected,[(#CLE|in_array{#GET{valeur,#LISTE}}|oui)selected="selected"]})]
+	]
+	<option value="#CLE" #GET{selected} [(#CLE|in_any{#GET{disabled}}|oui) disabled="disabled"]>#VALEUR</option>
+	<//B_cond>
+</BOUCLE_selection>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection.php b/design_system_dependences/saisies/v5.2.0/saisies/selection.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8f9e427a93fa861501c2acbc586ff45ca7bafde
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une valeur
+ *
+ * @package SPIP\valeurs\selection
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function selection_valeurs_acceptables($valeur, $description) {
+	$options = $description['options'];
+	if ($valeur == '' && !isset($options['obligatoire'])) {
+		return true;
+	}
+	if (saisies_saisie_est_gelee($description) && isset($options['defaut'])) {
+		return $valeur == $options['defaut'];
+	} else {
+		$data = saisies_trouver_data($description, true);
+		$data = saisies_aplatir_tableau($data);
+		$data = array_keys($data);
+		if (isset($options['disable_choix'])) {
+			include_spip('inc/saisies');
+			$disable_choix = saisies_normaliser_disable_choix($options['disable_choix']);
+			$data = array_diff($data, $disable_choix);
+		}
+		return (in_array($valeur, $data));
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selection.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0346720a415957e188196911715b7fb78a5ffa51
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection.yaml
@@ -0,0 +1,150 @@
+
+titre: '<:saisies:saisie_selection_titre:>'
+description: '<:saisies:saisie_selection_explication:>'
+icone: 'images/saisies_select-xx.svg'
+categorie:
+  type: 'choix'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_sous_groupe_explication:>'
+          explication_dev: '<:saisies:option_datas_sous_groupe_explication_dev:>'
+          rows: 10
+          cols: 50
+        verifier:
+          type: 'saisies_option_data'
+      -
+        saisie: 'case'
+        options:
+          nom: 'vue_masquer_sous_groupe'
+          label_case: '<:saisies:option_vue_masquer_sous_groupe:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: "@datas@ MATCH '/^\\*/m'"
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+          conteneur_class: 'pleine_largeur'
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+          afficher_si: '!@cacher_option_intro@'
+      -
+        saisie: 'case'
+        options:
+          nom: 'multiple'
+          label_case: '<:saisies:saisie_selection_multiple_titre:>'
+          conteneur_class: 'pleine_largeur'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'disable_choix'
+          label: '<:saisies:option_disable_choix_label:>'
+          explication: '<:saisies:option_disable_choix_explication:>'
+          explication_dev: '<:saisies:option_disable_choix_explication_dev:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_selection_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.html b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.html
new file mode 100644
index 0000000000000000000000000000000000000000..014ca10b58dc26af47cc852249fb1391348b2cba
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.html
@@ -0,0 +1,44 @@
+[(#REM)
+
+  Parametres :
+	- ** data : tableau de donnees
+               liste simple : cle=>valeur
+               liste avec groupes :  cle=> tableau (cle=>valeur)
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{selection_multiple,produits,
+		label=<:plugin:info_produits:>,
+		data=#ARRAY{
+			cle1,valeur1,
+			cle2,valeur2,
+			cle3,valeur3}})]
+]
+
+#SET{data, #ENV*{data, #ENV*{datas}}}
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+
+#SET{disabled, #ENV{disable_choix}|saisies_normaliser_disable_choix}
+<select name="#ENV{nom}[]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" multiple="multiple"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size,10})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(DATA){source tableau, #GET{data}}>
+	<B_cond>
+	<optgroup label="#CLE">
+	<BOUCLE_cond(CONDITION){si #VALEUR|is_array}><BOUCLE_optgroup(DATA){source tableau, #VALEUR}>
+		<option value="#CLE" [(#CLE|in_any{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui) selected="selected"][(#CLE|in_any{#GET{disabled}}|oui) disabled="disabled"]>#VALEUR</option>
+	</BOUCLE_optgroup></BOUCLE_cond>
+	</optgroup>
+	</B_cond>
+	<option value="#CLE" [(#CLE|in_any{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui) selected="selected"][(#CLE|in_any{#GET{disabled}}|oui) disabled="disabled"]>#VALEUR</option>
+	<//B_cond>
+</BOUCLE_selection>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.php b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.php
new file mode 100644
index 0000000000000000000000000000000000000000..d236d0e76991ed42761a9f40acd49e334ff318de
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\selection_multiple
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function selection_multiple_valeurs_acceptables($valeur, $description) {
+	if (!is_array($valeur)) {
+		if ($valeur) {
+			$valeur = explode(' ', $valeur);
+		} else {
+			$valeur = [];
+		}
+	}
+	$data = saisies_aplatir_tableau(saisies_trouver_data($description, true));
+	if (
+		isset($valeur['choix_alternatif'])
+		&& ($description['options']['choix_alternatif'] ?? '') == 'on'
+	) {
+		unset($valeur['choix_alternatif']);
+	}
+	if (
+		saisies_saisie_est_gelee($description)
+		&& isset($description['options']['defaut'])
+	) {
+		// Si valeur gelée, on vérifie qu'il n'y ni plus ni moins dans ce qui a été postée
+		$defaut = saisies_valeur2tableau($description['options']['defaut']);
+		$intersection = array_intersect($defaut, $valeur);
+		// L'intersection doit avoir le même nombre de valeur que le défaut. S'il a moins, c'est qu'on supprimé des valeurs, ou renommé
+		// L'intersection doit avoir le même nombre de valeur que posté. S'il y en a moins, c'est qu'on a posté de nouvelle valeur
+		// Sinon c'est bon
+		if (count($intersection) != count($defaut)) {
+			return false;
+		} elseif (count($intersection) != count($valeur)) {
+			return false;
+		} else {
+			return true;
+		}
+	} else {
+		//A-t-on essayé des poster des valeurs supplémentaires?
+		$choix_possibles = array_keys($data, true);
+		if (isset($description['options']['disable_choix'])) {
+			include_spip('inc/saisies');
+			$disable_choix = saisies_normaliser_disable_choix($description['options']['disable_choix']);
+			$choix_possibles = array_diff($choix_possibles, $disable_choix);
+		}
+		$diff = array_diff($valeur, $choix_possibles);
+		if (count($diff)) {
+			return false;
+		}
+	}
+	return true;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.yaml b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9c4fb613614c16b756fb0f4cbb59ead4382de401
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection_multiple.yaml
@@ -0,0 +1,133 @@
+
+titre: '<:saisies:saisie_selection_multiple_titre:>'
+description: '<:saisies:saisie_selection_multiple_explication:>'
+icone: 'images/saisies_select_multiple-xx.svg'
+obsolete: true
+categorie:
+  type: 'choix'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      - 'inclure:saisies/_base/explication.yaml'
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_sous_groupe_explication:>'
+          explication_dev: '<:saisies:option_datas_sous_groupe_explication_dev:>'
+          rows: 10
+          cols: 50
+        verifier:
+          type: 'saisies_option_data'
+      -
+        saisie: 'case'
+        options:
+          nom: 'vue_masquer_sous_groupe'
+          label_case: '<:saisies:option_vue_masquer_sous_groupe:>'
+          conteneur_class: 'pleine_largeur'
+          afficher_si: "@datas@ MATCH '/^\\*/m'"
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 10
+          cols: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'disable_choix'
+          label: '<:saisies:option_disable_choix_label:>'
+          explication: '<:saisies:option_disable_choix_explication:>'
+          explication_dev: '<:saisies:option_disable_choix_explication_dev:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_selection_multiple_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/selection_par_groupe.html b/design_system_dependences/saisies/v5.2.0/saisies/selection_par_groupe.html
new file mode 100644
index 0000000000000000000000000000000000000000..72af3ce8b2546dac2d14b4f6379c0f699aee37ca
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/selection_par_groupe.html
@@ -0,0 +1,35 @@
+[(#REM)
+
+	/!\ Déprécié, utiliser plutôt la nouvelle syntaxe de data pour la saisie selection/!\
+
+  Parametres :
+  - ** data : tableau de donnees groupe=>array(cle=>valeur)
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{selection_par_groupe,produits,
+		label=<:plugin:info_produits:>,
+		data=#ARRAY{
+			groupe 1,#ARRAY{
+				cle1,valeur1,
+				cle2,valeur2,
+				cle3,valeur3},
+			groupe 2,#ARRAY{
+				cle4,valeur1,
+				cle5,valeur2,
+				cle6,valeur3}}})]
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_groupes(DATA){source tableau, #ENV*{data, #ENV*{datas}}}>
+	<optgroup label="[(#CLE|attribut_html)]">
+		<BOUCLE_selection(DATA){source tableau, #VALEUR}>
+			<option value="#CLE" [(#CLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#VALEUR</option>
+		</BOUCLE_selection>
+	</optgroup>
+</BOUCLE_groupes>
+</select>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/statuts_auteurs.html b/design_system_dependences/saisies/v5.2.0/saisies/statuts_auteurs.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ed2d18cee9fc4cefde836bd0a4dd12009cdaea2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/statuts_auteurs.html
@@ -0,0 +1,44 @@
+[(#REM)
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+  	Dans le cas multiple, defaut et valeur doivent être un array, sinon un int
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - afficher_tous : permet d'afficher une option de valeur "tous" correspondant à tous les utilisateurs
+  - poubelle : permet d'afficher le statut poubelle
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - size : dans le cas d'un select multiple, limite le nombre de lignes au chiffre passé
+  
+  Exemple d'appel :
+	[(#SAISIE{statuts_auteurs,statuts,
+		label=<:plugin:statuts_des_auteurs:>,
+		multiple=oui})]
+]
+
+<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="[(#ENV{size,#ENV{afficher_tous}|?{4,3}})]"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+	[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+		<option value="">[(#ENV{option_intro})]</option>]
+		<BOUCLE_statuts_auteurs(DATA){source table, #EVAL{$GLOBALS['liste_des_statuts']}}{valeur!='5poubelle'}>
+			[(#ENV{multiple}|?{
+				<option value="#VALEUR"[(#VALEUR|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>[(#CLE|_T)]</option>
+			,
+			<option value="#VALEUR"[(#VALEUR|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>[(#CLE|_T)]</option>
+			})]
+	</BOUCLE_statuts_auteurs>
+	[(#ENV{multiple}|oui)
+		[(#ENV{poubelle}|oui)
+		<option value="5poubelle"[(#VAL{5poubelle}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:texte_statut_poubelle:></option>]
+		[(#ENV{afficher_tous}|oui)
+		<option value="tous"[(#VAL{tous}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:saisies:tous_visiteurs:></option>]	]
+	[(#ENV{multiple}|non)
+		[(#ENV{poubelle}|oui)
+			<option value="5poubelle"[(#VAL{5poubelle}|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]><:texte_statut_poubelle:></option>]
+		[(#ENV{afficher_tous}|oui)
+		<option value="tous"[(#VAL{tous}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:saisies:tous_visiteurs:></option>]
+	]
+</select>
+
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/statuts_objet.html b/design_system_dependences/saisies/v5.2.0/saisies/statuts_objet.html
new file mode 100644
index 0000000000000000000000000000000000000000..0f8d78fe24e48526960133a928e53998c599f169
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/statuts_objet.html
@@ -0,0 +1,9 @@
+
+[(#REM) On récupère les statuts de l'objet demandé ]
+#SET{statuts, #ARRAY}
+<BOUCLE_statuts(DATA){source table, #ENV{objet}|objet_info{statut_textes_instituer}}>
+#SET{statuts, #GET{statuts}|plus{#ARRAY{#CLE, #VALEUR|_T}}}
+</BOUCLE_statuts>
+
+#SET{type_saisie, #ENV{multiple}|?{selection_multiple, selection}}
+<INCLURE{fond=saisies/#GET{type_saisie}, env, data=#GET{statuts}}>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/telephone.html b/design_system_dependences/saisies/v5.2.0/saisies/telephone.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce67a2dd2f55d810b26d3fe2e951734bd7cb716f
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/telephone.html
@@ -0,0 +1,12 @@
+[(#REM) 
+
+		Zone de saisie de numero de telephone. Sur les sites en HTML5,
+		utilise type="tel" sur le input (et donc class="tel"); et
+		type="text" par défaut pour les autres (et donc class="text").
+		Dans ce dernier cas, on renseigne quand même class="tel" pour
+		avoir une classe cohérente avec ou sans HTML5.
+
+][(#INCLURE{fond=saisies/input,
+			env,
+            type=#HTML5|?{tel,text},
+            class=[(#HTML5|?{[(#ENV{class})],[(#ENV{class}) ]tel})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/textarea.html b/design_system_dependences/saisies/v5.2.0/saisies/textarea.html
new file mode 100644
index 0000000000000000000000000000000000000000..6039abb5842ca5047e7b308a7e1ba2b64a183f31
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/textarea.html
@@ -0,0 +1,22 @@
+[(#REM)
+
+  Parametres :
+  - class : classe(s) css ajoutes au textarea
+  - rows : nombre de ligne, par defaut : 20
+  - cols : nombre de caracteres de large, par defaut : 40 (cela depend aussi et surtout du CSS)
+  - inserer_barre : barre d'outils du porte plume à insérer (forum ou edition par défaut)
+  - previsualisation : si égale à 'oui', ajoute l'onglet de prévisualisation
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+	[(#SAISIE{textarea, couleur_foncee,
+		label=<:spa:couleur_foncee:>,
+		obligatoire=non})]
+]
+[(#REM) Si la valeur est un tableau, le plugin sait le transformer en chaine, plutôt que d'afficher "Array" ]
+#SET{valeur, #ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}
+#SET{valeur, #GET{valeur}|is_array|?{(#GET{valeur}|saisies_tableau2chaine), #GET{valeur}}}
+#SET{valeur,#GET{valeur}|saisies_utf8_restaurer_planes}
+<textarea name="#ENV{nom}" class="[(#ENV{class}) ][inserer_barre_(#ENV{inserer_barre}) ][(#ENV{previsualisation}|oui)inserer_previsualisation]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" rows="[(#ENV{rows,20})]" cols="[(#ENV{cols,40})]"[ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#ENV{placeholder})"][(#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|et{#HTML5}|oui) required="required"][ aria-describedby="(#ENV{describedby})"][  maxlength="(#ENV{longueur_max})"][ (#ENV*{attributs})]>
+#GET{valeur}</textarea>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/textarea.php b/design_system_dependences/saisies/v5.2.0/saisies/textarea.php
new file mode 100644
index 0000000000000000000000000000000000000000..993cebfbb83342d7ad8a83ecfa0b4e3bfa2a113b
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/textarea.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Fonctions spécifiques à une saisie
+ *
+ * @package SPIP\Saisies\textarea
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Vérifie que la valeur postée
+ * correspond aux valeurs proposées lors de la config de valeur
+ * @param string $valeur la valeur postée
+ * @param array $description la description de la saisie
+ * @return bool true si valeur ok, false sinon,
+ **/
+function textarea_valeurs_acceptables($valeur, $description) {
+	$options = $description['options'];
+	if (
+		saisies_saisie_est_gelee($description)
+		&&
+		isset($options['defaut'])
+		&& $options['defaut'] != $valeur
+	) {
+		return false;
+	}
+	return true;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/textarea.yaml b/design_system_dependences/saisies/v5.2.0/saisies/textarea.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..eec966a68a377d5a907b41510af304c9b29c7fd2
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/textarea.yaml
@@ -0,0 +1,148 @@
+
+titre: '<:saisies:saisie_textarea_titre:>'
+description: '<:saisies:saisie_textarea_explication:>'
+icone: 'images/saisies_textarea-xx.svg'
+categorie:
+  type: 'libre'
+  rang: 1
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 4
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'placeholder'
+          label: '<:saisies:option_placeholder_label:>'
+          rows: 4
+      - 'inclure:saisies/_base/explication.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'conteneur_class'
+          label: '<:saisies:option_conteneur_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'rows'
+          label: '<:saisies:option_rows_label:>'
+          explication: '<:saisies:option_rows_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'cols'
+          label: '<:saisies:option_cols_label:>'
+          explication: '<:saisies:option_cols_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'selection'
+        options:
+          nom: 'inserer_barre'
+          label: '<:saisies:option_inserer_barre_label:>'
+          explication: '<:saisies:option_inserer_barre_explication:>'
+          option_intro: '<:item_non:>'
+          data:
+            edition: '<:saisies:option_inserer_barre_choix_edition:>'
+            forum: '<:saisies:option_inserer_barre_choix_forum:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'previsualisation'
+          label: '<:saisies:option_previsualisation_label:>'
+          explication: '<:saisies:option_previsualisation_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'conditions'
+      label: '<:saisies:option_groupe_conditions:>'
+    saisies:
+      -  'inclure:saisies/_base/afficher_si.yaml'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'longueur_max'
+          label: '<:saisies:option_maxlength_label:>'
+          explication: '<:saisies:option_maxlength_explication:>'
+      -  'inclure:saisies/_base/obligatoire.yaml'
+options_dev:
+      - 'inclure:saisies/_base/options_dev.yaml'
+defaut:
+  options:
+    label: '<:saisies:saisie_textarea_titre:>'
+    cols: 40
+    rows: 5
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/true_false.html b/design_system_dependences/saisies/v5.2.0/saisies/true_false.html
new file mode 100644
index 0000000000000000000000000000000000000000..7fd234cb9c02afc7a05d1225915ec7620a345d9e
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/true_false.html
@@ -0,0 +1,23 @@
+[(#REM) 
+
+  Action :
+  - Rempli "true" si oui, "false" si non.
+  
+  Parametres :
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+	[(#SAISIE{true_false, afficher_liste,
+		label=<:plugin:afficher_liste:>,
+		explication=<:plugin:explication_afficher_liste:>})]
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+<div class="choix">
+	<input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_true"[ (#GET{valeur}|=={true}|oui)checked="checked"] value="true" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})] />
+	<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_true"[(#GET{valeur}|=={true}|oui)class="on"]><:item_oui:></label>
+</div>
+<div class="choix">
+	<input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_false"[ (#GET{valeur}|=={false}|oui)checked="checked"] value="false" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ aria-describedby="(#ENV{describedby})"] />
+	<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_false"[(#GET{valeur}|=={false}|oui)class="on"]><:item_non:></label>
+</div>
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/type_mime.html b/design_system_dependences/saisies/v5.2.0/saisies/type_mime.html
new file mode 100644
index 0000000000000000000000000000000000000000..4a3bfc9013ccfc60d062ee3338e75f07fd7cd943
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/type_mime.html
@@ -0,0 +1,5 @@
+#SET{mime,#ARRAY}
+<BOUCLE_mime(TYPES_DOCUMENTS){par titre}>
+#SET{mime,#GET{mime}|remplir_tableau_mime{#MIME_TYPE,#TITRE,#EXTENSION}}
+</BOUCLE_mime>
+#INCLURE{fond=saisies/checkbox,tout_selectionner=oui,attribut_title=on,env,data=#GET{mime}}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/type_mime_fonctions.php b/design_system_dependences/saisies/v5.2.0/saisies/type_mime_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..79f930f539c2200b48e4e9f747baf9852d76828a
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/type_mime_fonctions.php
@@ -0,0 +1,27 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Remplit un tableau de description de types mime
+ * Sous la forme type_mime => 'Nom du type (extensions)'
+ *
+ * @param array $tableau le tableau en l'état actuel
+ * @param string $mime le type mime qu'on veut mettre à jour
+ * @param string $titre le titre associé au type mime
+ * @param string $extension une extension associé au type mime
+ * @return array le tableau modifié
+ *
+ **/
+function remplir_tableau_mime($tableau, $mime, $titre, $extension) {
+	$txt = "$titre (.$extension)";
+	if (array_key_exists($mime, $tableau)) {
+		$tableau[$mime] .= " / $txt";
+	} else {
+		$tableau[$mime] = $txt;
+	}
+	return $tableau;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies/url.html b/design_system_dependences/saisies/v5.2.0/saisies/url.html
new file mode 100644
index 0000000000000000000000000000000000000000..dfc5e12a70f3ac302f1619ad7867f40012380441
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies/url.html
@@ -0,0 +1,12 @@
+[(#REM) 
+		
+		Zone de saisie d'URL. Sur les sites en HTML5, utilise type="url"
+		sur le input (et donc class="url"), et type="text" par défaut
+		pour les autres (et donc class="text"). Dans ce dernier cas, on
+		renseigne quand même class="url" pour avoir une classe cohérente
+		avec ou sans HTML5.
+		
+][(#INCLURE{fond=saisies/input,
+			env,
+            type=#HTML5|?{url,text},
+            class=[(#HTML5|?{[(#ENV{class}) ],[(#ENV{class}) ]url})]})]
diff --git a/design_system_dependences/saisies/v5.2.0/saisies_administrations.php b/design_system_dependences/saisies/v5.2.0/saisies_administrations.php
new file mode 100644
index 0000000000000000000000000000000000000000..ced284d0ca93f9e7cb7ad9a69c435d27aa7bfdd8
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies_administrations.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Fichier gérant l'installation et désinstallation du plugin
+ *
+ * @package SPIP\Saisies\Installation
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/config');
+/**
+ * Installation/maj des config de saisies
+ *
+ * @param string $nom_meta_base_version
+ *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
+ * @param string $version_cible
+ *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
+ * @return void
+ */
+function saisies_upgrade($nom_meta_base_version, $version_cible) {
+	$maj = [];
+	$maj['create'] = [
+		['saisies_corriger_assests']
+	];
+	include_spip('base/upgrade');
+	maj_plugin($nom_meta_base_version, $version_cible, $maj);
+}
+
+
+/**
+ * Corrige une honteuse coquille
+ **/
+function saisies_corriger_assests() {
+	$config = lire_config('saisies/assests_global');
+	if ($config) {
+		effacer_config('saisies/assests_global');
+		ecrire_config('saisies/assets_global', $config);
+	}
+}
+
+function saisies_vider_tables($nom_meta_base_version) {
+	effacer_config('saisies');
+	effacer_meta($nom_meta_base_version);
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies_afficher_si_js/defaut.php b/design_system_dependences/saisies/v5.2.0/saisies_afficher_si_js/defaut.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c11ca2ccb0059357ce49e66b0a42bde6cb6ab3c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies_afficher_si_js/defaut.php
@@ -0,0 +1,33 @@
+<?php
+
+/** Gestion de l'affichage conditionnelle des saisies.
+ * Partie spécifique js
+ *
+ * @package SPIP\Saisies\afficher_si_js\defaut
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+/**
+ * Generation du js d'afficher_si par défaut
+ * @param array $parse analyse syntaxique du tests à effectuer (sous tableau de résultat de saisies_parser_condition_afficher_si())
+ * @param array $saisies_form ensemble des saisies du formulaire, listées par nom
+ **/
+function saisies_afficher_si_js_defaut($parse, $saisies_form) {
+	$negation = $parse['negation'];
+	unset($parse['negation']);
+
+	// Compatibilité historique de syntaxe, avant que l'on mette tout en JSON, on envoyait directement RegExp(valeur), il fallait donc que les // soient dans valeur. Mais désormais on envoie en JSON, donc on a un string, donc il faut enlever les slashs avant d'envoyer au JS
+	if (in_array($parse['operateur']  ?? '', ['MATCH', '!MATCH'])) {
+		include_spip('inc/saisies_afficher_si_commun');
+
+		$m = saisies_afficher_si_parser_valeur_MATCH($parse['valeur']);
+
+		$parse['valeur'] = $m['regexp'];
+		$parse['regexp_modif'] = $m['regexp_modif'];
+	}
+	$parse['champ'] = saisie_nom2name($parse['champ']);
+	$parse = json_encode($parse);
+	return $negation . 'afficher_si(' . $parse . ')';
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies_fonctions.php b/design_system_dependences/saisies/v5.2.0/saisies_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..7288143dcb0df9cd4bd3f276a238459b238f801c
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies_fonctions.php
@@ -0,0 +1,312 @@
+<?php
+
+/**
+ * Déclaration de fonctions pour les squelettes
+ *
+ * @package SPIP\Saisies\Fonctions
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/saisies');
+include_spip('balise/saisie');
+include_spip('inc/saisies_afficher_si_js');
+// picker_selected (spip 3)
+include_spip('formulaires/selecteur/generique_fonctions');
+
+/**
+ * Retourne une balise dev. Maintenu pour compatibilité historique, ne plus utiliser.
+ * @deprecated
+ * Comportement antérieure :
+ * Retournait une balise `div` si on est en SPIP >= 3.1, sinon le texte en parametre.
+ * @example `[(#VAL{ul}|saisie_balise_structure_formulaire)]`
+ * @see balise_DIV_dist() pour une écriture plus courte.
+ * @note Préférer `[(#DIV|sinon{ul})]` dans les squelettes, plus lisible.
+ *
+ * @param $tag
+ *   ul ou li
+ * @return string
+ *   $tag initial ou div
+ */
+function saisie_balise_structure_formulaire($tag) {
+	trigger_error('Le filtre saisie_balise_structure_formulaire est deprécié et sera supprimé en v6 du plugin saisies. Utiliser directement `<div>`.', E_USER_DEPRECATED);
+	spip_log('Le filtre saisie_balise_structure_formulaire est deprécié et sera supprimé en v6 du plugin saisies. Utiliser directement `<div>`.', 'saisies');
+	return 'div';
+}
+
+if (
+	!function_exists('balise_DIV_dist')
+) {
+
+	/**
+	 * Compile la balise `DIV` qui retourne simplement le texte `div`
+	 *
+	 * Maintenu pour ne pas casser les squelettes qui s'appuient dessus, mais à ne plus utiliser.
+	 * Servait à la compatibilité entre SPIP 3.0 et SPIP 3.1+
+	 *
+	 * Variante d'écriture, plus courte, que le filtre `saisie_balise_structure_formulaire`
+	 *
+	 * À partir de SPIP 3.1
+	 * - ul.editer-groupe deviennent des div.editer-groupe
+	 * - li.editer devient div.editer
+	 * @deprecated
+	 * @see saisie_balise_structure_formulaire()
+	 * @example
+	 *     `[(#DIV|sinon{ul})]`
+	 *
+	 * @param Pile $p
+	 * @return Pile
+	 */
+	function balise_DIV_dist($p) {
+		$p->code = "'div'";
+		$p->interdire_scripts = false;
+		trigger_error('La balise #DIV est depréciée et sera supprimée en v6 du plugin saisies. Utiliser directement `<div>`.', E_USER_DEPRECATED);
+		spip_log('La balise #DIV est depréciée et sera supprimée en v6 du plugin saisies. Utiliser directement `<div>`.', 'saisies');
+		return $p;
+	}
+}
+
+/**
+ * Traiter la valeur de la vue en fonction du env
+ * si un traitement a ete fait en amont (champs extra) ne rien faire
+ * si pas de traitement defini (formidable) passer typo ou propre selon le type du champ
+ *
+ * @param ?string $valeur
+ * @param string|array $env
+ * @return string
+ */
+function saisie_traitement_vue(?string $valeur, $env): string {
+	if (is_null($valeur)) {
+		$valeur = '';
+	}
+	if (is_string($env)) {
+		$env = unserialize($env);
+	}
+	if (!function_exists('propre')) {
+		include_spip('inc/texte');
+	}
+	if (!is_array($valeur)) {
+		$valeur = trim($valeur);
+	}
+	// si traitement est renseigne, alors le champ est deja mis en forme
+	// (saisies)
+	// sinon on fait une mise en forme smart
+	if ($valeur && !is_array($valeur) && !isset($env['traitements'])) {
+		if (in_array($env['type_saisie'], ['textarea'])) {
+			$valeur = propre($valeur);
+		} else {
+			$valeur = '<p>' . typo($valeur) . '</p>';
+		}
+	}
+
+	return $valeur;
+}
+
+/**
+ * Liste les éléments du sélecteur générique triés
+ *
+ * Les éléments sont triés par objets puis par identifiants
+ *
+ * @example
+ *     L'entrée :
+ *     'rubrique|3,rubrique|5,article|2'
+ *     Retourne :
+ *     array(
+ *        0 => array('objet'=>'article', 'id_objet' => 2),
+ *        1 => array('objet'=>'rubrique', 'id_objet' => 3),
+ *        2 => array('objet'=>'rubrique', 'id_objet' => 5),
+ *     )
+ *
+ * @param string $selected
+ *     Liste des objets sélectionnés
+ * @return array
+ *     Liste des objets triés
+ **/
+function saisies_picker_selected_par_objet($selected) {
+	$res = [];
+	$liste = picker_selected($selected);
+	// $liste : la sortie dans le désordre
+	if (!$liste) {
+		return $res;
+	}
+
+	foreach ($liste as $l) {
+		if (!isset($res[ $l['objet'] ])) {
+			$res[ $l['objet'] ] = [];
+		}
+		$res[$l['objet']][] = $l['id_objet'];
+	}
+	// $res est trié par objet, puis par identifiant
+	ksort($res);
+	foreach ($res as $objet => $ids) {
+		sort($res[$objet]);
+	}
+
+	// on remet tout en file
+	$liste = [];
+	foreach ($res as $objet => $ids) {
+		foreach ($ids as $id) {
+			$liste[] = ['objet' => $objet, 'id_objet' => $id];
+		}
+	}
+
+	return $liste;
+}
+
+
+/**
+ * Lister les objets qui ont une url_edit renseignée et qui sont éditables.
+ *
+ * @return array Liste des objets :
+ *               index : nom de la table (spip_articles, spip_breves, etc.)
+ *               'type' : le type de l'objet ;
+ *               'url_edit' : l'url d'édition de l'objet ;
+ *               'texte_objets' : le nom humain de l'objet éditorial.
+ */
+function lister_tables_objets_edit() {
+	include_spip('base/abstract_sql');
+
+	$objets = lister_tables_objets_sql();
+	$objets_edit = [];
+
+	foreach ($objets as $objet => $definition) {
+		if (
+			isset($definition['editable'])
+			&& ($definition['url_edit'] ?? '')
+		) {
+			$objets_edit[$objet] = ['type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']];
+		}
+	}
+	$objets_edit = array_filter($objets_edit);
+
+	return $objets_edit;
+}
+
+/**
+ * Afficher la chaine de langue traduite.
+ *
+ * @param string $chaine
+ * @return string
+ */
+function saisies_label($chaine) {
+	$chaine = trim($chaine);
+	if (preg_match('/^(&lt;:|<:)/', $chaine)) {
+		$chaine = preg_replace('/^(&lt;:|<:)/', '', $chaine);
+		$chaine = preg_replace('/(:&gt;|:>)$/', '', $chaine);
+		return _T($chaine);
+	}
+
+	return $chaine;
+}
+
+
+/**
+ * Les liens ouvrants, c'est mal en général.
+ * Sauf dans un cas particulier : dans les explications dans un formulaire.
+ * En effet, si le lien n'est pas ouvrant, la personne en train de remplir un formulaire
+ * a) lis une explication
+ * b) clique sur le lien pour savoir comment remplir son formulaire
+ * c) est redirigée directement vers une page
+ * d) perd du coup ce qu'elle avait commencé remplir.
+ * Par conséquent, en terme d'accessibilité, il vaut mieux POUR LES EXPLICATIONS DE FORMULAIRE
+ * avoir des liens systématiquement ouvrant,
+ * et ce que le lien pointe en interne ou en externe (ce qui distingue du filtre |liens_ouvrants).
+ * D'où un filtre saisies_liens_ouvrants
+ * @param string $texte
+ * @return string $texte
+ **/
+function saisies_liens_ouvrants($texte) {
+	$texte = liens_absolus($texte);
+	if (
+		preg_match_all(
+			",(<a\s+[^>]*https?://[^>]*\b[^>]+>),imsS",
+			$texte,
+			$liens,
+			PREG_PATTERN_ORDER
+		)
+	) {
+			foreach ($liens[0] as $a) {
+				$rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
+				$ablank = inserer_attribut($a, 'rel', $rel);
+				$ablank = inserer_attribut($ablank, 'target', '_blank');
+				$texte = str_replace($a, $ablank, $texte);
+			}
+	}
+	return $texte;
+}
+
+/**
+ * Afficher un statut traduit
+ *
+ * @param string $statut Le statut (publie, refuse, ...)
+ * @param string $objet Le type d’objet (article, rubrique, ...)
+ * @return string La traduction du statut, si on la trouve, sinon simplement la clé...
+ */
+function saisies_statut_titre($statut, $objet = '') {
+	include_spip('inc/puce_statut');
+	$titre = statut_titre($objet, $statut);
+	return $titre ? $titre : $statut;
+}
+
+/**
+ * Convertit si nécessaire une valeur au format du picker ajax du sélecteur générique
+ * quand on sait que la valeur ne concerne qu'un seul type d'objet.
+ *
+ * Fait en quelque sorte l'inverse de picker_selected().
+ * Cela évite d'avoir à modifier le charger des formulaires quand on traite des cas simples :
+ * juste un plusieurs ids d'un seul type d'objet.
+ *
+ * @example
+ * - Entrée : 10,           sortie : array('article|10')
+ * - Entrée : array(10,20), sortie : array('article|10', 'article|20')
+ *
+ * @see picker_selected()
+ *
+ * @param array|string|int $valeur
+ *    - Soit un tableau issu du sélecteur (dans ce cas on ne fait rien) : `array('article|1', 'article|2')`
+ *    - Soit l'id d'un objet : 1
+ *    - Soit un tableau d'ids : array(1,2)
+ * @param string $objet
+ * @return array
+ *    Tableau au format du sélecteur générique
+ */
+function saisies_picker_preselect_objet($valeur, $objet) {
+
+	// Nb : évitons des preg_match si possible
+	$is_objet_unique   = is_numeric($valeur); // ex. : 10
+	$is_objet_multiple = (is_array($valeur) && is_numeric($valeur[0])); // ex. : array(10,20)
+
+	if ($is_objet_unique || $is_objet_multiple) {
+		if ($is_objet_unique) {
+			$valeur = [$valeur];
+		}
+		foreach ($valeur as $k => $id_objet) {
+			$valeur[$k] = "$objet|$id_objet";
+		}
+	}
+
+	return $valeur;
+}
+
+/**
+ * Function inverse de la fonction du core `utf8_noplanes()`
+ * Trouve les entités HTML numérique des hautes "planes"
+ * et les remets en Unicode
+ * @param string|null le texte
+ * @return string
+ **/
+function saisies_utf8_restaurer_planes(?string $x): string {
+	if (!$x) {
+		return (string)$x;
+	}
+	preg_match_all('/&(amp;)?#(\d+);/U', $x, $matches, PREG_SET_ORDER);
+	foreach ($matches as $m) {
+		if ($m[2] > 65535) {//Uniquement les planes 1-16, pas le plane 0
+			$decode = html_entity_decode($m[0], ENT_COMPAT);
+			$x = str_replace($m[0], $decode, $x);
+		}
+	}
+	return $x;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/saisies_pipelines.php b/design_system_dependences/saisies/v5.2.0/saisies_pipelines.php
new file mode 100644
index 0000000000000000000000000000000000000000..59b2d8fa87da163a19ea3dd3ba603b800a4acfb0
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/saisies_pipelines.php
@@ -0,0 +1,468 @@
+<?php
+
+/**
+ * Utilisation des pipelines
+ *
+ * @package SPIP\Saisies\Pipelines
+ **/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+/**
+ * Préambule, les constantes pour afficher_si
+ **/
+if (!defined('_SAISIES_AFFICHER_SI_JS_SHOW')) {
+	define('_SAISIES_AFFICHER_SI_JS_SHOW', 'slideDown(800)');
+}
+if (!defined('_SAISIES_AFFICHER_SI_JS_HIDE')) {
+	define('_SAISIES_AFFICHER_SI_JS_HIDE', 'slideUp(800)');
+}
+
+/**
+ * Ajoute les scripts JS et CSS de saisies dans l'espace privé
+ *
+ * @param string $flux
+ * @return string
+ **/
+function saisies_header_prive($flux) {
+	foreach (['javascript/saisies.js', 'javascript/saisies_afficher_si.js'] as $script) {
+		$js = timestamp(find_in_path($script));
+		$flux .= "\n<script type='text/javascript' src='$js'></script>\n";
+	}
+	$js = timestamp(find_in_path('javascript/saisies_textarea_counter.js'));
+	$flux .= '<script type="text/javascript">saisies_caracteres_restants = "' . _T('saisies:caracteres_restants') . '";</script>';
+	$flux .= "\n<script type='text/javascript' src='$js'></script>\n";
+	$flux .= afficher_si_definir_fonctions();
+	include_spip('inc/filtres');
+	$css = timestamp(find_in_path('css/saisies.css'));
+	$flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
+	$css_constructeur = timestamp(find_in_path('css/formulaires_constructeur.css'));
+	$flux .= "\n<link rel='stylesheet' href='$css_constructeur' type='text/css' />\n";
+
+	return $flux;
+}
+
+/**
+ * Insérer automatiquement les scripts JS et CSS de saisies dans toutes les pages de l'espace public
+ * @param array $flux
+ * @return array $flux modifié
+ **/
+function saisies_insert_head($flux) {
+	include_spip('inc/config');
+	if (lire_config('saisies/assets_global')) {
+		$flux .= saisies_generer_head();
+	}
+	return $flux;
+}
+
+/**
+ * Ajoute les scripts JS et CSS de saisies dans l'espace public
+ *
+ * Ajoute également de quoi gérer le datepicker de la saisie date si
+ * celle-ci est utilisée dans la page.
+ *
+ * @param string $flux
+ * @return string
+ **/
+function saisies_affichage_final($flux) {
+	include_spip('inc/config');
+	if (
+		!lire_config('saisies/assets_global')
+		&& $GLOBALS['html'] // si c'est bien du HTML
+		&& strpos($flux, '<!--!inserer_saisie_editer-->') !== false // et qu'on a au moins une saisie
+		&& strpos($flux, '<head') !== false // et qu'on a la balise <head> quelque part
+	) {
+		$head = saisies_generer_head($flux, true);
+		$flux = str_replace('</head>', "$head</head>", $flux);
+	}
+
+	return $flux;
+}
+
+/**
+ * Génère le contenu du head pour les saisies (css et js)
+ * @param str $html_content le contenu html où l'on teste la présence de saisies
+ * @param bool (false) $tester_saisies
+ *
+ * @return string
+ */
+function saisies_generer_head($html_content = '', $tester_saisies = false) {
+
+	$flux = '';
+	include_spip('inc/filtres');
+	// Pas de saisie alors qu'on veux tester leur présence > hop, on retourne direct
+	if ($tester_saisies && strpos($html_content, '<!--!inserer_saisie_editer-->') === false) {
+		return $flux;
+	}
+
+	$css = timestamp(find_in_path('css/saisies.css'));
+	$ins_css = "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
+
+	$flux = $ins_css . $flux;
+
+	// on insère le JS à la fin du <head>
+	$ins_js = '';
+	// JS général
+	$js = timestamp(find_in_path('javascript/saisies.js'));
+	$ins_js .= "\n<script type='text/javascript' src='$js'></script>\n";
+
+
+	// si on a une saisie de type textarea avec maxlength, on va charger un script
+	if (!$tester_saisies || (strpos($html_content, 'textarea') !== false && strpos($html_content, 'maxlength') !== false)) {
+		$js = timestamp(find_in_path('javascript/saisies_textarea_counter.js'));
+		$ins_js .= '<script type="text/javascript">saisies_caracteres_restants = "' . _T('saisies:caracteres_restants') . '";</script>';
+		$ins_js .= "\n<script type='text/javascript' src='$js'></script>\n";
+	}
+	// Afficher_si
+	if (!$tester_saisies || strpos($html_content, 'data-afficher_si') !== false) {
+		$ins_js .= afficher_si_definir_fonctions();
+		$js = timestamp(find_in_path('javascript/saisies_afficher_si.js'));
+		$ins_js .= "\n<script type='text/javascript' src='$js'></script>\n";
+	}
+
+	$flux = $flux . $ins_js;
+
+	return $flux;
+}
+
+/**
+ * Déclarer automatiquement les champs d'un formulaire CVT qui déclare des saisies
+ *
+ * Recherche une fonction `formulaires_XX_saisies_dist` et l'utilise si elle
+ * est présente. Cette fonction doit retourner une liste de saisies dont on se
+ * sert alors pour calculer les champs utilisés dans le formulaire.
+ *
+ * @param array $flux
+ * @return array
+ **/
+function saisies_formulaire_charger($flux) {
+	// Si le flux data est inexistant, on quitte : Le CVT d'origine a décidé de ne pas continuer
+	if (!is_array($flux['data'])) {
+		return $flux;
+	}
+
+	// Il faut que la fonction existe et qu'elle retourne bien un tableau
+	include_spip('inc/saisies');
+	$saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args'], $flux['args']['je_suis_poste']);
+
+	if ($saisies) {
+		// Si c'est un formulaire de config, on va régler automatiquement les defaut
+		if (strpos($flux['args']['form'], 'configurer_') === 0) {
+			$par_nom = saisies_lister_par_nom($saisies);
+			$contexte = [];
+			if (isset($par_nom['_meta_casier'])) {
+				$meta = $par_nom['_meta_casier']['options']['defaut'];
+			} else {
+				$meta = str_replace('configurer_', '', $flux['args']['form']);
+			}
+			$saisies = saisies_preremplir_defaut_depuis_config($saisies, $meta);
+		}
+
+		// On rajoute ce contexte en défaut de ce qui existe déjà (qui est prioritaire)
+		$contexte = saisies_lister_valeurs_defaut($saisies);
+		$flux['data'] = array_merge($contexte, $flux['data']);
+
+		// On cherche si on gère des étapes
+		if ($etapes = saisies_lister_par_etapes($saisies)) {
+			$flux['data']['_etapes'] = count($etapes);
+			$flux['data']['_saisies_par_etapes'] = $etapes;
+
+			// Construction du tableau resumé des étapes futures
+			$options_resume = saisies_determiner_options_demandees_resumer_etapes_futures($saisies['options']);
+			$resume_etapes_futures = saisies_resumer_etapes_futures($etapes, _request('_etape') ?? 1, $options_resume);
+			// Convertir les afficher_si en code JS
+			$resume_etapes_futures = array_map(function ($i) use ($etapes) {
+				if (!isset($i['afficher_si'])) {
+					return $i;
+				}
+				$i['afficher_si'] = saisies_afficher_si_js($i['afficher_si'], $etapes);
+				$i['afficher_si'] = str_replace('&quot;', '"', $i['afficher_si']);// Pour éviter que les &quot; soit à nouveau encodé par json_encode, ce qui fout la merde au decodage en JS
+			  return $i;
+			}, $resume_etapes_futures);
+			$flux['data']['_resume_etapes_futures'] = $resume_etapes_futures;
+		}
+		// On ajoute le tableau complet des saisies
+		$flux['data']['_saisies'] = $saisies;
+
+		// On ajoute également un bouton submit caché qui sert exclusivement à la validation au clavier
+		if (!isset($flux['data']['_hidden'])) {
+			$flux['data']['_hidden'] = '';
+		}
+		$flux['data']['_hidden'] .= '<!--Saisies : bouton caché pour validation au clavier--><button type="submit" value="1" hidden tabindex="-1" style="display:none"></button>';
+	}
+
+	return $flux;
+}
+
+/**
+ * Pre remplir les options 'defaut' des saisies depuis `lire_config()`
+ * @param array $saisies;
+ * @param string $meta_case;
+ * @return array $saisies
+ **/
+function saisies_preremplir_defaut_depuis_config($saisies, $meta_case) {
+	include_spip('inc/config');
+	foreach ($saisies as &$saisie) {
+		if (isset($saisie['options']['nom']) && $saisie['options']['nom'] !== '_meta_casier') {
+			$nom = $saisie['options']['nom'];
+			$nom = str_replace('[', '/', $nom);
+			$nom = str_replace(']', '', $nom);
+			$nom = trim($nom, '/');
+			$config = lire_config("$meta_case/$nom");
+			if ($config !== null) {
+				$saisie['options']['defaut'] = $config;
+			}
+			$contexte[$nom] = isset($saisies['options']['defaut']) ? $saisies['options']['defaut'] : '';
+			if (isset($saisie['saisies'])) {
+				$saisie['saisies'] = saisies_preremplir_defaut_depuis_config($saisie['saisies'], $meta_case);
+			}
+		}
+	}
+	return $saisies;
+}
+
+/**
+ * Aiguiller CVT vers un squelette propre à Saisies lorsqu'on a déclaré des saisies et qu'il n'y a pas déjà un HTML
+ *
+ * Dans le cadre d'un formulaire CVT demandé, si ce formulaire a déclaré des saisies, et
+ * qu'il n'y a pas de squelette spécifique pour afficher le HTML du formulaire,
+ * alors on utilise le formulaire générique intégré au plugin saisie, qui calculera le HTML
+ * à partir de la déclaration des saisies indiquées.
+ *
+ * @see saisies_formulaire_charger()
+ *
+ * @param array $flux
+ * @return array
+ **/
+function saisies_styliser($flux) {
+	if (
+		// Si on cherche un squelette de formulaire
+		strncmp($flux['args']['fond'], 'formulaires/', 12) == 0
+		// Et que ce n'est pas une inclusion (on teste ça pour l'instant mais c'est pas très générique)
+		&& strpos($flux['args']['fond'], 'inc-', 12) === false
+		// Et qu'il y a des saisies dans le contexte
+		&& isset($flux['args']['contexte']['_saisies'])
+		// Et que le fichier choisi est vide ou n'existe pas
+		&& include_spip('inc/flock')
+		&& ($ext = $flux['args']['ext'])
+		&& lire_fichier($flux['data'] . '.' . $ext, $contenu_squelette)
+		&& !trim($contenu_squelette)
+	) {
+		$flux['data'] = preg_replace("/\.$ext$/", '', find_in_path("formulaires/inc-saisies-cvt.$ext"));
+	}
+
+	return $flux;
+}
+
+/**
+ * Ajouter les vérifications déclarées dans la fonction "saisies" du CVT
+ *
+ * Si un formulaire CVT a déclaré des saisies, on utilise sa déclaration
+ * pour effectuer les vérifications du formulaire.
+ *
+ * @see saisies_formulaire_charger()
+ * @uses saisies_verifier()
+ *
+ * @param array $flux
+ *     'data' Liste des erreurs du formulaire
+ *     'args' Arguments du pipeline
+ * @return array
+ *     $flux ajusté
+ */
+function saisies_formulaire_verifier($flux) {
+	// Il faut que la fonction existe et qu'elle retourne bien un tableau
+	include_spip('inc/saisies');
+	$form = $flux['args']['form'];
+	$args_du_form = $flux['args']['args'];
+
+	$saisies = saisies_chercher_formulaire($form, $args_du_form, true);
+	if ($saisies && !saisies_lister_par_etapes($saisies, true)) {
+		$erreurs = saisies_verifier($saisies);
+
+		if ($erreurs && !isset($erreurs['message_erreur'])) {
+			$erreurs['message_erreur'] = _T('saisies:erreur_generique');
+		}
+		if (!is_array($flux['data'])) {
+			$flux['data'] = [];
+		}
+
+		$flux['data'] = array_merge($erreurs, $flux['data']);
+	}
+
+	// Vérification du formulaire après la vérification des saisies
+	$verifier_post_saisies = charger_fonction('verifier_post_saisies', "formulaires/$form/", true);
+	if ($verifier_post_saisies) {
+		$flux['data'] =  array_merge($flux['data'], call_user_func_array($verifier_post_saisies, $args_du_form));// Lorsqu'on sera en PHP 8 ++ only, transformer en = $verifier_post_saisies(...$args_du_form);
+	}
+	$flux['data'] = pipeline('formulaire_verifier_post_saisies', $flux);
+
+	return $flux;
+}
+
+/**
+ * Ajouter les vérifications déclarées dans la fonction "saisies" du CVT mais pour les étapes
+ *
+ * @see saisies_formulaire_charger()
+ * @uses saisies_verifier()
+ *
+ * @param array $flux
+ *     Liste des erreurs du formulaire
+ * @return array
+ *     iste des erreurs
+ */
+function saisies_formulaire_verifier_etape($flux) {
+	$form = $flux['args']['form'];
+	$args_du_form = $flux['args']['args'];
+
+	$saisies = saisies_chercher_formulaire($form, $args_du_form, true);
+	if ($saisies) {
+		//A quelle étape est-on ?
+		$etape = $flux['args']['etape'];
+		$erreurs = saisies_verifier($saisies, true, $etape);
+		$flux['data'] = array_merge($erreurs, $flux['data']);
+		// Si on est en train de vérifier la dernière étape courante et qu'elle n'a pas d'erreur, alors voir si on peut sauter les étapes suivantes
+		if (
+			$etape == ($flux['args']['etape_saisie'] ?? -1)
+			&& empty($flux['data'])
+			&& (!$flux['args']['etape_demandee'] || $flux['args']['etape_demandee'] > $etape)
+		) {
+			$avance_rapide = saisies_determiner_avance_rapide($saisies, $etape);
+			if ($avance_rapide && $avance_rapide != $etape + 1) {
+				set_request('aller_a_etape', $avance_rapide);
+				$flux['args']['etape_demandee'] = $avance_rapide;
+			}
+		}
+	}
+
+
+	// Vérification du formulaire après la vérification des saisies
+	$verifier_etapes_post_saisies = charger_fonction('verifier_etapes_post_saisies', "formulaires/$form/", true);
+	if ($verifier_etapes_post_saisies) {
+		$flux['data'] =  array_merge($flux['data'], call_user_func_array($verifier_etapes_post_saisies, $args_du_form));// Lorsqu'on sera en PHP 8 ++ only, transformer en = $verifier_post_saisies(...$args_du_form);
+	}
+	$flux['data'] = pipeline('formulaire_verifier_etapes_post_saisies', $flux);
+
+	return $flux;
+}
+
+/**
+ * À la réception d'un formulaire de config
+ * rechercher les input avec l'option cle_secrete.
+ * Si la valeur postée est vide, cela veut dire qu'on conserve celle en base.
+ * Dans ce cas, reinjecter cette dernière en `set_request'.
+ * Cela permet de ne pas perdre la valeur à chaque configuration du formulaire
+ * @param array $flux;
+ * @return array $flux;
+ **/
+function saisies_formulaire_receptionner($flux) {
+	if (strpos($flux['args']['form'], 'configurer_') === 0) {
+		$config = str_replace('configurer_', '', $flux['args']['form']);
+		$saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args'], true);
+		$avec_cle_secrete = saisies_lister_avec_option('cle_secrete', $saisies);
+		foreach ($avec_cle_secrete as $saisie => $description) {
+			if (!saisies_request($saisie)) {
+				$saisie = str_replace('[', '/', $saisie);
+				$saisie = str_replace(']', '', $saisie);
+				$saisie = trim($saisie, '/');
+				saisies_set_request($saisie, lire_config("$config/$saisie"));
+			}
+		}
+	}
+	return $flux;
+}
+
+/**
+ * Retourne une chaine renvoyant les functions js de masquage/affiche
+ **/
+function afficher_si_definir_fonctions() {
+	return '<script>
+		function afficher_si_show(src) {
+			src.' . _SAISIES_AFFICHER_SI_JS_SHOW . ';
+}
+function afficher_si_hide(src) {
+	src.' . _SAISIES_AFFICHER_SI_JS_HIDE . ';
+}
+	</script>';
+}
+
+/**
+ * Bien que proposé avec le plugin verifier
+ * la vérification `fichiers` n'a de sens que si la saisie `fichiers` du plugin CVT-Upload est disponible.
+ * @param array $flux
+ * @return array $flux
+**/
+function saisies_saisies_verifier_lister_disponibles(array $flux): array {
+	unset($flux['data']['disponibles']['fichiers']);// CVTUpload s'occupe tout seul de remettre cette verification
+}
+
+/**
+ * Appliquer le chiffrement des name de nospam sur les `afficher_si`
+ * @param array $flux
+ * @return array
+**/
+function saisies_formulaire_fond(array $flux): array {
+	// Si pas de nospam, on n'a besoin de rien
+	if (!test_plugin_actif('nospam')) {
+		return $flux;
+	}
+
+	$data = &$flux['data'];
+	$args = $flux['args'];
+	$form = $args['form'];
+
+	// Si chiffrement, au boulot!
+	if (
+		(
+			defined('_SPAM_ENCRYPT_NAME')
+			&& _SPAM_ENCRYPT_NAME
+			&& in_array($form, nospam_lister_formulaires())
+		)
+		|| !empty($args['contexte']['_nospam_encrypt'])
+	) {
+		include_spip('inc/nospam_encrypt');
+		preg_match_all('#data-afficher_si=(".*"|\'.*\')#U', $data, $matches);
+		$data_afficher_si = $matches[1];
+		$data_afficher_si = array_unique($data_afficher_si);
+
+
+		// Le jeton permettant de chiffrer
+		$jeton = '';
+		if (preg_match(",<input type='hidden' name='_jeton' value='([^>]*)' />,Uims", $data, $m)) {
+			$jeton = $m[1];
+		}
+
+		foreach ($data_afficher_si as $afficher_si) {
+			// Chercher tous les tests individuels
+			preg_match_all('#afficher_si\((.*)\)#U', $afficher_si, $tests_individuels);
+
+			$tests_individuels[1] = array_unique($tests_individuels[1]);
+			foreach ($tests_individuels[1] as $test) {
+				// Décoder le json, chercher le champ
+				$json_test = str_replace('&quot;', '"', $test);
+				$tableau_test = json_decode($json_test, true);
+				$champ_test = $tableau_test['champ'];
+
+				// Chiffrer le champ.
+				// Dans le cas des truc[chose] : on ne brouille que truc, dixit le code de nospam
+				$champ_test = explode('[', $champ_test);
+				$champ_test[0] = nospam_name_encode($champ_test[0], $jeton);
+				$champ_test = implode('[', $champ_test);
+
+				// A condition que par ailleurs nospam ait deja mis cette valeur chiffré dans le formulaire
+				// Mettre la valeur chiffrée dans le tableau decrivant, rencoder le json, injecter le résultat dans le formulaire à la place de la version non chiffré
+				// Le `à condition` permet de ne pas chiffrer indument un test sur un champ hidden
+				if (strpos($data, $champ_test) !== false) {
+					$tableau_test['champ'] = $champ_test;
+					$json_test = json_encode($tableau_test);
+					$json_test = str_replace('"', '&quot;', $json_test);
+					$data = str_replace($test, $json_test, $data);
+				}
+			}
+		}
+	}
+
+	return $flux;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/verifier/afficher_si.php b/design_system_dependences/saisies/v5.2.0/verifier/afficher_si.php
new file mode 100644
index 0000000000000000000000000000000000000000..eced44da864ee93f81f30e65b1db86a399eb9353
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/verifier/afficher_si.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * API de vérification : vérification de la validité d'un test afficher_si
+ *
+ * @plugin     saisies
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+/**
+ *
+ *
+ *
+ *
+ * @param string $valeur
+ *   La valeur à vérifier.
+ * @return string
+ *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
+ */
+function verifier_afficher_si_dist($valeur) {
+	include_spip('inc/saisies_afficher_si_commun');
+	$erreur = _T('saisies:erreur_syntaxe_afficher_si');
+	$tests = saisies_parser_condition_afficher_si($valeur);
+	if (!saisies_afficher_si_verifier_syntaxe($valeur, $tests)) {
+		return $erreur;
+	} else {
+		return '';
+	}
+}
diff --git a/design_system_dependences/saisies/v5.2.0/verifier/saisies_option_data.php b/design_system_dependences/saisies/v5.2.0/verifier/saisies_option_data.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebc0d75e9639cf2dac44c228bb94b43c8fb878fd
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/verifier/saisies_option_data.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * API de vérification : vérification qu'une chaîne puisse décrire un tableau de data pour une saisies
+ *
+ * @plugin     saisies
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+/**
+ * Vérifier qu'une saisie est sous forme d'une chaine transformable en tableau de data
+ * C'est-à-dire de la forme cle|valeur
+ * Et ce en autorisant les sous-groupes (sauf si demande contraire)
+ * Mais en refusant les clés construite automatiquement pour des lignes sans pipe.
+ * On en profite pour vérifier qu'il n'y pas de clé en double.
+ * De plus les trim() pertubent les choses.
+ * @param string $valeur
+ *   La valeur à vérifier.
+ * @param $options
+ *	 interdire_sous_groupes => True|False
+ *	 verifier_cles => array décrivant une vérification à effectuer
+ * @return string
+ *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
+ */
+function verifier_saisies_option_data_dist($valeur, $options = []) {
+
+	// Le pb des clés implicites : on veut les interdire, car, bien que cela soit supporté historiquement par saisies_chaine2tableau, elles ne permettent pas d'assurer la cohésion dans le temps des données.
+	// Voir discussion sur https://git.spip.net/spip-contrib-extensions/saisies/issues/54
+	// Chercher les clés numériques dans $tableau_plat = saisies_aplatir_tableau(saisies_chaine2tableau($saisies)) ne marche pas car:
+	//	 a. Des gens peuvent mettre des clés numériques explicites
+	//	 b. Mais celles-ci peuvent être écrasées par les clés implicites (c'est vraiment la plaie les clés implicites)
+	// Ex :
+	// 1|Cle explicite
+	// cle implicite
+	// Et bien la clé implicite (1) surchargera la clé explicite.
+	//	 c. Et l'on ne peut même pas vérifier la correspondance entre la clé dans $tableau_plat et une ce qu'on trouverai par une regexp dans $valeur, car dans $tableau_plat les chaines de langues ont deja été étendu. Donc rechercher <cle>|<valeur_humaine> dans $valeurs à partir de $tableau_plat peut échouer à tord
+	// Par conséquent, pour déterminer les clés implicites, nous sommes obligés de parser les lignes du tableau et d'exclure :
+	// 1. Les lignes vides
+	// 2. Les débuts de sous-groupes
+	// 3. Les fins de sous-groupes
+	// 4. Les lignes avec clés explicites
+	$lignes = explode("\n", $valeur);
+	$lignes_avec_cle_implicite = array_filter($lignes, function ($ligne) {
+		return
+			trim($ligne)
+			&& substr($ligne, 0, 1) !== '*'
+			&& substr($ligne, 0, 2) !== '/*'
+			&& !preg_match('#^(.*)\|#m', $ligne);
+	});
+	if ($lignes_avec_cle_implicite) {
+		return _T('saisies:verifier_saisies_option_data_cle_manquante');
+	}
+
+	// Les sous groupes sont-ils interdits?
+	if (
+		($options['interdire_sous_groupes'] ?? '')
+	) {
+		foreach ($lignes as $ligne) {
+			if (substr($ligne, 0, 1) === '*') {
+				return _T('saisies:verifier_saisies_option_data_sous_groupes_interdits');
+			}
+		}
+	}
+
+	// Y-a-il des clés en double ?
+	// On ne peut pas partir de $tableau_plat = saisies_aplatir_tableau(saisies_chaine2tableau($saisies)) car dans un $array php les clés sont déjà dédoublés
+	preg_match_all('#^(.*)\|#m', $valeur, $les_cles);
+	$les_cles = $les_cles[1];
+	if ($les_cles != array_unique($les_cles)) {
+		return _T('saisies:verifier_saisies_option_data_cles_doubles');
+	}
+
+	// Vérifier, si besoin, que toutes les clés répondent bien à certains critères (qu'on définit via une description de vérification).
+	if (is_array($options['verifier_cles'] ?? '')) {
+		$verifier = charger_fonction('verifier', 'inc');
+		$cles_erronnees = [];
+		foreach ($les_cles as $cle) {
+			if ($erreur = $verifier($cle, $options['verifier_cles']['type'], $options['verifier_cles']['options'])) {
+				$cles_erronnees[] = "$cle => $erreur";
+			}
+		}
+		if ($cles_erronnees) {
+			return _T('saisies:verifier_saisies_option_data_verifier_cles_erreurs') . '<br />' . implode('<br />', $cles_erronnees);
+		}
+	}
+
+	// Et sinon, c'est que cela passe
+	return '';
+}
diff --git a/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.php b/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8d7b6e69efff7060ee283cc64238bafb9a62277
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * API de vérification : vérification de la validité des valeurs acceptanles
+ *
+ * @plugin     saisies
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+/**
+ * @param string $valeur
+ *   La valeur à vérifier.
+ * @return string
+ *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
+ */
+function verifier_valeurs_acceptables_dist($valeur, $options) {
+	include_spip('inc/saisies_verifier');
+	$description = $options['_saisie'] ?? [];
+	if (!$description) {
+		return '';
+	}
+	$erreur = '';
+	$type = $description['saisie'] ?? '';
+	$saisie = $description['nom'] ?? '';
+	if (include_spip("saisies/$type")) {
+		$f = $type . '_valeurs_acceptables';
+		if (function_exists($f)) {
+			if (!$f($valeur, $description)) {
+				$erreur = _T('saisies:erreur_valeur_inacceptable');
+				spip_log("Tentative de poste de valeur innaceptable pour $saisie de type $type. Valeur postée : $valeur", 'saisies' . _LOG_AVERTISSEMENT);
+			}
+		} else {
+			spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", 'saisies' . _LOG_INFO);
+		}
+	} else {
+		spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", 'saisies' . _LOG_INFO);
+	}
+
+	return $erreur;
+}
diff --git a/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.yaml b/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f6e8636b3271ba09ecec6d4ebfcfbaa6881145d4
--- /dev/null
+++ b/design_system_dependences/saisies/v5.2.0/verifier/valeurs_acceptables.yaml
@@ -0,0 +1,2 @@
+titre: '<:saisies:verifier_valeurs_acceptables_label:>'
+description: '<:saisies:verifier_valeurs_acceptables_explication:>'
diff --git a/design_system_dependences/switchcase/.ok b/design_system_dependences/switchcase/.ok
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/design_system_dependences/switchcase/images/switchcase-xx.svg b/design_system_dependences/switchcase/images/switchcase-xx.svg
deleted file mode 100644
index 7784347a6126c85516a67c6487e5562e026d10a9..0000000000000000000000000000000000000000
--- a/design_system_dependences/switchcase/images/switchcase-xx.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M10.526 39.547c3.9 0 7.071 3.173 7.071 7.071 0 3.897-3.171 7.07-7.07 7.07-3.899 0-7.07-3.173-7.07-7.07 0-3.9 3.171-7.071 7.07-7.071zM31.865 39.547c3.897 0 7.07 3.173 7.07 7.071 0 3.897-3.173 7.07-7.07 7.07-3.899 0-7.07-3.173-7.07-7.07 0-3.9 3.172-7.071 7.07-7.071z" fill="#1d83d4"/><path d="M41.466 19.197c.002.56.333.942.832.946 1.654 0 2.874-.021 4.906-.021 2.962.054 5.373 3.046 5.4 6.432l.045 5.75.888 1.096.954-1.09v-5.757c0-4.616-3.243-8.373-7.23-8.373-1.676-.001-3.353.001-5.029-.001-.502 0-.769.458-.766 1.018z" fill="#f43737"/><path d="M53.472 38.026l3.23-3.194-.004-.004c.314-.315.286-.881.036-1.143-.25-.262-.668-.355-1.012-.092-.743.724-1.633 1.527-2.236 2.13-.603-.603-1.493-1.406-2.236-2.13-.302-.266-.767-.226-1.047.076-.279.303-.287.825.043 1.159l-.003.004z" fill="#f43737"/><path d="M31.865 12.32c3.897 0 7.07 3.173 7.07 7.072 0 3.897-3.173 7.069-7.07 7.069-3.899 0-7.07-3.173-7.07-7.069 0-3.899 3.172-7.071 7.07-7.071z" fill="#1d83d4"/><path d="M31.865 52.153a5.543 5.543 0 005.535-5.536 5.543 5.543 0 00-5.535-5.537 5.544 5.544 0 00-5.538 5.537 5.543 5.543 0 005.538 5.536z" fill="#ffbf00"/><path d="M10.526 52.153a5.544 5.544 0 005.539-5.536 5.545 5.545 0 00-5.539-5.537 5.541 5.541 0 00-5.534 5.537 5.54 5.54 0 005.534 5.536z" fill="#e895b7"/><path d="M53.476 39.547a7.08 7.08 0 017.072 7.071c0 3.897-3.172 7.07-7.072 7.07-3.898 0-7.07-3.173-7.07-7.07 0-3.9 3.173-7.071 7.07-7.071zM22.412 19.177c-.003.56-.334.942-.832.945-1.654 0-2.875-.02-4.907-.02-2.962.054-5.373 3.046-5.4 6.432l-.044 5.751-.888 1.096-.955-1.092v-5.756c0-4.617 3.244-8.374 7.23-8.374 1.677 0 3.353.002 5.029-.001.502 0 .77.458.767 1.019z" fill="#1d83d4"/><path d="M10.405 38.005l-3.23-3.194.004-.004c-.313-.314-.286-.88-.036-1.143.25-.262.668-.355 1.013-.092.742.724 1.632 1.527 2.236 2.131.603-.604 1.493-1.407 2.235-2.13.302-.266.768-.227 1.047.076.28.302.287.824-.042 1.158l.002.004zM31.917 33.274l.955-.973v-3.975s-.588-.702-.972-.695c-.384.007-.906.695-.906.695l.035 3.97z" fill="#1d83d4"/><path d="M31.978 37.755l-3.23-3.194.004-.004c-.313-.314-.286-.88-.036-1.143.25-.262.668-.355 1.013-.092.742.724 1.632 1.527 2.235 2.13.604-.603 1.494-1.406 2.236-2.13.302-.265.768-.226 1.047.077.279.302.287.824-.043 1.158l.003.004z" fill="#1d83d4"/><path d="M53.476 52.153a5.543 5.543 0 005.537-5.536 5.543 5.543 0 00-5.537-5.537 5.542 5.542 0 00-5.535 5.537 5.542 5.542 0 005.535 5.536zM31.82 24.879a5.544 5.544 0 005.538-5.536 5.545 5.545 0 00-5.538-5.537 5.541 5.541 0 00-5.535 5.537 5.54 5.54 0 005.535 5.536z" fill="#4caf50"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/switchcase/switchcase.svg b/design_system_dependences/switchcase/switchcase.svg
deleted file mode 100644
index 7784347a6126c85516a67c6487e5562e026d10a9..0000000000000000000000000000000000000000
--- a/design_system_dependences/switchcase/switchcase.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M10.526 39.547c3.9 0 7.071 3.173 7.071 7.071 0 3.897-3.171 7.07-7.07 7.07-3.899 0-7.07-3.173-7.07-7.07 0-3.9 3.171-7.071 7.07-7.071zM31.865 39.547c3.897 0 7.07 3.173 7.07 7.071 0 3.897-3.173 7.07-7.07 7.07-3.899 0-7.07-3.173-7.07-7.07 0-3.9 3.172-7.071 7.07-7.071z" fill="#1d83d4"/><path d="M41.466 19.197c.002.56.333.942.832.946 1.654 0 2.874-.021 4.906-.021 2.962.054 5.373 3.046 5.4 6.432l.045 5.75.888 1.096.954-1.09v-5.757c0-4.616-3.243-8.373-7.23-8.373-1.676-.001-3.353.001-5.029-.001-.502 0-.769.458-.766 1.018z" fill="#f43737"/><path d="M53.472 38.026l3.23-3.194-.004-.004c.314-.315.286-.881.036-1.143-.25-.262-.668-.355-1.012-.092-.743.724-1.633 1.527-2.236 2.13-.603-.603-1.493-1.406-2.236-2.13-.302-.266-.767-.226-1.047.076-.279.303-.287.825.043 1.159l-.003.004z" fill="#f43737"/><path d="M31.865 12.32c3.897 0 7.07 3.173 7.07 7.072 0 3.897-3.173 7.069-7.07 7.069-3.899 0-7.07-3.173-7.07-7.069 0-3.899 3.172-7.071 7.07-7.071z" fill="#1d83d4"/><path d="M31.865 52.153a5.543 5.543 0 005.535-5.536 5.543 5.543 0 00-5.535-5.537 5.544 5.544 0 00-5.538 5.537 5.543 5.543 0 005.538 5.536z" fill="#ffbf00"/><path d="M10.526 52.153a5.544 5.544 0 005.539-5.536 5.545 5.545 0 00-5.539-5.537 5.541 5.541 0 00-5.534 5.537 5.54 5.54 0 005.534 5.536z" fill="#e895b7"/><path d="M53.476 39.547a7.08 7.08 0 017.072 7.071c0 3.897-3.172 7.07-7.072 7.07-3.898 0-7.07-3.173-7.07-7.07 0-3.9 3.173-7.071 7.07-7.071zM22.412 19.177c-.003.56-.334.942-.832.945-1.654 0-2.875-.02-4.907-.02-2.962.054-5.373 3.046-5.4 6.432l-.044 5.751-.888 1.096-.955-1.092v-5.756c0-4.617 3.244-8.374 7.23-8.374 1.677 0 3.353.002 5.029-.001.502 0 .77.458.767 1.019z" fill="#1d83d4"/><path d="M10.405 38.005l-3.23-3.194.004-.004c-.313-.314-.286-.88-.036-1.143.25-.262.668-.355 1.013-.092.742.724 1.632 1.527 2.236 2.131.603-.604 1.493-1.407 2.235-2.13.302-.266.768-.227 1.047.076.28.302.287.824-.042 1.158l.002.004zM31.917 33.274l.955-.973v-3.975s-.588-.702-.972-.695c-.384.007-.906.695-.906.695l.035 3.97z" fill="#1d83d4"/><path d="M31.978 37.755l-3.23-3.194.004-.004c-.313-.314-.286-.88-.036-1.143.25-.262.668-.355 1.013-.092.742.724 1.632 1.527 2.235 2.13.604-.603 1.494-1.406 2.236-2.13.302-.265.768-.226 1.047.077.279.302.287.824-.043 1.158l.003.004z" fill="#1d83d4"/><path d="M53.476 52.153a5.543 5.543 0 005.537-5.536 5.543 5.543 0 00-5.537-5.537 5.542 5.542 0 00-5.535 5.537 5.542 5.542 0 005.535 5.536zM31.82 24.879a5.544 5.544 0 005.538-5.536 5.545 5.545 0 00-5.538-5.537 5.541 5.541 0 00-5.535 5.537 5.54 5.54 0 005.535 5.536z" fill="#4caf50"/></svg>
\ No newline at end of file
diff --git a/design_system_dependences/switchcase/.gitattributes b/design_system_dependences/switchcase/v0.5.1/.gitattributes
similarity index 100%
rename from design_system_dependences/switchcase/.gitattributes
rename to design_system_dependences/switchcase/v0.5.1/.gitattributes
diff --git a/design_system_dependences/switchcase/doc.txt b/design_system_dependences/switchcase/v0.5.1/doc.txt
similarity index 100%
rename from design_system_dependences/switchcase/doc.txt
rename to design_system_dependences/switchcase/v0.5.1/doc.txt
diff --git a/design_system_dependences/switchcase/images/switchcase-32.png b/design_system_dependences/switchcase/v0.5.1/images/switchcase-32.png
similarity index 100%
rename from design_system_dependences/switchcase/images/switchcase-32.png
rename to design_system_dependences/switchcase/v0.5.1/images/switchcase-32.png
diff --git a/design_system_dependences/switchcase/v0.5.1/images/switchcase-xx.svg b/design_system_dependences/switchcase/v0.5.1/images/switchcase-xx.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a62f0be3823a233f9be410f7bac80646970e541b
--- /dev/null
+++ b/design_system_dependences/switchcase/v0.5.1/images/switchcase-xx.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64">
+  <path fill="#d3d3d3" d="M10.4 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1S3.3 51.9 3.3 48c0-3.9 3.2-7.1 7.1-7.1z" />
+  <path fill="#1d83d4" d="M41.5 19.2c0 .6.3.9.8.9h4.9c3 .1 5.4 3 5.4 6.4v5.8l.9 1.1 1-1.1v-5.8c0-4.6-3.2-8.4-7.2-8.4h-5c-.6.1-.8.5-.8 1.1z"/>
+  <path fill="#1d83d4" d="m53.5 38 3.2-3.2c.3-.3.3-.9 0-1.1s-.7-.4-1-.1c-.7.7-1.6 1.5-2.2 2.1-.6-.6-1.5-1.4-2.2-2.1-.3-.3-.8-.2-1 .1-.3.3-.3.8 0 1.2l3.2 3.1z"/>
+  <path fill="#666" d="M31.9 12.3c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1zM22.4 19.2c0 .6-.3.9-.8.9h-4.9c-3 .1-5.4 3-5.4 6.4v5.8l-.9 1.1-1-1.1v-5.8c0-4.6 3.2-8.4 7.2-8.4h5c.5.1.8.5.8 1.1z"/>
+  <path fill="#666" d="m10.4 38-3.2-3.2c-.3-.3-.3-.9 0-1.1.3-.3.7-.4 1-.1.7.7 1.6 1.5 2.2 2.1.6-.6 1.5-1.4 2.2-2.1.3-.3.8-.2 1 .1.3.3.3.8 0 1.2L10.4 38zm21.5-4.7 1-1v-4s-.6-.7-1-.7-.9.7-.9.7v4l.9 1z"/>
+  <path fill="#666" d="m32 37.8-3.2-3.2c-.3-.3-.3-.9 0-1.1.3-.3.7-.4 1-.1.7.7 1.6 1.5 2.2 2.1.6-.6 1.5-1.4 2.2-2.1.3-.3.8-.2 1 .1.3.3.3.8 0 1.2L32 37.8z"/>
+  <path fill="#888" d="M32 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1z"/>
+  <path fill="#666" d="M53.5 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1z" />
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/switchcase/v0.5.1/install.log b/design_system_dependences/switchcase/v0.5.1/install.log
new file mode 100644
index 0000000000000000000000000000000000000000..673a8ece8fb95ec8e9fee7256ca87e5e52724ee0
--- /dev/null
+++ b/design_system_dependences/switchcase/v0.5.1/install.log
@@ -0,0 +1,3 @@
+installation: charger_plugin
+date: 2024-01-16T12:57:08Z
+source: ../tmp/cache/chargeur/v0.5.1-7063c879-switchcase-d1f0d-v0.5.1.zip
diff --git a/design_system_dependences/switchcase/lang/paquet-switchcase_fr.php b/design_system_dependences/switchcase/v0.5.1/lang/paquet-switchcase_fr.php
similarity index 100%
rename from design_system_dependences/switchcase/lang/paquet-switchcase_fr.php
rename to design_system_dependences/switchcase/v0.5.1/lang/paquet-switchcase_fr.php
diff --git a/design_system_dependences/switchcase/paquet.xml b/design_system_dependences/switchcase/v0.5.1/paquet.xml
similarity index 92%
rename from design_system_dependences/switchcase/paquet.xml
rename to design_system_dependences/switchcase/v0.5.1/paquet.xml
index fc7e00f002529b67ffd9b2cfc0abe00e8307eac0..ef3446379fc5568e7ae06ec58211082bab12f651 100644
--- a/design_system_dependences/switchcase/paquet.xml
+++ b/design_system_dependences/switchcase/v0.5.1/paquet.xml
@@ -1,9 +1,9 @@
 <paquet
 	prefix="switchcase"
 	categorie="outil"
-	version="0.5.0"
+	version="0.5.1"
 	etat="stable"
-	compatibilite="[3.1.0;4.5.*]"
+	compatibilite="[3.1.0;4.2.*]"
 	logo="images/switchcase-32.png"
 	documentation="https://contrib.spip.net/4800"
 >
diff --git a/design_system_dependences/switchcase/v0.5.1/switchcase.svg b/design_system_dependences/switchcase/v0.5.1/switchcase.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a62f0be3823a233f9be410f7bac80646970e541b
--- /dev/null
+++ b/design_system_dependences/switchcase/v0.5.1/switchcase.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64">
+  <path fill="#d3d3d3" d="M10.4 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1S3.3 51.9 3.3 48c0-3.9 3.2-7.1 7.1-7.1z" />
+  <path fill="#1d83d4" d="M41.5 19.2c0 .6.3.9.8.9h4.9c3 .1 5.4 3 5.4 6.4v5.8l.9 1.1 1-1.1v-5.8c0-4.6-3.2-8.4-7.2-8.4h-5c-.6.1-.8.5-.8 1.1z"/>
+  <path fill="#1d83d4" d="m53.5 38 3.2-3.2c.3-.3.3-.9 0-1.1s-.7-.4-1-.1c-.7.7-1.6 1.5-2.2 2.1-.6-.6-1.5-1.4-2.2-2.1-.3-.3-.8-.2-1 .1-.3.3-.3.8 0 1.2l3.2 3.1z"/>
+  <path fill="#666" d="M31.9 12.3c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1zM22.4 19.2c0 .6-.3.9-.8.9h-4.9c-3 .1-5.4 3-5.4 6.4v5.8l-.9 1.1-1-1.1v-5.8c0-4.6 3.2-8.4 7.2-8.4h5c.5.1.8.5.8 1.1z"/>
+  <path fill="#666" d="m10.4 38-3.2-3.2c-.3-.3-.3-.9 0-1.1.3-.3.7-.4 1-.1.7.7 1.6 1.5 2.2 2.1.6-.6 1.5-1.4 2.2-2.1.3-.3.8-.2 1 .1.3.3.3.8 0 1.2L10.4 38zm21.5-4.7 1-1v-4s-.6-.7-1-.7-.9.7-.9.7v4l.9 1z"/>
+  <path fill="#666" d="m32 37.8-3.2-3.2c-.3-.3-.3-.9 0-1.1.3-.3.7-.4 1-.1.7.7 1.6 1.5 2.2 2.1.6-.6 1.5-1.4 2.2-2.1.3-.3.8-.2 1 .1.3.3.3.8 0 1.2L32 37.8z"/>
+  <path fill="#888" d="M32 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1z"/>
+  <path fill="#666" d="M53.5 40.9c3.9 0 7.1 3.2 7.1 7.1 0 3.9-3.2 7.1-7.1 7.1-3.9 0-7.1-3.2-7.1-7.1 0-3.9 3.2-7.1 7.1-7.1z" />
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/switchcase/switchcase_fonctions.php b/design_system_dependences/switchcase/v0.5.1/switchcase_fonctions.php
similarity index 100%
rename from design_system_dependences/switchcase/switchcase_fonctions.php
rename to design_system_dependences/switchcase/v0.5.1/switchcase_fonctions.php
diff --git a/design_system_dependences/switchcase/switchcase_options.php b/design_system_dependences/switchcase/v0.5.1/switchcase_options.php
similarity index 100%
rename from design_system_dependences/switchcase/switchcase_options.php
rename to design_system_dependences/switchcase/v0.5.1/switchcase_options.php
diff --git a/design_system_dependences/switchcase/tests/test_switchcase.html b/design_system_dependences/switchcase/v0.5.1/tests/test_switchcase.html
similarity index 95%
rename from design_system_dependences/switchcase/tests/test_switchcase.html
rename to design_system_dependences/switchcase/v0.5.1/tests/test_switchcase.html
index 30b25fe38d300423839755f5e3601690b6a70fe2..0610c6b046dc60886298588042a015a16f35c495 100644
--- a/design_system_dependences/switchcase/tests/test_switchcase.html
+++ b/design_system_dependences/switchcase/v0.5.1/tests/test_switchcase.html
@@ -1,7 +1,7 @@
 [(#ARG|oui)
 	<a href="#SELF&var_mode=calcul">calcul</a> | <a href="#SELF&var_mode=recalcul">recalcul</a><br>
 ]
-Valeur à tester : <BOUCLE_menu(DATA){source table,#LISTE{1,2,3,4,5,10,A,B,C,X,Y,Z,A'B,A'B"C,B"C}}{' | '}>
+Choisissez la valeur à tester : <BOUCLE_menu(DATA){source table,#LISTE{1,2,3,4,5,10,A,B,C,X,Y,Z,A'B,A'B"C,B"C}}{' | '}>
 	<a href="[(#SELF|parametre_url{arg,#VALEUR})]">#VALEUR</a>
 </BOUCLE_menu>
 #SET{arg,#ENV{arg,précisément rien}}
@@ -27,7 +27,7 @@ Et de nouveau (sans nouveau switch) :<br>
 [(#CASE{1,3,5}) <b>C'est un, trois ou cing</b>][(#CASE{1,3,5}|non) C'est NI un NI trois NI cinq] - 
 [(#CASE{2,4,6}) <b>C'est deux, quatre ou six</b>][(#CASE{2,4,6}|non) C'est NI deux NI quatre NI six] - 
 [(#CASE{3,5,7}) <b>C'est trois, cinq ou sept</b>][(#CASE{3,5,7}|non) C'est PAS trois NI cinq NI sept] - 
-[(#CASE_DEFAULT) C'est pas dans 1,2,3,4,5,6][(#CASE_DEFAULT|non) <b>C'est l'un de 1, 2, 3, 4, 5, 6 ou 7</b>]
+[(#CASE_DEFAULT) C'est pas dans 1,2,3,4,5,6,7][(#CASE_DEFAULT|non) <b>C'est l'un de 1, 2, 3, 4, 5, 6 ou 7</b>]
 <br>
 Et de nouveau (sans nouveau switch) :<br>
 [(#CASE{1,3,5}) <b>C'est un, trois ou cing</b>][(#CASE{1,3,5}|non) C'est NI un NI trois NI cinq] -