diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000000000000000000000000000000000000..bb0de602bc695beaa3c4d217276a22c82c839d29
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,12 @@
+{
+    "presets": [
+        ["env", {
+            "modules": false,
+            "targets": {
+                "browsers": "> 1%",
+                "uglify": true
+            },
+            "useBuiltIns": true
+        }]
+    ]
+}
diff --git a/.composer-require-checker.json b/.composer-require-checker.json
new file mode 100644
index 0000000000000000000000000000000000000000..51a3da208690a93a7469adbc9683a6ff87ce3cdd
--- /dev/null
+++ b/.composer-require-checker.json
@@ -0,0 +1,45 @@
+{
+    "symbol-whitelist": [
+        "null",
+        "true",
+        "false",
+        "static",
+        "self",
+        "parent",
+        "array",
+        "string",
+        "int",
+        "float",
+        "bool",
+        "iterable",
+        "callable",
+        "void",
+        "object",
+        "DAMA\\DoctrineTestBundle\\DAMADoctrineTestBundle",
+        "Irstea\\PlantUmlBundle\\IrsteaPlantUmlBundle",
+        "org\\bovigo\\vfs\\vfsStream",
+        "PHPUnit_Framework_TestCase",
+        "PHPUnit\\Framework\\TestCase",
+        "Sensio\\Bundle\\GeneratorBundle\\SensioGeneratorBundle",
+        "Swift_Attachment",
+        "Swift_Message",
+        "Symfony\\Bundle\\DebugBundle\\DebugBundle",
+        "Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle"
+    ],
+    "php-core-extensions": [
+        "Core",
+        "date",
+        "filter",
+        "hash",
+        "libxml",
+        "openssl",
+        "pcntl",
+        "pcre",
+        "Reflection",
+        "session",
+        "SPL",
+        "standard",
+        "zlib"
+    ],
+    "scan-files": []
+}
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..184bfe368db986cc2fadf59609ace903f679883c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,44 @@
+# Generated/fetched content
+/app/bootstrap*
+/app/cache
+/app/check.php
+/app/config/parameters.yml
+/app/exports
+/app/imports
+/app/logs
+/app/Resources/doc/entities.*
+/app/SymfonyRequirements.php
+/node_modules
+/src/BdohInternationalisationBundle/Resources/assets/translations/
+/web/assets
+/web/bundles
+/web/css/themes
+/web/maintenance.html
+/web/uploads
+/vendor
+/yarn-error.log
+
+# Tools
+/dev
+/bin
+/Dockerfile*
+/docker-compose*
+behat.yml
+deploy.php
+phpcs.xml.dist
+phpmd-ruleset.xml
+phpunit.xml.dist
+README.md
+
+# Local configuration
+/auth.json
+
+# Hidden files
+/.[a-zA-Z0-9]*
+.gitignore
+
+
+# Backup files
+*~
+*-old*
+
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..bee8777d6234310537969f5a5fd4ac6efe3c0ac6
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,14 @@
+# editorconfig.org
+root=true
+
+[*]
+charset=utf-8
+end_of_line=lf
+indent_size=4
+indent_style=space
+insert_final_newline=true
+tab_width=8
+trim_trailing_whitespace=true
+
+[/*.yml]
+indent_size=2
diff --git a/.env.dist b/.env.dist
new file mode 100644
index 0000000000000000000000000000000000000000..e3fac77c0bfb8a0edaa2c003aa393460582ec5a2
--- /dev/null
+++ b/.env.dist
@@ -0,0 +1,2 @@
+FRONTAL_IP=127.0.0.1
+FRONTAL_HOSTNAME=localhost
diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000000000000000000000000000000000000..0c601a9c5c5b53dd13d52b834ae18636d126280c
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,3 @@
+export PHP_VERSION=7.1
+layout php
+use node 12
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..0bd25cce7369bce2c2afcba6b27803c910842ec7
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,6 @@
+node_modules/*
+vendor/*
+web/*
+uploads/*
+app/*
+!app/Resources
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..2b86a774441bcdfa25c3db20436668108c7898ab
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,88 @@
+{
+    "extends": "eslint:recommended",
+    "parserOptions": {
+        "impliedStrict": true
+    },
+    "rules": {
+        "quotes": [
+            "error",
+            "single",
+            {
+                "avoidEscape": true
+            }
+        ],
+        "one-var": [
+            "warn",
+            "never"
+        ],
+        "no-var": [
+            "error"
+        ],
+        "no-lonely-if": [
+            "error"
+        ],
+        "newline-per-chained-call": [
+            "error"
+        ],
+        "object-curly-newline": [
+            "error",
+            {
+                "multiline": true,
+                "consistent": true
+            }
+        ],
+        "prefer-const": [
+            "error"
+        ],
+        "prefer-arrow-callback": [
+            "error"
+        ],
+        "object-shorthand": [
+            "error",
+            "always"
+        ],
+        "prefer-spread": [
+            "error"
+        ],
+        "prefer-template": [
+            "error"
+        ],
+        "no-useless-concat": [
+            "error"
+        ],
+        "no-template-curly-in-string": [
+            "warn"
+        ],
+        "block-scoped-var": [
+            "error"
+        ],
+        "no-else-return": [
+            "error"
+        ],
+        "no-extra-bind": [
+            "warn"
+        ],
+        "template-curly-spacing": [
+            "error",
+            "never"
+        ]
+    },
+    "env": {
+        "es6": true,
+        "node": true
+    },
+    "overrides": [
+        {
+            "files": [
+                "src/**/assets/**/*.js"
+            ],
+            "env": {
+                "browser": true,
+                "es6": true,
+                "amd": true,
+                "commonjs": true,
+                "jquery": true
+            }
+        }
+    ]
+}
diff --git a/.php_cs.dist b/.php_cs.dist
new file mode 100644
index 0000000000000000000000000000000000000000..b64757d1c0f485ca9e72df6aff143d84f5c16da5
--- /dev/null
+++ b/.php_cs.dist
@@ -0,0 +1,59 @@
+<?php declare(strict_types=1);
+
+$finder = PhpCsFixer\Finder::create()
+    ->exclude(['vendor', 'reports', 'node_modules', 'app/cache', 'app/logs', '.phpstan-cache'])
+    ->files()
+    ->name('*.php')
+    ->in(__DIR__.'/.deploy')
+    ->in(__DIR__);
+
+$loader = require_once __DIR__ . '/vendor/autoload.php';
+try {
+    $config = Irstea\CS\Config::create()
+        ->setRiskyAllowed(true)
+        ->setIndent('    ')
+        ->setLineEnding("\n")
+        ->setFinder($finder);
+    $config->setRules([
+            'header_comment' => [
+                'header' => <<<EOT
+Base de Données des Observatoires en Hydrologie
+Copyright (C) 2012-2019 IRSTEA
+Copyright (C) 2020-2021 INRAE
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU Affero General Public License as published by the
+Free Software Foundation, either version 3 of the License, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+EOT
+                ,
+            ],
+            // @TODO: corriger plutôt qu'ignorer
+            'declare_strict_types' => false,
+            'fopen_flags' => false,
+            'function_to_constant' => false,
+            'modernize_types_casting' => false,
+            'native_constant_invocation' => false,
+            'native_function_invocation' => false,
+            'no_alias_functions' => false,
+            'no_superfluous_phpdoc_tags' => false,
+            'random_api_migration' => false,
+            'self_accessor' => false,
+            'single_line_throw' => false,
+            'visibility_required' => false,
+            'void_return' => false,
+        ]);
+    return $config;
+} finally {
+    // Supprime le loader une fois la config chargée
+    // pour éviter des conflits de version de classes.
+    $loader->unregister();
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..2beb9e16309456b1f4244480f4fe6890324a5064
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,662 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<https://www.gnu.org/licenses/>.
+
diff --git a/app/AppCache.php b/app/AppCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..b25d44c143ec22bd782326efa835bf96b34f24e2
--- /dev/null
+++ b/app/AppCache.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+require_once __DIR__ . '/AppKernel.php';
+
+use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache;
+
+class AppCache extends HttpCache
+{
+}
diff --git a/app/AppKernel.php b/app/AppKernel.php
new file mode 100644
index 0000000000000000000000000000000000000000..3dc488e7e314b3d3c5af253504523dcfc20db1e0
--- /dev/null
+++ b/app/AppKernel.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\HttpKernel\Kernel;
+
+class AppKernel extends Kernel
+{
+    public function registerBundles()
+    {
+        $bundles = [
+            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
+            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
+            new Symfony\Bundle\TwigBundle\TwigBundle(),
+            new Symfony\Bundle\MonologBundle\MonologBundle(),
+            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
+            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
+            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
+            new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(),
+            new JMS\AopBundle\JMSAopBundle(),
+            new JMS\DiExtraBundle\JMSDiExtraBundle(),
+            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
+            new Bazinga\Bundle\JsTranslationBundle\BazingaJsTranslationBundle(),
+            new JMS\JobQueueBundle\JMSJobQueueBundle(),
+            new Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
+
+            new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
+            new Sonata\CoreBundle\SonataCoreBundle(),
+            new Sonata\BlockBundle\SonataBlockBundle(),
+            new Sonata\AdminBundle\SonataAdminBundle(),
+            new Knp\Bundle\MenuBundle\KnpMenuBundle(),
+            new Gregwar\CaptchaBundle\GregwarCaptchaBundle(),
+            new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
+
+            new Irstea\BdohBundle\IrsteaBdohBundle(),
+            new Irstea\BdohDataBundle\IrsteaBdohDataBundle(),
+            new Irstea\BdohAdminBundle\IrsteaBdohAdminBundle(),
+            new Irstea\BdohSecurityBundle\IrsteaBdohSecurityBundle(),
+            new Irstea\BdohConsultBundle\IrsteaBdohConsultBundle(),
+            new Irstea\BdohLoggerBundle\IrsteaBdohLoggerBundle(),
+            new Irstea\BdohInternationalisationBundle\IrsteaBdohInternationalisationBundle(),
+            new Irstea\BdohTheiaOzcarBundle\IrsteaBdohTheiaOzcarBundle(),
+        ];
+
+        if (in_array($this->getEnvironment(), ['dev', 'test'])) {
+            $bundles[] = new Irstea\PlantUmlBundle\IrsteaPlantUmlBundle();
+            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
+            $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
+            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
+            $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
+        }
+
+        if ($this->getEnvironment() === 'test') {
+            $bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle();
+        }
+
+        return $bundles;
+    }
+
+    public function registerContainerConfiguration(LoaderInterface $loader)
+    {
+        $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
+    }
+}
diff --git a/app/DoctrineMigrations/AbstractScriptMigration.php b/app/DoctrineMigrations/AbstractScriptMigration.php
new file mode 100644
index 0000000000000000000000000000000000000000..a74fecc0ea7cb7b3a3e710a37c04767a388ff749
--- /dev/null
+++ b/app/DoctrineMigrations/AbstractScriptMigration.php
@@ -0,0 +1,76 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+
+/**
+ * Class AbstractScriptMigration.
+ */
+abstract class AbstractScriptMigration extends AbstractMigration
+{
+    const SCRIPT_DIR = __DIR__ . '/../sql/';
+
+    /**
+     * @param string $sql
+     */
+    protected function addStatements($sql)
+    {
+        $defs = array_map('trim', preg_split('/(?=^(?:CREATE|DROP|SELECT|INSERT|UPDATE|DELETE|GRANT|REVOKE))/im', $sql));
+        foreach ($defs as $def) {
+            if (!$def) {
+                continue;
+            }
+            $this->addSql($def);
+        }
+    }
+
+    /**
+     * @param string $sql
+     */
+    protected function removeFunctions($sql)
+    {
+        preg_match_all('/^CREATE(?:\s+OR\s+REPLACE)?\s+(FUNCTION|AGGREGATE)\s+(\w+\s*\([^)]+\))/im', $sql, $matches, PREG_SET_ORDER);
+        foreach ($matches as list(, $type, $sig)) {
+            $sig = preg_replace(
+                ['/\s+DEFAULT\s+[^,)]+/i', '/ {2,}/m'],
+                ['', ' '],
+                strtr($sig, "\n\t", '  ')
+            );
+            $this->addSql("DROP $type IF EXISTS $sig CASCADE");
+        }
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return string
+     */
+    protected function readFile($name)
+    {
+        $sql = file_get_contents(self::SCRIPT_DIR . $name);
+        $sql = preg_replace('/^\s*--.*$/m', '', $sql);
+
+        return $sql;
+    }
+}
diff --git a/app/DoctrineMigrations/Version20161214085310.php b/app/DoctrineMigrations/Version20161214085310.php
new file mode 100644
index 0000000000000000000000000000000000000000..b20899ca0554664461e07dd35c3516362a5a1a35
--- /dev/null
+++ b/app/DoctrineMigrations/Version20161214085310.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20161214085310 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('CREATE EXTENSION IF NOT EXISTS postgis;');
+        $this->addSql('CREATE EXTENSION IF NOT EXISTS postgis_topology;');
+        $this->addSql('CREATE SCHEMA IF NOT EXISTS bdoh');
+        $this->addSql('CREATE SCHEMA IF NOT EXISTS temp');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP SCHEMA IF EXISTS temp CASCADE');
+        $this->addSql('DROP SCHEMA IF EXISTS bdoh CASCADE');
+        $this->addSql('DROP EXTENSION IF EXISTS postgis_topology');
+        $this->addSql('DROP EXTENSION IF EXISTS postgis');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20161214090416.php b/app/DoctrineMigrations/Version20161214090416.php
new file mode 100644
index 0000000000000000000000000000000000000000..75364436787ef4818b832e4064a9dc6a659b8dbc
--- /dev/null
+++ b/app/DoctrineMigrations/Version20161214090416.php
@@ -0,0 +1,464 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20161214090416 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('CREATE SEQUENCE observatoire_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE doi_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE partenaire_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE siteexperimental_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE station_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE chronique_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE tauxremplissage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE commune_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE typeparametre_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE unite_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE mesure_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE pointjaugeage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE pointcontrole_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE echantillonnage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE transformation_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE bareme_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE baremejeubareme_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE jeubareme_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE plage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE qualite_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE jeuqualite_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE qualitejeuqualite_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE bassin_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE courseau_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE pasechantillonnage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE optionechantillonnageSortie_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE role_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE utilisateur_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE besoin_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE categorie_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE typetravaux_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE objectifrecherche_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE historique_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE observatoire (id INT NOT NULL, jeu_id INT DEFAULT NULL, nom VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, conditionsUtilisation VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, descriptionEn TEXT DEFAULT NULL, lien VARCHAR(255) DEFAULT NULL, couleurPrimaire VARCHAR(255) DEFAULT NULL, couleurSecondaire VARCHAR(255) DEFAULT NULL, pathPhotoPrincipale VARCHAR(255) DEFAULT NULL, pathPhotoSecondaire VARCHAR(255) DEFAULT NULL, pathLogo VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_90B54B326C6E55B5 ON observatoire (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_90B54B32989D9B62 ON observatoire (slug)');
+        $this->addSql('CREATE INDEX IDX_90B54B328C9E392E ON observatoire (jeu_id)');
+        $this->addSql('CREATE TABLE observatoires_partenaires_scientifiques (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_5C80B31D61ED1B0D ON observatoires_partenaires_scientifiques (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_5C80B31D98DE13AC ON observatoires_partenaires_scientifiques (partenaire_id)');
+        $this->addSql('CREATE TABLE observatoires_partenaires_institutionnels (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_DDFC381E61ED1B0D ON observatoires_partenaires_institutionnels (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_DDFC381E98DE13AC ON observatoires_partenaires_institutionnels (partenaire_id)');
+        $this->addSql('CREATE TABLE doi (id INT NOT NULL, observatoire_id INT DEFAULT NULL, identifiant VARCHAR(255) NOT NULL, description VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_5ED9529A61ED1B0D ON doi (observatoire_id)');
+        $this->addSql('CREATE TABLE partenaire (id INT NOT NULL, nom VARCHAR(255) NOT NULL, lien VARCHAR(255) DEFAULT NULL, pathLogo VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_7DA2A0A36C6E55B5 ON partenaire (nom)');
+        $this->addSql('CREATE TABLE siteexperimental (id INT NOT NULL, observatoire_id INT DEFAULT NULL, nom VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, descriptionEn TEXT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_70E54E326C6E55B5 ON siteexperimental (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_70E54E32989D9B62 ON siteexperimental (slug)');
+        $this->addSql('CREATE INDEX IDX_70E54E3261ED1B0D ON siteexperimental (observatoire_id)');
+        $this->addSql('CREATE TABLE station (id INT NOT NULL, commune_id INT DEFAULT NULL, nom VARCHAR(255) NOT NULL, code VARCHAR(255) NOT NULL, altitude DOUBLE PRECISION DEFAULT NULL, estActive BOOLEAN NOT NULL, codeAlternatif VARCHAR(255) DEFAULT NULL, commentaire VARCHAR(4000) DEFAULT NULL, point geometry DEFAULT NULL, latitude DOUBLE PRECISION DEFAULT NULL, longitude DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_5084C12D6C6E55B5 ON station (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_5084C12D77153098 ON station (code)');
+        $this->addSql('CREATE INDEX IDX_5084C12D131A4F72 ON station (commune_id)');
+        $this->addSql('COMMENT ON COLUMN station.point IS \'(DC2type:geometry)\'');
+        $this->addSql('CREATE TABLE stations_sites (station_id INT NOT NULL, site_id INT NOT NULL, PRIMARY KEY(station_id, site_id))');
+        $this->addSql('CREATE INDEX IDX_F1C706F121BDB235 ON stations_sites (station_id)');
+        $this->addSql('CREATE INDEX IDX_F1C706F1F6BD1646 ON stations_sites (site_id)');
+        $this->addSql('CREATE TABLE chronique (id INT NOT NULL, unite_id INT DEFAULT NULL, producteur_id INT DEFAULT NULL, parametre_id INT DEFAULT NULL, station_id INT DEFAULT NULL, echantillonnage_id INT DEFAULT NULL, code VARCHAR(255) NOT NULL, libelle VARCHAR(255) NOT NULL, libelleEn VARCHAR(255) DEFAULT NULL, genealogie VARCHAR(4000) DEFAULT NULL, estVisible BOOLEAN NOT NULL, minimumValide DOUBLE PRECISION DEFAULT NULL, maximumValide DOUBLE PRECISION DEFAULT NULL, dateDebutmesures TIMESTAMP(3) WITHOUT TIME ZONE DEFAULT NULL, dateFinmesures TIMESTAMP(3) WITHOUT TIME ZONE DEFAULT NULL, nbmesures INT DEFAULT NULL, echantillonageSet BOOLEAN DEFAULT NULL, allowValueLimits BOOLEAN DEFAULT NULL, dtype VARCHAR(255) NOT NULL, directionmesure VARCHAR(255) DEFAULT NULL, uniteCumul_id INT DEFAULT NULL, facteurMultiplicatif DOUBLE PRECISION DEFAULT NULL, miseAJour DATE DEFAULT NULL, premiereEntree_id INT DEFAULT NULL, secondeEntree_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_DAC28749EC4A74AB ON chronique (unite_id)');
+        $this->addSql('CREATE INDEX IDX_DAC28749AB9BB300 ON chronique (producteur_id)');
+        $this->addSql('CREATE INDEX IDX_DAC287496358FF62 ON chronique (parametre_id)');
+        $this->addSql('CREATE INDEX IDX_DAC2874921BDB235 ON chronique (station_id)');
+        $this->addSql('CREATE INDEX IDX_DAC28749C573B65 ON chronique (echantillonnage_id)');
+        $this->addSql('CREATE INDEX IDX_DAC28749DFE96297 ON chronique (uniteCumul_id)');
+        $this->addSql('CREATE INDEX IDX_DAC28749DC970D1B ON chronique (premiereEntree_id)');
+        $this->addSql('CREATE INDEX IDX_DAC287496FB0C8CA ON chronique (secondeEntree_id)');
+        $this->addSql('COMMENT ON COLUMN chronique.dateDebutmesures IS \'(DC2type:datetimems)\'');
+        $this->addSql('COMMENT ON COLUMN chronique.dateFinmesures IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE echantillonnageSortieLicite_chronique (chronique_id INT NOT NULL, echantillonnage_id INT NOT NULL, PRIMARY KEY(chronique_id, echantillonnage_id))');
+        $this->addSql('CREATE INDEX IDX_C02D212B93054D ON echantillonnageSortieLicite_chronique (chronique_id)');
+        $this->addSql('CREATE INDEX IDX_C02D212BC573B65 ON echantillonnageSortieLicite_chronique (echantillonnage_id)');
+        $this->addSql('CREATE TABLE optionechantillonnageSortie_chronique (chronique_id INT NOT NULL, optionechantillonnageSortie_id INT NOT NULL, PRIMARY KEY(chronique_id, optionechantillonnageSortie_id))');
+        $this->addSql('CREATE INDEX IDX_C5BB869D93054D ON optionechantillonnageSortie_chronique (chronique_id)');
+        $this->addSql('CREATE INDEX IDX_C5BB869DA40BAC33 ON optionechantillonnageSortie_chronique (optionechantillonnageSortie_id)');
+        $this->addSql('CREATE TABLE tauxremplissage (id INT NOT NULL, chronique_id INT DEFAULT NULL, debut TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, fin TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, taux DOUBLE PRECISION NOT NULL, poids DOUBLE PRECISION NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_AB7DAC0893054D ON tauxremplissage (chronique_id)');
+        $this->addSql('COMMENT ON COLUMN tauxremplissage.debut IS \'(DC2type:datetimems)\'');
+        $this->addSql('COMMENT ON COLUMN tauxremplissage.fin IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE commune (id INT NOT NULL, nom VARCHAR(255) NOT NULL, codePostal VARCHAR(5) DEFAULT NULL, codeInsee VARCHAR(5) DEFAULT NULL, latitude DOUBLE PRECISION DEFAULT NULL, longitude DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE typeparametre (id INT NOT NULL, nom VARCHAR(255) NOT NULL, nomEn VARCHAR(255) NOT NULL, code VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_7E773B8B6C6E55B5 ON typeparametre (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_7E773B8BE46E7608 ON typeparametre (nomEn)');
+        $this->addSql('CREATE TABLE parametres_unites (parametre_id INT NOT NULL, unite_id INT NOT NULL, PRIMARY KEY(parametre_id, unite_id))');
+        $this->addSql('CREATE INDEX IDX_9818AAAF6358FF62 ON parametres_unites (parametre_id)');
+        $this->addSql('CREATE INDEX IDX_9818AAAFEC4A74AB ON parametres_unites (unite_id)');
+        $this->addSql('CREATE TABLE unite (id INT NOT NULL, libelle VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_DCA5EE1CA4D60759 ON unite (libelle)');
+        $this->addSql('CREATE TABLE mesure (id BIGINT NOT NULL, qualite_id INT DEFAULT NULL, chronique_id INT DEFAULT NULL, date TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, valeur DOUBLE PRECISION DEFAULT NULL, minimum DOUBLE PRECISION DEFAULT NULL, maximum DOUBLE PRECISION DEFAULT NULL, estCalculee BOOLEAN NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_58B76B46A6338570 ON mesure (qualite_id)');
+        $this->addSql('CREATE INDEX IDX_58B76B4693054D ON mesure (chronique_id)');
+        $this->addSql('CREATE UNIQUE INDEX idx_mesure_chronique_date ON mesure (chronique_id, date)');
+        $this->addSql('COMMENT ON COLUMN mesure.date IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE pointjaugeage (id INT NOT NULL, bareme_id INT DEFAULT NULL, date TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, valeurparametreEntree DOUBLE PRECISION NOT NULL, valeurparametreSortie DOUBLE PRECISION NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_A228ECE75F49EAAD ON pointjaugeage (bareme_id)');
+        $this->addSql('COMMENT ON COLUMN pointjaugeage.date IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE pointcontrole (id INT NOT NULL, chronique_id INT DEFAULT NULL, qualite_id INT DEFAULT NULL, date TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, valeur DOUBLE PRECISION DEFAULT NULL, minimum DOUBLE PRECISION DEFAULT NULL, maximum DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_87AD087C93054D ON pointcontrole (chronique_id)');
+        $this->addSql('CREATE INDEX IDX_87AD087CA6338570 ON pointcontrole (qualite_id)');
+        $this->addSql('COMMENT ON COLUMN pointcontrole.date IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE echantillonnage (id INT NOT NULL, code VARCHAR(255) DEFAULT NULL, nom VARCHAR(255) NOT NULL, nomEn VARCHAR(255) DEFAULT NULL, ordreSortie INT DEFAULT NULL, hasDirection BOOLEAN DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_A5AE44C277153098 ON echantillonnage (code)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_A5AE44C26C6E55B5 ON echantillonnage (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_A5AE44C2E46E7608 ON echantillonnage (nomEn)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_A5AE44C2E632D4D7 ON echantillonnage (ordreSortie)');
+        $this->addSql('CREATE TABLE transformation (id INT NOT NULL, entree_id INT DEFAULT NULL, jeubaremeActuel_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_3FD6625D683E0182 ON transformation (jeubaremeActuel_id)');
+        $this->addSql('CREATE INDEX IDX_3FD6625DAF7BD910 ON transformation (entree_id)');
+        $this->addSql('CREATE TABLE bareme (id INT NOT NULL, observatoire_id INT DEFAULT NULL, nom VARCHAR(255) NOT NULL, commentaire VARCHAR(4000) DEFAULT NULL, valeurs _float8 NOT NULL, dateCreation DATE NOT NULL, uniteEntree_id INT DEFAULT NULL, uniteSortie_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_35A1B5D84C2F85C0 ON bareme (uniteEntree_id)');
+        $this->addSql('CREATE INDEX IDX_35A1B5D82F268583 ON bareme (uniteSortie_id)');
+        $this->addSql('CREATE INDEX IDX_35A1B5D861ED1B0D ON bareme (observatoire_id)');
+        $this->addSql('COMMENT ON COLUMN bareme.valeurs IS \'(DC2type:bareme)\'');
+        $this->addSql('CREATE TABLE baremejeubareme (id INT NOT NULL, bareme_id INT DEFAULT NULL, debutValidite DATE DEFAULT NULL, finValidite DATE DEFAULT NULL, jeubareme_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_8B2FAD395F49EAAD ON baremejeubareme (bareme_id)');
+        $this->addSql('CREATE INDEX IDX_8B2FAD39B3E24A00 ON baremejeubareme (jeubareme_id)');
+        $this->addSql('CREATE TABLE jeubareme (id INT NOT NULL, transformation_id INT DEFAULT NULL, dateCreation TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, delaiPropagation DOUBLE PRECISION DEFAULT NULL, valueLimittransformationtype VARCHAR(255) DEFAULT NULL, valueLimitPlaceholder DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_F8DD81F14FD34D2 ON jeubareme (transformation_id)');
+        $this->addSql('CREATE TABLE plage (id INT NOT NULL, qualite_id INT DEFAULT NULL, chronique_id INT DEFAULT NULL, debut TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, fin TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, valeur DOUBLE PRECISION DEFAULT NULL, minimum DOUBLE PRECISION DEFAULT NULL, maximum DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_D1B0B9CDA6338570 ON plage (qualite_id)');
+        $this->addSql('CREATE INDEX IDX_D1B0B9CD93054D ON plage (chronique_id)');
+        $this->addSql('COMMENT ON COLUMN plage.debut IS \'(DC2type:datetimems)\'');
+        $this->addSql('COMMENT ON COLUMN plage.fin IS \'(DC2type:datetimems)\'');
+        $this->addSql('CREATE TABLE qualite (id INT NOT NULL, jeu_id INT DEFAULT NULL, code VARCHAR(255) NOT NULL, libelle VARCHAR(255) DEFAULT NULL, libelleEn VARCHAR(255) DEFAULT NULL, ordre INT DEFAULT NULL, type VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_A70E6EC38C9E392E ON qualite (jeu_id)');
+        $this->addSql('CREATE TABLE jeuqualite (id INT NOT NULL, nom VARCHAR(255) NOT NULL, estAffectable BOOLEAN NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_A23415BD6C6E55B5 ON jeuqualite (nom)');
+        $this->addSql('CREATE TABLE qualitejeuqualite (id INT NOT NULL, traduction_id INT DEFAULT NULL, jeu_id INT DEFAULT NULL, qualite_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_329B05FB7E0955EF ON qualitejeuqualite (traduction_id)');
+        $this->addSql('CREATE INDEX IDX_329B05FB8C9E392E ON qualitejeuqualite (jeu_id)');
+        $this->addSql('CREATE INDEX IDX_329B05FBA6338570 ON qualitejeuqualite (qualite_id)');
+        $this->addSql('CREATE TABLE bassin (id INT NOT NULL, observatoire_id INT DEFAULT NULL, nom VARCHAR(255) NOT NULL, aire DOUBLE PRECISION DEFAULT NULL, perimetre geometry DEFAULT NULL, stationExutoire_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_660811F36C6E55B5 ON bassin (nom)');
+        $this->addSql('CREATE INDEX IDX_660811F361ED1B0D ON bassin (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_660811F3166BAF05 ON bassin (stationExutoire_id)');
+        $this->addSql('COMMENT ON COLUMN bassin.perimetre IS \'(DC2type:geometry)\'');
+        $this->addSql('CREATE TABLE courseau (id INT NOT NULL, nom VARCHAR(255) NOT NULL, codeHydro VARCHAR(255) DEFAULT NULL, classification INT DEFAULT NULL, trace geometry DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('COMMENT ON COLUMN courseau.trace IS \'(DC2type:geometry)\'');
+        $this->addSql('CREATE TABLE courseau_observatoires (courseau_id INT NOT NULL, observatoire_id INT NOT NULL, PRIMARY KEY(courseau_id, observatoire_id))');
+        $this->addSql('CREATE INDEX IDX_C05B50632164871 ON courseau_observatoires (courseau_id)');
+        $this->addSql('CREATE INDEX IDX_C05B50661ED1B0D ON courseau_observatoires (observatoire_id)');
+        $this->addSql('CREATE TABLE pasechantillonnage (id INT NOT NULL, unite VARCHAR(255) NOT NULL, valeur INT NOT NULL, approxSecondes INT DEFAULT NULL, libelle VARCHAR(255) DEFAULT NULL, libelleEn VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX uniqueUnitValuePair ON pasechantillonnage (unite, valeur)');
+        $this->addSql('CREATE TABLE optionechantillonnageSortie (id INT NOT NULL, echantillonnageEntree_id INT DEFAULT NULL, pasechantillonnage_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_6BD7A0C6B6FF6A7E ON optionechantillonnageSortie (echantillonnageEntree_id)');
+        $this->addSql('CREATE INDEX IDX_6BD7A0C6CE381F92 ON optionechantillonnageSortie (pasechantillonnage_id)');
+        $this->addSql('CREATE UNIQUE INDEX uniqueSamplingoption ON optionechantillonnageSortie (echantillonnageEntree_id, pasechantillonnage_id)');
+        $this->addSql('CREATE TABLE role (id INT NOT NULL, observatoire_id INT DEFAULT NULL, utilisateur_id INT DEFAULT NULL, site_id INT DEFAULT NULL, chronique_id INT DEFAULT NULL, valeur VARCHAR(255) DEFAULT NULL, dtype VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_F75B255461ED1B0D ON role (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_F75B2554FB88E14F ON role (utilisateur_id)');
+        $this->addSql('CREATE INDEX IDX_F75B2554F6BD1646 ON role (site_id)');
+        $this->addSql('CREATE INDEX IDX_F75B255493054D ON role (chronique_id)');
+        $this->addSql('CREATE TABLE utilisateur (id INT NOT NULL, categorie_id INT DEFAULT NULL, email VARCHAR(255) NOT NULL, login VARCHAR(255) DEFAULT NULL, password VARCHAR(255) NOT NULL, salt VARCHAR(255) NOT NULL, prenom VARCHAR(255) DEFAULT NULL, nom VARCHAR(255) DEFAULT NULL, organisme VARCHAR(255) DEFAULT NULL, telephone VARCHAR(255) DEFAULT NULL, adresse VARCHAR(255) DEFAULT NULL, finAcces DATE DEFAULT NULL, derniereConnection DATE DEFAULT NULL, confirmationToken VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_9B80EC64BCF5E72D ON utilisateur (categorie_id)');
+        $this->addSql('CREATE TABLE besoin (id INT NOT NULL, utilisateur_id INT DEFAULT NULL, objectif_id INT DEFAULT NULL, type_id INT DEFAULT NULL, observatoire_id INT DEFAULT NULL, duree VARCHAR(255) DEFAULT NULL, details VARCHAR(1023) DEFAULT NULL, traite BOOLEAN DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_86B4ED27FB88E14F ON besoin (utilisateur_id)');
+        $this->addSql('CREATE INDEX IDX_86B4ED27157D1AD4 ON besoin (objectif_id)');
+        $this->addSql('CREATE INDEX IDX_86B4ED27C54C8C93 ON besoin (type_id)');
+        $this->addSql('CREATE INDEX IDX_86B4ED2761ED1B0D ON besoin (observatoire_id)');
+        $this->addSql('CREATE TABLE besoins_parametres (besoin_id INT NOT NULL, parametre_id INT NOT NULL, PRIMARY KEY(besoin_id, parametre_id))');
+        $this->addSql('CREATE INDEX IDX_75A89B03FE6EED44 ON besoins_parametres (besoin_id)');
+        $this->addSql('CREATE INDEX IDX_75A89B036358FF62 ON besoins_parametres (parametre_id)');
+        $this->addSql('CREATE TABLE besoins_stations (besoin_id INT NOT NULL, station_id INT NOT NULL, PRIMARY KEY(besoin_id, station_id))');
+        $this->addSql('CREATE INDEX IDX_59777037FE6EED44 ON besoins_stations (besoin_id)');
+        $this->addSql('CREATE INDEX IDX_5977703721BDB235 ON besoins_stations (station_id)');
+        $this->addSql('CREATE TABLE categorie (id INT NOT NULL, libelle VARCHAR(255) NOT NULL, libelleEn VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_CB8C5497A4D60759 ON categorie (libelle)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_CB8C549793C03288 ON categorie (libelleEn)');
+        $this->addSql('CREATE TABLE typetravaux (id INT NOT NULL, libelle VARCHAR(255) NOT NULL, libelleEn VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_FFE1C96BA4D60759 ON typetravaux (libelle)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_FFE1C96B93C03288 ON typetravaux (libelleEn)');
+        $this->addSql('CREATE TABLE objectifrecherche (id INT NOT NULL, libelle VARCHAR(255) NOT NULL, libelleEn VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_724F8B13A4D60759 ON objectifrecherche (libelle)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_724F8B1393C03288 ON objectifrecherche (libelleEn)');
+        $this->addSql('CREATE TABLE historique (id INT NOT NULL, auteur_id INT DEFAULT NULL, observatoire_id INT DEFAULT NULL, utilisateur_id INT DEFAULT NULL, bareme_id INT DEFAULT NULL, commune_id INT DEFAULT NULL, unite_id INT DEFAULT NULL, station_id INT DEFAULT NULL, chronique_id INT DEFAULT NULL, doi_id INT DEFAULT NULL, partenaire_id INT DEFAULT NULL, date DATE DEFAULT NULL, description TEXT NOT NULL, lien VARCHAR(255) DEFAULT NULL, dtype VARCHAR(255) NOT NULL, action VARCHAR(255) DEFAULT NULL, observatoireCible_id INT DEFAULT NULL, typeparametre_id INT DEFAULT NULL, siteexperimental_id INT DEFAULT NULL, debut TIMESTAMP(3) WITHOUT TIME ZONE DEFAULT NULL, fin TIMESTAMP(3) WITHOUT TIME ZONE DEFAULT NULL, nombremesures INT DEFAULT NULL, formatExport VARCHAR(255) DEFAULT NULL, formatImport VARCHAR(255) DEFAULT NULL, fuseau VARCHAR(255) DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, inputUnit VARCHAR(255) DEFAULT NULL, outputUnit VARCHAR(255) DEFAULT NULL, minAbscissa DOUBLE PRECISION DEFAULT NULL, maxAbscissa DOUBLE PRECISION DEFAULT NULL, nValues INT DEFAULT NULL, dateCreation DATE DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C60BB6FE6 ON historique (auteur_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C61ED1B0D ON historique (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CFB88E14F ON historique (utilisateur_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C5F49EAAD ON historique (bareme_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C131A4F72 ON historique (commune_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C5001BC01 ON historique (observatoireCible_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C6ECD41F5 ON historique (typeparametre_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CEC4A74AB ON historique (unite_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C21BDB235 ON historique (station_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CD9B0F6D6 ON historique (siteExperimental_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C93054D ON historique (chronique_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CE6EBA8D8 ON historique (doi_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C98DE13AC ON historique (partenaire_id)');
+        $this->addSql('COMMENT ON COLUMN historique.debut IS \'(DC2type:datetimems)\'');
+        $this->addSql('COMMENT ON COLUMN historique.fin IS \'(DC2type:datetimems)\'');
+        $this->addSql('ALTER TABLE observatoire ADD CONSTRAINT FK_90B54B328C9E392E FOREIGN KEY (jeu_id) REFERENCES jeuqualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT FK_5C80B31D61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT FK_5C80B31D98DE13AC FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT FK_DDFC381E61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT FK_DDFC381E98DE13AC FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE doi ADD CONSTRAINT FK_5ED9529A61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE siteexperimental ADD CONSTRAINT FK_70E54E3261ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE station ADD CONSTRAINT FK_5084C12D131A4F72 FOREIGN KEY (commune_id) REFERENCES commune (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE stations_sites ADD CONSTRAINT FK_F1C706F121BDB235 FOREIGN KEY (station_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE stations_sites ADD CONSTRAINT FK_F1C706F1F6BD1646 FOREIGN KEY (site_id) REFERENCES siteexperimental (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749EC4A74AB FOREIGN KEY (unite_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749AB9BB300 FOREIGN KEY (producteur_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC287496358FF62 FOREIGN KEY (parametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC2874921BDB235 FOREIGN KEY (station_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749C573B65 FOREIGN KEY (echantillonnage_id) REFERENCES echantillonnage (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749DFE96297 FOREIGN KEY (uniteCumul_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749DC970D1B FOREIGN KEY (premiereEntree_id) REFERENCES transformation (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC287496FB0C8CA FOREIGN KEY (secondeEntree_id) REFERENCES transformation (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE echantillonnageSortieLicite_chronique ADD CONSTRAINT FK_C02D212B93054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE echantillonnageSortieLicite_chronique ADD CONSTRAINT FK_C02D212BC573B65 FOREIGN KEY (echantillonnage_id) REFERENCES echantillonnage (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie_chronique ADD CONSTRAINT FK_C5BB869D93054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie_chronique ADD CONSTRAINT FK_C5BB869DA40BAC33 FOREIGN KEY (optionechantillonnageSortie_id) REFERENCES optionechantillonnageSortie (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE tauxremplissage ADD CONSTRAINT FK_AB7DAC0893054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE parametres_unites ADD CONSTRAINT FK_9818AAAF6358FF62 FOREIGN KEY (parametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE parametres_unites ADD CONSTRAINT FK_9818AAAFEC4A74AB FOREIGN KEY (unite_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE mesure ADD CONSTRAINT FK_58B76B46A6338570 FOREIGN KEY (qualite_id) REFERENCES qualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE mesure ADD CONSTRAINT FK_58B76B4693054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE pointjaugeage ADD CONSTRAINT FK_A228ECE75F49EAAD FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE pointcontrole ADD CONSTRAINT FK_87AD087C93054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE pointcontrole ADD CONSTRAINT FK_87AD087CA6338570 FOREIGN KEY (qualite_id) REFERENCES qualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE transformation ADD CONSTRAINT FK_3FD6625D683E0182 FOREIGN KEY (jeubaremeActuel_id) REFERENCES jeubareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE transformation ADD CONSTRAINT FK_3FD6625DAF7BD910 FOREIGN KEY (entree_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bareme ADD CONSTRAINT FK_35A1B5D84C2F85C0 FOREIGN KEY (uniteEntree_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bareme ADD CONSTRAINT FK_35A1B5D82F268583 FOREIGN KEY (uniteSortie_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bareme ADD CONSTRAINT FK_35A1B5D861ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE baremejeubareme ADD CONSTRAINT FK_8B2FAD395F49EAAD FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE baremejeubareme ADD CONSTRAINT FK_8B2FAD39B3E24A00 FOREIGN KEY (jeubareme_id) REFERENCES jeubareme (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE jeubareme ADD CONSTRAINT FK_F8DD81F14FD34D2 FOREIGN KEY (transformation_id) REFERENCES transformation (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE plage ADD CONSTRAINT FK_D1B0B9CDA6338570 FOREIGN KEY (qualite_id) REFERENCES qualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE plage ADD CONSTRAINT FK_D1B0B9CD93054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE qualite ADD CONSTRAINT FK_A70E6EC38C9E392E FOREIGN KEY (jeu_id) REFERENCES jeuqualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE qualitejeuqualite ADD CONSTRAINT FK_329B05FB7E0955EF FOREIGN KEY (traduction_id) REFERENCES qualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE qualitejeuqualite ADD CONSTRAINT FK_329B05FB8C9E392E FOREIGN KEY (jeu_id) REFERENCES jeuqualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE qualitejeuqualite ADD CONSTRAINT FK_329B05FBA6338570 FOREIGN KEY (qualite_id) REFERENCES qualite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bassin ADD CONSTRAINT FK_660811F361ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bassin ADD CONSTRAINT FK_660811F3166BAF05 FOREIGN KEY (stationExutoire_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE courseau_observatoires ADD CONSTRAINT FK_C05B50632164871 FOREIGN KEY (courseau_id) REFERENCES courseau (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE courseau_observatoires ADD CONSTRAINT FK_C05B50661ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie ADD CONSTRAINT FK_6BD7A0C6B6FF6A7E FOREIGN KEY (echantillonnageEntree_id) REFERENCES echantillonnage (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie ADD CONSTRAINT FK_6BD7A0C6CE381F92 FOREIGN KEY (pasechantillonnage_id) REFERENCES pasechantillonnage (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B255461ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B2554FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B2554F6BD1646 FOREIGN KEY (site_id) REFERENCES siteexperimental (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B255493054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE utilisateur ADD CONSTRAINT FK_9B80EC64BCF5E72D FOREIGN KEY (categorie_id) REFERENCES categorie (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED27FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED27157D1AD4 FOREIGN KEY (objectif_id) REFERENCES objectifrecherche (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED27C54C8C93 FOREIGN KEY (type_id) REFERENCES typetravaux (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED2761ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT FK_75A89B03FE6EED44 FOREIGN KEY (besoin_id) REFERENCES besoin (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT FK_75A89B036358FF62 FOREIGN KEY (parametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_stations ADD CONSTRAINT FK_59777037FE6EED44 FOREIGN KEY (besoin_id) REFERENCES besoin (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_stations ADD CONSTRAINT FK_5977703721BDB235 FOREIGN KEY (station_id) REFERENCES station (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C60BB6FE6 FOREIGN KEY (auteur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CFB88E14F FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C5F49EAAD FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C131A4F72 FOREIGN KEY (commune_id) REFERENCES commune (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C5001BC01 FOREIGN KEY (observatoireCible_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C6ECD41F5 FOREIGN KEY (typeparametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CEC4A74AB FOREIGN KEY (unite_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C21BDB235 FOREIGN KEY (station_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CD9B0F6D6 FOREIGN KEY (siteExperimental_id) REFERENCES siteexperimental (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C93054D FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CE6EBA8D8 FOREIGN KEY (doi_id) REFERENCES doi (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C98DE13AC FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT FK_5C80B31D61ED1B0D');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT FK_DDFC381E61ED1B0D');
+        $this->addSql('ALTER TABLE doi DROP CONSTRAINT FK_5ED9529A61ED1B0D');
+        $this->addSql('ALTER TABLE siteexperimental DROP CONSTRAINT FK_70E54E3261ED1B0D');
+        $this->addSql('ALTER TABLE bareme DROP CONSTRAINT FK_35A1B5D861ED1B0D');
+        $this->addSql('ALTER TABLE bassin DROP CONSTRAINT FK_660811F361ED1B0D');
+        $this->addSql('ALTER TABLE courseau_observatoires DROP CONSTRAINT FK_C05B50661ED1B0D');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B255461ED1B0D');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED2761ED1B0D');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C61ED1B0D');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C5001BC01');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CE6EBA8D8');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT FK_5C80B31D98DE13AC');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT FK_DDFC381E98DE13AC');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749AB9BB300');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C98DE13AC');
+        $this->addSql('ALTER TABLE stations_sites DROP CONSTRAINT FK_F1C706F1F6BD1646');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B2554F6BD1646');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CD9B0F6D6');
+        $this->addSql('ALTER TABLE stations_sites DROP CONSTRAINT FK_F1C706F121BDB235');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC2874921BDB235');
+        $this->addSql('ALTER TABLE bassin DROP CONSTRAINT FK_660811F3166BAF05');
+        $this->addSql('ALTER TABLE besoins_stations DROP CONSTRAINT FK_5977703721BDB235');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C21BDB235');
+        $this->addSql('ALTER TABLE echantillonnageSortieLicite_chronique DROP CONSTRAINT FK_C02D212B93054D');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie_chronique DROP CONSTRAINT FK_C5BB869D93054D');
+        $this->addSql('ALTER TABLE tauxremplissage DROP CONSTRAINT FK_AB7DAC0893054D');
+        $this->addSql('ALTER TABLE mesure DROP CONSTRAINT FK_58B76B4693054D');
+        $this->addSql('ALTER TABLE pointcontrole DROP CONSTRAINT FK_87AD087C93054D');
+        $this->addSql('ALTER TABLE transformation DROP CONSTRAINT FK_3FD6625DAF7BD910');
+        $this->addSql('ALTER TABLE plage DROP CONSTRAINT FK_D1B0B9CD93054D');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B255493054D');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C93054D');
+        $this->addSql('ALTER TABLE station DROP CONSTRAINT FK_5084C12D131A4F72');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C131A4F72');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC287496358FF62');
+        $this->addSql('ALTER TABLE parametres_unites DROP CONSTRAINT FK_9818AAAF6358FF62');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT FK_75A89B036358FF62');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C6ECD41F5');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749EC4A74AB');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749DFE96297');
+        $this->addSql('ALTER TABLE parametres_unites DROP CONSTRAINT FK_9818AAAFEC4A74AB');
+        $this->addSql('ALTER TABLE bareme DROP CONSTRAINT FK_35A1B5D84C2F85C0');
+        $this->addSql('ALTER TABLE bareme DROP CONSTRAINT FK_35A1B5D82F268583');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CEC4A74AB');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749C573B65');
+        $this->addSql('ALTER TABLE echantillonnageSortieLicite_chronique DROP CONSTRAINT FK_C02D212BC573B65');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie DROP CONSTRAINT FK_6BD7A0C6B6FF6A7E');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749DC970D1B');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC287496FB0C8CA');
+        $this->addSql('ALTER TABLE jeubareme DROP CONSTRAINT FK_F8DD81F14FD34D2');
+        $this->addSql('ALTER TABLE pointjaugeage DROP CONSTRAINT FK_A228ECE75F49EAAD');
+        $this->addSql('ALTER TABLE baremejeubareme DROP CONSTRAINT FK_8B2FAD395F49EAAD');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C5F49EAAD');
+        $this->addSql('ALTER TABLE transformation DROP CONSTRAINT FK_3FD6625D683E0182');
+        $this->addSql('ALTER TABLE baremejeubareme DROP CONSTRAINT FK_8B2FAD39B3E24A00');
+        $this->addSql('ALTER TABLE mesure DROP CONSTRAINT FK_58B76B46A6338570');
+        $this->addSql('ALTER TABLE pointcontrole DROP CONSTRAINT FK_87AD087CA6338570');
+        $this->addSql('ALTER TABLE plage DROP CONSTRAINT FK_D1B0B9CDA6338570');
+        $this->addSql('ALTER TABLE qualitejeuqualite DROP CONSTRAINT FK_329B05FB7E0955EF');
+        $this->addSql('ALTER TABLE qualitejeuqualite DROP CONSTRAINT FK_329B05FBA6338570');
+        $this->addSql('ALTER TABLE observatoire DROP CONSTRAINT FK_90B54B328C9E392E');
+        $this->addSql('ALTER TABLE qualite DROP CONSTRAINT FK_A70E6EC38C9E392E');
+        $this->addSql('ALTER TABLE qualitejeuqualite DROP CONSTRAINT FK_329B05FB8C9E392E');
+        $this->addSql('ALTER TABLE courseau_observatoires DROP CONSTRAINT FK_C05B50632164871');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie DROP CONSTRAINT FK_6BD7A0C6CE381F92');
+        $this->addSql('ALTER TABLE optionechantillonnageSortie_chronique DROP CONSTRAINT FK_C5BB869DA40BAC33');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B2554FB88E14F');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED27FB88E14F');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C60BB6FE6');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CFB88E14F');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT FK_75A89B03FE6EED44');
+        $this->addSql('ALTER TABLE besoins_stations DROP CONSTRAINT FK_59777037FE6EED44');
+        $this->addSql('ALTER TABLE utilisateur DROP CONSTRAINT FK_9B80EC64BCF5E72D');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED27C54C8C93');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED27157D1AD4');
+        $this->addSql('DROP SEQUENCE observatoire_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE doi_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE partenaire_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE siteexperimental_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE station_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE chronique_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE tauxremplissage_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE commune_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE typeparametre_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE unite_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE mesure_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE pointjaugeage_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE pointcontrole_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE echantillonnage_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE transformation_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE bareme_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE baremejeubareme_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE jeubareme_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE plage_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE qualite_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE jeuqualite_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE qualitejeuqualite_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE bassin_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE courseau_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE pasechantillonnage_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE optionechantillonnageSortie_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE role_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE utilisateur_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE besoin_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE categorie_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE typetravaux_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE objectifrecherche_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE historique_id_seq CASCADE');
+        $this->addSql('DROP TABLE observatoire');
+        $this->addSql('DROP TABLE observatoires_partenaires_scientifiques');
+        $this->addSql('DROP TABLE observatoires_partenaires_institutionnels');
+        $this->addSql('DROP TABLE doi');
+        $this->addSql('DROP TABLE partenaire');
+        $this->addSql('DROP TABLE siteexperimental');
+        $this->addSql('DROP TABLE station');
+        $this->addSql('DROP TABLE stations_sites');
+        $this->addSql('DROP TABLE chronique');
+        $this->addSql('DROP TABLE echantillonnageSortieLicite_chronique');
+        $this->addSql('DROP TABLE optionechantillonnageSortie_chronique');
+        $this->addSql('DROP TABLE tauxremplissage');
+        $this->addSql('DROP TABLE commune');
+        $this->addSql('DROP TABLE typeparametre');
+        $this->addSql('DROP TABLE parametres_unites');
+        $this->addSql('DROP TABLE unite');
+        $this->addSql('DROP TABLE mesure');
+        $this->addSql('DROP TABLE pointjaugeage');
+        $this->addSql('DROP TABLE pointcontrole');
+        $this->addSql('DROP TABLE echantillonnage');
+        $this->addSql('DROP TABLE transformation');
+        $this->addSql('DROP TABLE bareme');
+        $this->addSql('DROP TABLE baremejeubareme');
+        $this->addSql('DROP TABLE jeubareme');
+        $this->addSql('DROP TABLE plage');
+        $this->addSql('DROP TABLE qualite');
+        $this->addSql('DROP TABLE jeuqualite');
+        $this->addSql('DROP TABLE qualitejeuqualite');
+        $this->addSql('DROP TABLE bassin');
+        $this->addSql('DROP TABLE courseau');
+        $this->addSql('DROP TABLE courseau_observatoires');
+        $this->addSql('DROP TABLE pasechantillonnage');
+        $this->addSql('DROP TABLE optionechantillonnageSortie');
+        $this->addSql('DROP TABLE role');
+        $this->addSql('DROP TABLE utilisateur');
+        $this->addSql('DROP TABLE besoin');
+        $this->addSql('DROP TABLE besoins_parametres');
+        $this->addSql('DROP TABLE besoins_stations');
+        $this->addSql('DROP TABLE categorie');
+        $this->addSql('DROP TABLE typetravaux');
+        $this->addSql('DROP TABLE objectifrecherche');
+        $this->addSql('DROP TABLE historique');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20161214093208.php b/app/DoctrineMigrations/Version20161214093208.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7427038dbf4b382745e041966d263a376ecedc3
--- /dev/null
+++ b/app/DoctrineMigrations/Version20161214093208.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20161214093208 extends AbstractScriptMigration
+{
+    private static $scripts = [
+        'chronique_calcul_dates_mesures.sql',
+        'compute_chronique.sql',
+        'copyFromCsv.sql',
+        'insert_mesures_one_transformation.sql',
+        'insert_mesures_two_transformations.sql',
+        'interp_between_dates.sql',
+        'interp_for_bareme.sql',
+        'purge_mesures_child_chronique.sql',
+        'transformed_mesures.sql',
+        'trunc_timestamp_function_create.sql',
+        'bdoh_subsampled_instantaneous.sql',
+        'bdoh_subsampled_mean.sql',
+        'bdoh_cross_quality_orders.sql',
+        'bdoh_integrate_instant_interval.sql',
+        'bdoh_integrate_mean_interval.sql',
+        'bdoh_interp_cumul_to_cumul.sql',
+        'bdoh_interp_instant_to_instant.sql',
+        'bdoh_interp_instant_to_mean_or_cumul.sql',
+        'bdoh_interp_to_mean_or_cumul.sql',
+        'bdoh_jeu_qualite_id.sql',
+        'bdoh_select_values_for_time_step.sql',
+        'bdoh_interp_to_cumulative.sql',
+    ];
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        foreach (self::$scripts as $script) {
+            $this->addStatements($this->readFile($script));
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        foreach (self::$scripts as $script) {
+            $this->removeFunctions($this->readFile($script));
+        }
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170214134116.php b/app/DoctrineMigrations/Version20170214134116.php
new file mode 100644
index 0000000000000000000000000000000000000000..904bc4b3ac521c19aab2e874fcf41191b64bd29e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170214134116.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170214134116 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('CREATE SEQUENCE jms_jobs_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE jms_cron_jobs_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE jms_jobs (id BIGINT NOT NULL, state VARCHAR(15) NOT NULL, queue VARCHAR(50) NOT NULL, priority SMALLINT NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, startedAt TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, checkedAt TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, workerName VARCHAR(50) DEFAULT NULL, executeAfter TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, closedAt TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, command VARCHAR(255) NOT NULL, args JSON NOT NULL, output TEXT DEFAULT NULL, errorOutput TEXT DEFAULT NULL, exitCode SMALLINT DEFAULT NULL, maxRuntime SMALLINT NOT NULL, maxRetries SMALLINT NOT NULL, stackTrace BYTEA DEFAULT NULL, runtime SMALLINT DEFAULT NULL, memoryUsage INT DEFAULT NULL, memoryUsageReal INT DEFAULT NULL, originalJob_id BIGINT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_704ADB9349C447F1 ON jms_jobs (originalJob_id)');
+        $this->addSql('CREATE INDEX cmd_search_index ON jms_jobs (command)');
+        $this->addSql('CREATE INDEX sorting_index ON jms_jobs (state, priority, id)');
+        $this->addSql('COMMENT ON COLUMN jms_jobs.stackTrace IS \'(DC2Type:jms_job_safe_object)\'');
+        $this->addSql('CREATE TABLE jms_job_dependencies (source_job_id BIGINT NOT NULL, dest_job_id BIGINT NOT NULL, PRIMARY KEY(source_job_id, dest_job_id))');
+        $this->addSql('CREATE INDEX IDX_8DCFE92CBD1F6B4F ON jms_job_dependencies (source_job_id)');
+        $this->addSql('CREATE INDEX IDX_8DCFE92C32CF8D4C ON jms_job_dependencies (dest_job_id)');
+        $this->addSql('CREATE TABLE jms_cron_jobs (id INT NOT NULL, command VARCHAR(200) NOT NULL, lastRunAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_55F5ED428ECAEAD4 ON jms_cron_jobs (command)');
+        $this->addSql('CREATE TABLE jms_job_related_entities (job_id BIGINT NOT NULL, related_class VARCHAR(150) NOT NULL, related_id VARCHAR(100) NOT NULL, PRIMARY KEY(job_id, related_class, related_id))');
+        $this->addSql('CREATE INDEX IDX_E956F4E2BE04EA9 ON jms_job_related_entities (job_id)');
+        $this->addSql('CREATE TABLE jms_job_statistics (job_id BIGINT NOT NULL, characteristic VARCHAR(30) NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, charValue DOUBLE PRECISION NOT NULL, PRIMARY KEY(job_id, characteristic, createdAt))');
+        $this->addSql('ALTER TABLE jms_jobs ADD CONSTRAINT FK_704ADB9349C447F1 FOREIGN KEY (originalJob_id) REFERENCES jms_jobs (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE jms_job_dependencies ADD CONSTRAINT FK_8DCFE92CBD1F6B4F FOREIGN KEY (source_job_id) REFERENCES jms_jobs (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE jms_job_dependencies ADD CONSTRAINT FK_8DCFE92C32CF8D4C FOREIGN KEY (dest_job_id) REFERENCES jms_jobs (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE jms_job_related_entities ADD CONSTRAINT FK_E956F4E2BE04EA9 FOREIGN KEY (job_id) REFERENCES jms_jobs (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE jms_jobs DROP CONSTRAINT FK_704ADB9349C447F1');
+        $this->addSql('ALTER TABLE jms_job_dependencies DROP CONSTRAINT FK_8DCFE92CBD1F6B4F');
+        $this->addSql('ALTER TABLE jms_job_dependencies DROP CONSTRAINT FK_8DCFE92C32CF8D4C');
+        $this->addSql('ALTER TABLE jms_job_related_entities DROP CONSTRAINT FK_E956F4E2BE04EA9');
+        $this->addSql('DROP SEQUENCE jms_jobs_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE jms_cron_jobs_id_seq CASCADE');
+        $this->addSql('DROP TABLE jms_jobs');
+        $this->addSql('DROP TABLE jms_job_dependencies');
+        $this->addSql('DROP TABLE jms_cron_jobs');
+        $this->addSql('DROP TABLE jms_job_related_entities');
+        $this->addSql('DROP TABLE jms_job_statistics');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170412120527.php b/app/DoctrineMigrations/Version20170412120527.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc872a2318110c58bed8731aaf341cf09bf69fd5
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170412120527.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170412120527 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+            CREATE TABLE interp_qualite (
+                input1_id INTEGER NOT NULL REFERENCES qualite(id),
+                input2_id INTEGER NOT NULL REFERENCES qualite(id),
+                output_id INTEGER NOT NULL REFERENCES qualite(id),
+                PRIMARY KEY (input1_id, input2_id)
+            )
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            WITH ordered_qualite AS (
+                SELECT
+                    DISTINCT jeu_id,
+                    id,
+                    ordre
+                FROM qualite
+                WHERE ordre IS NOT NULL
+                AND code != 'gap'
+            )
+            INSERT INTO interp_qualite
+                SELECT
+                    i1.id,
+                    i2.id,
+                    o.id
+                FROM
+                    ordered_qualite i1
+                    JOIN ordered_qualite i2
+                        ON (i1.jeu_id = i2.jeu_id)
+                    JOIN ordered_qualite o
+                        ON (i1.jeu_id = o.jeu_id AND o.ordre = bdoh_cross_quality_orders(i1.ordre, i2.ordre))
+                ORDER by i1.ordre, i2.ordre;
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP TABLE interp_qualite');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170412121937.php b/app/DoctrineMigrations/Version20170412121937.php
new file mode 100644
index 0000000000000000000000000000000000000000..9235fa01aac3ab2936c8d7c8032690516855590e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170412121937.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170412121937 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+            CREATE FUNCTION bdoh_segments(
+                chronique_id mesure.chronique_id%TYPE,
+                start_date mesure.date%TYPE,
+                end_date mesure.date%TYPE
+            )
+            RETURNS TABLE(
+                start_date mesure.date%TYPE,
+                end_date mesure.date%TYPE,
+                start_valeur mesure.valeur%TYPE,
+                end_valeur mesure.valeur%TYPE,
+                start_qualite_id mesure.qualite_id%TYPE,
+                end_qualite_id mesure.qualite_id%TYPE
+            )
+            STABLE
+            LANGUAGE 'sql'
+            AS $$
+                 SELECT
+                        lag(date) OVER w,
+                        m.date,
+                        lag(valeur) OVER w,
+                        m.valeur,
+                        lag(qualite_id) OVER w,
+                        m.qualite_id
+                    FROM mesure m
+                    WHERE m.chronique_id = $1 AND m.date BETWEEN $2 AND $3
+                    WINDOW w AS (
+                        PARTITION BY chronique_id
+                        ORDER BY date ASC
+                        ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
+                    )
+            $$
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            CREATE FUNCTION bdoh_interpolate_linear(
+                start_date mesure.date%TYPE,
+                start_valeur mesure.valeur%TYPE,
+                end_date mesure.date%TYPE,
+                end_valeur mesure.valeur%TYPE,
+                date mesure.date%TYPE
+            )
+            RETURNS mesure.valeur%TYPE
+            IMMUTABLE
+            LANGUAGE 'sql'
+            AS $$
+                 SELECT $2 + ($4 - $2) * EXTRACT(EPOCH FROM ($5 - $1)) / EXTRACT(EPOCH FROM ($3 - $1));
+            $$
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP FUNCTION bdoh_interpolate_linear(
+            start_date mesure.date%TYPE,
+            start_valeur mesure.valeur%TYPE,
+            end_date mesure.date%TYPE,
+            end_valeur mesure.valeur%TYPE,
+            date mesure.date%TYPE
+        )');
+
+        $this->addSql('DROP FUNCTION bdoh_segments(
+            chronique_id mesure.chronique_id%TYPE,
+            start_date mesure.date%TYPE,
+            end_date mesure.date%TYPE
+        )');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170413114329.php b/app/DoctrineMigrations/Version20170413114329.php
new file mode 100644
index 0000000000000000000000000000000000000000..210a1f3ae9f412615ea46b5b76a5c751ad6d4c82
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170413114329.php
@@ -0,0 +1,227 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170413114329 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+            CREATE OR REPLACE FUNCTION bdoh_chronique_qualite_id(
+                chronique_id chronique.id%TYPE,
+                qualite_ordre qualite.ordre%TYPE
+            )
+            RETURNS qualite.id%TYPE
+            STABLE
+            LANGUAGE 'sql'
+            AS $$
+                SELECT q.id
+                FROM chronique c
+                    INNER JOIN station s ON (c.station_id = s.id)
+                    INNER JOIN stations_sites sts ON (s.id = sts.station_id)
+                    INNER JOIN siteexperimental se ON (sts.site_id = se.id)
+                    INNER JOIN observatoire o ON (se.observatoire_id = o.id)
+                    INNER JOIN qualite q ON (o.jeu_id = q.jeu_id)
+                WHERE q.ordre = $2
+                    AND q.code != 'gap'
+                    AND c.id = $1;
+            $$;
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            CREATE OR REPLACE FUNCTION bdoh_bounded_mesures(
+                chronique_id mesure.chronique_id%TYPE,
+                begin_date mesure.date%TYPE,
+                end_date mesure.date%TYPE
+            )
+            RETURNS TABLE(
+                date mesure.date%TYPE,
+                valeur mesure.valeur%TYPE,
+                qualite_id mesure.qualite_id%TYPE
+            )
+            STABLE
+            ROWS 6000
+            LANGUAGE 'plpgsql'
+            AS $$
+                DECLARE
+                    c_id ALIAS FOR chronique_id;
+                    lower_date mesure.date%TYPE;
+                    upper_date mesure.date%TYPE;
+                    gap_id     CONSTANT mesure.qualite_id%TYPE := bdoh_chronique_qualite_id(chronique_id, 100);
+                BEGIN
+                    SELECT MAX(m.date) INTO lower_date FROM mesure m WHERE m.chronique_id = c_id AND m.date <= begin_date;
+                    SELECT MIN(m.date) INTO upper_date FROM mesure m WHERE m.chronique_id = c_id AND m.date >= end_date;
+
+                    IF lower_date IS NULL THEN
+                        RETURN QUERY SELECT TIMESTAMP '-infinity', NULL::DOUBLE PRECISION, gap_id;
+                        lower_date := begin_date;
+                    END IF;
+
+                    IF upper_date IS NULL THEN
+                        RETURN QUERY SELECT TIMESTAMP 'infinity', NULL::DOUBLE PRECISION, gap_id;
+                        lower_date := end_date;
+                    END IF;
+
+                    RETURN QUERY
+                        SELECT m.date, m.valeur, COALESCE(m.qualite_id, gap_id)
+                          FROM mesure m
+                         WHERE m.chronique_id = c_id
+                           AND m.date BETWEEN lower_date AND upper_date;
+                END;
+            $$;
+SQL
+        );
+
+        $this->addSql(
+            'DROP FUNCTION bdoh_segments(mesure.chronique_id%TYPE, mesure.date%TYPE, mesure.date%TYPE)'
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            CREATE FUNCTION bdoh_segments(
+                chronique_id mesure.chronique_id%TYPE,
+                start_date mesure.date%TYPE,
+                end_date mesure.date%TYPE
+            )
+            RETURNS TABLE(
+                start_date mesure.date%TYPE,
+                end_date mesure.date%TYPE,
+                start_valeur mesure.valeur%TYPE,
+                end_valeur mesure.valeur%TYPE,
+                start_qualite_id mesure.qualite_id%TYPE,
+                end_qualite_id mesure.qualite_id%TYPE
+            )
+            STABLE
+            LANGUAGE 'sql'
+            AS $$
+                SELECT * FROM (
+                    SELECT LAG(date, 1, TIMESTAMP '-infinity') OVER w,
+                           date,
+                           LAG(valeur) OVER w,
+                           valeur,
+                           LAG(qualite_id, 1, bdoh_chronique_qualite_id(chronique_id , 100)) OVER w,
+                           COALESCE(qualite_id, bdoh_chronique_qualite_id(chronique_id , 100))
+                      FROM bdoh_bounded_mesures(chronique_id, start_date, end_date)
+                    WINDOW w AS (
+                        ORDER BY date ASC
+                        ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
+                    )
+                ) m
+                OFFSET 1
+            $$;
+SQL
+        );
+
+        $this->addSql(
+            'DROP FUNCTION bdoh_interpolate_linear(start_date mesure.date%TYPE, start_valeur mesure.valeur%TYPE, ' .
+            'end_date mesure.date%TYPE, end_valeur mesure.valeur%TYPE, date mesure.date%TYPE);'
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            CREATE FUNCTION bdoh_interpolate_linear(
+                start_date mesure.date%TYPE,
+                start_valeur mesure.valeur%TYPE,
+                end_date mesure.date%TYPE,
+                end_valeur mesure.valeur%TYPE,
+                date mesure.date%TYPE
+            )
+            RETURNS mesure.valeur%TYPE
+            IMMUTABLE
+            LANGUAGE 'sql'
+            AS $$
+                 SELECT CASE
+                            WHEN $5 = $1 THEN
+                                $2
+                            WHEN $5 = $3 THEN
+                                $4
+                            WHEN ISFINITE($1) AND ISFINITE($3) AND ISFINITE($5) THEN
+                                $2 + ($4 - $2) * EXTRACT(EPOCH FROM ($5 - $1)) / EXTRACT(EPOCH FROM ($3 - $1))
+                            ELSE
+                                NULL
+                        END;
+
+            $$
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+            DROP FUNCTION bdoh_chronique_qualite_id(
+                chronique_id chronique.id%TYPE,
+                qualite_ordre qualite.ordre%TYPE
+            );
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            DROP FUNCTION bdoh_bounded_mesures(
+                chronique_id mesure.chronique_id%TYPE,
+                begin_date mesure.date%TYPE,
+                end_date mesure.date%TYPE
+            );
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            DROP FUNCTION bdoh_segments(
+                chronique_id mesure.chronique_id%TYPE,
+                begin_date mesure.date%TYPE,
+                end_date mesure.date%TYPE
+            );
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+            DROP FUNCTION bdoh_interpolate_linear(
+                start_date mesure.date%TYPE,
+                start_valeur mesure.valeur%TYPE,
+                end_date mesure.date%TYPE,
+                end_valeur mesure.valeur%TYPE,
+                date mesure.date%TYPE
+            );
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170719143257.php b/app/DoctrineMigrations/Version20170719143257.php
new file mode 100644
index 0000000000000000000000000000000000000000..137edf3304f87c24700e793bc1219cdf7c92707e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170719143257.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170719143257 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_filling_rates(
+    chro_id chronique.id%TYPE,
+    startDate TIMESTAMP(3) DEFAULT '-infinity',
+    endDate TIMESTAMP(3) DEFAULT 'infinity'
+)
+RETURNS INTEGER
+VOLATILE STRICT
+LANGUAGE 'plpgsql'
+AS $$
+DECLARE
+    discontinue BOOLEAN;
+    mesCount INTEGER;
+    firstDate TIMESTAMP(3);
+    lastDate TIMESTAMP(3);
+    tauxCount INTEGER;
+BEGIN
+    -- Récupère des informations sur la chronique
+    SELECT
+            dtype = 'discontinue',
+            nbmesures,
+            datedebutmesures,
+            datefinmesures
+        INTO discontinue, mesCount, firstDate, lastDate
+        FROM chronique
+        WHERE id = chro_id;
+
+    -- Nous ne voulons pas de taux de remplissage pour les chroniques discontinues
+    IF discontinue OR mesCount = 0 THEN
+        DELETE FROM tauxremplissage WHERE chronique_id = chro_id;
+        RETURN 0;
+    END IF;
+
+    -- Limite la période de recalcul
+    IF firstDate > startDate THEN
+        startDate := firstDate;
+    END IF;
+    IF lastDate < endDate THEN
+        endDate := lastDate;
+    END IF;
+
+    RAISE INFO 'Chronicle #%: updating filling rate from % to %', chro_id, startDate, endDate;
+
+    -- Supprime les taux de remplissage en dehors des périodes de données, ou dans la période à recalculer.
+    DELETE FROM tauxremplissage
+        WHERE (NOT (debut, fin) OVERLAPS (firstDate, lastDate)
+                OR (debut, fin) OVERLAPS (startDate, endDate))
+        AND chronique_id = chro_id;
+
+    -- Recalcule les taux de remplissages inclus la période demandée
+    INSERT INTO tauxremplissage(id, chronique_id, debut, fin, poids, taux) (
+        WITH
+            mesures(qualite_id, debut, fin) AS (
+                SELECT
+                    m.qualite_id,
+                    m.date,
+                    LEAD(m.date, 1, endDate) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
+                FROM mesure m
+                WHERE m.chronique_id = chro_id
+            ),
+            valides(debut, fin) AS (
+                SELECT
+                    debut,
+                    fin
+                FROM mesures
+                WHERE qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100)
+            ),
+            mois(debut, fin, duration) AS (
+                SELECT
+                    t,
+                    t + '1 month',
+                    EXTRACT('epoch' FROM ((t + '1 month') - t))
+                FROM generate_series(DATE_TRUNC('month', startDate), endDate, '1 month') t
+                WHERE t < endDate
+            )
+        SELECT
+            nextval('tauxremplissage_id_seq'),
+            chro_id,
+            m.debut,
+            m.fin,
+            m.duration,
+            SUM(EXTRACT('epoch' FROM (
+                    CASE WHEN v.fin < m.fin THEN v.fin ELSE m.fin END
+                    -
+                    CASE WHEN v.debut > m.debut THEN v.debut ELSE m.debut END
+            ))) / m.duration
+        FROM
+            mois m
+            LEFT JOIN valides v ON ((m.debut, m.fin) OVERLAPS (v.debut, v.fin))
+        GROUP BY m.debut, m.fin, m.duration
+    );
+
+    GET DIAGNOSTICS tauxCount := ROW_COUNT;
+    RAISE INFO 'Chronicle #%: % filling rate record(s) created', chro_id, tauxCount;
+
+    RETURN tauxCount;
+END;
+$$
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_measures_metadata(
+    chro_id chronique.id%TYPE,
+    OUT firstDate TIMESTAMP(3),
+    OUT lastDate TIMESTAMP(3),
+    OUT mesCount INTEGER
+)
+VOLATILE STRICT
+LANGUAGE 'plpgsql'
+AS $$
+DECLARE
+    discontinue BOOLEAN;
+BEGIN
+    -- Détermine le type de chronique
+    SELECT
+        dtype = 'discontinue'
+        INTO discontinue
+        FROM chronique
+        WHERE id = chro_id;
+
+    -- Récupère les bornes
+    IF discontinue THEN
+        SELECT
+            MIN(debut), MAX(fin), COUNT(debut)
+            INTO firstDate, lastDate, mesCount
+            FROM plage
+            WHERE chronique_id = chro_id;
+    ELSE
+        SELECT
+            MIN(date), MAX(date), COUNT(date)
+            INTO firstDate, lastDate, mesCount
+            FROM mesure
+            WHERE chronique_id = chro_id;
+    END IF;
+
+    -- Met à jour les métadonnées dans chronique
+    UPDATE chronique
+        SET nbmesures = mesCount, datedebutmesures = firstDate, datefinmesures = lastDate
+        WHERE id = chro_id;
+
+    RAISE INFO 'Chronicle #%: % measures from % to %', chro_id, mesCount, firstDate, lastDate;
+END;
+$$
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql(
+            'DROP FUNCTION bdoh_update_measures_metadata(chronique.id%TYPE)'
+        );
+        $this->addSql(
+            'DROP FUNCTION bdoh_update_filling_rates(chronique.id%TYPE, TIMESTAMP(3), TIMESTAMP(3))'
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170811083748.php b/app/DoctrineMigrations/Version20170811083748.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e6397036a0cdc3faf39aa1ffa9eabcb720c99d6
--- /dev/null
+++ b/app/DoctrineMigrations/Version20170811083748.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20170811083748 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE utilisateur ADD roleAdmin VARCHAR(255) DEFAULT NULL');
+
+        $this->addSql(
+            "UPDATE utilisateur u
+                SET roleAdmin = 'FCT'
+                FROM role r
+                WHERE u.id = r.utilisateur_id
+                AND r.valeur = 'gestionnaire'
+                AND r.dtype = 'observatoire'
+                AND r.observatoire_id IS NULL"
+        );
+
+        $this->addSql(
+            "DELETE FROM role
+                WHERE valeur = 'gestionnaire'
+                AND dtype = 'observatoire'
+                AND observatoire_id IS NULL"
+        );
+
+        $this->addSql('DELETE FROM role WHERE valeur IS null');
+
+        $this->addSql('ALTER TABLE role ALTER utilisateur_id SET NOT NULL');
+        $this->addSql('ALTER TABLE role ALTER valeur SET NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE Role ALTER utilisateur_id DROP NOT NULL');
+        $this->addSql('ALTER TABLE Role ALTER valeur DROP NOT NULL');
+
+        $this->addSql(
+            "INSERT INTO role(id, utilisateur_id, valeur, dtype)
+                SELECT nextval('role_id_seq'), id, 'gestionnaire, 'observatoire'
+                FROM utilisateur
+                WHERE roleAdmin = 'FCT'"
+        );
+
+        $this->addSql('ALTER TABLE Utilisateur DROP roleAdmin');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20171013115613.php b/app/DoctrineMigrations/Version20171013115613.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad5a12806b5b08db40d89812255212cb716917bd
--- /dev/null
+++ b/app/DoctrineMigrations/Version20171013115613.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20171013115613 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('SELECT bdoh_update_measures_metadata(id) FROM chronique');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // NOOP
+    }
+}
diff --git a/app/DoctrineMigrations/Version20171114114139.php b/app/DoctrineMigrations/Version20171114114139.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2a14d0153d39e74d20ec2f01caa915b7ce2e403
--- /dev/null
+++ b/app/DoctrineMigrations/Version20171114114139.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20171114114139 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE transformation ADD sortie_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE transformation ADD CONSTRAINT FK_3FD6625DCC72D953 FOREIGN KEY (sortie_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_3FD6625DCC72D953 ON transformation (sortie_id)');
+        $this->addSql('UPDATE transformation t SET sortie_id = c.id FROM chronique c WHERE t.id IN (c.premiereentree_id, c.secondeentree_id)');
+        $this->addSql(
+            'DELETE FROM transformation t WHERE NOT EXISTS ' .
+            '(SELECT * FROM chronique c WHERE t.id = c.premiereentree_id OR t.id = c.secondeentree_id)'
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE Transformation DROP CONSTRAINT FK_3FD6625DCC72D953');
+        $this->addSql('DROP INDEX IDX_3FD6625DCC72D953');
+        $this->addSql('ALTER TABLE Transformation DROP sortie_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20171121124726.php b/app/DoctrineMigrations/Version20171121124726.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5741efed61dc98b38125238f78262fe3ff73e12
--- /dev/null
+++ b/app/DoctrineMigrations/Version20171121124726.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20171121124726 extends AbstractScriptMigration
+{
+    const SCRIPT = 'copyFromCsv.sql';
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->removeFunctions($this->readFile(self::SCRIPT));
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addStatements($this->readFile(self::SCRIPT));
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180502170600.php b/app/DoctrineMigrations/Version20180502170600.php
new file mode 100644
index 0000000000000000000000000000000000000000..53ef4400923c3e56d297a7d515afa7b6f22dea76
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180502170600.php
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ */
+class Version20180502170600 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_filling_rates(
+    chro_id chronique.id%TYPE,
+    startDate TIMESTAMP(3) DEFAULT '-infinity',
+    endDate TIMESTAMP(3) DEFAULT 'infinity'
+)
+RETURNS INTEGER
+VOLATILE STRICT
+LANGUAGE 'plpgsql'
+AS $$
+DECLARE
+    discontinue BOOLEAN;
+    mesCount INTEGER;
+    firstDate TIMESTAMP(3);
+    lastDate TIMESTAMP(3);
+    tauxCount INTEGER;
+BEGIN
+    -- Récupère des informations sur la chronique
+    SELECT
+            dtype = 'discontinue',
+            nbmesures,
+            datedebutmesures,
+            datefinmesures
+        INTO discontinue, mesCount, firstDate, lastDate
+        FROM chronique
+        WHERE id = chro_id;
+
+    -- Nous ne voulons pas de taux de remplissage pour les chroniques discontinues
+    IF discontinue OR mesCount = 0 THEN
+        DELETE FROM tauxremplissage WHERE chronique_id = chro_id;
+        RETURN 0;
+    END IF;
+
+    -- Supprime les taux qui ne correspondent à aucune mesure.
+    DELETE FROM tauxremplissage WHERE chronique_id = chro_id AND (fin < firstDate OR debut > lastDate);
+
+    IF startDate > '-infinity'::TIMESTAMP(3) THEN
+        -- Calcule à partir de la mesure non-lacunaire précédente
+        SELECT MAX(date)
+            INTO firstDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date <= startDate;
+        IF firstDate < startDate THEN
+            startDate = firstDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas avant le début de la chronique
+        IF firstDate > startDate THEN
+            startDate = firstDate;
+        END IF;
+    END IF;
+
+    IF endDate < 'infinity'::TIMESTAMP(3) THEN
+        -- Calcule jusqu'à la mesure non-lacunaire suivante
+        SELECT MIN(date)
+            INTO lastDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date >= endDate;
+        IF lastDate > endDate THEN
+            endDate = lastDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas après la fin de la chronique
+        IF lastDate < endDate THEN
+            endDate = lastDate;
+        END IF;
+    END IF;
+
+    RAISE INFO 'Chronicle #%: updating filling rate from % to %', chro_id, startDate, endDate;
+
+    -- Recalcule les taux de remplissages inclus la période demandée
+    INSERT INTO tauxremplissage(id, chronique_id, debut, fin, poids, taux) (
+        WITH
+            mesures(qualite_id, debut, fin) AS (
+                SELECT
+                    m.qualite_id,
+                    m.date,
+                    LEAD(m.date, 1, endDate) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
+                FROM mesure m
+                WHERE m.chronique_id = chro_id
+            ),
+            valides(debut, fin) AS (
+                SELECT
+                    debut,
+                    fin
+                FROM mesures
+                WHERE qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            ),
+            mois(debut, fin, duration) AS (
+                SELECT
+                    t,
+                    t + '1 month',
+                    EXTRACT('epoch' FROM ((t + '1 month') - t))
+                FROM generate_series(DATE_TRUNC('month', startDate), endDate, '1 month') t
+                WHERE t < endDate
+            )
+        SELECT
+            nextval('tauxremplissage_id_seq'),
+            chro_id,
+            m.debut,
+            m.fin,
+            m.duration,
+            SUM(
+                CASE WHEN v.debut IS NOT NULL AND v.fin IS NOT NULL THEN
+                    EXTRACT('epoch' FROM (
+                        CASE WHEN v.fin < m.fin THEN v.fin ELSE m.fin END
+                        -
+                        CASE WHEN v.debut > m.debut THEN v.debut ELSE m.debut END
+                    ))
+                ELSE
+                    0
+                END
+            ) / m.duration
+        FROM
+            mois m
+            LEFT JOIN valides v ON ((m.debut, m.fin) OVERLAPS (v.debut, v.fin))
+        GROUP BY m.debut, m.fin, m.duration
+    );
+
+    GET DIAGNOSTICS tauxCount := ROW_COUNT;
+    RAISE INFO 'Chronicle #%: % filling rate record(s) created', chro_id, tauxCount;
+
+    RETURN tauxCount;
+END;
+$$
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180503114954.php b/app/DoctrineMigrations/Version20180503114954.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae454fb957846c062d6483d00542a9b9d1dbd031
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180503114954.php
@@ -0,0 +1,184 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180503114954 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('TRUNCATE TABLE tauxremplissage');
+
+        $this->addSql('CREATE UNIQUE INDEX unique_chro_date ON tauxremplissage (chronique_id, debut);');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_filling_rates(
+    chro_id chronique.id%TYPE,
+    startDate TIMESTAMP(3) DEFAULT '-infinity',
+    endDate TIMESTAMP(3) DEFAULT 'infinity'
+)
+RETURNS INTEGER
+VOLATILE STRICT
+LANGUAGE 'plpgsql'
+AS $$
+DECLARE
+    discontinue BOOLEAN;
+    mesCount INTEGER;
+    firstDate TIMESTAMP(3);
+    lastDate TIMESTAMP(3);
+    tauxCount INTEGER;
+BEGIN
+    -- Récupère des informations sur la chronique
+    SELECT
+            dtype = 'discontinue',
+            nbmesures,
+            datedebutmesures,
+            datefinmesures
+        INTO discontinue, mesCount, firstDate, lastDate
+        FROM chronique
+        WHERE id = chro_id;
+
+    -- Nous ne voulons pas de taux de remplissage pour les chroniques discontinues
+    IF discontinue OR mesCount = 0 THEN
+        DELETE FROM tauxremplissage WHERE chronique_id = chro_id;
+        RETURN 0;
+    END IF;
+
+    -- Supprime les taux qui ne correspondent à aucune mesure.
+    DELETE FROM tauxremplissage WHERE chronique_id = chro_id AND (fin < firstDate OR debut > lastDate);
+
+    IF startDate > '-infinity'::TIMESTAMP(3) THEN
+        -- Calcule à partir de la mesure non-lacunaire précédente
+        SELECT MAX(date)
+            INTO firstDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date <= startDate;
+        IF firstDate < startDate THEN
+            startDate = firstDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas avant le début de la chronique
+        IF firstDate > startDate THEN
+            startDate = firstDate;
+        END IF;
+    END IF;
+
+    IF endDate < 'infinity'::TIMESTAMP(3) THEN
+        -- Calcule jusqu'à la mesure non-lacunaire suivante
+        SELECT MIN(date)
+            INTO lastDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date >= endDate;
+        IF lastDate > endDate THEN
+            endDate = lastDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas après la fin de la chronique
+        IF lastDate < endDate THEN
+            endDate = lastDate;
+        END IF;
+    END IF;
+
+    RAISE INFO 'Chronicle #%: updating filling rate from % to %', chro_id, startDate, endDate;
+
+    -- Recalcule les taux de remplissages inclus la période demandée
+    INSERT INTO tauxremplissage(id, chronique_id, debut, fin, poids, taux) (
+        WITH
+            mesures(qualite_id, debut, fin) AS (
+                SELECT
+                    m.qualite_id,
+                    m.date,
+                    LEAD(m.date, 1, endDate) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
+                FROM mesure m
+                WHERE m.chronique_id = chro_id
+            ),
+            valides(debut, fin) AS (
+                SELECT
+                    debut,
+                    fin
+                FROM mesures
+                WHERE qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            ),
+            mois(debut, fin, duration) AS (
+                SELECT
+                    t,
+                    t + '1 month',
+                    EXTRACT('epoch' FROM ((t + '1 month') - t))
+                FROM generate_series(DATE_TRUNC('month', startDate), endDate, '1 month') t
+                WHERE t < endDate
+            )
+        SELECT
+            nextval('tauxremplissage_id_seq'),
+            chro_id,
+            m.debut,
+            m.fin,
+            m.duration,
+            SUM(
+                CASE WHEN v.debut IS NOT NULL AND v.fin IS NOT NULL THEN
+                    EXTRACT('epoch' FROM (
+                        CASE WHEN v.fin < m.fin THEN v.fin ELSE m.fin END
+                        -
+                        CASE WHEN v.debut > m.debut THEN v.debut ELSE m.debut END
+                    ))
+                ELSE
+                    0
+                END
+            ) / m.duration
+        FROM
+            mois m
+            LEFT JOIN valides v ON ((m.debut, m.fin) OVERLAPS (v.debut, v.fin))
+        GROUP BY m.debut, m.fin, m.duration
+    )
+        ON CONFLICT (chronique_id, debut)
+            DO UPDATE SET fin = EXCLUDED.fin, poids = EXCLUDED.poids, taux = EXCLUDED.taux;
+
+    GET DIAGNOSTICS tauxCount := ROW_COUNT;
+    RAISE INFO 'Chronicle #%: % filling rate record(s) created', chro_id, tauxCount;
+
+    RETURN tauxCount;
+END;
+$$
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP INDEX unique_chro_date');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180628063613.php b/app/DoctrineMigrations/Version20180628063613.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ad45447768219424080a3d4ad6694cf8c9ca540
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180628063613.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180628063613 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ALTER date TYPE TIMESTAMP(0) WITH TIME ZONE');
+        $this->addSql('ALTER TABLE historique ALTER date DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique ALTER date TYPE DATE');
+        $this->addSql('ALTER TABLE Historique ALTER date DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180628113617.php b/app/DoctrineMigrations/Version20180628113617.php
new file mode 100644
index 0000000000000000000000000000000000000000..49f833036c5f73e34ca22b4ab44fca05f8799481
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180628113617.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180628113617 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE transformation DROP CONSTRAINT FK_3FD6625DAF7BD910');
+        $this->addSql('ALTER TABLE transformation DROP CONSTRAINT FK_3FD6625DCC72D953');
+        $this->addSql('ALTER TABLE transformation ADD CONSTRAINT FK_3FD6625DAF7BD910 FOREIGN KEY (entree_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE transformation ADD CONSTRAINT FK_3FD6625DCC72D953 FOREIGN KEY (sortie_id) REFERENCES Chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Transformation DROP CONSTRAINT fk_3fd6625daf7bd910');
+        $this->addSql('ALTER TABLE Transformation DROP CONSTRAINT fk_3fd6625dcc72d953');
+        $this->addSql('ALTER TABLE Transformation ADD CONSTRAINT fk_3fd6625daf7bd910 FOREIGN KEY (entree_id) REFERENCES chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Transformation ADD CONSTRAINT fk_3fd6625dcc72d953 FOREIGN KEY (sortie_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180628130734.php b/app/DoctrineMigrations/Version20180628130734.php
new file mode 100644
index 0000000000000000000000000000000000000000..f72081f9182bfe5a60efe2464df211e33d3965ef
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180628130734.php
@@ -0,0 +1,324 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180628130734 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('TRUNCATE TABLE tauxremplissage RESTART IDENTITY;');
+        $this->addSql('ALTER SEQUENCE tauxremplissage_id_seq RESTART;');
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_filling_rates(
+    chro_id integer,
+    startdate timestamp without time zone DEFAULT '-infinity'::timestamp without time zone,
+    enddate timestamp without time zone DEFAULT 'infinity'::timestamp without time zone)
+  RETURNS integer AS
+$BODY$
+DECLARE
+	discontinue BOOLEAN;
+	mesCount INTEGER;
+	firstDate TIMESTAMP WITHOUT TIME ZONE;
+	lastDate TIMESTAMP WITHOUT TIME ZONE;
+	tauxCount INTEGER;
+BEGIN
+	-- Met à jour les metadata de la chronique
+	PERFORM bdoh_update_measures_metadata(chro_id);
+
+	-- Récupère des informations sur la chronique
+	SELECT
+		dtype = 'discontinue',
+		nbmesures,
+		datedebutmesures,
+		datefinmesures
+		INTO discontinue, mesCount, firstDate, lastDate
+	FROM chronique
+	WHERE id = chro_id;
+
+	-- Pas de taux de remplissage si la chronique est discontinue ou si il n'y a pas de mesures
+	IF discontinue OR mesCount = 0 THEN
+		-- Nettoyage des taux existants
+		DELETE FROM tauxremplissage WHERE chronique_id = chro_id;
+		RETURN 0;
+	END IF;
+
+	-- Supprime les taux qui ne correspondent à aucune mesure
+	DELETE FROM tauxremplissage WHERE chronique_id = chro_id AND (fin <= firstDate OR debut > lastDate);
+
+	IF startDate > '-infinity'::TIMESTAMP WITHOUT TIME ZONE THEN
+		-- Si startDate est spécifié
+		-- Calcule à partir de la dernière mesure non-lacunaire précédant startDate
+		-- Ou à défaut depuis startDate
+		SELECT COALESCE(MAX(date), startDate)
+			INTO startDate
+		FROM mesure
+		WHERE chronique_id = chro_id
+			AND qualite_id NOT IN (SELECT id FROM qualite WHERE type = 'gap')
+			AND date <= startDate;
+	END IF;
+
+	IF endDate < 'infinity'::TIMESTAMP WITHOUT TIME ZONE THEN
+		-- Si endDate est spécifié
+		-- Calcule jusqu'à la première mesure non-lacunaire suivant endDate
+		-- Ou à défaut jusqu'à endDate
+		SELECT COALESCE(MIN(date), endDate)
+			INTO endDate
+		FROM mesure
+		WHERE chronique_id = chro_id
+			AND qualite_id NOT IN (SELECT id FROM qualite WHERE type = 'gap')
+			AND date >= endDate;
+	END IF;
+
+	-- Et dans tous les cas, correction des paramètres aux limites de la chronique si besoin
+	SELECT GREATEST(firstDate, startDate) INTO startDate;
+	SELECT LEAST(lastDate, endDate) INTO endDate;
+
+	-- INFO
+	RAISE INFO 'Chronicle #%: updating filling rate from % to %', chro_id, firstDate, lastDate;
+
+	-- Recalcule les taux de remplissages
+	INSERT INTO tauxremplissage(id, chronique_id, debut, fin, taux, poids) (
+		WITH
+			mesures(debut, fin, qualite_debut, qualite_fin) AS (
+				SELECT
+					date,
+					last_value(date) over (order by date rows between current row and 1 following),
+					qualite_id,
+					last_value(qualite_id) over (order by date rows between current row and 1 following)
+				FROM mesure
+				WHERE chronique_id = chro_id
+			),
+			valides(debut, fin) AS (
+				SELECT
+					debut,
+					fin
+				FROM mesures
+				WHERE qualite_debut NOT IN (SELECT id FROM qualite WHERE type = 'gap')
+					AND qualite_fin NOT IN (SELECT id FROM qualite WHERE type = 'gap')
+			),
+			mois(debut, fin, duration) AS (
+				SELECT
+					t,
+					t + '1 month',
+					EXTRACT('epoch' FROM ((t + '1 month') - t))
+				FROM generate_series(DATE_TRUNC('month', startDate), endDate, '1 month') t
+			)
+		SELECT
+			nextval('tauxremplissage_id_seq'),
+			chro_id,
+			m.debut,
+			m.fin,
+			SUM(
+				CASE WHEN v.debut IS NULL OR v.fin IS NULL THEN
+					0
+				ELSE
+					EXTRACT('epoch' FROM (LEAST(v.fin, m.fin) - GREATEST(v.debut, m.debut)))
+				END
+			) / m.duration,
+			m.duration
+		FROM mois m LEFT JOIN valides v ON ((m.debut, m.fin) OVERLAPS (v.debut, v.fin))
+		GROUP BY m.debut, m.fin, m.duration
+	)
+	ON CONFLICT (chronique_id, debut) DO UPDATE SET fin = EXCLUDED.fin, taux = EXCLUDED.taux, poids = EXCLUDED.poids;
+
+	-- INFO
+	GET DIAGNOSTICS tauxCount := ROW_COUNT;
+	RAISE INFO 'Chronicle #%: % filling rate record(s) created', chro_id, tauxCount;
+
+	RETURN tauxCount;
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE STRICT
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_update_filling_rates(integer, timestamp without time zone, timestamp without time zone)
+  OWNER TO bdoh;
+SQL
+        );
+        // à faire à la main pour ne pas alourdir le déploiement
+        //$this->addSql('SELECT bdoh_update_filling_rates(id) FROM chronique;');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('TRUNCATE TABLE tauxremplissage RESTART IDENTITY;');
+        $this->addSql('ALTER SEQUENCE tauxremplissage_id_seq RESTART;');
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_update_filling_rates(
+    chro_id chronique.id%TYPE,
+    startDate TIMESTAMP(3) DEFAULT '-infinity',
+    endDate TIMESTAMP(3) DEFAULT 'infinity'
+)
+RETURNS INTEGER
+VOLATILE STRICT
+LANGUAGE 'plpgsql'
+AS $$
+DECLARE
+    discontinue BOOLEAN;
+    mesCount INTEGER;
+    firstDate TIMESTAMP(3);
+    lastDate TIMESTAMP(3);
+    tauxCount INTEGER;
+BEGIN
+    -- Récupère des informations sur la chronique
+    SELECT
+            dtype = 'discontinue',
+            nbmesures,
+            datedebutmesures,
+            datefinmesures
+        INTO discontinue, mesCount, firstDate, lastDate
+        FROM chronique
+        WHERE id = chro_id;
+
+    -- Nous ne voulons pas de taux de remplissage pour les chroniques discontinues
+    IF discontinue OR mesCount = 0 THEN
+        DELETE FROM tauxremplissage WHERE chronique_id = chro_id;
+        RETURN 0;
+    END IF;
+
+    -- Supprime les taux qui ne correspondent à aucune mesure.
+    DELETE FROM tauxremplissage WHERE chronique_id = chro_id AND (fin < firstDate OR debut > lastDate);
+
+    IF startDate > '-infinity'::TIMESTAMP(3) THEN
+        -- Calcule à partir de la mesure non-lacunaire précédente
+        SELECT MAX(date)
+            INTO firstDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date <= startDate;
+        IF firstDate < startDate THEN
+            startDate = firstDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas avant le début de la chronique
+        IF firstDate > startDate THEN
+            startDate = firstDate;
+        END IF;
+    END IF;
+
+    IF endDate < 'infinity'::TIMESTAMP(3) THEN
+        -- Calcule jusqu'à la mesure non-lacunaire suivante
+        SELECT MIN(date)
+            INTO lastDate
+            FROM mesure
+            WHERE chronique_id = chro_id
+            AND qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            AND date >= endDate;
+        IF lastDate > endDate THEN
+            endDate = lastDate;
+        END IF;
+    ELSE
+        -- Ne calcule pas après la fin de la chronique
+        IF lastDate < endDate THEN
+            endDate = lastDate;
+        END IF;
+    END IF;
+
+    RAISE INFO 'Chronicle #%: updating filling rate from % to %', chro_id, startDate, endDate;
+
+    -- Recalcule les taux de remplissages inclus la période demandée
+    INSERT INTO tauxremplissage(id, chronique_id, debut, fin, poids, taux) (
+        WITH
+            mesures(qualite_id, debut, fin) AS (
+                SELECT
+                    m.qualite_id,
+                    m.date,
+                    LEAD(m.date, 1, endDate) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
+                FROM mesure m
+                WHERE m.chronique_id = chro_id
+            ),
+            valides(debut, fin) AS (
+                SELECT
+                    debut,
+                    fin
+                FROM mesures
+                WHERE qualite_id NOT IN (SELECT id FROM qualite WHERE ordre = 100 OR code = 'gap')
+            ),
+            mois(debut, fin, duration) AS (
+                SELECT
+                    t,
+                    t + '1 month',
+                    EXTRACT('epoch' FROM ((t + '1 month') - t))
+                FROM generate_series(DATE_TRUNC('month', startDate), endDate, '1 month') t
+                WHERE t < endDate
+            )
+        SELECT
+            nextval('tauxremplissage_id_seq'),
+            chro_id,
+            m.debut,
+            m.fin,
+            m.duration,
+            SUM(
+                CASE WHEN v.debut IS NOT NULL AND v.fin IS NOT NULL THEN
+                    EXTRACT('epoch' FROM (
+                        CASE WHEN v.fin < m.fin THEN v.fin ELSE m.fin END
+                        -
+                        CASE WHEN v.debut > m.debut THEN v.debut ELSE m.debut END
+                    ))
+                ELSE
+                    0
+                END
+            ) / m.duration
+        FROM
+            mois m
+            LEFT JOIN valides v ON ((m.debut, m.fin) OVERLAPS (v.debut, v.fin))
+        GROUP BY m.debut, m.fin, m.duration
+    )
+        ON CONFLICT (chronique_id, debut)
+            DO UPDATE SET fin = EXCLUDED.fin, poids = EXCLUDED.poids, taux = EXCLUDED.taux;
+
+    GET DIAGNOSTICS tauxCount := ROW_COUNT;
+    RAISE INFO 'Chronicle #%: % filling rate record(s) created', chro_id, tauxCount;
+
+    RETURN tauxCount;
+END;
+$$
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_update_filling_rates(integer, timestamp without time zone, timestamp without time zone)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql('SELECT bdoh_update_measures_metadata(id) FROM chronique;');
+        $this->addSql('SELECT bdoh_update_filling_rates(id) FROM chronique;');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180704151338.php b/app/DoctrineMigrations/Version20180704151338.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5fbf4e730f42dc91773a50c24754bdb61d37f62
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180704151338.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180704151338 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE IF EXISTS periodevalidite DROP CONSTRAINT fk_e3e6450b5a438e76');
+        $this->addSql('ALTER TABLE IF EXISTS chroniques_pas DROP CONSTRAINT fk_bd0c31ffe38e1cf');
+        $this->addSql('DROP SEQUENCE IF EXISTS bdoh.lignecalcul_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE IF EXISTS bdoh.pastemps_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE IF EXISTS bdoh.periodevalidite_id_seq CASCADE');
+        $this->addSql('DROP TABLE IF EXISTS chroniques_pas');
+        $this->addSql('DROP TABLE IF EXISTS lignecalcul');
+        $this->addSql('DROP TABLE IF EXISTS pastemps');
+        $this->addSql('DROP TABLE IF EXISTS periodevalidite');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE bdoh.lignecalcul_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE bdoh.pastemps_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE bdoh.periodevalidite_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE chroniques_pas (chronique_id INT NOT NULL, pas_id INT NOT NULL, PRIMARY KEY(chronique_id, pas_id))');
+        $this->addSql('CREATE INDEX idx_bd0c31ffe38e1cf ON chroniques_pas (pas_id)');
+        $this->addSql('CREATE INDEX idx_bd0c31f93054d ON chroniques_pas (chronique_id)');
+        $this->addSql('CREATE TABLE lignecalcul (id INT NOT NULL, entree_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX idx_be7993e5af7bd910 ON lignecalcul (entree_id)');
+        $this->addSql('CREATE TABLE pastemps (id INT NOT NULL, nom VARCHAR(255) NOT NULL, nomen VARCHAR(255) NOT NULL, nombresecondes INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX uniq_f7247ba8e46e7608 ON pastemps (nomen)');
+        $this->addSql('CREATE UNIQUE INDEX uniq_f7247ba86c6e55b5 ON pastemps (nom)');
+        $this->addSql('CREATE TABLE periodevalidite (id INT NOT NULL, ligne_id INT DEFAULT NULL, bareme_id INT DEFAULT NULL, debut TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, fin TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX idx_e3e6450b5f49eaad ON periodevalidite (bareme_id)');
+        $this->addSql('CREATE INDEX idx_e3e6450b5a438e76 ON periodevalidite (ligne_id)');
+        $this->addSql('COMMENT ON COLUMN periodevalidite.debut IS \'(DC2Type:datetimems)\'');
+        $this->addSql('COMMENT ON COLUMN periodevalidite.fin IS \'(DC2Type:datetimems)\'');
+        $this->addSql('ALTER TABLE chroniques_pas ADD CONSTRAINT fk_bd0c31f93054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chroniques_pas ADD CONSTRAINT fk_bd0c31ffe38e1cf FOREIGN KEY (pas_id) REFERENCES pastemps (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE lignecalcul ADD CONSTRAINT fk_be7993e5af7bd910 FOREIGN KEY (entree_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE periodevalidite ADD CONSTRAINT fk_e3e6450b5a438e76 FOREIGN KEY (ligne_id) REFERENCES lignecalcul (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE periodevalidite ADD CONSTRAINT fk_e3e6450b5f49eaad FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180706094150.php b/app/DoctrineMigrations/Version20180706094150.php
new file mode 100644
index 0000000000000000000000000000000000000000..4248de6915295cd3c3c0768463119015e2c7f99e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180706094150.php
@@ -0,0 +1,575 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180706094150 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('UPDATE qualite SET ordre=250, type=NULL WHERE id=12;');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+    chroniquefilleid integer,
+    jeuqualiteid integer,
+    transfomainid integer,
+    transfosecondid integer,
+    delaymain double precision DEFAULT 0.0,
+    delaysecond double precision DEFAULT 0.0,
+    coefficient double precision DEFAULT 1.0)
+  RETURNS integer AS
+$BODY$
+
+DECLARE
+	cursorMain         CURSOR FOR SELECT date + delayMain * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date + delaySecond * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+BEGIN
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL OR dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond OR dateSecond IS NULL THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+
+		ELSIF dateSecond < dateMain OR dateMain IS NULL THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF ;
+
+                qualiteInsert := bdoh_cross_quality_orders(ROUND(valeurMainInsert[2])::INTEGER, ROUND(valeurSecondInsert[2])::INTEGER);
+		IF qualiteInsert <= 200 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		SELECT id INTO qualiteId
+                    FROM qualite
+                    WHERE ordre = ROUND(qualiteInsert)
+                    AND jeu_id = jeuQualiteId
+                    AND code <> 'gap';
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_between_dates(
+    dateinterp timestamp without time zone,
+    dateavant timestamp without time zone,
+    valeuravant double precision[],
+    dateapres timestamp without time zone,
+    valeurapres double precision[])
+  RETURNS double precision[] AS
+$BODY$ -- TODO voir type renvoyé par la fonction
+
+DECLARE
+
+	valeur        DOUBLE PRECISION;
+	qualite       DOUBLE PRECISION;
+	secondes      DOUBLE PRECISION;
+	secondesAvant DOUBLE PRECISION;
+	secondesApres DOUBLE PRECISION;
+
+BEGIN
+
+	IF dateAvant IS NULL OR dateApres IS NULL OR valeurAvant IS NULL OR valeurApres IS NULL THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	IF valeurAvant[2] <= 200 THEN
+		RETURN ARRAY[-9999, valeurAvant[2]];
+	END IF;
+
+	IF valeurApres[2] <= 200 THEN
+		RETURN valeurAvant;
+	END IF;
+
+	secondes := EXTRACT(EPOCH FROM dateInterp AT TIME ZONE 'UTC');
+	secondesAvant := EXTRACT(EPOCH FROM dateAvant AT TIME ZONE 'UTC');
+	secondesApres := EXTRACT(EPOCH FROM dateApres AT TIME ZONE 'UTC');
+	valeur := ((secondesApres - secondes) * valeurAvant[1]
+		+ (secondes - secondesAvant) * valeurApres[1])
+		/ (secondesApres - secondesAvant);
+	qualite := bdoh_cross_quality_orders(ROUND(valeurAvant[2])::INTEGER, ROUND(valeurApres[2])::INTEGER);
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_between_dates(timestamp without time zone, timestamp without time zone, double precision[], timestamp without time zone, double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+    entree double precision,
+    qualiteentree integer,
+    bareme double precision[],
+    limitsasgaps boolean DEFAULT false,
+    limitsaddcoeff double precision DEFAULT 0.0,
+    limitsmultcoeff double precision DEFAULT 1.0)
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+        entree_adaptee DOUBLE PRECISION;
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+        valeur          DOUBLE PRECISION;
+	qualite         DOUBLE PRECISION;
+BEGIN
+
+        IF qualiteEntree IN (600, 700) THEN
+                IF limitsAsGaps THEN
+                    RETURN ARRAY[-9999.0, 200.0];
+                END IF;
+                entree_adaptee := entree * limitsMultCoeff + limitsAddCoeff;
+        ELSE
+                entree_adaptee := entree;
+        END IF;
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree <= 200 THEN
+		RETURN ARRAY[-9999.0, qualiteEntree];
+	END IF;
+	IF entree_adaptee < minBareme OR entree_adaptee > maxBareme
+	THEN
+		RETURN ARRAY[-9999.0, 100.0];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree_adaptee < bareme[indice][1]
+		OR entree_adaptee > bareme[indice+1][1]
+	LOOP
+		IF entree_adaptee < bareme[indice][1]
+		THEN indice := indice-1;
+		ELSE indice := indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+        qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, ROUND(ligneSuivante[1][3])::INTEGER, limitsAsGaps);
+        qualite := bdoh_cross_quality_orders(ROUND(qualite)::INTEGER, qualiteEntree, limitsAsGaps);
+
+        valeur := ((ligneSuivante[1][1] - entree_adaptee) * lignePrecedente[1][2]
+                + (entree_adaptee - lignePrecedente[1][1]) * ligneSuivante[1][2])
+                / (ligneSuivante[1][1] - lignePrecedente[1][1]);
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_for_bareme(double precision, integer, double precision[], boolean, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+
+        // à faire à la main pour ne pas alourdir le déploiement
+        //$this->addSql('SELECT id, bdoh_compute_chronique(id) FROM chronique;');
+
+        // à faire à la main pour ne pas alourdir le déploiement
+        //$this->addSql('SELECT id, bdoh_update_filling_rates(id) FROM chronique;');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("UPDATE qualite SET ordre=200, type='gap' WHERE id=12;");
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+    chroniquefilleid integer,
+    jeuqualiteid integer,
+    transfomainid integer,
+    transfosecondid integer,
+    delaymain double precision DEFAULT 0.0,
+    delaysecond double precision DEFAULT 0.0,
+    coefficient double precision DEFAULT 1.0)
+  RETURNS integer AS
+$BODY$
+
+DECLARE
+	cursorMain         CURSOR FOR SELECT date + delayMain * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date + delaySecond * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+BEGIN
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL OR dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond OR dateSecond IS NULL THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+
+		ELSIF dateSecond < dateMain OR dateMain IS NULL THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF ;
+
+                qualiteInsert := bdoh_cross_quality_orders(ROUND(valeurMainInsert[2])::INTEGER, ROUND(valeurSecondInsert[2])::INTEGER);
+		IF qualiteInsert < 300 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		SELECT id INTO qualiteId
+                    FROM qualite
+                    WHERE ordre = ROUND(qualiteInsert)
+                    AND jeu_id = jeuQualiteId
+                    AND code <> 'gap';
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_between_dates(
+    dateinterp timestamp without time zone,
+    dateavant timestamp without time zone,
+    valeuravant double precision[],
+    dateapres timestamp without time zone,
+    valeurapres double precision[])
+  RETURNS double precision[] AS
+$BODY$ -- TODO voir type renvoyé par la fonction
+
+DECLARE
+
+	valeur        DOUBLE PRECISION;
+	qualite       DOUBLE PRECISION;
+	secondes      DOUBLE PRECISION;
+	secondesAvant DOUBLE PRECISION;
+	secondesApres DOUBLE PRECISION;
+
+BEGIN
+
+	IF dateAvant IS NULL OR dateApres IS NULL OR valeurAvant IS NULL OR valeurApres IS NULL THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	IF valeurAvant[2] < 300 THEN
+		RETURN ARRAY[-9999, valeurAvant[2]];
+	END IF;
+
+	IF valeurApres[2] < 300 THEN
+		RETURN valeurAvant;
+	END IF;
+
+	secondes := EXTRACT(EPOCH FROM dateInterp AT TIME ZONE 'UTC');
+	secondesAvant := EXTRACT(EPOCH FROM dateAvant AT TIME ZONE 'UTC');
+	secondesApres := EXTRACT(EPOCH FROM dateApres AT TIME ZONE 'UTC');
+	valeur := ((secondesApres - secondes) * valeurAvant[1]
+		+ (secondes - secondesAvant) * valeurApres[1])
+		/ (secondesApres - secondesAvant);
+	qualite := bdoh_cross_quality_orders(ROUND(valeurAvant[2])::INTEGER, ROUND(valeurApres[2])::INTEGER);
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_between_dates(timestamp without time zone, timestamp without time zone, double precision[], timestamp without time zone, double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+    entree double precision,
+    qualiteentree integer,
+    bareme double precision[],
+    limitsasgaps boolean DEFAULT false,
+    limitsaddcoeff double precision DEFAULT 0.0,
+    limitsmultcoeff double precision DEFAULT 1.0)
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+        entree_adaptee DOUBLE PRECISION;
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+        valeur          DOUBLE PRECISION;
+	qualite         DOUBLE PRECISION;
+BEGIN
+
+        IF qualiteEntree IN (600, 700) THEN
+                IF limitsAsGaps THEN
+                    RETURN ARRAY[-9999.0, 200.0];
+                END IF;
+                entree_adaptee := entree * limitsMultCoeff + limitsAddCoeff;
+        ELSE
+                entree_adaptee := entree;
+        END IF;
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree < 300 THEN
+		RETURN ARRAY[-9999.0, qualiteEntree];
+	END IF;
+	IF entree_adaptee < minBareme OR entree_adaptee > maxBareme
+	THEN
+		RETURN ARRAY[-9999.0, 100.0];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree_adaptee < bareme[indice][1]
+		OR entree_adaptee > bareme[indice+1][1]
+	LOOP
+		IF entree_adaptee < bareme[indice][1]
+		THEN indice := indice-1;
+		ELSE indice := indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+        qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, ROUND(ligneSuivante[1][3])::INTEGER, limitsAsGaps);
+        qualite := bdoh_cross_quality_orders(ROUND(qualite)::INTEGER, qualiteEntree, limitsAsGaps);
+
+        valeur := ((ligneSuivante[1][1] - entree_adaptee) * lignePrecedente[1][2]
+                + (entree_adaptee - lignePrecedente[1][1]) * ligneSuivante[1][2])
+                / (ligneSuivante[1][1] - lignePrecedente[1][1]);
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_for_bareme(double precision, integer, double precision[], boolean, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+
+        $this->addSql('SELECT id, bdoh_compute_chronique(id) FROM chronique;');
+
+        $this->addSql('SELECT id, bdoh_update_filling_rates(id) FROM chronique;');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180709115017.php b/app/DoctrineMigrations/Version20180709115017.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d1fdcb10db008655bee6eca1d0bcf5ee130598d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180709115017.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180709115017 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE bareme ALTER datecreation TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE bareme ALTER datecreation DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Bareme ALTER dateCreation TYPE DATE');
+        $this->addSql('ALTER TABLE Bareme ALTER dateCreation DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180710063532.php b/app/DoctrineMigrations/Version20180710063532.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab5e2eab39566a82fcde3bc2454bf732525e1298
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180710063532.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180710063532 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE utilisateur ALTER derniereconnection TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE utilisateur ALTER derniereconnection DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Utilisateur ALTER derniereConnection TYPE DATE');
+        $this->addSql('ALTER TABLE Utilisateur ALTER derniereConnection DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180710085816.php b/app/DoctrineMigrations/Version20180710085816.php
new file mode 100644
index 0000000000000000000000000000000000000000..514e740bbff26cfefbc42b7752d1c8c494bf6624
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180710085816.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180710085816 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ALTER date TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE historique ALTER date DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique ALTER date TYPE TIMESTAMP(0) WITH TIME ZONE');
+        $this->addSql('ALTER TABLE Historique ALTER date DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180713094239.php b/app/DoctrineMigrations/Version20180713094239.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9929047f4d084704a64b20eaccbf4c7baa9e7d6
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180713094239.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180713094239 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD changedIntoGap BOOLEAN DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ALTER datecreation TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE historique ALTER datecreation DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP changedIntoGap');
+        $this->addSql('ALTER TABLE Historique ALTER dateCreation TYPE DATE');
+        $this->addSql('ALTER TABLE Historique ALTER dateCreation DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180713113947.php b/app/DoctrineMigrations/Version20180713113947.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f2e64ab9392058db056ccc57e75977b0e0fe773
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180713113947.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180713113947 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE baremejeubareme ALTER debutvalidite TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE baremejeubareme ALTER debutvalidite DROP DEFAULT');
+        $this->addSql('ALTER TABLE baremejeubareme ALTER finvalidite TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE baremejeubareme ALTER finvalidite DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE BaremeJeuBareme ALTER debutValidite TYPE DATE');
+        $this->addSql('ALTER TABLE BaremeJeuBareme ALTER debutValidite DROP DEFAULT');
+        $this->addSql('ALTER TABLE BaremeJeuBareme ALTER finValidite TYPE DATE');
+        $this->addSql('ALTER TABLE BaremeJeuBareme ALTER finValidite DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180720111756.php b/app/DoctrineMigrations/Version20180720111756.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9e86177fed89340e2bb58315fe3048621783784
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180720111756.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180720111756 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique ALTER miseajour TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE chronique ALTER miseajour DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour TYPE DATE');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180723154055.php b/app/DoctrineMigrations/Version20180723154055.php
new file mode 100644
index 0000000000000000000000000000000000000000..db8cd5fea573c4eac78d878054e78d0d9bfb7cca
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180723154055.php
@@ -0,0 +1,1031 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180723154055 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+    chroniquefilleid integer,
+    jeuqualiteid integer,
+    transfomainid integer,
+    transfosecondid integer,
+    delaymain double precision DEFAULT 0.0,
+    delaysecond double precision DEFAULT 0.0,
+    coefficient double precision DEFAULT 1.0)
+  RETURNS integer AS
+$BODY$
+
+DECLARE
+
+	cursorMain         CURSOR FOR SELECT date + delayMain * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date + delaySecond * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+
+BEGIN
+
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL AND dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			CONTINUE WHEN dateSecondAvant IS NULL;
+
+		ELSIF dateSecond < dateMain THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+			CONTINUE WHEN dateMainAvant IS NULL;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF;
+
+		qualiteInsert := bdoh_cross_quality_orders(ROUND(valeurMainInsert[2])::INTEGER, ROUND(valeurSecondInsert[2])::INTEGER);
+		IF qualiteInsert <= 200 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		SELECT id INTO qualiteId
+			FROM qualite
+			WHERE ordre = ROUND(qualiteInsert)
+			AND jeu_id = jeuQualiteId
+			AND code <> 'gap';
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_transformed_mesures(IN transfoid integer)
+  RETURNS TABLE(date timestamp without time zone, valeur double precision[]) AS
+$BODY$
+
+DECLARE
+
+	typeTransfoLimites VARCHAR;
+	turnLimitsToGap    BOOLEAN;
+	coeffLimitsAdd     DOUBLE PRECISION;
+	coeffLimitsMult    DOUBLE PRECISION;
+
+BEGIN
+
+	typeTransfoLimites := valuelimittransformationtype FROM jeubareme jb
+		JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+
+	IF typeTransfoLimites = 'chronique.lq_ld.options.gap' THEN
+		turnLimitsToGap := true;
+		coeffLimitsAdd  := -9999;
+		coeffLimitsMult := 0.0;
+	ELSE
+		turnLimitsToGap := false;
+	END IF;
+
+	IF typeTransfoLimites IS NULL OR typeTransfoLimites = 'chronique.lq_ld.options.true_value' THEN
+		coeffLimitsAdd  := 0.0;
+		coeffLimitsMult := 1.0;
+	END IF;
+
+	IF typeTransfoLimites = 'chronique.lq_ld.options.half_value' THEN
+		coeffLimitsAdd  := 0.0;
+		coeffLimitsMult := 0.5;
+	END IF;
+
+	IF typeTransfoLimites = 'chronique.lq_ld.options.placeholder' THEN
+		coeffLimitsAdd  := valuelimitplaceholder FROM jeubareme jb
+			JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+		coeffLimitsMult := 0.0;
+	END IF;
+
+	RETURN QUERY
+		SELECT
+			m.date,
+			CASE
+				WHEN b.nom = 'lacune' THEN
+					ARRAY[-9999, 100]
+				WHEN turnLimitsToGap AND q.ordre IN (600, 700) THEN
+					ARRAY[-9999, 200]
+				WHEN b.nom = 'identite' THEN
+					CASE
+						WHEN q.ordre IN (600, 700) THEN
+							ARRAY[m.valeur * coeffLimitsMult + coeffLimitsAdd, q.ordre]
+						ELSE
+							ARRAY[m.valeur, q.ordre]
+					END
+				ELSE
+					bdoh_interp_for_bareme(m.valeur, q.ordre, b.valeurs, turnLimitsToGap, coeffLimitsAdd, coeffLimitsMult)
+			END
+		FROM
+			transformation t,
+			mesure m,
+			qualite q,
+			baremejeubareme bjb,
+			bareme b
+		WHERE
+			t.id=transfoId AND
+			m.chronique_id=t.entree_id AND
+			q.id=m.qualite_id AND
+			bjb.jeubareme_id=t.jeubaremeactuel_id AND
+			m.date >= bjb.debutValidite AND
+			(m.date < bjb.finValidite OR bjb.finValidite IS NULL) AND
+			b.id=bjb.bareme_id AND
+			b.nom <> 'manuel'
+		ORDER BY m.date ASC;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_transformed_mesures(integer)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+    entree double precision,
+    qualiteentree integer,
+    bareme double precision[],
+    limitsasgaps boolean DEFAULT false,
+    limitsaddcoeff double precision DEFAULT 0.0,
+    limitsmultcoeff double precision DEFAULT 1.0)
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+	entree_adaptee  DOUBLE PRECISION;
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+	valeur          DOUBLE PRECISION;
+	qualite         DOUBLE PRECISION;
+
+BEGIN
+
+        IF qualiteEntree IN (600, 700) THEN
+                IF limitsAsGaps THEN
+                    RETURN ARRAY[-9999, 200];
+                END IF;
+                entree_adaptee := entree * limitsMultCoeff + limitsAddCoeff;
+        ELSE
+                entree_adaptee := entree;
+        END IF;
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree <= 200 THEN
+		RETURN ARRAY[-9999, qualiteEntree];
+	END IF;
+
+	IF entree_adaptee < minBareme OR entree_adaptee > maxBareme THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree_adaptee < bareme[indice][1]
+		OR entree_adaptee > bareme[indice+1][1]
+	LOOP
+		IF entree_adaptee < bareme[indice][1] THEN
+			indice := indice-1;
+		ELSE
+			indice := indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+
+	IF entree_adaptee = lignePrecedente[1][1] THEN
+		qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, qualiteEntree, limitsAsGaps);
+		valeur := lignePrecedente[1][2];
+
+	ELSIF entree_adaptee = ligneSuivante[1][1] THEN
+		qualite := bdoh_cross_quality_orders(ROUND(ligneSuivante[1][3])::INTEGER, qualiteEntree, limitsAsGaps);
+		valeur := ligneSuivante[1][2];
+
+	ELSE
+		qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, ROUND(ligneSuivante[1][3])::INTEGER, limitsAsGaps);
+		qualite := bdoh_cross_quality_orders(ROUND(qualite)::INTEGER, qualiteEntree, limitsAsGaps);
+		valeur := ((ligneSuivante[1][1] - entree_adaptee) * lignePrecedente[1][2]
+			+ (entree_adaptee - lignePrecedente[1][1]) * ligneSuivante[1][2])
+			/ (ligneSuivante[1][1] - lignePrecedente[1][1]);
+
+	END IF;
+
+	IF qualite <= 200 THEN
+		valeur := -9999;
+	END IF;
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_for_bareme(double precision, integer, double precision[], boolean, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_between_dates(
+    dateinterp timestamp without time zone,
+    dateavant timestamp without time zone,
+    valeuravant double precision[],
+    dateapres timestamp without time zone,
+    valeurapres double precision[])
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+	valeur        DOUBLE PRECISION;
+	qualite       DOUBLE PRECISION;
+	secondes      DOUBLE PRECISION;
+	secondesAvant DOUBLE PRECISION;
+	secondesApres DOUBLE PRECISION;
+
+BEGIN
+
+	IF dateAvant IS NULL OR dateApres IS NULL OR valeurAvant IS NULL OR valeurApres IS NULL THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	IF valeurAvant[2] <= 200 THEN
+		RETURN ARRAY[-9999, valeurAvant[2]];
+	END IF;
+
+	IF valeurApres[2] <= 200 THEN
+		RETURN ARRAY[-9999, valeurApres[2]];
+	END IF;
+
+	secondes := EXTRACT(EPOCH FROM dateInterp AT TIME ZONE 'UTC');
+	secondesAvant := EXTRACT(EPOCH FROM dateAvant AT TIME ZONE 'UTC');
+	secondesApres := EXTRACT(EPOCH FROM dateApres AT TIME ZONE 'UTC');
+	valeur := ((secondesApres - secondes) * valeurAvant[1]
+		+ (secondes - secondesAvant) * valeurApres[1])
+		/ (secondesApres - secondesAvant);
+	qualite := bdoh_cross_quality_orders(ROUND(valeurAvant[2])::INTEGER, ROUND(valeurApres[2])::INTEGER);
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_between_dates(timestamp without time zone, timestamp without time zone, double precision[], timestamp without time zone, double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_purge_mesures_child_chronique(chroniquefilleid integer)
+  RETURNS void AS
+$BODY$
+
+BEGIN
+
+	DELETE FROM mesure WHERE chronique_id = chroniqueFilleId AND estcalculee;
+
+	DELETE FROM mesure WHERE id IN (
+		SELECT DISTINCT m.id
+		FROM
+			mesure m,
+			chronique c,
+			transformation t,
+			baremejeubareme bjb,
+			bareme b
+		WHERE
+			m.chronique_id = c.id AND
+			c.id = chroniqueFilleId AND
+			(t.id = c.premiereentree_id OR t.id = c.secondeentree_id) AND
+			bjb.jeubareme_id = t.jeubaremeactuel_id AND
+			m.date >= bjb.debutvalidite AND
+			(m.date < bjb.finvalidite OR bjb.finvalidite IS NULL) AND
+			bjb.bareme_id = b.id AND
+			b.nom <> 'manuel'
+	);
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_purge_mesures_child_chronique(integer)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_interp_for_bareme(double precision, integer, double precision[]);
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+    chroniquefilleid integer,
+    jeuqualiteid integer,
+    transfomainid integer,
+    transfosecondid integer,
+    delaymain double precision DEFAULT 0.0,
+    delaysecond double precision DEFAULT 0.0,
+    coefficient double precision DEFAULT 1.0)
+  RETURNS integer AS
+$BODY$
+
+DECLARE
+	cursorMain         CURSOR FOR SELECT date + delayMain * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date + delaySecond * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+BEGIN
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL OR dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond OR dateSecond IS NULL THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+
+		ELSIF dateSecond < dateMain OR dateMain IS NULL THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF ;
+
+                qualiteInsert := bdoh_cross_quality_orders(ROUND(valeurMainInsert[2])::INTEGER, ROUND(valeurSecondInsert[2])::INTEGER);
+		IF qualiteInsert <= 200 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		SELECT id INTO qualiteId
+                    FROM qualite
+                    WHERE ordre = ROUND(qualiteInsert)
+                    AND jeu_id = jeuQualiteId
+                    AND code <> 'gap';
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_transformed_mesures(IN transfoid integer)
+  RETURNS TABLE(date timestamp without time zone, valeur double precision[]) AS
+$BODY$
+DECLARE
+        typeTransfoLimites VARCHAR;
+        turnLimitsToGap    BOOLEAN;
+        coeffLimitsAdd     DOUBLE PRECISION;
+        coeffLimitsMult    DOUBLE PRECISION;
+BEGIN
+
+        typeTransfoLimites := valuelimittransformationtype FROM jeubareme jb
+            JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.gap' THEN
+            turnLimitsToGap := true;
+            coeffLimitsAdd  := -9999.0;
+            coeffLimitsMult := 0.0;
+        ELSE
+            turnLimitsToGap := false;
+        END IF;
+
+        IF typeTransfoLimites IS NULL OR typeTransfoLimites = 'chronique.lq_ld.options.true_value' THEN
+            coeffLimitsAdd  := 0.0;
+            coeffLimitsMult := 1.0;
+        END IF;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.half_value' THEN
+            coeffLimitsAdd  := 0.0;
+            coeffLimitsMult := 0.5;
+        END IF;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.placeholder' THEN
+            coeffLimitsAdd  := valuelimitplaceholder FROM jeubareme jb
+                JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+            coeffLimitsMult := 0.0;
+        END IF;
+
+	RETURN QUERY
+		SELECT m.date,
+		CASE
+                    WHEN b.nom = 'lacune' THEN
+                        ARRAY[-9999, 100]
+                    WHEN turnLimitsToGap AND q.ordre IN (600, 700) THEN
+                        ARRAY[-9999, 200]
+                    WHEN b.nom = 'identite' THEN
+                        CASE
+                            WHEN q.ordre IN (600, 700) THEN
+                                ARRAY[m.valeur * coeffLimitsMult + coeffLimitsAdd, q.ordre]
+                            ELSE
+                                ARRAY[m.valeur, q.ordre]
+                        END
+                    WHEN b.nom = 'manuel' THEN
+                        NULL
+                    ELSE
+                        replace(bdoh_interp_for_bareme(m.valeur, q.ordre, b.valeurs, turnLimitsToGap, coeffLimitsAdd, coeffLimitsMult)::varchar,
+                            '{NULL,NULL}', '{-9999,100}')::DOUBLE PRECISION[]
+		END
+		FROM transformation t
+		LEFT JOIN mesure m ON m.chronique_id = t.entree_id
+		LEFT JOIN qualite q ON m.qualite_id = q.id
+		LEFT JOIN jeuBareme jb ON jb.id = t.jeuBaremeActuel_id
+		LEFT JOIN baremeJeuBareme bjb ON bjb.jeuBareme_id = jb.id AND m.date >= bjb.debutValidite AND (m.date < bjb.finValidite OR bjb.finValidite IS NULL)
+		LEFT JOIN bareme b ON bjb.bareme_id = b.id
+		WHERE t.id = transfoId
+		AND b.nom <> 'manuel'
+		ORDER BY m.valeur DESC;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_transformed_mesures(integer)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+    entree double precision,
+    qualiteentree integer,
+    bareme double precision[],
+    limitsasgaps boolean DEFAULT false,
+    limitsaddcoeff double precision DEFAULT 0.0,
+    limitsmultcoeff double precision DEFAULT 1.0)
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+        entree_adaptee DOUBLE PRECISION;
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+        valeur          DOUBLE PRECISION;
+	qualite         DOUBLE PRECISION;
+BEGIN
+
+        IF qualiteEntree IN (600, 700) THEN
+                IF limitsAsGaps THEN
+                    RETURN ARRAY[-9999.0, 200.0];
+                END IF;
+                entree_adaptee := entree * limitsMultCoeff + limitsAddCoeff;
+        ELSE
+                entree_adaptee := entree;
+        END IF;
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree <= 200 THEN
+		RETURN ARRAY[-9999.0, qualiteEntree];
+	END IF;
+	IF entree_adaptee < minBareme OR entree_adaptee > maxBareme
+	THEN
+		RETURN ARRAY[-9999.0, 100.0];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree_adaptee < bareme[indice][1]
+		OR entree_adaptee > bareme[indice+1][1]
+	LOOP
+		IF entree_adaptee < bareme[indice][1]
+		THEN indice := indice-1;
+		ELSE indice := indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+        qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, ROUND(ligneSuivante[1][3])::INTEGER, limitsAsGaps);
+        qualite := bdoh_cross_quality_orders(ROUND(qualite)::INTEGER, qualiteEntree, limitsAsGaps);
+
+        valeur := ((ligneSuivante[1][1] - entree_adaptee) * lignePrecedente[1][2]
+                + (entree_adaptee - lignePrecedente[1][1]) * ligneSuivante[1][2])
+                / (ligneSuivante[1][1] - lignePrecedente[1][1]);
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_for_bareme(double precision, integer, double precision[], boolean, double precision, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_between_dates(
+    dateinterp timestamp without time zone,
+    dateavant timestamp without time zone,
+    valeuravant double precision[],
+    dateapres timestamp without time zone,
+    valeurapres double precision[])
+  RETURNS double precision[] AS
+$BODY$ -- TODO voir type renvoyé par la fonction
+
+DECLARE
+
+	valeur        DOUBLE PRECISION;
+	qualite       DOUBLE PRECISION;
+	secondes      DOUBLE PRECISION;
+	secondesAvant DOUBLE PRECISION;
+	secondesApres DOUBLE PRECISION;
+
+BEGIN
+
+	IF dateAvant IS NULL OR dateApres IS NULL OR valeurAvant IS NULL OR valeurApres IS NULL THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	IF valeurAvant[2] <= 200 THEN
+		RETURN ARRAY[-9999, valeurAvant[2]];
+	END IF;
+
+	IF valeurApres[2] <= 200 THEN
+		RETURN valeurAvant;
+	END IF;
+
+	secondes := EXTRACT(EPOCH FROM dateInterp AT TIME ZONE 'UTC');
+	secondesAvant := EXTRACT(EPOCH FROM dateAvant AT TIME ZONE 'UTC');
+	secondesApres := EXTRACT(EPOCH FROM dateApres AT TIME ZONE 'UTC');
+	valeur := ((secondesApres - secondes) * valeurAvant[1]
+		+ (secondes - secondesAvant) * valeurApres[1])
+		/ (secondesApres - secondesAvant);
+	qualite := bdoh_cross_quality_orders(ROUND(valeurAvant[2])::INTEGER, ROUND(valeurApres[2])::INTEGER);
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_between_dates(timestamp without time zone, timestamp without time zone, double precision[], timestamp without time zone, double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_purge_mesures_child_chronique(chroniquefilleid integer)
+  RETURNS void AS
+$BODY$
+
+BEGIN
+
+        DELETE FROM mesure WHERE chronique_id = chroniqueFilleId AND estcalculee;
+
+	DELETE FROM mesure WHERE id IN (
+		SELECT m.id
+		FROM mesure m
+		LEFT JOIN chronique c on c.id = m.chronique_id
+		LEFT JOIN transformation t ON t.id = c.premiereentree_id OR t.id = c.secondeentree_id
+		LEFT JOIN jeuBareme jb ON jb.id = t.jeuBaremeActuel_id
+		LEFT JOIN baremeJeuBareme bjb ON bjb.jeuBareme_id = jb.id AND m.date >= bjb.debutValidite AND (m.date < bjb.finValidite OR bjb.finValidite IS NULL)
+		LEFT JOIN bareme b ON bjb.bareme_id = b.id
+		WHERE m.chronique_id = chroniqueFilleId
+		AND b.nom <> 'manuel'
+	);
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_purge_mesures_child_chronique(integer)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+    chroniquefilleid integer,
+    jeuqualiteid integer,
+    transfomainid integer,
+    transfosecondid integer,
+    coefficient double precision DEFAULT 1.0)
+  RETURNS integer AS
+$BODY$
+
+DECLARE
+
+	cursorMain         CURSOR FOR SELECT date, valeur FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date, valeur FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+BEGIN
+
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL OR dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond OR dateSecond IS NULL THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+
+		ELSIF dateSecond < dateMain OR dateMain IS NULL THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF ;
+
+		qualiteInsert := valeurMainInsert[2];
+		IF valeurSecondInsert[2] < qualiteInsert THEN
+			qualiteInsert := valeurSecondInsert[2];
+		END IF;
+		IF qualiteInsert < 2 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		qualiteId = (SELECT id FROM qualite WHERE ordre = ROUND(qualiteInsert) AND jeu_id = jeuQualiteId AND code <> 'gap');
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_insert_mesures_two_transformations(integer, integer, integer, integer, double precision)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+    entree double precision,
+    qualiteentree integer,
+    bareme double precision[])
+  RETURNS double precision[] AS
+$BODY$
+
+DECLARE
+
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+	qualite         DOUBLE PRECISION;
+BEGIN
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree < 2 THEN
+		RETURN ARRAY[-9999.0, qualiteEntree];
+	END IF;
+	IF entree < minBareme OR entree > maxBareme
+	THEN
+		RETURN ARRAY[-9999.0, 0.0];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree < bareme[indice][1]
+		OR entree > bareme[indice+1][1]
+	LOOP
+		IF entree < bareme[indice][1]
+		THEN indice := indice-1;
+		ELSE indice :=indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+	qualite := lignePrecedente[1][3];
+	IF ligneSuivante[1][3] < qualite THEN
+		qualite := ligneSuivante[1][3];
+	END IF;
+	IF qualiteEntree < qualite THEN
+		qualite := qualiteEntree;
+	END IF;
+
+	RETURN ARRAY[
+		((ligneSuivante[1][1] - entree) * lignePrecedente[1][2]
+			+ (entree - lignePrecedente[1][1]) * ligneSuivante[1][2]
+			) / (ligneSuivante[1][1] - lignePrecedente[1][1]),
+		qualite
+		];
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_interp_for_bareme(double precision, integer, double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180917143832.php b/app/DoctrineMigrations/Version20180917143832.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8d654f39b5825400ee1f1c29991f3383355f1a8
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180917143832.php
@@ -0,0 +1,191 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180917143832 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT FK_5C80B31D61ED1B0D');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT FK_5C80B31D98DE13AC');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT FK_5C80B31D61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT FK_5C80B31D98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT FK_DDFC381E61ED1B0D');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT FK_DDFC381E98DE13AC');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT FK_DDFC381E61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT FK_DDFC381E98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE doi DROP CONSTRAINT FK_5ED9529A61ED1B0D');
+        $this->addSql('ALTER TABLE doi ADD CONSTRAINT FK_5ED9529A61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE station DROP CONSTRAINT FK_5084C12D131A4F72');
+        $this->addSql('ALTER TABLE station ADD CONSTRAINT FK_5084C12D131A4F72 FOREIGN KEY (commune_id) REFERENCES Commune (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749AB9BB300');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749AB9BB300 FOREIGN KEY (producteur_id) REFERENCES Partenaire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE pointjaugeage DROP CONSTRAINT FK_A228ECE75F49EAAD');
+        $this->addSql('ALTER TABLE pointjaugeage ADD CONSTRAINT FK_A228ECE75F49EAAD FOREIGN KEY (bareme_id) REFERENCES Bareme (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bareme DROP CONSTRAINT FK_35A1B5D861ED1B0D');
+        $this->addSql('ALTER TABLE bareme ADD CONSTRAINT FK_35A1B5D861ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bassin DROP CONSTRAINT fk_660811f3166baf05');
+        $this->addSql('ALTER TABLE bassin DROP CONSTRAINT FK_660811F361ED1B0D');
+        $this->addSql('ALTER TABLE bassin ADD CONSTRAINT FK_660811F390F720D2 FOREIGN KEY (stationexutoire_id) REFERENCES Station (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE bassin ADD CONSTRAINT FK_660811F361ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER INDEX idx_660811f3166baf05 RENAME TO IDX_660811F390F720D2');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B255461ED1B0D');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B2554FB88E14F');
+        $this->addSql('ALTER TABLE role DROP CONSTRAINT FK_F75B2554F6BD1646');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B255461ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B2554FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE role ADD CONSTRAINT FK_F75B2554F6BD1646 FOREIGN KEY (site_id) REFERENCES SiteExperimental (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED27FB88E14F');
+        $this->addSql('ALTER TABLE besoin DROP CONSTRAINT FK_86B4ED2761ED1B0D');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED27FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoin ADD CONSTRAINT FK_86B4ED2761ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT FK_75A89B03FE6EED44');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT FK_75A89B036358FF62');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT FK_75A89B03FE6EED44 FOREIGN KEY (besoin_id) REFERENCES Besoin (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT FK_75A89B036358FF62 FOREIGN KEY (parametre_id) REFERENCES TypeParametre (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_stations DROP CONSTRAINT FK_59777037FE6EED44');
+        $this->addSql('ALTER TABLE besoins_stations ADD CONSTRAINT FK_59777037FE6EED44 FOREIGN KEY (besoin_id) REFERENCES Besoin (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT fk_a2e2d63cd9b0f6d6');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT fk_a2e2d63c6ecd41f5');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT fk_a2e2d63c5001bc01');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C60BB6FE6');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C61ED1B0D');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CFB88E14F');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C5F49EAAD');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C131A4F72');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63CEC4A74AB');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C21BDB235');
+        $this->addSql('ALTER TABLE historique DROP CONSTRAINT FK_A2E2D63C98DE13AC');
+        $this->addSql('ALTER TABLE historique ADD courseau_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD bassin_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C32164871 FOREIGN KEY (courseau_id) REFERENCES CoursEau (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CE30215E FOREIGN KEY (bassin_id) REFERENCES Bassin (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CA977DE57 FOREIGN KEY (observatoirecible_id) REFERENCES Observatoire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C76FC9A0D FOREIGN KEY (typeparametre_id) REFERENCES TypeParametre (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C5175C848 FOREIGN KEY (siteexperimental_id) REFERENCES SiteExperimental (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C60BB6FE6 FOREIGN KEY (auteur_id) REFERENCES Utilisateur (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CFB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C5F49EAAD FOREIGN KEY (bareme_id) REFERENCES Bareme (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C131A4F72 FOREIGN KEY (commune_id) REFERENCES Commune (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CEC4A74AB FOREIGN KEY (unite_id) REFERENCES Unite (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C21BDB235 FOREIGN KEY (station_id) REFERENCES Station (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C32164871 ON historique (courseau_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CE30215E ON historique (bassin_id)');
+        $this->addSql('ALTER INDEX idx_a2e2d63c5001bc01 RENAME TO IDX_A2E2D63CA977DE57');
+        $this->addSql('ALTER INDEX idx_a2e2d63c6ecd41f5 RENAME TO IDX_A2E2D63C76FC9A0D');
+        $this->addSql('ALTER INDEX idx_a2e2d63cd9b0f6d6 RENAME TO IDX_A2E2D63C5175C848');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Doi DROP CONSTRAINT fk_5ed9529a61ed1b0d');
+        $this->addSql('ALTER TABLE Doi ADD CONSTRAINT fk_5ed9529a61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT fk_5c80b31d61ed1b0d');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques DROP CONSTRAINT fk_5c80b31d98de13ac');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT fk_5c80b31d61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT fk_5c80b31d98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT fk_ddfc381e61ed1b0d');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels DROP CONSTRAINT fk_ddfc381e98de13ac');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT fk_ddfc381e61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT fk_ddfc381e98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PointJaugeage DROP CONSTRAINT fk_a228ece75f49eaad');
+        $this->addSql('ALTER TABLE PointJaugeage ADD CONSTRAINT fk_a228ece75f49eaad FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT fk_75a89b03fe6eed44');
+        $this->addSql('ALTER TABLE besoins_parametres DROP CONSTRAINT fk_75a89b036358ff62');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT fk_75a89b03fe6eed44 FOREIGN KEY (besoin_id) REFERENCES besoin (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_parametres ADD CONSTRAINT fk_75a89b036358ff62 FOREIGN KEY (parametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE besoins_stations DROP CONSTRAINT fk_59777037fe6eed44');
+        $this->addSql('ALTER TABLE besoins_stations ADD CONSTRAINT fk_59777037fe6eed44 FOREIGN KEY (besoin_id) REFERENCES besoin (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749ab9bb300');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749ab9bb300 FOREIGN KEY (producteur_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Bassin DROP CONSTRAINT FK_660811F390F720D2');
+        $this->addSql('ALTER TABLE Bassin DROP CONSTRAINT fk_660811f361ed1b0d');
+        $this->addSql('ALTER TABLE Bassin ADD CONSTRAINT fk_660811f3166baf05 FOREIGN KEY (stationexutoire_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Bassin ADD CONSTRAINT fk_660811f361ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER INDEX idx_660811f390f720d2 RENAME TO idx_660811f3166baf05');
+        $this->addSql('ALTER TABLE Role DROP CONSTRAINT fk_f75b255461ed1b0d');
+        $this->addSql('ALTER TABLE Role DROP CONSTRAINT fk_f75b2554fb88e14f');
+        $this->addSql('ALTER TABLE Role DROP CONSTRAINT fk_f75b2554f6bd1646');
+        $this->addSql('ALTER TABLE Role ADD CONSTRAINT fk_f75b255461ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Role ADD CONSTRAINT fk_f75b2554fb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Role ADD CONSTRAINT fk_f75b2554f6bd1646 FOREIGN KEY (site_id) REFERENCES siteexperimental (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Bareme DROP CONSTRAINT fk_35a1b5d861ed1b0d');
+        $this->addSql('ALTER TABLE Bareme ADD CONSTRAINT fk_35a1b5d861ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Station DROP CONSTRAINT fk_5084c12d131a4f72');
+        $this->addSql('ALTER TABLE Station ADD CONSTRAINT fk_5084c12d131a4f72 FOREIGN KEY (commune_id) REFERENCES commune (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Besoin DROP CONSTRAINT fk_86b4ed27fb88e14f');
+        $this->addSql('ALTER TABLE Besoin DROP CONSTRAINT fk_86b4ed2761ed1b0d');
+        $this->addSql('ALTER TABLE Besoin ADD CONSTRAINT fk_86b4ed27fb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Besoin ADD CONSTRAINT fk_86b4ed2761ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C32164871');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CE30215E');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CA977DE57');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C76FC9A0D');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C5175C848');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c60bb6fe6');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c61ed1b0d');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63cfb88e14f');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c5f49eaad');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c131a4f72');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63cec4a74ab');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c21bdb235');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT fk_a2e2d63c98de13ac');
+        $this->addSql('DROP INDEX IDX_A2E2D63C32164871');
+        $this->addSql('DROP INDEX IDX_A2E2D63CE30215E');
+        $this->addSql('ALTER TABLE Historique DROP courseau_id');
+        $this->addSql('ALTER TABLE Historique DROP bassin_id');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63cd9b0f6d6 FOREIGN KEY (siteexperimental_id) REFERENCES siteexperimental (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c6ecd41f5 FOREIGN KEY (typeparametre_id) REFERENCES typeparametre (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c5001bc01 FOREIGN KEY (observatoirecible_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c60bb6fe6 FOREIGN KEY (auteur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63cfb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c5f49eaad FOREIGN KEY (bareme_id) REFERENCES bareme (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c131a4f72 FOREIGN KEY (commune_id) REFERENCES commune (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63cec4a74ab FOREIGN KEY (unite_id) REFERENCES unite (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c21bdb235 FOREIGN KEY (station_id) REFERENCES station (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Historique ADD CONSTRAINT fk_a2e2d63c98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER INDEX idx_a2e2d63ca977de57 RENAME TO idx_a2e2d63c5001bc01');
+        $this->addSql('ALTER INDEX idx_a2e2d63c76fc9a0d RENAME TO idx_a2e2d63c6ecd41f5');
+        $this->addSql('ALTER INDEX idx_a2e2d63c5175c848 RENAME TO idx_a2e2d63cd9b0f6d6');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20180919140834.php b/app/DoctrineMigrations/Version20180919140834.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2782023accd8e7f7b758d4ed978eaff76188e72
--- /dev/null
+++ b/app/DoctrineMigrations/Version20180919140834.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20180919140834 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("DELETE FROM role WHERE valeur = 'validateur' OR valeur = 'sig'");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181019123046.php b/app/DoctrineMigrations/Version20181019123046.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1f458a1b0fdbe11e97e447bd50646f830592c56
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181019123046.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181019123046 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+UPDATE bareme SET datecreation = datecreation + ((id % 60) * INTERVAL '1 second')
+WHERE id IN (
+    SELECT id FROM (
+        SELECT b.id,
+            CASE
+                WHEN
+                    (SELECT count(*) FROM bareme bb WHERE bb.nom = b.nom AND bb.datecreation = b.datecreation AND bb.observatoire_id = b.observatoire_id) > 1
+                THEN 'doublon'
+                ELSE NULL
+            END AS doublon
+        FROM bareme b
+    ) AS t
+    WHERE doublon IS NOT NULL
+)
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181107153443.php b/app/DoctrineMigrations/Version20181107153443.php
new file mode 100644
index 0000000000000000000000000000000000000000..ce0eef3eb3c8b331c9223327fbd139ae2286b930
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181107153443.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181107153443 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        /*
+         *
+         * ATTENTION cette migration vise a modifier le mapping JMS\JobQueueBundle\Job
+         * elle sera signalé systématiquement comme une différence avec le mapping par
+         * la commande app/console doctrine:migration:diff
+         *
+         */
+
+        $this->addSql('ALTER TABLE jms_jobs ALTER runtime TYPE INT');
+        $this->addSql('ALTER TABLE jms_jobs ALTER runtime DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE jms_jobs ALTER runtime TYPE SMALLINT');
+        $this->addSql('ALTER TABLE jms_jobs ALTER runtime DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181113085223.php b/app/DoctrineMigrations/Version20181113085223.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0f68370162fcb07ffb840578a597e7782deb749
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181113085223.php
@@ -0,0 +1,309 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181113085223 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_export_interpolate_linear(integer, timestamp without time zone, timestamp without time zone, interval);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_export_interpolate_linear(
+	IN chronique_id integer,
+	IN starting_date timestamp without time zone,
+	IN ending_date timestamp without time zone,
+	IN timestep interval
+) RETURNS TABLE(
+	start_date timestamp without time zone,
+	end_date timestamp without time zone,
+	start_valeur double precision,
+	end_valeur double precision,
+	start_qualite_id integer,
+	end_qualite_id integer,
+	step timestamp without time zone
+) AS
+$BODY$
+	DECLARE
+		cursorSteps CURSOR FOR
+            SELECT * FROM generate_series(starting_date, ending_date, timestep) AS s(s) ORDER BY s.s ASC;
+		cursorMesures CURSOR FOR
+            SELECT * FROM bdoh_segments(chronique_id, starting_date, ending_date) AS s ORDER BY s.start_date ASC;
+		dateStep TIMESTAMP;
+		dateDebut TIMESTAMP;
+		dateFin TIMESTAMP;
+		valeurDebut DOUBLE PRECISION;
+		valeurFin DOUBLE PRECISION;
+		qualiteDebut INTEGER;
+		qualiteFin INTEGER;
+	BEGIN
+		OPEN cursorSteps;
+		OPEN cursorMesures;
+		FETCH cursorSteps INTO dateStep;
+		FETCH cursorMesures INTO dateDebut, dateFin, valeurDebut, valeurFin, qualiteDebut, qualiteFin;
+		WHILE dateStep IS NOT NULL LOOP
+			IF dateStep >= dateFin THEN
+				FETCH cursorMesures INTO dateDebut, dateFin, valeurDebut, valeurFin, qualiteDebut, qualiteFin;
+			ELSE
+				RETURN QUERY SELECT dateDebut, dateFin, valeurDebut, valeurFin, qualiteDebut, qualiteFin, dateStep;
+				FETCH cursorSteps INTO dateStep;
+			END IF;
+		END LOOP;
+		CLOSE cursorSteps;
+		CLOSE cursorMesures;
+	END;
+$BODY$
+LANGUAGE plpgsql STABLE
+COST 100
+ROWS 100000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_export_interpolate_linear(integer, timestamp without time zone, timestamp without time zone, interval)
+    OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_segments(integer, timestamp without time zone, timestamp without time zone);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_segments(
+    IN chronique_id integer,
+    IN starting_date timestamp without time zone,
+    IN ending_date timestamp without time zone
+) RETURNS TABLE(
+    start_date timestamp without time zone,
+    end_date timestamp without time zone,
+    start_valeur double precision,
+    end_valeur double precision,
+    start_qualite_id integer,
+    end_qualite_id integer
+) AS
+$BODY$
+    DECLARE
+        gap_id CONSTANT mesure.qualite_id%TYPE := bdoh_chronique_qualite_id(chronique_id, 100);
+    BEGIN
+        RETURN QUERY
+            SELECT * FROM (
+                SELECT LAG(date, 1, TIMESTAMP '-infinity') OVER w,
+                    date,
+                    LAG(valeur, 1, NULL) OVER w,
+                    valeur,
+                    LAG(qualite_id, 1, gap_id) OVER w,
+                    COALESCE(qualite_id, gap_id)
+                FROM bdoh_bounded_mesures(chronique_id, starting_date, ending_date)
+                WINDOW w AS (
+                    ORDER BY date ASC
+                    ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
+                )
+            ) m
+            OFFSET 1;
+    END;
+$BODY$
+LANGUAGE plpgsql STABLE
+COST 100
+ROWS 100000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_segments(integer, timestamp without time zone, timestamp without time zone)
+    OWNER TO bdoh;
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_bounded_mesures(
+    IN chronique_id integer,
+    IN begin_date timestamp without time zone,
+    IN end_date timestamp without time zone
+) RETURNS TABLE(
+    date timestamp without time zone,
+    valeur double precision,
+    qualite_id integer
+) AS
+$BODY$
+    DECLARE
+        c_id ALIAS FOR chronique_id;
+        lower_date mesure.date%TYPE;
+        upper_date mesure.date%TYPE;
+        gap_id CONSTANT mesure.qualite_id%TYPE := bdoh_chronique_qualite_id(chronique_id, 100);
+    BEGIN
+        SELECT MAX(m.date) INTO lower_date FROM mesure m WHERE m.chronique_id = c_id AND m.date <= begin_date;
+        SELECT MIN(m.date) INTO upper_date FROM mesure m WHERE m.chronique_id = c_id AND m.date > end_date;
+
+        IF lower_date IS NULL THEN
+            lower_date := TIMESTAMP '-infinity';
+            RETURN QUERY SELECT TIMESTAMP '-infinity', NULL::DOUBLE PRECISION, gap_id;
+        END IF;
+
+        IF upper_date IS NULL THEN
+            upper_date := TIMESTAMP 'infinity';
+        END IF;
+
+        RETURN QUERY
+            SELECT m.date, m.valeur, COALESCE(m.qualite_id, gap_id)
+            FROM mesure m
+            WHERE m.chronique_id = c_id
+            AND m.date BETWEEN lower_date AND upper_date
+            ORDER BY m.date ASC;
+
+        IF upper_date = TIMESTAMP 'infinity' THEN
+            RETURN QUERY SELECT TIMESTAMP 'infinity', NULL::DOUBLE PRECISION, gap_id;
+        END IF;
+    END;
+$BODY$
+LANGUAGE plpgsql STABLE
+COST 100
+ROWS 100000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_bounded_mesures(integer, timestamp without time zone, timestamp without time zone)
+    OWNER TO bdoh;
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_export_interpolate_linear(integer, timestamp without time zone, timestamp without time zone, interval);
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION IF EXISTS bdoh_segments(integer, timestamp without time zone, timestamp without time zone);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_segments(
+    IN chronique_id integer,
+    IN start_date timestamp without time zone,
+    IN end_date timestamp without time zone)
+  RETURNS TABLE(start_date timestamp without time zone, end_date timestamp without time zone, start_valeur double precision, end_valeur double precision, start_qualite_id integer, end_qualite_id integer) AS
+$BODY$
+                SELECT * FROM (
+                    SELECT LAG(date, 1, TIMESTAMP '-infinity') OVER w,
+                           date,
+                           LAG(valeur) OVER w,
+                           valeur,
+                           LAG(qualite_id, 1, bdoh_chronique_qualite_id(chronique_id , 100)) OVER w,
+                           COALESCE(qualite_id, bdoh_chronique_qualite_id(chronique_id , 100))
+                      FROM bdoh_bounded_mesures(chronique_id, start_date, end_date)
+                    WINDOW w AS (
+                        ORDER BY date ASC
+                        ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
+                    )
+                ) m
+                OFFSET 1
+            $BODY$
+  LANGUAGE sql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_segments(integer, timestamp without time zone, timestamp without time zone)
+  OWNER TO bdoh;
+SQL
+        );
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_bounded_mesures(
+    IN chronique_id integer,
+    IN begin_date timestamp without time zone,
+    IN end_date timestamp without time zone)
+  RETURNS TABLE(date timestamp without time zone, valeur double precision, qualite_id integer) AS
+$BODY$
+                DECLARE
+                    c_id ALIAS FOR chronique_id;
+                    lower_date mesure.date%TYPE;
+                    upper_date mesure.date%TYPE;
+                    gap_id     CONSTANT mesure.qualite_id%TYPE := bdoh_chronique_qualite_id(chronique_id, 100);
+                BEGIN
+                    SELECT MAX(m.date) INTO lower_date FROM mesure m WHERE m.chronique_id = c_id AND m.date <= begin_date;
+                    SELECT MIN(m.date) INTO upper_date FROM mesure m WHERE m.chronique_id = c_id AND m.date >= end_date;
+
+                    IF lower_date IS NULL THEN
+                        RETURN QUERY SELECT TIMESTAMP '-infinity', NULL::DOUBLE PRECISION, gap_id;
+                        lower_date := begin_date;
+                    END IF;
+
+                    IF upper_date IS NULL THEN
+                        RETURN QUERY SELECT TIMESTAMP 'infinity', NULL::DOUBLE PRECISION, gap_id;
+                        lower_date := end_date;
+                    END IF;
+
+                    RETURN QUERY
+                        SELECT m.date, m.valeur, COALESCE(m.qualite_id, gap_id)
+                          FROM mesure m
+                         WHERE m.chronique_id = c_id
+                           AND m.date BETWEEN lower_date AND upper_date;
+                END;
+            $BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 6000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_bounded_mesures(integer, timestamp without time zone, timestamp without time zone)
+  OWNER TO bdoh;
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181115164511.php b/app/DoctrineMigrations/Version20181115164511.php
new file mode 100644
index 0000000000000000000000000000000000000000..4cdde7ca204c65ae6d5a4f0827ba997f2fa17d7e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181115164511.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181115164511 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD typeExport VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD timestep VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP typeExport');
+        $this->addSql('ALTER TABLE Historique DROP timestep');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181116134306.php b/app/DoctrineMigrations/Version20181116134306.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd4d71469cd378be89bfb6b13ce2b76466e028c5
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181116134306.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181116134306 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE doi ALTER description TYPE VARCHAR(750)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Doi ALTER description TYPE VARCHAR(255)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20181120133930.php b/app/DoctrineMigrations/Version20181120133930.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf74031aa276fd8ce98d1509f782baaa48418084
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181120133930.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20181120133930 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE bdoh.pointjaugeage_id_seq CASCADE');
+        $this->addSql('CREATE SEQUENCE Conversion_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE JeuConversion_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE Conversion (id INT NOT NULL, entree_id INT DEFAULT NULL, sortie_id INT DEFAULT NULL, jeuConversionActuel_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_F2CC24949F6D100F ON Conversion (jeuConversionActuel_id)');
+        $this->addSql('CREATE INDEX IDX_F2CC2494AF7BD910 ON Conversion (entree_id)');
+        $this->addSql('CREATE INDEX IDX_F2CC2494CC72D953 ON Conversion (sortie_id)');
+        $this->addSql('CREATE UNIQUE INDEX unique_conversion ON Conversion (entree_id, sortie_id)');
+        $this->addSql('CREATE TABLE JeuConversion (id INT NOT NULL, conversion_id INT DEFAULT NULL, dateCreation TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, paramConversion INT NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_A66418444C1FF126 ON JeuConversion (conversion_id)');
+        $this->addSql('ALTER TABLE Conversion ADD CONSTRAINT FK_F2CC24949F6D100F FOREIGN KEY (jeuConversionActuel_id) REFERENCES JeuConversion (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Conversion ADD CONSTRAINT FK_F2CC2494AF7BD910 FOREIGN KEY (entree_id) REFERENCES Chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Conversion ADD CONSTRAINT FK_F2CC2494CC72D953 FOREIGN KEY (sortie_id) REFERENCES Chronique (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE JeuConversion ADD CONSTRAINT FK_A66418444C1FF126 FOREIGN KEY (conversion_id) REFERENCES Conversion (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE pointjaugeage');
+        $this->addSql('ALTER TABLE chronique ADD conversion_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC287494C1FF126 FOREIGN KEY (conversion_id) REFERENCES Conversion (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_DAC287494C1FF126 ON chronique (conversion_id)');
+        $this->addSql('ALTER TABLE historique ADD chroniqueconvertie_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD chroniquemere_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD paramConversion INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C408C274E FOREIGN KEY (chroniqueconvertie_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C26FB49FF FOREIGN KEY (chroniquemere_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C408C274E ON historique (chroniqueconvertie_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C26FB49FF ON historique (chroniquemere_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT FK_DAC287494C1FF126');
+        $this->addSql('ALTER TABLE JeuConversion DROP CONSTRAINT FK_A66418444C1FF126');
+        $this->addSql('ALTER TABLE Conversion DROP CONSTRAINT FK_F2CC24949F6D100F');
+        $this->addSql('DROP SEQUENCE Conversion_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE JeuConversion_id_seq CASCADE');
+        $this->addSql('CREATE SEQUENCE bdoh.pointjaugeage_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE pointjaugeage (id INT NOT NULL, bareme_id INT DEFAULT NULL, date TIMESTAMP(3) WITHOUT TIME ZONE NOT NULL, valeurparametreentree DOUBLE PRECISION NOT NULL, valeurparametresortie DOUBLE PRECISION NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX idx_a228ece75f49eaad ON pointjaugeage (bareme_id)');
+        $this->addSql('COMMENT ON COLUMN pointjaugeage.date IS \'(DC2Type:datetimems)\'');
+        $this->addSql('ALTER TABLE pointjaugeage ADD CONSTRAINT fk_a228ece75f49eaad FOREIGN KEY (bareme_id) REFERENCES bareme (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE Conversion');
+        $this->addSql('DROP TABLE JeuConversion');
+        $this->addSql('DROP INDEX IDX_DAC287494C1FF126');
+        $this->addSql('ALTER TABLE Chronique DROP conversion_id');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C408C274E');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C26FB49FF');
+        $this->addSql('DROP INDEX IDX_A2E2D63C408C274E');
+        $this->addSql('DROP INDEX IDX_A2E2D63C26FB49FF');
+        $this->addSql('ALTER TABLE Historique DROP chroniqueconvertie_id');
+        $this->addSql('ALTER TABLE Historique DROP chroniquemere_id');
+        $this->addSql('ALTER TABLE Historique DROP paramConversion');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190102144927.php b/app/DoctrineMigrations/Version20190102144927.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbc9aec4a7e230005f009b1101ba250b4499d6ea
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190102144927.php
@@ -0,0 +1,231 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190102144927 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_transformed_mesures(IN transfoid integer)
+  RETURNS TABLE(date timestamp without time zone, valeur double precision[]) AS
+$BODY$
+
+DECLARE
+
+    typeTransfoLimites VARCHAR;
+    turnLimitsToGap    BOOLEAN;
+    coeffLimitsAdd     DOUBLE PRECISION;
+    coeffLimitsMult    DOUBLE PRECISION;
+
+BEGIN
+
+    typeTransfoLimites := valuelimittransformationtype FROM jeubareme jb
+        JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.gap' THEN
+        turnLimitsToGap := true;
+        coeffLimitsAdd  := -9999;
+        coeffLimitsMult := 0.0;
+    ELSE
+        turnLimitsToGap := false;
+    END IF;
+
+    IF typeTransfoLimites IS NULL OR typeTransfoLimites = 'chronique.lq_ld.options.true_value' THEN
+        coeffLimitsAdd  := 0.0;
+        coeffLimitsMult := 1.0;
+    END IF;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.half_value' THEN
+        coeffLimitsAdd  := 0.0;
+        coeffLimitsMult := 0.5;
+    END IF;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.placeholder' THEN
+        coeffLimitsAdd  := valuelimitplaceholder FROM jeubareme jb
+            JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+        coeffLimitsMult := 0.0;
+    END IF;
+
+    RETURN QUERY
+        SELECT
+            m.date,
+            CASE
+                WHEN b.nom = 'lacune' THEN
+                    ARRAY[-9999, 100]
+                WHEN turnLimitsToGap AND q.ordre IN (600, 700) THEN
+                    ARRAY[-9999, 200]
+                WHEN b.nom = 'identite' THEN
+                    CASE
+                        WHEN q.ordre IN (600, 700) THEN
+                            ARRAY[m.valeur * coeffLimitsMult + coeffLimitsAdd, 500]
+                        ELSE
+                            ARRAY[m.valeur, q.ordre]
+                    END
+                ELSE
+                    bdoh_interp_for_bareme(m.valeur, q.ordre, b.valeurs, turnLimitsToGap, coeffLimitsAdd, coeffLimitsMult)
+            END
+        FROM
+            transformation t,
+            mesure m,
+            qualite q,
+            baremejeubareme bjb,
+            bareme b
+        WHERE
+            t.id=transfoId AND
+            m.chronique_id=t.entree_id AND
+            q.id=m.qualite_id AND
+            bjb.jeubareme_id=t.jeubaremeactuel_id AND
+            m.date >= bjb.debutValidite AND
+            (m.date < bjb.finValidite OR bjb.finValidite IS NULL) AND
+            b.id=bjb.bareme_id AND
+            b.nom <> 'manuel'
+        ORDER BY m.date ASC;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_transformed_mesures(integer)
+  OWNER TO bdoh;
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_transformed_mesures(IN transfoid integer)
+  RETURNS TABLE(date timestamp without time zone, valeur double precision[]) AS
+$BODY$
+
+DECLARE
+
+    typeTransfoLimites VARCHAR;
+    turnLimitsToGap    BOOLEAN;
+    coeffLimitsAdd     DOUBLE PRECISION;
+    coeffLimitsMult    DOUBLE PRECISION;
+
+BEGIN
+
+    typeTransfoLimites := valuelimittransformationtype FROM jeubareme jb
+        JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.gap' THEN
+        turnLimitsToGap := true;
+        coeffLimitsAdd  := -9999;
+        coeffLimitsMult := 0.0;
+    ELSE
+        turnLimitsToGap := false;
+    END IF;
+
+    IF typeTransfoLimites IS NULL OR typeTransfoLimites = 'chronique.lq_ld.options.true_value' THEN
+        coeffLimitsAdd  := 0.0;
+        coeffLimitsMult := 1.0;
+    END IF;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.half_value' THEN
+        coeffLimitsAdd  := 0.0;
+        coeffLimitsMult := 0.5;
+    END IF;
+
+    IF typeTransfoLimites = 'chronique.lq_ld.options.placeholder' THEN
+        coeffLimitsAdd  := valuelimitplaceholder FROM jeubareme jb
+            JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+        coeffLimitsMult := 0.0;
+    END IF;
+
+    RETURN QUERY
+        SELECT
+            m.date,
+            CASE
+                WHEN b.nom = 'lacune' THEN
+                    ARRAY[-9999, 100]
+                WHEN turnLimitsToGap AND q.ordre IN (600, 700) THEN
+                    ARRAY[-9999, 200]
+                WHEN b.nom = 'identite' THEN
+                    CASE
+                        WHEN q.ordre IN (600, 700) THEN
+                            ARRAY[m.valeur * coeffLimitsMult + coeffLimitsAdd, q.ordre]
+                        ELSE
+                            ARRAY[m.valeur, q.ordre]
+                    END
+                ELSE
+                    bdoh_interp_for_bareme(m.valeur, q.ordre, b.valeurs, turnLimitsToGap, coeffLimitsAdd, coeffLimitsMult)
+            END
+        FROM
+            transformation t,
+            mesure m,
+            qualite q,
+            baremejeubareme bjb,
+            bareme b
+        WHERE
+            t.id=transfoId AND
+            m.chronique_id=t.entree_id AND
+            q.id=m.qualite_id AND
+            bjb.jeubareme_id=t.jeubaremeactuel_id AND
+            m.date >= bjb.debutValidite AND
+            (m.date < bjb.finValidite OR bjb.finValidite IS NULL) AND
+            b.id=bjb.bareme_id AND
+            b.nom <> 'manuel'
+        ORDER BY m.date ASC;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_transformed_mesures(integer)
+  OWNER TO bdoh;
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190103103037.php b/app/DoctrineMigrations/Version20190103103037.php
new file mode 100644
index 0000000000000000000000000000000000000000..e143baa493047ed53856d773ff2d178501fcaa5d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190103103037.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190103103037 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE qualite ADD style JSON DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Qualite DROP style');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190104071048.php b/app/DoctrineMigrations/Version20190104071048.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfdacfe6d4ce3586262c3968e6ec68258c345c98
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190104071048.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190104071048 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE jeuqualite ADD checkpointStyle JSON DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE JeuQualite DROP checkpointStyle');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190104131824.php b/app/DoctrineMigrations/Version20190104131824.php
new file mode 100644
index 0000000000000000000000000000000000000000..9544d50172c3b0e90796dead903467fcd73e4736
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190104131824.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190104131824 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("UPDATE jeuqualite SET nom='VALIDE' WHERE nom='VALID'");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("UPDATE jeuqualite SET nom='VALID' WHERE nom='VALIDE'");
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190115091101.php b/app/DoctrineMigrations/Version20190115091101.php
new file mode 100644
index 0000000000000000000000000000000000000000..a75253d84770c652547ab3cd8d497b40dedf56b1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190115091101.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190115091101 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE jeuqualite ADD discontinuousStyle JSON DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE JeuQualite DROP discontinuousStyle');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190116124901.php b/app/DoctrineMigrations/Version20190116124901.php
new file mode 100644
index 0000000000000000000000000000000000000000..897c53599f4e35d066829c3c8b06952ba454726d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190116124901.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190116124901 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_series_measures_with_flag(
+    IN chroniqueid integer,
+    IN startdate timestamp without time zone,
+    IN enddate timestamp without time zone,
+    IN subinterval double precision)
+  RETURNS TABLE(e double precision, v double precision, q integer, o integer, f text) AS
+$BODY$
+BEGIN
+	-- WITH clause yields measures with date in milliseconds, subinterval index (starting from zero) and value
+	-- First subselect (alias "vmin") yields, for each subinterval, the date & value for the measure with smallest value
+	-- Second subselect (alias "vmax") yields, for each subinterval, the date & value for the largest measure with greatest value
+	-- Finally, we append the very first & last measures in our date interval
+	RETURN QUERY
+		WITH mi(ems, idx, val, qid, ord, flag) AS (
+			SELECT
+				1000 * EXTRACT(EPOCH FROM m.date AT TIME ZONE 'UTC') AS ems,
+				floor(EXTRACT(EPOCH FROM AGE(m.date, startdate))/subinterval)::INTEGER AS idx,
+				m.valeur AS val,
+				m.qualite_id AS qid,
+				q.ordre AS ord,
+				CASE q.ordre
+					WHEN 100 THEN 'gap'
+					WHEN 200 THEN 'invalid'
+					ELSE 'valid_' || q.code
+				END AS flag
+			FROM mesure m INNER JOIN qualite q ON (m.qualite_id = q.id)
+			WHERE chronique_id = chroniqueId AND date >= startDate AND date <= endDate
+			ORDER BY m.date
+		)
+		SELECT ems, val, qid, ord, flag FROM (SELECT * FROM mi ORDER BY ems ASC LIMIT 1) first_m -- very first measure
+		UNION
+		SELECT ems, val, qid, ord, flag FROM ( -- row with min value per subinterval
+			SELECT
+				ROW_NUMBER() OVER (PARTITION BY idx ORDER BY val ASC) AS rank,
+				ems,
+				val,
+				qid,
+				ord,
+				flag
+			FROM mi
+			WHERE val IS NOT NULL -- filtrage des mesures invalid ou gap inutiles
+		) vmin
+		WHERE vmin.rank = 1
+		UNION
+		SELECT ems, val, qid, ord, flag FROM ( -- row with max value per subinterval
+			SELECT
+				ROW_NUMBER() OVER (PARTITION BY idx ORDER BY val DESC) AS rank,
+				ems,
+				val,
+				qid,
+				ord,
+				flag
+			FROM mi
+			WHERE val IS NOT NULL -- filtrage des mesures invalid ou gap inutiles
+		) vmax
+		WHERE vmax.rank = 1
+		UNION
+		SELECT ems, val, qid, ord, flag FROM (SELECT * FROM mi ORDER BY ems DESC LIMIT 1) last_m -- very last measure
+		ORDER BY ems;
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_all_series_measures_with_flag(
+    IN chroniqueid integer,
+    IN startdates timestamp without time zone[],
+    IN enddates timestamp without time zone[],
+    IN subintervals double precision[])
+  RETURNS TABLE(e double precision, v double precision, q integer, o integer, f text) AS
+$BODY$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY
+			SELECT *
+			FROM bdoh_subsampled_instantaneous_series_measures_with_flag(
+				chroniqueId,
+				startDates[i],
+				endDates[i],
+				subintervals[i]
+			);
+	END LOOP;
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_instantaneous_all_series_measures_with_flag(integer, timestamp without time zone[], timestamp without time zone[], double precision[])
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_instantaneous_series_measures_with_flag(integer, timestamp without time zone, timestamp without time zone, double precision);
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190117134432.php b/app/DoctrineMigrations/Version20190117134432.php
new file mode 100644
index 0000000000000000000000000000000000000000..4de4b48d5affe1047c8327bd46636cdf44bcb055
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190117134432.php
@@ -0,0 +1,377 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190117134432 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_instantaneous_series_measures(integer, timestamp without time zone, timestamp without time zone, double precision);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_instantaneous_all_series_measures(integer, timestamp without time zone[], timestamp without time zone[], double precision[]);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_instantaneous_all_series_lengths(integer, timestamp without time zone[], timestamp without time zone[], double precision[]);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_mean_series_measures(integer, timestamp without time zone, timestamp without time zone, double precision, character varying);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_mean_all_series_measures(integer, timestamp without time zone[], timestamp without time zone[], double precision[], character varying);
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+DROP FUNCTION bdoh_subsampled_mean_all_series_lengths(integer, timestamp without time zone[], timestamp without time zone[], double precision[], character varying);
+SQL
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_series_measures(
+    IN chroniqueid integer,
+    IN startdate timestamp without time zone,
+    IN enddate timestamp without time zone,
+    IN subinterval double precision)
+  RETURNS TABLE(milliseconds double precision, value double precision) AS
+$BODY$
+BEGIN
+	-- WITH clause yields measures with date in milliseconds, subinterval index (starting from zero) and value
+	-- First subselect (alias "vmin") yields, for each subinterval, the date & value for the measure with smallest value
+	-- Second subselect (alias "vmax") yields, for each subinterval, the date & value for the largest measure with greatest value
+	-- Finally, we append the very first & last measures in our date interval
+
+	RETURN QUERY
+		WITH miv(millisecs, index, val) AS (
+			SELECT 1000 * EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC'),
+			(EXTRACT(EPOCH FROM AGE(date, startDate))/subinterval)::INTEGER,
+			valeur
+			FROM mesure WHERE chronique_id = chroniqueId
+			AND date >= startDate AND date <= endDate
+			ORDER BY date
+		)
+		SELECT millisecs, val FROM (SELECT * FROM miv LIMIT 1) first_m -- very first measure
+		UNION
+		SELECT millisecs, val FROM -- row with min value per subinterval
+		(
+			SELECT ROW_NUMBER() OVER(PARTITION BY index ORDER BY value ASC) AS rank,
+			millisecs,
+			val
+			FROM miv
+		) vmin
+		WHERE vmin.rank = 1
+		UNION
+		SELECT millisecs, val FROM -- row with max value per subinterval
+		(
+			SELECT ROW_NUMBER() OVER(PARTITION BY index ORDER BY value DESC) AS rank,
+			millisecs,
+			val
+			FROM miv
+		) vmax
+		WHERE vmax.rank = 1
+		UNION
+		SELECT millisecs, val FROM (SELECT * FROM miv ORDER BY milliseconds DESC LIMIT 1) last_m -- very last measure
+		ORDER BY millisecs
+        ;
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_instantaneous_series_measures(integer, timestamp without time zone, timestamp without time zone, double precision)
+  OWNER TO bdoh;
+
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_all_series_measures(
+    IN chroniqueid integer,
+    IN startdates timestamp without time zone[],
+    IN enddates timestamp without time zone[],
+    IN subintervals double precision[])
+  RETURNS TABLE(milliseconds double precision, value double precision) AS
+$BODY$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT * FROM bdoh_subsampled_instantaneous_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i]);
+	END LOOP;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_instantaneous_all_series_measures(integer, timestamp without time zone[], timestamp without time zone[], double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_all_series_lengths(
+    IN chroniqueid integer,
+    IN startdates timestamp without time zone[],
+    IN enddates timestamp without time zone[],
+    IN subintervals double precision[])
+  RETURNS TABLE(measure_count bigint) AS
+$BODY$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT COUNT(*) FROM bdoh_subsampled_instantaneous_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i]);
+	END LOOP;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_instantaneous_all_series_lengths(integer, timestamp without time zone[], timestamp without time zone[], double precision[])
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_series_measures(
+    IN chroniqueid integer,
+    IN startdate timestamp without time zone,
+    IN enddate timestamp without time zone,
+    IN subinterval double precision,
+    IN direction character varying DEFAULT 'AHEAD'::character varying)
+  RETURNS TABLE(milliseconds double precision, value double precision) AS
+$BODY$
+DECLARE
+	directionDateFilter VARCHAR;
+	shiftedDate VARCHAR;
+	overallQuery VARCHAR;
+	intervalFirstDate DOUBLE PRECISION;
+	intervalLastDate DOUBLE PRECISION;
+BEGIN
+	SELECT 1000 * MIN(EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC')) INTO intervalFirstDate
+		FROM mesure WHERE chronique_id = chroniqueId AND date >= startDate;
+	SELECT 1000 * MAX(EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC')) INTO intervalLastDate
+		FROM mesure WHERE chronique_id = chroniqueId AND date <= endDate;
+
+	-- String replacement variables in ALL the stored procedure:
+	-- $1 = chroniqueId
+	-- $2 = startDate
+	-- $3 = endDate
+	-- $4 = subinterval
+	-- $5 = intervalFirstDate
+	-- $6 = intervalLastDate
+
+	CASE UPPER(direction)
+		WHEN 'AHEAD' THEN
+			directionDateFilter := 'AND date < (SELECT MAX(date) FROM mesure WHERE chronique_id = $1)';
+			shiftedDate := 'COALESCE(LEAD(date) OVER(obd),'
+				       '(SELECT MIN(date) FROM mesure WHERE chronique_id = $1 AND date > $3)'
+				       ')';
+		ELSE
+			directionDateFilter := 'AND date > (SELECT MIN(date) FROM mesure WHERE chronique_id = $1)';
+			shiftedDate := 'COALESCE(LAG(date) OVER(obd),'
+				       '(SELECT MAX(date) FROM mesure WHERE chronique_id = $1 AND date < $2)'
+				       ')';
+	END CASE;
+
+        overallQuery := 'WITH dsiiv(millisecs, shifted_ms, meas_index, intvl_index, val) AS ('
+			'	SELECT 1000 * EXTRACT(EPOCH FROM date AT TIME ZONE ''UTC''),'
+			'	1000 * EXTRACT(EPOCH FROM ' || shiftedDate || ' AT TIME ZONE ''UTC''),'
+			'	ROW_NUMBER() OVER(obd),'
+			'	(EXTRACT(EPOCH FROM age(date, $2))/$4)::INTEGER,'
+			'	valeur FROM mesure WHERE chronique_id = $1'
+			'	AND date >= $2 AND date <= $3 ' || directionDateFilter ||
+			'	WINDOW obd AS (ORDER BY date)'
+			'	ORDER BY date'
+			'), vmin(millisecs, shifted_ms, meas_index, rank, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index,'
+			'	ROW_NUMBER() OVER(PARTITION BY intvl_index ORDER BY val ASC),'
+			'	val FROM dsiiv'
+			'), vmin_filtered(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM vmin WHERE rank = 1'
+			'), vmax(millisecs, shifted_ms, meas_index, rank, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index,'
+			'	ROW_NUMBER() OVER(PARTITION BY intvl_index ORDER BY val DESC),'
+			'	val FROM dsiiv'
+			'), vmax_filtered(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM vmax WHERE rank = 1'
+			'), vfirst(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM dsiiv WHERE millisecs = $5'
+			'), vlast(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM dsiiv WHERE millisecs = $6'
+			')'
+			'SELECT millisecs, val FROM('
+			'	SELECT millisecs, val, meas_index FROM vfirst'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vfirst'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vmin_filtered'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vmin_filtered'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vmax_filtered'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vmax_filtered'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vlast'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vlast'
+			'	ORDER BY millisecs, meas_index'
+			') x'
+			;
+
+	RETURN QUERY EXECUTE overallQuery USING
+		chroniqueId, startDate, endDate, subinterval, intervalFirstDate, intervalLastDate;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_mean_series_measures(integer, timestamp without time zone, timestamp without time zone, double precision, character varying)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_all_series_measures(
+    IN chroniqueid integer,
+    IN startdates timestamp without time zone[],
+    IN enddates timestamp without time zone[],
+    IN subintervals double precision[],
+    IN direction character varying DEFAULT 'AHEAD'::character varying)
+  RETURNS TABLE(milliseconds double precision, value double precision) AS
+$BODY$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT * FROM bdoh_subsampled_mean_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i], direction);
+	END LOOP;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_mean_all_series_measures(integer, timestamp without time zone[], timestamp without time zone[], double precision[], character varying)
+  OWNER TO bdoh;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_all_series_lengths(
+    IN chroniqueid integer,
+    IN startdates timestamp without time zone[],
+    IN enddates timestamp without time zone[],
+    IN subintervals double precision[],
+    IN direction character varying DEFAULT 'AHEAD'::character varying)
+  RETURNS TABLE(measure_count bigint) AS
+$BODY$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT COUNT(*) FROM bdoh_subsampled_mean_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i], direction);
+	END LOOP;
+
+END;
+$BODY$
+  LANGUAGE plpgsql STABLE
+  COST 100
+  ROWS 1000;
+SQL
+        );
+        $this->addSql(
+            <<<'SQL'
+ALTER FUNCTION bdoh_subsampled_mean_all_series_lengths(integer, timestamp without time zone[], timestamp without time zone[], double precision[], character varying)
+  OWNER TO bdoh;
+SQL
+        );
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190129154614.php b/app/DoctrineMigrations/Version20190129154614.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5e9d5215bf1cd6278a564021c6f48bbb5befd44
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190129154614.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190129154614 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE courseau_observatoires');
+        $this->addSql('ALTER TABLE courseau ADD observatoire_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE courseau ADD CONSTRAINT FK_346196BA61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_346196BA61ED1B0D ON courseau (observatoire_id)');
+
+        // Tous les cours d'eaux existant à ce point vont dans l'observatoire YZERON
+        $this->addSql('UPDATE courseau SET observatoire_id=10');
+
+        $this->addSql('ALTER TABLE courseau ALTER observatoire_id DROP DEFAULT');
+        $this->addSql('ALTER TABLE courseau ALTER observatoire_id SET NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE courseau_observatoires (courseau_id INT NOT NULL, observatoire_id INT NOT NULL, PRIMARY KEY(courseau_id, observatoire_id))');
+        $this->addSql('CREATE INDEX idx_c05b50661ed1b0d ON courseau_observatoires (observatoire_id)');
+        $this->addSql('CREATE INDEX idx_c05b50632164871 ON courseau_observatoires (courseau_id)');
+        $this->addSql('ALTER TABLE courseau_observatoires ADD CONSTRAINT fk_c05b50632164871 FOREIGN KEY (courseau_id) REFERENCES courseau (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE courseau_observatoires ADD CONSTRAINT fk_c05b50661ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE CoursEau DROP CONSTRAINT FK_346196BA61ED1B0D');
+        $this->addSql('DROP INDEX IDX_346196BA61ED1B0D');
+        $this->addSql('ALTER TABLE CoursEau DROP observatoire_id');
+
+        // Tous les cours d'eaux existant à ce point retourne dans l'observatoire YZERON
+        $this->addSql('INSERT INTO courseau_observatoires (courseau_id, observatoire_id) SELECT id, 10 FROM courseau ON CONFLICT DO NOTHING');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190206150849.php b/app/DoctrineMigrations/Version20190206150849.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd0e957d40322b5f662029b15916db7206a7e247
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190206150849.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190206150849 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX uniq_660811f36c6e55b5');
+        $this->addSql('ALTER TABLE bassin ALTER observatoire_id SET NOT NULL');
+        $this->addSql('ALTER TABLE courseau ALTER codehydro DROP DEFAULT');
+        $this->addSql('CREATE UNIQUE INDEX uniqueBassinObservatoire ON bassin (nom, observatoire_id)');
+        $this->addSql('CREATE UNIQUE INDEX uniqueCoursEauObservatoire ON courseau (nom, observatoire_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX uniqueBassinObservatoire');
+        $this->addSql('ALTER TABLE Bassin ALTER observatoire_id DROP NOT NULL');
+        $this->addSql('CREATE UNIQUE INDEX uniq_660811f36c6e55b5 ON Bassin (nom)');
+        $this->addSql('DROP INDEX uniqueCoursEauObservatoire');
+        $this->addSql('ALTER TABLE courseau ALTER codehydro SET DEFAULT NULL::character varying');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190208155000.php b/app/DoctrineMigrations/Version20190208155000.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d99948d22d0dbf6399b812912e135f0f22430ce
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190208155000.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190208155000 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD nombreInserts INT DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP nombreInserts');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190208155010.php b/app/DoctrineMigrations/Version20190208155010.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfcaeabe883f928ffc73701b38d84cfa13016b3a
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190208155010.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190208155010 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE commune DROP latitude');
+        $this->addSql('ALTER TABLE commune DROP longitude');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Commune ADD latitude DOUBLE PRECISION DEFAULT NULL');
+        $this->addSql('ALTER TABLE Commune ADD longitude DOUBLE PRECISION DEFAULT NULL');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190208155842.php b/app/DoctrineMigrations/Version20190208155842.php
new file mode 100644
index 0000000000000000000000000000000000000000..db7166242981771fa40e1236eea15bfbacf81ed7
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190208155842.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190208155842 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE FamilleParametres_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE FamilleParametres (id INT NOT NULL, nom VARCHAR(255) NOT NULL, nomEn VARCHAR(255) NOT NULL, familleParente_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_163312BC6C6E55B5 ON FamilleParametres (nom)');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_163312BCE46E7608 ON FamilleParametres (nomEn)');
+        $this->addSql('CREATE INDEX IDX_163312BCE09DE74B ON FamilleParametres (familleParente_id)');
+        $this->addSql('ALTER TABLE FamilleParametres ADD CONSTRAINT FK_163312BCE09DE74B FOREIGN KEY (familleParente_id) REFERENCES FamilleParametres (id) ON DELETE RESTRICT NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE typeparametre ADD familleParametres_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE typeparametre ADD CONSTRAINT FK_7E773B8B77DD839C FOREIGN KEY (familleParametres_id) REFERENCES FamilleParametres (id) ON DELETE RESTRICT NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_7E773B8B77DD839C ON typeparametre (familleParametres_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE FamilleParametres DROP CONSTRAINT FK_163312BCE09DE74B');
+        $this->addSql('ALTER TABLE TypeParametre DROP CONSTRAINT FK_7E773B8B77DD839C');
+        $this->addSql('DROP SEQUENCE FamilleParametres_id_seq CASCADE');
+        $this->addSql('DROP TABLE FamilleParametres');
+        $this->addSql('DROP INDEX IDX_7E773B8B77DD839C');
+        $this->addSql('ALTER TABLE TypeParametre DROP familleParametres_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190211132109.php b/app/DoctrineMigrations/Version20190211132109.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a56a38ffa674da0a39906b1ddb588bdcc974e87
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190211132109.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190211132109 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD familleparametres_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD familleparente_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CC4A3C869 FOREIGN KEY (familleparametres_id) REFERENCES FamilleParametres (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CAFC0E49B FOREIGN KEY (familleparente_id) REFERENCES FamilleParametres (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CC4A3C869 ON historique (familleparametres_id)');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CAFC0E49B ON historique (familleparente_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CC4A3C869');
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CAFC0E49B');
+        $this->addSql('DROP INDEX IDX_A2E2D63CC4A3C869');
+        $this->addSql('DROP INDEX IDX_A2E2D63CAFC0E49B');
+        $this->addSql('ALTER TABLE Historique DROP familleparametres_id');
+        $this->addSql('ALTER TABLE Historique DROP familleparente_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190213133602.php b/app/DoctrineMigrations/Version20190213133602.php
new file mode 100644
index 0000000000000000000000000000000000000000..c695169d8c7f3bb33852a1af1ad76d0d53608eab
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190213133602.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190213133602 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE familleparametres ADD prefix VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE FamilleParametres DROP prefix');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190221091941.php b/app/DoctrineMigrations/Version20190221091941.php
new file mode 100644
index 0000000000000000000000000000000000000000..c28f16152c73c7bd1e446a5dca0424a5d83ec4bf
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190221091941.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190221091941 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("UPDATE categorie SET libelleen='Administration' WHERE id = '12'");
+        $this->addSql("UPDATE categorie SET libelleen='Other' WHERE id = '14'");
+        $this->addSql("UPDATE categorie SET libelleen='Engineering consultant' WHERE id = '9'");
+        $this->addSql("UPDATE categorie SET libelleen='Researcher' WHERE id = '8'");
+        $this->addSql("UPDATE categorie SET libelleen='Local authority' WHERE id = '10'");
+        $this->addSql("UPDATE categorie SET libelleen='Company' WHERE id = '11'");
+        $this->addSql("UPDATE categorie SET libelleen='Private individual' WHERE id = '13'");
+
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Agrosystem' WHERE id = '21'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Land use planning' WHERE id = '22'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Biodiversity' WHERE id = '23'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Biogeochemistry' WHERE id = '24'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Climate change' WHERE id = '25'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Ecology' WHERE id = '26'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Landscape ecology' WHERE id = '27'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geochemistry' WHERE id = '28'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geology' WHERE id = '29'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geophysics' WHERE id = '30'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Water resource management' WHERE id = '31'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydraulics' WHERE id = '32'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydrogeology' WHERE id = '33'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydrology' WHERE id = '34'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Meteorology' WHERE id = '35'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Microbiologie' WHERE id = '36'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Micropollutants' WHERE id = '37'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Pedology' WHERE id = '38'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Humanities' WHERE id = '39'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Remote sensing' WHERE id = '40'");
+
+        $this->addSql("UPDATE typetravaux SET libelleen='Other' WHERE id = '8'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Education' WHERE id = '6'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Study' WHERE id = '7'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Research' WHERE id = '5'");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+    }
+}
diff --git a/app/DoctrineMigrations/Version20190221102138.php b/app/DoctrineMigrations/Version20190221102138.php
new file mode 100644
index 0000000000000000000000000000000000000000..497c6e4fe97f1ca41baab753a7df42eb47d5cfa2
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190221102138.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20190221102138 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql("UPDATE categorie SET libelleen='Administration' WHERE id = '12'");
+        $this->addSql("UPDATE categorie SET libelleen='Other' WHERE id = '14'");
+        $this->addSql("UPDATE categorie SET libelleen='Engineering consultant' WHERE id = '9'");
+        $this->addSql("UPDATE categorie SET libelleen='Researcher' WHERE id = '8'");
+        $this->addSql("UPDATE categorie SET libelleen='Local authority' WHERE id = '10'");
+        $this->addSql("UPDATE categorie SET libelleen='Company' WHERE id = '11'");
+        $this->addSql("UPDATE categorie SET libelleen='Private individual' WHERE id = '13'");
+
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Agrosystem' WHERE id = '21'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Land use planning' WHERE id = '22'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Biodiversity' WHERE id = '23'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Biogeochemistry' WHERE id = '24'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Climate change' WHERE id = '25'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Ecology' WHERE id = '26'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Landscape ecology' WHERE id = '27'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geochemistry' WHERE id = '28'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geology' WHERE id = '29'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Geophysics' WHERE id = '30'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Water resource management' WHERE id = '31'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydraulics' WHERE id = '32'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydrogeology' WHERE id = '33'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Hydrology' WHERE id = '34'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Meteorology' WHERE id = '35'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Microbiology' WHERE id = '36'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Micropollutants' WHERE id = '37'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Pedology' WHERE id = '38'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Humanities' WHERE id = '39'");
+        $this->addSql("UPDATE objectifrecherche SET libelleen='Remote sensing' WHERE id = '40'");
+
+        $this->addSql("UPDATE typetravaux SET libelleen='Other' WHERE id = '8'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Education' WHERE id = '6'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Consulting / design project' WHERE id = '7'");
+        $this->addSql("UPDATE typetravaux SET libelleen='Research' WHERE id = '5'");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201126141800.php b/app/DoctrineMigrations/Version20201126141800.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdf7883211695b878030801b65b2f7abb9926c81
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201126141800.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201126141800 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE partenaire ADD typeFunding VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire ADD estFinanceur BOOLEAN NOT NULL DEFAULT FALSE');
+        $this->addSql('ALTER TABLE partenaire ADD iso VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire ADD scanR VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Partenaire DROP typeFunding');
+        $this->addSql('ALTER TABLE Partenaire DROP estFinanceur');
+        $this->addSql('ALTER TABLE Partenaire DROP iso');
+        $this->addSql('ALTER TABLE Partenaire DROP scanR');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201201084410.php b/app/DoctrineMigrations/Version20201201084410.php
new file mode 100644
index 0000000000000000000000000000000000000000..4019db919ccfae13dae7ab51eda65cf19cac6b98
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201201084410.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201201084410 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ADD theiaCode VARCHAR(4) DEFAULT NULL');
+        $this->addSql('ALTER TABLE observatoire ADD titre VARCHAR(255) DEFAULT NULL ');
+        $this->addSql('ALTER TABLE observatoire ADD email VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Observatoire DROP theiaCode');
+        $this->addSql('ALTER TABLE Observatoire DROP titre');
+        $this->addSql('ALTER TABLE Observatoire DROP email');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201208134920.php b/app/DoctrineMigrations/Version20201208134920.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e18425b70af8d7057c7b9c2f5f021098c003902
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201208134920.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201208134920 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE DataSet_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE DataSet (id INT NOT NULL, titre VARCHAR(255) DEFAULT NULL, description VARCHAR(750) DEFAULT NULL, genealogie VARCHAR(255) DEFAULT NULL, topicCategory VARCHAR(255) DEFAULT NULL, themeInpire VARCHAR(255) DEFAULT NULL, portailSearchCriteriaClimat VARCHAR(255) DEFAULT NULL, portailSearchCriteriaGeology VARCHAR(255) DEFAULT NULL, dataConstraint VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE DataSet_id_seq CASCADE');
+        $this->addSql('DROP TABLE DataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201210144205.php b/app/DoctrineMigrations/Version20201210144205.php
new file mode 100644
index 0000000000000000000000000000000000000000..5dc5cec2aa36628ceefe58677208928d4dd922ce
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201210144205.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201210144205 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ALTER titre SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER description SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER genealogie SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER topiccategory SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER themeinpire SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriaclimat SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriageology SET NOT NULL');
+        $this->addSql('ALTER TABLE dataset ALTER dataconstraint SET NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet ALTER titre DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER description DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER genealogie DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER topicCategory DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER themeInpire DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaClimat DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaGeology DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ALTER dataConstraint DROP NOT NULL');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201211150444.php b/app/DoctrineMigrations/Version20201211150444.php
new file mode 100644
index 0000000000000000000000000000000000000000..c92c887059413796c17efad1dbf21935caa4a4af
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201211150444.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201211150444 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ALTER topiccategory TYPE TEXT');
+        $this->addSql('ALTER TABLE dataset ALTER topiccategory DROP DEFAULT');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriaclimat TYPE TEXT');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriaclimat DROP DEFAULT');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriageology TYPE TEXT');
+        $this->addSql('ALTER TABLE dataset ALTER portailsearchcriteriageology DROP DEFAULT');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet ALTER topicCategory TYPE VARCHAR(255)');
+        $this->addSql('ALTER TABLE DataSet ALTER topicCategory DROP DEFAULT');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaClimat TYPE VARCHAR(255)');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaClimat DROP DEFAULT');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaGeology TYPE VARCHAR(255)');
+        $this->addSql('ALTER TABLE DataSet ALTER portailSearchCriteriaGeology DROP DEFAULT');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201214115639.php b/app/DoctrineMigrations/Version20201214115639.php
new file mode 100644
index 0000000000000000000000000000000000000000..64ba5c71eb849f49d97bd4ba78756c06d1fa4352
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201214115639.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201214115639 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('CREATE SEQUENCE TopicCategory_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE TopicCategory (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE topicCat_DataSet (dataset_id INT NOT NULL, topiccategory_id INT NOT NULL, PRIMARY KEY(dataset_id, topiccategory_id))');
+        $this->addSql('CREATE INDEX IDX_40656D7FD47C2D1B ON topicCat_DataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_40656D7FB45EC3B0 ON topicCat_DataSet (topiccategory_id)');
+        $this->addSql('ALTER TABLE topicCat_DataSet ADD CONSTRAINT FK_40656D7FD47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topicCat_DataSet ADD CONSTRAINT FK_40656D7FB45EC3B0 FOREIGN KEY (topiccategory_id) REFERENCES TopicCategory (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset DROP topiccategory');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE topicCat_DataSet DROP CONSTRAINT FK_40656D7FB45EC3B0');
+        $this->addSql('DROP SEQUENCE TopicCategory_id_seq CASCADE');
+        $this->addSql('DROP TABLE TopicCategory');
+        $this->addSql('DROP TABLE topicCat_DataSet');
+        $this->addSql('COMMENT ON COLUMN jms_jobs.args IS NULL');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+        $this->addSql('ALTER TABLE DataSet ADD topiccategory TEXT NOT NULL');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201214130251.php b/app/DoctrineMigrations/Version20201214130251.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac215912ca8edc3d685434db9c920a1cdf2020e0
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201214130251.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201214130251 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE topic_category_dataSet (dataset_id INT NOT NULL, topiccategory_id INT NOT NULL, PRIMARY KEY(dataset_id, topiccategory_id))');
+        $this->addSql('CREATE INDEX IDX_6FC9B40ED47C2D1B ON topic_category_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_6FC9B40EB45EC3B0 ON topic_category_dataSet (topiccategory_id)');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT FK_6FC9B40ED47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT FK_6FC9B40EB45EC3B0 FOREIGN KEY (topiccategory_id) REFERENCES TopicCategory (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE topiccat_dataset');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE topiccat_dataset (dataset_id INT NOT NULL, topiccategory_id INT NOT NULL, PRIMARY KEY(dataset_id, topiccategory_id))');
+        $this->addSql('CREATE INDEX idx_40656d7fb45ec3b0 ON topiccat_dataset (topiccategory_id)');
+        $this->addSql('CREATE INDEX idx_40656d7fd47c2d1b ON topiccat_dataset (dataset_id)');
+        $this->addSql('ALTER TABLE topiccat_dataset ADD CONSTRAINT fk_40656d7fd47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topiccat_dataset ADD CONSTRAINT fk_40656d7fb45ec3b0 FOREIGN KEY (topiccategory_id) REFERENCES topiccategory (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE topic_category_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201214152230.php b/app/DoctrineMigrations/Version20201214152230.php
new file mode 100644
index 0000000000000000000000000000000000000000..f805626e9670f0f3f391d984ccd97cef1a3d17c7
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201214152230.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201214152230 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE CriteriaClimat_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE CriteriaGeology_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE CriteriaClimat (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE CriteriaGeology (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE criteria_geology_dataSet (dataset_id INT NOT NULL, criteriageology_id INT NOT NULL, PRIMARY KEY(dataset_id, criteriageology_id))');
+        $this->addSql('CREATE INDEX IDX_5C567A19D47C2D1B ON criteria_geology_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_5C567A1979262535 ON criteria_geology_dataSet (criteriageology_id)');
+        $this->addSql('CREATE TABLE criteria_climat_dataSet (dataset_id INT NOT NULL, criteriaclimat_id INT NOT NULL, PRIMARY KEY(dataset_id, criteriaclimat_id))');
+        $this->addSql('CREATE INDEX IDX_1F40E8D1D47C2D1B ON criteria_climat_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_1F40E8D12929DC79 ON criteria_climat_dataSet (criteriaclimat_id)');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet ADD CONSTRAINT FK_5C567A19D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet ADD CONSTRAINT FK_5C567A1979262535 FOREIGN KEY (criteriageology_id) REFERENCES CriteriaGeology (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet ADD CONSTRAINT FK_1F40E8D1D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet ADD CONSTRAINT FK_1F40E8D12929DC79 FOREIGN KEY (criteriaclimat_id) REFERENCES CriteriaClimat (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset DROP portailsearchcriteriaclimat');
+        $this->addSql('ALTER TABLE dataset DROP portailsearchcriteriageology');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE criteria_climat_dataSet DROP CONSTRAINT FK_1F40E8D12929DC79');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet DROP CONSTRAINT FK_5C567A1979262535');
+        $this->addSql('DROP SEQUENCE CriteriaClimat_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE CriteriaGeology_id_seq CASCADE');
+        $this->addSql('DROP TABLE CriteriaClimat');
+        $this->addSql('DROP TABLE CriteriaGeology');
+        $this->addSql('DROP TABLE criteria_geology_dataSet');
+        $this->addSql('DROP TABLE criteria_climat_dataSet');
+        $this->addSql('ALTER TABLE DataSet ADD portailsearchcriteriaclimat TEXT NOT NULL');
+        $this->addSql('ALTER TABLE DataSet ADD portailsearchcriteriageology TEXT NOT NULL');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201216123608.php b/app/DoctrineMigrations/Version20201216123608.php
new file mode 100644
index 0000000000000000000000000000000000000000..b09f63408f668520ea5a1697cf8af5b8f9c8df00
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201216123608.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201216123608 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE TypeFunding_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE TypeFunding (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('ALTER TABLE partenaire ADD typeFundings_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire DROP typefunding');
+        $this->addSql('ALTER TABLE partenaire ADD CONSTRAINT FK_7DA2A0A31C1A21A7 FOREIGN KEY (typeFundings_id) REFERENCES TypeFunding (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_7DA2A0A31C1A21A7 ON partenaire (typeFundings_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Partenaire DROP CONSTRAINT FK_7DA2A0A31C1A21A7');
+        $this->addSql('DROP SEQUENCE TypeFunding_id_seq CASCADE');
+        $this->addSql('DROP TABLE TypeFunding');
+        $this->addSql('DROP INDEX IDX_7DA2A0A31C1A21A7');
+        $this->addSql('ALTER TABLE Partenaire ADD typefunding VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE Partenaire DROP typeFundings_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201216130634.php b/app/DoctrineMigrations/Version20201216130634.php
new file mode 100644
index 0000000000000000000000000000000000000000..b571245aefdf5b41363d60582b1c014f13b11cdb
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201216130634.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201216130634 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE partenaire DROP CONSTRAINT fk_7da2a0a31c1a21a7');
+        $this->addSql('ALTER TABLE partenaire ADD CONSTRAINT FK_7DA2A0A39A86AE70 FOREIGN KEY (typefundings_id) REFERENCES TypeFunding (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER INDEX idx_7da2a0a31c1a21a7 RENAME TO IDX_7DA2A0A39A86AE70');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Partenaire DROP CONSTRAINT FK_7DA2A0A39A86AE70');
+        $this->addSql('ALTER TABLE Partenaire ADD CONSTRAINT fk_7da2a0a31c1a21a7 FOREIGN KEY (typefundings_id) REFERENCES typefunding (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER INDEX idx_7da2a0a39a86ae70 RENAME TO idx_7da2a0a31c1a21a7');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20201222095656.php b/app/DoctrineMigrations/Version20201222095656.php
new file mode 100644
index 0000000000000000000000000000000000000000..94c65d3cd33f0c096f235c6e36fa5aeebd90fd2e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20201222095656.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20201222095656 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE DataConstraint_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE DataConstraint (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('ALTER TABLE dataset ADD dataconstraints_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset DROP dataconstraint');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EACD8B5F69 FOREIGN KEY (dataconstraints_id) REFERENCES DataConstraint (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EACD8B5F69 ON dataset (dataconstraints_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EACD8B5F69');
+        $this->addSql('DROP SEQUENCE DataConstraint_id_seq CASCADE');
+        $this->addSql('DROP TABLE DataConstraint');
+        $this->addSql('DROP INDEX IDX_40503EACD8B5F69');
+        $this->addSql('ALTER TABLE DataSet ADD dataconstraint VARCHAR(255) NOT NULL');
+        $this->addSql('ALTER TABLE DataSet DROP dataconstraints_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210105133542.php b/app/DoctrineMigrations/Version20210105133542.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9b326d59d374a17a33d818c0e3419680f75b152
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210105133542.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210105133542 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('CREATE SEQUENCE ContactOrganisationRole_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE ContactOrganisationRole (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('ALTER TABLE partenaire ADD roleorganisation_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire ADD CONSTRAINT FK_7DA2A0A32B9B7B3C FOREIGN KEY (roleorganisation_id) REFERENCES ContactOrganisationRole (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_7DA2A0A32B9B7B3C ON partenaire (roleorganisation_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('ALTER TABLE Partenaire DROP CONSTRAINT FK_7DA2A0A32B9B7B3C');
+        $this->addSql('DROP SEQUENCE ContactOrganisationRole_id_seq CASCADE');
+        $this->addSql('DROP TABLE ContactOrganisationRole');
+        $this->addSql('DROP INDEX IDX_7DA2A0A32B9B7B3C');
+        $this->addSql('ALTER TABLE Partenaire DROP roleorganisation_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210106095741.php b/app/DoctrineMigrations/Version20210106095741.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2a6bf5da65b5849fa10bebb44de4db597f0fa3d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210106095741.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210106095741 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE PersonneTheia_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE PersonneTheia (id INT NOT NULL, nom VARCHAR(255) NOT NULL, prenom VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE utilisateur_personnetheia (utilisateur_id INT NOT NULL, personnetheia_id INT NOT NULL, PRIMARY KEY(utilisateur_id, personnetheia_id))');
+        $this->addSql('CREATE INDEX IDX_6DC1E190FB88E14F ON utilisateur_personnetheia (utilisateur_id)');
+        $this->addSql('CREATE INDEX IDX_6DC1E19089274090 ON utilisateur_personnetheia (personnetheia_id)');
+        $this->addSql('ALTER TABLE utilisateur_personnetheia ADD CONSTRAINT FK_6DC1E190FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE utilisateur_personnetheia ADD CONSTRAINT FK_6DC1E19089274090 FOREIGN KEY (personnetheia_id) REFERENCES PersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE utilisateur_personnetheia DROP CONSTRAINT FK_6DC1E19089274090');
+        $this->addSql('DROP SEQUENCE PersonneTheia_id_seq CASCADE');
+        $this->addSql('DROP TABLE PersonneTheia');
+        $this->addSql('DROP TABLE utilisateur_personnetheia');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210106125901.php b/app/DoctrineMigrations/Version20210106125901.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d874a5825ebcab84120367f6b09aef102d97fb6
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210106125901.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210106125901 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE RolePersonneTheia_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE RolePersonneTheia (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE RolePersonneTheia_id_seq CASCADE');
+        $this->addSql('DROP TABLE RolePersonneTheia');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210106145144.php b/app/DoctrineMigrations/Version20210106145144.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3dd5407b0f2e9a120020c75b8a4418f5114c170
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210106145144.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210106145144 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE PersonneTheiaEtRolePersonneTheia_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE PersonneTheiaEtRolePersonneTheia (id INT NOT NULL, personnetheia_id INT DEFAULT NULL, rolepersonnetheia_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_76F8E79089274090 ON PersonneTheiaEtRolePersonneTheia (personnetheia_id)');
+        $this->addSql('CREATE INDEX IDX_76F8E7903B2FBBD6 ON PersonneTheiaEtRolePersonneTheia (rolepersonnetheia_id)');
+        $this->addSql('CREATE TABLE contact_theia_dataSet (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX IDX_A311B0E2D47C2D1B ON contact_theia_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_A311B0E2CD8785EC ON contact_theia_dataSet (contacttheia_id)');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ADD CONSTRAINT FK_76F8E79089274090 FOREIGN KEY (personnetheia_id) REFERENCES PersonneTheia (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ADD CONSTRAINT FK_76F8E7903B2FBBD6 FOREIGN KEY (rolepersonnetheia_id) REFERENCES RolePersonneTheia (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE contact_theia_dataSet ADD CONSTRAINT FK_A311B0E2D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE contact_theia_dataSet ADD CONSTRAINT FK_A311B0E2CD8785EC FOREIGN KEY (contacttheia_id) REFERENCES PersonneTheiaEtRolePersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE contact_theia_dataSet DROP CONSTRAINT FK_A311B0E2CD8785EC');
+        $this->addSql('DROP SEQUENCE PersonneTheiaEtRolePersonneTheia_id_seq CASCADE');
+        $this->addSql('DROP TABLE PersonneTheiaEtRolePersonneTheia');
+        $this->addSql('DROP TABLE contact_theia_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210107110857.php b/app/DoctrineMigrations/Version20210107110857.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8a442e07ff5603f07c9fd6377544749f6547004
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210107110857.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210107110857 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia ADD nom VARCHAR(255)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia DROP nom');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210108154655.php b/app/DoctrineMigrations/Version20210108154655.php
new file mode 100644
index 0000000000000000000000000000000000000000..68bd45627acb467f5af8e27346b65393ffeba4d4
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210108154655.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210108154655 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE personnetheia ADD partenaires_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E338898CF5 FOREIGN KEY (partenaires_id) REFERENCES Partenaire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_3BA3D4E338898CF5 ON personnetheia (partenaires_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT FK_3BA3D4E338898CF5');
+        $this->addSql('DROP INDEX IDX_3BA3D4E338898CF5');
+        $this->addSql('ALTER TABLE PersonneTheia DROP partenaires_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210111133603.php b/app/DoctrineMigrations/Version20210111133603.php
new file mode 100644
index 0000000000000000000000000000000000000000..91c8d21622c1b0b4ce05e2ca26bea7b79e94e8f8
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210111133603.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210111133603 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE utilisateur_personnetheia');
+        $this->addSql('ALTER TABLE personnetheia ADD utilisateur_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E3FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_3BA3D4E3FB88E14F ON personnetheia (utilisateur_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE utilisateur_personnetheia (utilisateur_id INT NOT NULL, personnetheia_id INT NOT NULL, PRIMARY KEY(utilisateur_id, personnetheia_id))');
+        $this->addSql('CREATE INDEX idx_6dc1e19089274090 ON utilisateur_personnetheia (personnetheia_id)');
+        $this->addSql('CREATE INDEX idx_6dc1e190fb88e14f ON utilisateur_personnetheia (utilisateur_id)');
+        $this->addSql('ALTER TABLE utilisateur_personnetheia ADD CONSTRAINT fk_6dc1e190fb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE utilisateur_personnetheia ADD CONSTRAINT fk_6dc1e19089274090 FOREIGN KEY (personnetheia_id) REFERENCES personnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ALTER nom DROP NOT NULL');
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT FK_3BA3D4E3FB88E14F');
+        $this->addSql('DROP INDEX IDX_3BA3D4E3FB88E14F');
+        $this->addSql('ALTER TABLE PersonneTheia DROP utilisateur_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210113120457.php b/app/DoctrineMigrations/Version20210113120457.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4e34599c787a96838b5e4391973015e10cb5a1a
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210113120457.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210113120457 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ADD conditionsUtilisation VARCHAR(255)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP conditionsUtilisation');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210114130132.php b/app/DoctrineMigrations/Version20210114130132.php
new file mode 100644
index 0000000000000000000000000000000000000000..740e0fe35295bc1ceff1581b3176a3a45266b169
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210114130132.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210114130132 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia DROP CONSTRAINT FK_76F8E79089274090');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia DROP CONSTRAINT FK_76F8E7903B2FBBD6');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia DROP nom');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia ADD CONSTRAINT FK_76F8E79089274090 FOREIGN KEY (personnetheia_id) REFERENCES PersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia ADD CONSTRAINT FK_76F8E7903B2FBBD6 FOREIGN KEY (rolepersonnetheia_id) REFERENCES RolePersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia DROP CONSTRAINT fk_76f8e79089274090');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia DROP CONSTRAINT fk_76f8e7903b2fbbd6');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ADD nom VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ADD CONSTRAINT fk_76f8e79089274090 FOREIGN KEY (personnetheia_id) REFERENCES personnetheia (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PersonneTheiaEtRolePersonneTheia ADD CONSTRAINT fk_76f8e7903b2fbbd6 FOREIGN KEY (rolepersonnetheia_id) REFERENCES rolepersonnetheia (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210114132405.php b/app/DoctrineMigrations/Version20210114132405.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f3c6522bd0e66982001ef0a9477169728157930
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210114132405.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210114132405 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE partenaire DROP CONSTRAINT fk_7da2a0a32b9b7b3c');
+        $this->addSql('DROP SEQUENCE bdoh.contactorganisationrole_id_seq CASCADE');
+        $this->addSql('DROP TABLE contactorganisationrole');
+        $this->addSql('ALTER TABLE personnetheia DROP CONSTRAINT FK_3BA3D4E338898CF5');
+        $this->addSql('ALTER TABLE personnetheia DROP CONSTRAINT FK_3BA3D4E3FB88E14F');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E338898CF5 FOREIGN KEY (partenaires_id) REFERENCES Partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E3FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset DROP CONSTRAINT FK_40503EACD8B5F69');
+        $this->addSql('ALTER TABLE dataset DROP conditionsutilisation');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EACD8B5F69 FOREIGN KEY (dataconstraints_id) REFERENCES DataConstraint (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP INDEX idx_7da2a0a32b9b7b3c');
+        $this->addSql('ALTER TABLE partenaire DROP roleorganisation_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE bdoh.contactorganisationrole_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE contactorganisationrole (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+        $this->addSql('ALTER TABLE Partenaire ADD roleorganisation_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE Partenaire ADD CONSTRAINT fk_7da2a0a32b9b7b3c FOREIGN KEY (roleorganisation_id) REFERENCES contactorganisationrole (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_7da2a0a32b9b7b3c ON Partenaire (roleorganisation_id)');
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT fk_40503eacd8b5f69');
+        $this->addSql('ALTER TABLE DataSet ADD conditionsutilisation VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE DataSet ADD CONSTRAINT fk_40503eacd8b5f69 FOREIGN KEY (dataconstraints_id) REFERENCES dataconstraint (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT fk_3ba3d4e338898cf5');
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT fk_3ba3d4e3fb88e14f');
+        $this->addSql('ALTER TABLE PersonneTheia ADD CONSTRAINT fk_3ba3d4e338898cf5 FOREIGN KEY (partenaires_id) REFERENCES partenaire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PersonneTheia ADD CONSTRAINT fk_3ba3d4e3fb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210114150144.php b/app/DoctrineMigrations/Version20210114150144.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ea42ad955e07e2e0479b57e18c389afa5e63c17
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210114150144.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210114150144 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE personne_theia_et_role_personne_theia_observatoire (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX IDX_850435DFD47C2D1B ON personne_theia_et_role_personne_theia_observatoire (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_850435DFCD8785EC ON personne_theia_et_role_personne_theia_observatoire (contacttheia_id)');
+        $this->addSql('CREATE TABLE personne_theia_et_role_personne_theia_theia_dataSet (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX IDX_EF59972BD47C2D1B ON personne_theia_et_role_personne_theia_theia_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_EF59972BCD8785EC ON personne_theia_et_role_personne_theia_theia_dataSet (contacttheia_id)');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_observatoire ADD CONSTRAINT FK_850435DFD47C2D1B FOREIGN KEY (dataset_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_observatoire ADD CONSTRAINT FK_850435DFCD8785EC FOREIGN KEY (contacttheia_id) REFERENCES PersonneTheiaEtRolePersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_theia_dataSet ADD CONSTRAINT FK_EF59972BD47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_theia_dataSet ADD CONSTRAINT FK_EF59972BCD8785EC FOREIGN KEY (contacttheia_id) REFERENCES PersonneTheiaEtRolePersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE contact_theia_dataset');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE contact_theia_dataset (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX idx_a311b0e2cd8785ec ON contact_theia_dataset (contacttheia_id)');
+        $this->addSql('CREATE INDEX idx_a311b0e2d47c2d1b ON contact_theia_dataset (dataset_id)');
+        $this->addSql('ALTER TABLE contact_theia_dataset ADD CONSTRAINT fk_a311b0e2d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE contact_theia_dataset ADD CONSTRAINT fk_a311b0e2cd8785ec FOREIGN KEY (contacttheia_id) REFERENCES personnetheiaetrolepersonnetheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE personne_theia_et_role_personne_theia_observatoire');
+        $this->addSql('DROP TABLE personne_theia_et_role_personne_theia_theia_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210119151812.php b/app/DoctrineMigrations/Version20210119151812.php
new file mode 100644
index 0000000000000000000000000000000000000000..508d14ecaef636c7952d9493ddf08ea704ad6875
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210119151812.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210119151812 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DELETE FROM Partenaire');
+        $this->addSql('DROP TABLE observatoires_partenaires_institutionnels');
+        $this->addSql('DROP TABLE observatoires_partenaires_scientifiques');
+        $this->addSql('ALTER TABLE partenaire ADD observatoire_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire ALTER estfinanceur DROP DEFAULT');
+        $this->addSql('ALTER TABLE partenaire ADD CONSTRAINT FK_7DA2A0A361ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_7DA2A0A361ED1B0D ON partenaire (observatoire_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE observatoires_partenaires_institutionnels (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX idx_ddfc381e98de13ac ON observatoires_partenaires_institutionnels (partenaire_id)');
+        $this->addSql('CREATE INDEX idx_ddfc381e61ed1b0d ON observatoires_partenaires_institutionnels (observatoire_id)');
+        $this->addSql('CREATE TABLE observatoires_partenaires_scientifiques (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX idx_5c80b31d61ed1b0d ON observatoires_partenaires_scientifiques (observatoire_id)');
+        $this->addSql('CREATE INDEX idx_5c80b31d98de13ac ON observatoires_partenaires_scientifiques (partenaire_id)');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT fk_ddfc381e98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_institutionnels ADD CONSTRAINT fk_ddfc381e61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT fk_5c80b31d98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_partenaires_scientifiques ADD CONSTRAINT fk_5c80b31d61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Partenaire DROP CONSTRAINT FK_7DA2A0A361ED1B0D');
+        $this->addSql('DROP INDEX IDX_7DA2A0A361ED1B0D');
+        $this->addSql('ALTER TABLE Partenaire DROP observatoire_id');
+        $this->addSql('ALTER TABLE Partenaire ALTER estFinanceur SET DEFAULT \'false\'');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210120125300.php b/app/DoctrineMigrations/Version20210120125300.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6ab15de17b83ad2f30c43c747fa724e8f8a256b
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210120125300.php
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210120125300 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia DROP CONSTRAINT fk_76f8e7903b2fbbd6');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_observatoire DROP CONSTRAINT fk_850435dfcd8785ec');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_theia_dataset DROP CONSTRAINT fk_ef59972bcd8785ec');
+        $this->addSql('DROP SEQUENCE bdoh.personnetheiaetrolepersonnetheia_id_seq CASCADE');
+        $this->addSql('DROP SEQUENCE bdoh.rolepersonnetheia_id_seq CASCADE');
+        $this->addSql('CREATE TABLE observatoires_data_manager (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_26C6793A61ED1B0D ON observatoires_data_manager (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_26C6793A98DE13AC ON observatoires_data_manager (partenaire_id)');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD CONSTRAINT FK_26C6793A61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD CONSTRAINT FK_26C6793A98DE13AC FOREIGN KEY (partenaire_id) REFERENCES PersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE rolepersonnetheia');
+        $this->addSql('DROP TABLE personnetheiaetrolepersonnetheia');
+        $this->addSql('DROP TABLE personne_theia_et_role_personne_theia_observatoire');
+        $this->addSql('DROP TABLE personne_theia_et_role_personne_theia_theia_dataset');
+        $this->addSql('ALTER TABLE observatoire ADD projectLeader_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE observatoire ADD CONSTRAINT FK_90B54B32E26A02CC FOREIGN KEY (projectLeader_id) REFERENCES PersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_90B54B32EC0C1EEE ON observatoire (theiaCode)');
+        $this->addSql('CREATE INDEX IDX_90B54B32E26A02CC ON observatoire (projectLeader_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE bdoh.personnetheiaetrolepersonnetheia_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE SEQUENCE bdoh.rolepersonnetheia_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE rolepersonnetheia (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE personnetheiaetrolepersonnetheia (id INT NOT NULL, personnetheia_id INT DEFAULT NULL, rolepersonnetheia_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX idx_76f8e7903b2fbbd6 ON personnetheiaetrolepersonnetheia (rolepersonnetheia_id)');
+        $this->addSql('CREATE INDEX idx_76f8e79089274090 ON personnetheiaetrolepersonnetheia (personnetheia_id)');
+        $this->addSql('CREATE TABLE personne_theia_et_role_personne_theia_observatoire (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX idx_850435dfcd8785ec ON personne_theia_et_role_personne_theia_observatoire (contacttheia_id)');
+        $this->addSql('CREATE INDEX idx_850435dfd47c2d1b ON personne_theia_et_role_personne_theia_observatoire (dataset_id)');
+        $this->addSql('CREATE TABLE personne_theia_et_role_personne_theia_theia_dataset (dataset_id INT NOT NULL, contacttheia_id INT NOT NULL, PRIMARY KEY(dataset_id, contacttheia_id))');
+        $this->addSql('CREATE INDEX idx_ef59972bcd8785ec ON personne_theia_et_role_personne_theia_theia_dataset (contacttheia_id)');
+        $this->addSql('CREATE INDEX idx_ef59972bd47c2d1b ON personne_theia_et_role_personne_theia_theia_dataset (dataset_id)');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia ADD CONSTRAINT fk_76f8e7903b2fbbd6 FOREIGN KEY (rolepersonnetheia_id) REFERENCES rolepersonnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personnetheiaetrolepersonnetheia ADD CONSTRAINT fk_76f8e79089274090 FOREIGN KEY (personnetheia_id) REFERENCES personnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_observatoire ADD CONSTRAINT fk_850435dfcd8785ec FOREIGN KEY (contacttheia_id) REFERENCES personnetheiaetrolepersonnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_observatoire ADD CONSTRAINT fk_850435dfd47c2d1b FOREIGN KEY (dataset_id) REFERENCES observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_theia_dataset ADD CONSTRAINT fk_ef59972bcd8785ec FOREIGN KEY (contacttheia_id) REFERENCES personnetheiaetrolepersonnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personne_theia_et_role_personne_theia_theia_dataset ADD CONSTRAINT fk_ef59972bd47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE observatoires_data_manager');
+        $this->addSql('ALTER TABLE Observatoire DROP CONSTRAINT FK_90B54B32E26A02CC');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+        $this->addSql('DROP INDEX IDX_90B54B32E26A02CC');
+        $this->addSql('ALTER TABLE Observatoire DROP projectLeader_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210120142721.php b/app/DoctrineMigrations/Version20210120142721.php
new file mode 100644
index 0000000000000000000000000000000000000000..ba905b5362f8adc77221bea9a1fd7d5743ce7f5b
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210120142721.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210120142721 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE data_manager_dataSet (dataset_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(dataset_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_4491DB31D47C2D1B ON data_manager_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_4491DB3198DE13AC ON data_manager_dataSet (partenaire_id)');
+        $this->addSql('CREATE TABLE principal_investigator_dataSet (dataset_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(dataset_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_D4483058D47C2D1B ON principal_investigator_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_D448305898DE13AC ON principal_investigator_dataSet (partenaire_id)');
+        $this->addSql('CREATE TABLE data_collector_dataSet (dataset_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(dataset_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_4158353CD47C2D1B ON data_collector_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_4158353C98DE13AC ON data_collector_dataSet (partenaire_id)');
+        $this->addSql('CREATE TABLE project_member_dataSet (dataset_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(dataset_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_D9AE8406D47C2D1B ON project_member_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_D9AE840698DE13AC ON project_member_dataSet (partenaire_id)');
+        $this->addSql('ALTER TABLE data_manager_dataSet ADD CONSTRAINT FK_4491DB31D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE data_manager_dataSet ADD CONSTRAINT FK_4491DB3198DE13AC FOREIGN KEY (partenaire_id) REFERENCES PersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE principal_investigator_dataSet ADD CONSTRAINT FK_D4483058D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE principal_investigator_dataSet ADD CONSTRAINT FK_D448305898DE13AC FOREIGN KEY (partenaire_id) REFERENCES PersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE data_collector_dataSet ADD CONSTRAINT FK_4158353CD47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE data_collector_dataSet ADD CONSTRAINT FK_4158353C98DE13AC FOREIGN KEY (partenaire_id) REFERENCES PersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE project_member_dataSet ADD CONSTRAINT FK_D9AE8406D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE project_member_dataSet ADD CONSTRAINT FK_D9AE840698DE13AC FOREIGN KEY (partenaire_id) REFERENCES PersonneTheia (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE data_manager_dataSet');
+        $this->addSql('DROP TABLE principal_investigator_dataSet');
+        $this->addSql('DROP TABLE data_collector_dataSet');
+        $this->addSql('DROP TABLE project_member_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210121141527.php b/app/DoctrineMigrations/Version20210121141527.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1a5f4c69fee413183386e247652d5b893c3fa42
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210121141527.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210121141527 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE TheiaCategorie_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE TheiaCategorie (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE TheiaCategorie_id_seq CASCADE');
+        $this->addSql('DROP TABLE TheiaCategorie');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210122134507.php b/app/DoctrineMigrations/Version20210122134507.php
new file mode 100644
index 0000000000000000000000000000000000000000..69a4ebc847bb65b0f21e122997a32d85edfdde53
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210122134507.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210122134507 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE theia_categorie_dataSet (chronique_id INT NOT NULL, theiaCategorie_id INT NOT NULL, PRIMARY KEY(chronique_id, theiaCategorie_id))');
+        $this->addSql('CREATE INDEX IDX_713FB98993054D ON theia_categorie_dataSet (chronique_id)');
+        $this->addSql('CREATE INDEX IDX_713FB989CB4778A9 ON theia_categorie_dataSet (theiaCategorie_id)');
+        $this->addSql('ALTER TABLE theia_categorie_dataSet ADD CONSTRAINT FK_713FB98993054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE theia_categorie_dataSet ADD CONSTRAINT FK_713FB989CB4778A9 FOREIGN KEY (theiaCategorie_id) REFERENCES TheiaCategorie (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE theia_categorie_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210125130239.php b/app/DoctrineMigrations/Version20210125130239.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3881a9a1d598f3dfab37700b8826634a457db27
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210125130239.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210125130239 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset DROP CONSTRAINT FK_40503EACD8B5F69');
+        $this->addSql('ALTER TABLE dataset ADD chronique_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EAC93054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EACD8B5F69 FOREIGN KEY (dataconstraints_id) REFERENCES DataConstraint (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EAC93054D ON dataset (chronique_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EAC93054D');
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT fk_40503eacd8b5f69');
+        $this->addSql('DROP INDEX IDX_40503EAC93054D');
+        $this->addSql('ALTER TABLE DataSet DROP chronique_id');
+        $this->addSql('ALTER TABLE DataSet ADD CONSTRAINT fk_40503eacd8b5f69 FOREIGN KEY (dataconstraints_id) REFERENCES dataconstraint (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210126091246.php b/app/DoctrineMigrations/Version20210126091246.php
new file mode 100644
index 0000000000000000000000000000000000000000..84d9f9135bfdd1b03fb5ac2db436c58ad91d0e20
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210126091246.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210126091246 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset DROP CONSTRAINT fk_40503eac93054d');
+        $this->addSql('DROP INDEX idx_40503eac93054d');
+        $this->addSql('ALTER TABLE dataset RENAME COLUMN chronique_id TO chroniques_id');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EACEF1C130D FOREIGN KEY (chroniques_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EACEF1C130D ON dataset (chroniques_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EACEF1C130D');
+        $this->addSql('DROP INDEX IDX_40503EACEF1C130D');
+        $this->addSql('ALTER TABLE DataSet RENAME COLUMN chroniques_id TO chronique_id');
+        $this->addSql('ALTER TABLE DataSet ADD CONSTRAINT fk_40503eac93054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_40503eac93054d ON DataSet (chronique_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210126094637.php b/app/DoctrineMigrations/Version20210126094637.php
new file mode 100644
index 0000000000000000000000000000000000000000..acfe79988d36d84ed351f134cdae032b617abb10
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210126094637.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210126094637 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ADD doi_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD urlDownload VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EACE6EBA8D8 FOREIGN KEY (doi_id) REFERENCES Doi (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EACE6EBA8D8 ON dataset (doi_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EACE6EBA8D8');
+        $this->addSql('DROP INDEX IDX_40503EACE6EBA8D8');
+        $this->addSql('ALTER TABLE DataSet DROP doi_id');
+        $this->addSql('ALTER TABLE DataSet DROP urlDownload');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210127124936.php b/app/DoctrineMigrations/Version20210127124936.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ebf6cbd62e2252073f8fe898ca0406c5f4525f1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210127124936.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210127124936 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE theia_categorie_dataset DROP CONSTRAINT fk_713fb989cb4778a9');
+        $this->addSql('DROP SEQUENCE bdoh.theiacategorie_id_seq CASCADE');
+        $this->addSql('DROP TABLE theiacategorie');
+        $this->addSql('DROP TABLE theia_categorie_dataset');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE bdoh.theiacategorie_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE theiacategorie (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE TABLE theia_categorie_dataset (chronique_id INT NOT NULL, theiacategorie_id INT NOT NULL, PRIMARY KEY(chronique_id, theiacategorie_id))');
+        $this->addSql('CREATE INDEX idx_713fb989cb4778a9 ON theia_categorie_dataset (theiacategorie_id)');
+        $this->addSql('CREATE INDEX idx_713fb98993054d ON theia_categorie_dataset (chronique_id)');
+        $this->addSql('ALTER TABLE theia_categorie_dataset ADD CONSTRAINT fk_713fb989cb4778a9 FOREIGN KEY (theiacategorie_id) REFERENCES theiacategorie (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE theia_categorie_dataset ADD CONSTRAINT fk_713fb98993054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210129092541.php b/app/DoctrineMigrations/Version20210129092541.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c1e3e0acad8c7df1ede54f682c9b3745926141b
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210129092541.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210129092541 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE partenaire_observatoire (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_ACB4456E61ED1B0D ON partenaire_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_ACB4456E98DE13AC ON partenaire_observatoire (partenaire_id)');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT FK_ACB4456E61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT FK_ACB4456E98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire DROP CONSTRAINT fk_7da2a0a361ed1b0d');
+        $this->addSql('DROP INDEX idx_7da2a0a361ed1b0d');
+        $this->addSql('ALTER TABLE partenaire DROP observatoire_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE partenaire_observatoire');
+        $this->addSql('DROP INDEX UNIQ_90B54B32EC0C1EEE');
+        $this->addSql('ALTER TABLE Partenaire ADD observatoire_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE Partenaire ADD CONSTRAINT fk_7da2a0a361ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_7da2a0a361ed1b0d ON Partenaire (observatoire_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210129143554.php b/app/DoctrineMigrations/Version20210129143554.php
new file mode 100644
index 0000000000000000000000000000000000000000..3509272b920b03099f0c42f384d035d0722503ed
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210129143554.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210129143554 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE partenaire_observatoire');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE partenaire_observatoire (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX idx_acb4456e98de13ac ON partenaire_observatoire (partenaire_id)');
+        $this->addSql('CREATE INDEX idx_acb4456e61ed1b0d ON partenaire_observatoire (observatoire_id)');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT fk_acb4456e98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT fk_acb4456e61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210129143738.php b/app/DoctrineMigrations/Version20210129143738.php
new file mode 100644
index 0000000000000000000000000000000000000000..9253ddf7291ea91cb8354854ccfd1c8fcf636b97
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210129143738.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210129143738 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE partenaire_observatoire (observatoire_id INT DEFAULT NULL, partenaire_id INT DEFAULT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX IDX_ACB4456E61ED1B0D ON partenaire_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_ACB4456E98DE13AC ON partenaire_observatoire (partenaire_id)');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT FK_ACB4456E61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT FK_ACB4456E98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE partenaire_observatoire');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210202083059.php b/app/DoctrineMigrations/Version20210202083059.php
new file mode 100644
index 0000000000000000000000000000000000000000..987f3ac437cadb1a4c5464cb96fb9b62ca1757fd
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210202083059.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210202083059 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE chronique_dataSet (dataset_id INT NOT NULL, chronique_id INT NOT NULL, PRIMARY KEY(dataset_id, chronique_id))');
+        $this->addSql('CREATE INDEX IDX_3100014AD47C2D1B ON chronique_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_3100014A93054D ON chronique_dataSet (chronique_id)');
+        $this->addSql('ALTER TABLE chronique_dataSet ADD CONSTRAINT FK_3100014AD47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique_dataSet ADD CONSTRAINT FK_3100014A93054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire_observatoire DROP CONSTRAINT FK_ACB4456E98DE13AC');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT FK_ACB4456E98DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset DROP CONSTRAINT fk_40503eacef1c130d');
+        $this->addSql('DROP INDEX idx_40503eacef1c130d');
+        $this->addSql('ALTER TABLE dataset DROP chroniques_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE chronique_dataSet');
+        $this->addSql('ALTER TABLE DataSet ADD chroniques_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE DataSet ADD CONSTRAINT fk_40503eacef1c130d FOREIGN KEY (chroniques_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_40503eacef1c130d ON DataSet (chroniques_id)');
+        $this->addSql('ALTER TABLE partenaire_observatoire DROP CONSTRAINT fk_acb4456e98de13ac');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT fk_acb4456e98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210203100903.php b/app/DoctrineMigrations/Version20210203100903.php
new file mode 100644
index 0000000000000000000000000000000000000000..a35c3fb0aeb6f850996f4494e464fd0bd11c6db8
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210203100903.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210203100903 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE ListeChroniques_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE ListeChroniques (id INT NOT NULL, chronique_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_8CF9AD6293054D ON ListeChroniques (chronique_id)');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT FK_8CF9AD6293054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE ListeChroniques_id_seq CASCADE');
+        $this->addSql('DROP TABLE ListeChroniques');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210203103421.php b/app/DoctrineMigrations/Version20210203103421.php
new file mode 100644
index 0000000000000000000000000000000000000000..034648e14691ad4d7b57c78950b7f4d7a5780423
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210203103421.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210203103421 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE liste_chroniques_dataSet (dataset_id INT NOT NULL, listeChroniques_id INT NOT NULL, PRIMARY KEY(dataset_id, listeChroniques_id))');
+        $this->addSql('CREATE INDEX IDX_E501B452D47C2D1B ON liste_chroniques_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_E501B452AF9CEADE ON liste_chroniques_dataSet (listeChroniques_id)');
+        $this->addSql('ALTER TABLE liste_chroniques_dataSet ADD CONSTRAINT FK_E501B452D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE liste_chroniques_dataSet ADD CONSTRAINT FK_E501B452AF9CEADE FOREIGN KEY (listeChroniques_id) REFERENCES ListeChroniques (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE chronique_dataset');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE chronique_dataset (dataset_id INT NOT NULL, chronique_id INT NOT NULL, PRIMARY KEY(dataset_id, chronique_id))');
+        $this->addSql('CREATE INDEX idx_3100014ad47c2d1b ON chronique_dataset (dataset_id)');
+        $this->addSql('CREATE INDEX idx_3100014a93054d ON chronique_dataset (chronique_id)');
+        $this->addSql('ALTER TABLE chronique_dataset ADD CONSTRAINT fk_3100014a93054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique_dataset ADD CONSTRAINT fk_3100014ad47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE liste_chroniques_dataSet');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210203125112.php b/app/DoctrineMigrations/Version20210203125112.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd1746b5c5850260357c83b9113c7362820c2b0c
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210203125112.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210203125112 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT FK_8CF9AD6293054D');
+        $this->addSql('DROP INDEX uniq_8cf9ad6293054d');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD6293054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_8CF9AD6293054D ON listechroniques (chronique_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT fk_8cf9ad6293054d');
+        $this->addSql('DROP INDEX IDX_8CF9AD6293054D');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad6293054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE UNIQUE INDEX uniq_8cf9ad6293054d ON ListeChroniques (chronique_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210203150549.php b/app/DoctrineMigrations/Version20210203150549.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7e7adb6c1833edf649a1b2ff8ef72c7945d1f41
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210203150549.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210203150549 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT fk_8cf9ad6293054d');
+        $this->addSql('DROP INDEX idx_8cf9ad6293054d');
+        $this->addSql('ALTER TABLE listechroniques RENAME COLUMN chronique_id TO chronique_continue_id');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD6271FAE7A4 FOREIGN KEY (chronique_continue_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_8CF9AD6271FAE7A4 ON listechroniques (chronique_continue_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT FK_8CF9AD6271FAE7A4');
+        $this->addSql('DROP INDEX IDX_8CF9AD6271FAE7A4');
+        $this->addSql('ALTER TABLE ListeChroniques RENAME COLUMN chronique_continue_id TO chronique_id');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad6293054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_8cf9ad6293054d ON ListeChroniques (chronique_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210204085346.php b/app/DoctrineMigrations/Version20210204085346.php
new file mode 100644
index 0000000000000000000000000000000000000000..c605ff1032234771676f9faedf968b3335e9edf4
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210204085346.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210204085346 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques ADD chronique_discontinue_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE listechroniques ADD chronique_convertie_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE listechroniques ADD chronique_calculee_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD62F0ABD5D0 FOREIGN KEY (chronique_discontinue_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD629442DDA7 FOREIGN KEY (chronique_convertie_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD62BAED0790 FOREIGN KEY (chronique_calculee_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_8CF9AD62F0ABD5D0 ON listechroniques (chronique_discontinue_id)');
+        $this->addSql('CREATE INDEX IDX_8CF9AD629442DDA7 ON listechroniques (chronique_convertie_id)');
+        $this->addSql('CREATE INDEX IDX_8CF9AD62BAED0790 ON listechroniques (chronique_calculee_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT FK_8CF9AD62F0ABD5D0');
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT FK_8CF9AD629442DDA7');
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT FK_8CF9AD62BAED0790');
+        $this->addSql('DROP INDEX IDX_8CF9AD62F0ABD5D0');
+        $this->addSql('DROP INDEX IDX_8CF9AD629442DDA7');
+        $this->addSql('DROP INDEX IDX_8CF9AD62BAED0790');
+        $this->addSql('ALTER TABLE ListeChroniques DROP chronique_discontinue_id');
+        $this->addSql('ALTER TABLE ListeChroniques DROP chronique_convertie_id');
+        $this->addSql('ALTER TABLE ListeChroniques DROP chronique_calculee_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210204095544.php b/app/DoctrineMigrations/Version20210204095544.php
new file mode 100644
index 0000000000000000000000000000000000000000..5fa17ca68711d6559ec9815f5b45faa32be9924f
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210204095544.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210204095544 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques ADD chronique_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD6293054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_8CF9AD6293054D ON listechroniques (chronique_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT FK_8CF9AD6293054D');
+        $this->addSql('DROP INDEX IDX_8CF9AD6293054D');
+        $this->addSql('ALTER TABLE ListeChroniques DROP chronique_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210204095959.php b/app/DoctrineMigrations/Version20210204095959.php
new file mode 100644
index 0000000000000000000000000000000000000000..5948346b608c4ba3563738ab2b669b5cacf0f3a1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210204095959.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210204095959 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT fk_8cf9ad62baed0790');
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT fk_8cf9ad629442dda7');
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT fk_8cf9ad62f0abd5d0');
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT fk_8cf9ad6271fae7a4');
+        $this->addSql('DROP INDEX idx_8cf9ad62baed0790');
+        $this->addSql('DROP INDEX idx_8cf9ad629442dda7');
+        $this->addSql('DROP INDEX idx_8cf9ad62f0abd5d0');
+        $this->addSql('DROP INDEX idx_8cf9ad6271fae7a4');
+        $this->addSql('ALTER TABLE listechroniques DROP chronique_continue_id');
+        $this->addSql('ALTER TABLE listechroniques DROP chronique_discontinue_id');
+        $this->addSql('ALTER TABLE listechroniques DROP chronique_convertie_id');
+        $this->addSql('ALTER TABLE listechroniques DROP chronique_calculee_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour TYPE TIMESTAMP(3) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour DROP DEFAULT');
+        $this->addSql('ALTER TABLE ListeChroniques ADD chronique_continue_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE ListeChroniques ADD chronique_discontinue_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE ListeChroniques ADD chronique_convertie_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE ListeChroniques ADD chronique_calculee_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad62baed0790 FOREIGN KEY (chronique_calculee_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad629442dda7 FOREIGN KEY (chronique_convertie_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad62f0abd5d0 FOREIGN KEY (chronique_discontinue_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad6271fae7a4 FOREIGN KEY (chronique_continue_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_8cf9ad62baed0790 ON ListeChroniques (chronique_calculee_id)');
+        $this->addSql('CREATE INDEX idx_8cf9ad629442dda7 ON ListeChroniques (chronique_convertie_id)');
+        $this->addSql('CREATE INDEX idx_8cf9ad62f0abd5d0 ON ListeChroniques (chronique_discontinue_id)');
+        $this->addSql('CREATE INDEX idx_8cf9ad6271fae7a4 ON ListeChroniques (chronique_continue_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210204143855.php b/app/DoctrineMigrations/Version20210204143855.php
new file mode 100644
index 0000000000000000000000000000000000000000..efbbfc5af81d0732f06c6b2e95600daafdd223a1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210204143855.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210204143855 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques DROP CONSTRAINT FK_8CF9AD6293054D');
+        $this->addSql('DROP INDEX idx_8cf9ad6293054d');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT FK_8CF9AD6293054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_8CF9AD6293054D ON listechroniques (chronique_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP CONSTRAINT fk_8cf9ad6293054d');
+        $this->addSql('DROP INDEX UNIQ_8CF9AD6293054D');
+        $this->addSql('ALTER TABLE ListeChroniques ADD CONSTRAINT fk_8cf9ad6293054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_8cf9ad6293054d ON ListeChroniques (chronique_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210205080525.php b/app/DoctrineMigrations/Version20210205080525.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f2e183ccc2b9ea275a3c9b65f8ff4205febdfb7
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210205080525.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210205080525 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique ADD listechroniques_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC287491CE2A12B FOREIGN KEY (listechroniques_id) REFERENCES ListeChroniques (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_DAC287491CE2A12B ON chronique (listechroniques_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT FK_DAC287491CE2A12B');
+        $this->addSql('DROP INDEX IDX_DAC287491CE2A12B');
+        $this->addSql('ALTER TABLE Chronique DROP listechroniques_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210209081656.php b/app/DoctrineMigrations/Version20210209081656.php
new file mode 100644
index 0000000000000000000000000000000000000000..7014040cc165284e329e869078cc7faf3dc347e4
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210209081656.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210209081656 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE dataset_observatoire (observatoire_id INT NOT NULL, dataset_id INT NOT NULL, PRIMARY KEY(observatoire_id, dataset_id))');
+        $this->addSql('CREATE INDEX IDX_4DAE319261ED1B0D ON dataset_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_4DAE3192D47C2D1B ON dataset_observatoire (dataset_id)');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT FK_4DAE319261ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT FK_4DAE3192D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE dataset_observatoire');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210209133541.php b/app/DoctrineMigrations/Version20210209133541.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f9e5d48b0f70d442a044dc7fc9a40e7256ed949
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210209133541.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210209133541 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset DROP urldownload');
+        $this->addSql('ALTER TABLE chronique ADD description TEXT DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet ADD urldownload VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique DROP description');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210215120932.php b/app/DoctrineMigrations/Version20210215120932.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c833adcf8e804d39084c9c665c9dede135c6694
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210215120932.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210215120932 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques ADD nom VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP nom');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210217130825.php b/app/DoctrineMigrations/Version20210217130825.php
new file mode 100644
index 0000000000000000000000000000000000000000..eae0ae2e9a1b0e877a9e65f806454e323623f842
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210217130825.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210217130825 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE dataset_observatoire');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE dataset_observatoire (observatoire_id INT NOT NULL, dataset_id INT NOT NULL, PRIMARY KEY(observatoire_id, dataset_id))');
+        $this->addSql('CREATE INDEX idx_4dae319261ed1b0d ON dataset_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX idx_4dae3192d47c2d1b ON dataset_observatoire (dataset_id)');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT fk_4dae3192d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT fk_4dae319261ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210217132512.php b/app/DoctrineMigrations/Version20210217132512.php
new file mode 100644
index 0000000000000000000000000000000000000000..0af358987f1ead8f57d0918e0f784434fae2f8f9
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210217132512.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210217132512 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE dataset_observatoire (observatoire_id INT DEFAULT NULL, dataset_id INT DEFAULT NULL, PRIMARY KEY(observatoire_id, dataset_id))');
+        $this->addSql('CREATE INDEX IDX_4DAE319261ED1B0D ON dataset_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX IDX_4DAE3192D47C2D1B ON dataset_observatoire (dataset_id)');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT FK_4DAE319261ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT FK_4DAE3192D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE dataset_observatoire');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210218140532.php b/app/DoctrineMigrations/Version20210218140532.php
new file mode 100644
index 0000000000000000000000000000000000000000..155f0cf349c1fecfb686d4afc40216a025012be4
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210218140532.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210218140532 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE listechroniques ADD supprimer BOOLEAN NOT NULL DEFAULT FALSE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE ListeChroniques DROP supprimer');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210219121324.php b/app/DoctrineMigrations/Version20210219121324.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e7e164099b2b77e9a4bf0cfc5f232f32caacb06
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210219121324.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210219121324 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE liste_chroniques_dataset DROP CONSTRAINT fk_e501b452af9ceade');
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT fk_dac287491ce2a12b');
+        $this->addSql('DROP SEQUENCE bdoh.listechroniques_id_seq CASCADE');
+        $this->addSql('CREATE TABLE chroniques_dataSet (dataset_id INT NOT NULL DEFAULT NULL, chronique_id INT NOT NULL DEFAULT NULL, PRIMARY KEY(dataset_id, chronique_id))');
+        $this->addSql('CREATE INDEX IDX_2F0EE2DED47C2D1B ON chroniques_dataSet (dataset_id)');
+        $this->addSql('CREATE INDEX IDX_2F0EE2DE93054D ON chroniques_dataSet (chronique_id)');
+        $this->addSql('ALTER TABLE chroniques_dataSet ADD CONSTRAINT FK_2F0EE2DED47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chroniques_dataSet ADD CONSTRAINT FK_2F0EE2DE93054D FOREIGN KEY (chronique_id) REFERENCES Chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE liste_chroniques_dataset');
+        $this->addSql('DROP TABLE listechroniques');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE bdoh.listechroniques_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE liste_chroniques_dataset (dataset_id INT NOT NULL, listechroniques_id INT NOT NULL, PRIMARY KEY(dataset_id, listechroniques_id))');
+        $this->addSql('CREATE INDEX idx_e501b452d47c2d1b ON liste_chroniques_dataset (dataset_id)');
+        $this->addSql('CREATE INDEX idx_e501b452af9ceade ON liste_chroniques_dataset (listechroniques_id)');
+        $this->addSql('CREATE TABLE listechroniques (id INT NOT NULL, chronique_id INT DEFAULT NULL, nom VARCHAR(255) DEFAULT NULL, supprimer BOOLEAN DEFAULT \'false\' NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE UNIQUE INDEX uniq_8cf9ad6293054d ON listechroniques (chronique_id)');
+        $this->addSql('ALTER TABLE liste_chroniques_dataset ADD CONSTRAINT fk_e501b452af9ceade FOREIGN KEY (listechroniques_id) REFERENCES listechroniques (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE liste_chroniques_dataset ADD CONSTRAINT fk_e501b452d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE listechroniques ADD CONSTRAINT fk_8cf9ad6293054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('DROP TABLE chroniques_dataSet');
+        $this->addSql('ALTER TABLE Chronique ADD listechroniques_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour TYPE TIMESTAMP(3) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour DROP DEFAULT');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac287491ce2a12b FOREIGN KEY (listechroniques_id) REFERENCES listechroniques (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_dac287491ce2a12b ON Chronique (listechroniques_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210308142301.php b/app/DoctrineMigrations/Version20210308142301.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfb7c935755d0e9685ff44018ed1e842639fbd6e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210308142301.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210308142301 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE familleparametres ADD milieu VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE FamilleParametres DROP milieu');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210310082143.php b/app/DoctrineMigrations/Version20210310082143.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0c279b7c2d1c5f934cbad80effdcc488b2a5268
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210310082143.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210310082143 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE partenaire_observatoire');
+        $this->addSql('DROP TABLE dataset_observatoire');
+        $this->addSql('ALTER TABLE dataset ADD observatoire_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EAC61ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EAC61ED1B0D ON dataset (observatoire_id)');
+        $this->addSql('DROP INDEX idx_dac287491ce2a12b');
+        $this->addSql('ALTER TABLE chronique DROP listechroniques_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE partenaire_observatoire (observatoire_id INT NOT NULL, partenaire_id INT NOT NULL, PRIMARY KEY(observatoire_id, partenaire_id))');
+        $this->addSql('CREATE INDEX idx_acb4456e61ed1b0d ON partenaire_observatoire (observatoire_id)');
+        $this->addSql('CREATE INDEX idx_acb4456e98de13ac ON partenaire_observatoire (partenaire_id)');
+        $this->addSql('CREATE TABLE dataset_observatoire (observatoire_id INT NOT NULL, dataset_id INT NOT NULL, PRIMARY KEY(observatoire_id, dataset_id))');
+        $this->addSql('CREATE INDEX idx_4dae3192d47c2d1b ON dataset_observatoire (dataset_id)');
+        $this->addSql('CREATE INDEX idx_4dae319261ed1b0d ON dataset_observatoire (observatoire_id)');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT fk_acb4456e98de13ac FOREIGN KEY (partenaire_id) REFERENCES partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE partenaire_observatoire ADD CONSTRAINT fk_acb4456e61ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT fk_4dae3192d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE dataset_observatoire ADD CONSTRAINT fk_4dae319261ed1b0d FOREIGN KEY (observatoire_id) REFERENCES observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EAC61ED1B0D');
+        $this->addSql('DROP INDEX IDX_40503EAC61ED1B0D');
+        $this->addSql('ALTER TABLE DataSet DROP observatoire_id');
+        $this->addSql('ALTER TABLE Chronique ADD listechroniques_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour TYPE TIMESTAMP(3) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour DROP DEFAULT');
+        $this->addSql('CREATE INDEX idx_dac287491ce2a12b ON Chronique (listechroniques_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210310082630.php b/app/DoctrineMigrations/Version20210310082630.php
new file mode 100644
index 0000000000000000000000000000000000000000..5af222e4a5c5304daa1c67075a6b029dbe24b069
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210310082630.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210310082630 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE partenaire ADD observatoire_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE partenaire ADD CONSTRAINT FK_7DA2A0A361ED1B0D FOREIGN KEY (observatoire_id) REFERENCES Observatoire (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_7DA2A0A361ED1B0D ON partenaire (observatoire_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Partenaire DROP CONSTRAINT FK_7DA2A0A361ED1B0D');
+        $this->addSql('DROP INDEX IDX_7DA2A0A361ED1B0D');
+        $this->addSql('ALTER TABLE Partenaire DROP observatoire_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311095644.php b/app/DoctrineMigrations/Version20210311095644.php
new file mode 100644
index 0000000000000000000000000000000000000000..de78b2033007682cac02045cf55e151ca32ae113
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311095644.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311095644 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP TABLE chroniques_dataset');
+        $this->addSql('ALTER TABLE chronique ADD dataset_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_DAC28749D47C2D1B ON chronique (dataset_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TABLE chroniques_dataset (dataset_id INT NOT NULL, chronique_id INT NOT NULL, PRIMARY KEY(dataset_id, chronique_id))');
+        $this->addSql('CREATE INDEX idx_2f0ee2de93054d ON chroniques_dataset (chronique_id)');
+        $this->addSql('CREATE INDEX idx_2f0ee2ded47c2d1b ON chroniques_dataset (dataset_id)');
+        $this->addSql('ALTER TABLE chroniques_dataset ADD CONSTRAINT fk_2f0ee2de93054d FOREIGN KEY (chronique_id) REFERENCES chronique (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chroniques_dataset ADD CONSTRAINT fk_2f0ee2ded47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('DROP INDEX IDX_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE Chronique DROP dataset_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311102013.php b/app/DoctrineMigrations/Version20210311102013.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad6b3b57488ad339310c69eb9c179fab8626c3dd
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311102013.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311102013 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311112707.php b/app/DoctrineMigrations/Version20210311112707.php
new file mode 100644
index 0000000000000000000000000000000000000000..1098c22afe40b141b8fbccb07d04345b0584721e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311112707.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311112707 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ALTER miseajour TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE chronique ALTER miseajour DROP DEFAULT');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour TYPE TIMESTAMP(3) WITHOUT TIME ZONE');
+        $this->addSql('ALTER TABLE Chronique ALTER miseAJour DROP DEFAULT');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311113151.php b/app/DoctrineMigrations/Version20210311113151.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2876817f0544041e811f55d4b8f83844e58611c
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311113151.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311113151 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX UNIQ_163312BC9F990A5E');
+        $this->addSql('ALTER TABLE FamilleParametres ALTER milieu DROP NOT NULL');
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311113905.php b/app/DoctrineMigrations/Version20210311113905.php
new file mode 100644
index 0000000000000000000000000000000000000000..912db0c4d31204dd7bb1c722e7d49ada0131f253
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311113905.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311113905 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311115431.php b/app/DoctrineMigrations/Version20210311115431.php
new file mode 100644
index 0000000000000000000000000000000000000000..d75de6d690fec40e5d4f3bf777d38424bc162e0c
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311115431.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311115431 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('DROP INDEX idx_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE chronique DROP dataset_id');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique ADD dataset_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_dac28749d47c2d1b ON Chronique (dataset_id)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311115601.php b/app/DoctrineMigrations/Version20210311115601.php
new file mode 100644
index 0000000000000000000000000000000000000000..efb722a2ec176a6d1d6b6e7b246c436ecab9fabe
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311115601.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311115601 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique ADD dataset_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_DAC28749D47C2D1B ON chronique (dataset_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('DROP INDEX IDX_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE Chronique DROP dataset_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311161601.php b/app/DoctrineMigrations/Version20210311161601.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0254e46659cd1cba5cb36366a961ed8fde49315
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311161601.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311161601 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210311164328.php b/app/DoctrineMigrations/Version20210311164328.php
new file mode 100644
index 0000000000000000000000000000000000000000..eab83b7bf522afdc59e0534ba32c54b711781397
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210311164328.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210311164328 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749D47C2D1B');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749d47c2d1b');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210315080651.php b/app/DoctrineMigrations/Version20210315080651.php
new file mode 100644
index 0000000000000000000000000000000000000000..2bde6af81ba94ea6cfce6ac410a910b0d485ed96
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210315080651.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210315080651 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ADD uuid VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP uuid');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210317080417.php b/app/DoctrineMigrations/Version20210317080417.php
new file mode 100644
index 0000000000000000000000000000000000000000..d43010734fad2bc99826e89d132b6f4468105cfb
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210317080417.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210317080417 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ADD doiPrincipal_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE observatoire ADD CONSTRAINT FK_90B54B326812A577 FOREIGN KEY (doiPrincipal_id) REFERENCES Doi (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_90B54B326812A577 ON observatoire (doiPrincipal_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Observatoire DROP CONSTRAINT FK_90B54B326812A577');
+        $this->addSql('DROP INDEX UNIQ_90B54B326812A577');
+        $this->addSql('ALTER TABLE Observatoire DROP doiPrincipal_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210317101059.php b/app/DoctrineMigrations/Version20210317101059.php
new file mode 100644
index 0000000000000000000000000000000000000000..3385614f923642af7297f802d533bef733660ea1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210317101059.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210317101059 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE TheiaCategories_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE TheiaCategories (id INT NOT NULL, milieu VARCHAR(255) NOT NULL, uriOzcarTheia JSON NOT NULL, familleParametre_id INT DEFAULT NULL, PRIMARY KEY(id))');
+        $this->addSql('CREATE INDEX IDX_CDEB484B1323280F ON TheiaCategories (familleParametre_id)');
+        $this->addSql('COMMENT ON COLUMN TheiaCategories.uriOzcarTheia IS \'(DC2Type:json_array)\'');
+        $this->addSql('ALTER TABLE TheiaCategories ADD CONSTRAINT FK_CDEB484B1323280F FOREIGN KEY (familleParametre_id) REFERENCES FamilleParametres (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE chronique ADD milieu VARCHAR(255) DEFAULT NULL');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_DAC287499F990A5E ON chronique (milieu)');
+        $this->addSql('ALTER TABLE familleparametres DROP milieu');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE TheiaCategories_id_seq CASCADE');
+        $this->addSql('DROP TABLE TheiaCategories');
+        $this->addSql('ALTER TABLE FamilleParametres ADD milieu VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique DROP milieu');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210319103313.php b/app/DoctrineMigrations/Version20210319103313.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e681963eeba3e1b2e70d43e7f51512667bc1543
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210319103313.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210319103313 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE Milieu_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE Milieu (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP SEQUENCE Milieu_id_seq CASCADE');
+        $this->addSql('DROP TABLE Milieu');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210319104109.php b/app/DoctrineMigrations/Version20210319104109.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9ab305ec5dbddc1feaa573ec2459c6cde8e939d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210319104109.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210319104109 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE theiacategories ADD milieu_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE theiacategories DROP milieu');
+        $this->addSql('ALTER TABLE theiacategories ADD CONSTRAINT FK_CDEB484B735F057F FOREIGN KEY (milieu_id) REFERENCES Milieu (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_CDEB484B735F057F ON theiacategories (milieu_id)');
+        $this->addSql('DROP INDEX uniq_dac287499f990a5e');
+        $this->addSql('ALTER TABLE chronique ADD milieu_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique DROP milieu');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749735F057F FOREIGN KEY (milieu_id) REFERENCES Milieu (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_DAC28749735F057F ON chronique (milieu_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE TheiaCategories DROP CONSTRAINT FK_CDEB484B735F057F');
+        $this->addSql('DROP INDEX IDX_CDEB484B735F057F');
+        $this->addSql('ALTER TABLE TheiaCategories ADD milieu VARCHAR(255) NOT NULL');
+        $this->addSql('ALTER TABLE TheiaCategories DROP milieu_id');
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT FK_DAC28749735F057F');
+        $this->addSql('DROP INDEX IDX_DAC28749735F057F');
+        $this->addSql('ALTER TABLE Chronique ADD milieu VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE Chronique DROP milieu_id');
+        $this->addSql('CREATE UNIQUE INDEX uniq_dac287499f990a5e ON Chronique (milieu)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324102056.php b/app/DoctrineMigrations/Version20210324102056.php
new file mode 100644
index 0000000000000000000000000000000000000000..48dc3526ce8fc7719876eb806f79ae0a7e125b95
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324102056.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324102056 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO Milieu(id, nom) VALUES (3,'Surface'),(4,'Sous-sol'),(6,'Sol'),(5,'Atmosphère');");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('DELETE FROM Milieu');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324121236.php b/app/DoctrineMigrations/Version20210324121236.php
new file mode 100644
index 0000000000000000000000000000000000000000..70ea409425d15abe2cbb5f975390fff12db74991
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324121236.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324121236 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324131607.php b/app/DoctrineMigrations/Version20210324131607.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7b813cf30dbbccadea9adf823cf78ec83efd9f0
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324131607.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324131607 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE chronique DROP CONSTRAINT FK_DAC28749735F057F');
+        $this->addSql('ALTER TABLE chronique ADD CONSTRAINT FK_DAC28749735F057F FOREIGN KEY (milieu_id) REFERENCES Milieu (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Chronique DROP CONSTRAINT fk_dac28749735f057f');
+        $this->addSql('ALTER TABLE Chronique ADD CONSTRAINT fk_dac28749735f057f FOREIGN KEY (milieu_id) REFERENCES milieu (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324134940.php b/app/DoctrineMigrations/Version20210324134940.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0abc9c59da1bb4ed9d29ec3ca479793fa8b7a62
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324134940.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324134940 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO TypeFunding(id, nom) VALUES (1,'Federative structure'), (2,'French research institutes'), (3,'French universities and schools'),
+                            (4,'Other'), (5,'Other research institutes'), (6,'Other universities and schools'), (7, 'Research program'), (8, 'Research unit' );");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('DELETE FROM TypeFunding');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324140721.php b/app/DoctrineMigrations/Version20210324140721.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac4d98fac148b04fc4f25b1788bc0022b0f2b003
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324140721.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324140721 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO DataConstraint(id, nom) VALUES (1,'Conditions Generales Utilisation (voir pdf)');");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('DELETE FROM DataConstraint');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324142234.php b/app/DoctrineMigrations/Version20210324142234.php
new file mode 100644
index 0000000000000000000000000000000000000000..a740033d6980f54223d5e8b6bb457260b72d2282
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324142234.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324142234 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE topic_category_dataset DROP CONSTRAINT FK_6FC9B40EB45EC3B0');
+        $this->addSql('ALTER TABLE topic_category_dataset DROP CONSTRAINT FK_6FC9B40ED47C2D1B');
+        $this->addSql('ALTER TABLE topic_category_dataset ADD CONSTRAINT FK_6FC9B40EB45EC3B0 FOREIGN KEY (topiccategory_id) REFERENCES TopicCategory (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topic_category_dataset ADD CONSTRAINT FK_6FC9B40ED47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE topic_category_dataSet DROP CONSTRAINT fk_6fc9b40ed47c2d1b');
+        $this->addSql('ALTER TABLE topic_category_dataSet DROP CONSTRAINT fk_6fc9b40eb45ec3b0');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT fk_6fc9b40ed47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT fk_6fc9b40eb45ec3b0 FOREIGN KEY (topiccategory_id) REFERENCES topiccategory (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324142454.php b/app/DoctrineMigrations/Version20210324142454.php
new file mode 100644
index 0000000000000000000000000000000000000000..109ef08705e0216505b95a5c98bb0db6ca86e31f
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324142454.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324142454 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO TopicCategory(id, nom) VALUES (1,'Climatology / Meteorology / Atmosphere'), (6, 'Environment'), (7, 'Geoscientific information'),
+                                          (8, 'Inland Waters');");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('DELETE FROM TopicCategory');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324150432.php b/app/DoctrineMigrations/Version20210324150432.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3e0fe118f468497343eaca5a24b2210dd4f7de5
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324150432.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324150432 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE topic_category_dataset DROP CONSTRAINT FK_6FC9B40ED47C2D1B');
+        $this->addSql('ALTER TABLE topic_category_dataset DROP CONSTRAINT FK_6FC9B40EB45EC3B0');
+        $this->addSql('ALTER TABLE topic_category_dataset ADD CONSTRAINT FK_6FC9B40ED47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topic_category_dataset ADD CONSTRAINT FK_6FC9B40EB45EC3B0 FOREIGN KEY (topiccategory_id) REFERENCES TopicCategory (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_geology_dataset DROP CONSTRAINT FK_5C567A1979262535');
+        $this->addSql('ALTER TABLE criteria_geology_dataset DROP CONSTRAINT FK_5C567A19D47C2D1B');
+        $this->addSql('ALTER TABLE criteria_geology_dataset ADD CONSTRAINT FK_5C567A1979262535 FOREIGN KEY (criteriageology_id) REFERENCES CriteriaGeology (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_geology_dataset ADD CONSTRAINT FK_5C567A19D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataset DROP CONSTRAINT FK_1F40E8D12929DC79');
+        $this->addSql('ALTER TABLE criteria_climat_dataset DROP CONSTRAINT FK_1F40E8D1D47C2D1B');
+        $this->addSql('ALTER TABLE criteria_climat_dataset ADD CONSTRAINT FK_1F40E8D12929DC79 FOREIGN KEY (criteriaclimat_id) REFERENCES CriteriaClimat (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataset ADD CONSTRAINT FK_1F40E8D1D47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE topic_category_dataSet DROP CONSTRAINT fk_6fc9b40ed47c2d1b');
+        $this->addSql('ALTER TABLE topic_category_dataSet DROP CONSTRAINT fk_6fc9b40eb45ec3b0');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT fk_6fc9b40ed47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE topic_category_dataSet ADD CONSTRAINT fk_6fc9b40eb45ec3b0 FOREIGN KEY (topiccategory_id) REFERENCES topiccategory (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet DROP CONSTRAINT fk_5c567a19d47c2d1b');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet DROP CONSTRAINT fk_5c567a1979262535');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet ADD CONSTRAINT fk_5c567a19d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_geology_dataSet ADD CONSTRAINT fk_5c567a1979262535 FOREIGN KEY (criteriageology_id) REFERENCES criteriageology (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet DROP CONSTRAINT fk_1f40e8d1d47c2d1b');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet DROP CONSTRAINT fk_1f40e8d12929dc79');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet ADD CONSTRAINT fk_1f40e8d1d47c2d1b FOREIGN KEY (dataset_id) REFERENCES dataset (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE criteria_climat_dataSet ADD CONSTRAINT fk_1f40e8d12929dc79 FOREIGN KEY (criteriaclimat_id) REFERENCES criteriaclimat (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210324151216.php b/app/DoctrineMigrations/Version20210324151216.php
new file mode 100644
index 0000000000000000000000000000000000000000..7786572b71fbd54370d2e85e647c40b4ea5438b1
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210324151216.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210324151216 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO CriteriaClimat(id, nom) VALUES (1,'Arid climate'), (2, 'Continental climate'), (3, 'Equatorial climate'),
+                                          (4, 'Mountain climate'), (5,'Oceanic climate'), (6, 'Polar climate'), (7, 'Tropical climate');");
+
+        $this->addSql("INSERT INTO CriteriaGeology(id, nom) VALUES (1,'Carbonate rocks'), (2, 'Metamorphic rocks'), (3, 'Other sedimentary rocks'),
+                                          (4, 'Plutonic rocks'), (5, 'Quaternary soils'), (6, 'Volcanic rocks');");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql('DELETE FROM CriteriaClimat');
+        $this->addSql('DELETE FROM CriteriaGeology');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210329092615.php b/app/DoctrineMigrations/Version20210329092615.php
new file mode 100644
index 0000000000000000000000000000000000000000..d6b26a7d08ce18615177623711909782318a17a3
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210329092615.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210329092615 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE SEQUENCE InspireTheme_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+        $this->addSql('CREATE TABLE InspireTheme (id INT NOT NULL, nom VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('ALTER TABLE dataset ADD inspiretheme_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset DROP themeinpire');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EAC745C8861 FOREIGN KEY (inspiretheme_id) REFERENCES InspireTheme (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EAC745C8861 ON dataset (inspiretheme_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT FK_40503EAC745C8861');
+        $this->addSql('DROP SEQUENCE InspireTheme_id_seq CASCADE');
+        $this->addSql('DROP TABLE InspireTheme');
+        $this->addSql('DROP INDEX IDX_40503EAC745C8861');
+        $this->addSql('ALTER TABLE DataSet ADD themeinpire VARCHAR(255) NOT NULL');
+        $this->addSql('ALTER TABLE DataSet DROP inspiretheme_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210329110620.php b/app/DoctrineMigrations/Version20210329110620.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfd1f7dd30f912a0eccc0595f338cc94a82d8707
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210329110620.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210329110620 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO InspireTheme(id, nom) VALUES (1,'Environmental monitoring facilities');");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM InspireTheme');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210422073601.php b/app/DoctrineMigrations/Version20210422073601.php
new file mode 100644
index 0000000000000000000000000000000000000000..331983fb7a62935362b75f6ec001338f89e2390e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210422073601.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210422073601 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE theiacategories ADD nom VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE TheiaCategories DROP nom');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210427110217.php b/app/DoctrineMigrations/Version20210427110217.php
new file mode 100644
index 0000000000000000000000000000000000000000..47f3cad9ee7271a19c17a3c5802db66d894caa8c
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210427110217.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210427110217 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("UPDATE TopicCategory SET nom = 'Geoscientific Information' WHERE nom = 'Geoscientific information'");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("UPDATE TopicCategory SET nom = 'Geoscientific information' WHERE nom = 'Geoscientific Information'");
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210517093919.php b/app/DoctrineMigrations/Version20210517093919.php
new file mode 100644
index 0000000000000000000000000000000000000000..762cea9424a7fee06e4e0a95fed761bc0de4f7c2
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210517093919.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210517093919 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ADD titreEn VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD titreEn VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD descriptionEn VARCHAR(750) DEFAULT NULL');
+        $this->addSql('ALTER TABLE dataset ADD genealogieEn VARCHAR(255) DEFAULT NULL');
+        $this->addSql('ALTER TABLE chronique ADD genealogieEn VARCHAR(4000) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Observatoire DROP titreEn');
+        $this->addSql('ALTER TABLE DataSet DROP titreEn');
+        $this->addSql('ALTER TABLE DataSet DROP descriptionEn');
+        $this->addSql('ALTER TABLE DataSet DROP genealogieEn');
+        $this->addSql('ALTER TABLE Chronique DROP genealogieEn');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210518123233.php b/app/DoctrineMigrations/Version20210518123233.php
new file mode 100644
index 0000000000000000000000000000000000000000..0566b7f9b47eb992e0ad34c5e68414635712d158
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210518123233.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210518123233 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO CriteriaClimat(id, nom) VALUES (8,'Mediterranean climate')");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM CriteriaClimat');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210518134854.php b/app/DoctrineMigrations/Version20210518134854.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a86e14dce744fcf73d3fc28fa65a9c46ada4482
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210518134854.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210518134854 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD dataset_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CD47C2D1B FOREIGN KEY (dataset_id) REFERENCES DataSet (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CD47C2D1B ON historique (dataset_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CD47C2D1B');
+        $this->addSql('DROP INDEX IDX_A2E2D63CD47C2D1B');
+        $this->addSql('ALTER TABLE Historique DROP dataset_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210519071528.php b/app/DoctrineMigrations/Version20210519071528.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc7262cd8475c259a6b8f9f0fbe364e22422b65a
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210519071528.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210519071528 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD milieu_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C735F057F FOREIGN KEY (milieu_id) REFERENCES Milieu (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C735F057F ON historique (milieu_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C735F057F');
+        $this->addSql('DROP INDEX IDX_A2E2D63C735F057F');
+        $this->addSql('ALTER TABLE Historique DROP milieu_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210519080323.php b/app/DoctrineMigrations/Version20210519080323.php
new file mode 100644
index 0000000000000000000000000000000000000000..56cc537ba7c3d3033eaf5c0e87afea08a41a10e5
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210519080323.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210519080323 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD personnetheia_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C89274090 FOREIGN KEY (personnetheia_id) REFERENCES PersonneTheia (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C89274090 ON historique (personnetheia_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C89274090');
+        $this->addSql('DROP INDEX IDX_A2E2D63C89274090');
+        $this->addSql('ALTER TABLE Historique DROP personnetheia_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210521072015.php b/app/DoctrineMigrations/Version20210521072015.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b512821915895909ba04f22dea796e51dc6cf05
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210521072015.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210521072015 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD typefunding_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CF08DE48F FOREIGN KEY (typefunding_id) REFERENCES TypeFunding (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CF08DE48F ON historique (typefunding_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CF08DE48F');
+        $this->addSql('DROP INDEX IDX_A2E2D63CF08DE48F');
+        $this->addSql('ALTER TABLE Historique DROP typefunding_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210521090307.php b/app/DoctrineMigrations/Version20210521090307.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bccb9f9bddc50b02e19df0d938688e79b67062b
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210521090307.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210521090307 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD topiccategory_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CB45EC3B0 FOREIGN KEY (topiccategory_id) REFERENCES TopicCategory (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CB45EC3B0 ON historique (topiccategory_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CB45EC3B0');
+        $this->addSql('DROP INDEX IDX_A2E2D63CB45EC3B0');
+        $this->addSql('ALTER TABLE Historique DROP topiccategory_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210521093822.php b/app/DoctrineMigrations/Version20210521093822.php
new file mode 100644
index 0000000000000000000000000000000000000000..72c2a95c74a38bce1b921f0bf132d40f4e027805
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210521093822.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210521093822 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD theiacategories_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CFBCEAAE4 FOREIGN KEY (theiacategories_id) REFERENCES TheiaCategories (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CFBCEAAE4 ON historique (theiacategories_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CFBCEAAE4');
+        $this->addSql('DROP INDEX IDX_A2E2D63CFBCEAAE4');
+        $this->addSql('ALTER TABLE Historique DROP theiacategories_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210521122420.php b/app/DoctrineMigrations/Version20210521122420.php
new file mode 100644
index 0000000000000000000000000000000000000000..48952b9a46aa421927780701c95349181cc43e85
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210521122420.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210521122420 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD inspiretheme_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C745C8861 FOREIGN KEY (inspiretheme_id) REFERENCES InspireTheme (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C745C8861 ON historique (inspiretheme_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C745C8861');
+        $this->addSql('DROP INDEX IDX_A2E2D63C745C8861');
+        $this->addSql('ALTER TABLE Historique DROP inspiretheme_id');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210521131003.php b/app/DoctrineMigrations/Version20210521131003.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a6b3cde51ea9e345e5d2279ac6e261fc837257c
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210521131003.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210521131003 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD dataconstraint INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CFB796FD9 FOREIGN KEY (dataconstraint) REFERENCES DataConstraint (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CFB796FD9 ON historique (dataconstraint)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CFB796FD9');
+        $this->addSql('DROP INDEX IDX_A2E2D63CFB796FD9');
+        $this->addSql('ALTER TABLE Historique DROP dataconstraint');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210525071914.php b/app/DoctrineMigrations/Version20210525071914.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbc648727524e23d921ec19828788f4d193e86b9
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210525071914.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210525071914 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD criteriageology INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63C225135ED FOREIGN KEY (criteriageology) REFERENCES CriteriaGeology (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63C225135ED ON historique (criteriageology)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63C225135ED');
+        $this->addSql('DROP INDEX IDX_A2E2D63C225135ED');
+        $this->addSql('ALTER TABLE Historique DROP criteriageology');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210525082320.php b/app/DoctrineMigrations/Version20210525082320.php
new file mode 100644
index 0000000000000000000000000000000000000000..86fc2efdb41a36965f8dd761076846cabe1b5c14
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210525082320.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210525082320 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE historique ADD criteriaclimate INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE historique ADD CONSTRAINT FK_A2E2D63CB99DE224 FOREIGN KEY (criteriaclimate) REFERENCES CriteriaClimat (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_A2E2D63CB99DE224 ON historique (criteriaclimate)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Historique DROP CONSTRAINT FK_A2E2D63CB99DE224');
+        $this->addSql('DROP INDEX IDX_A2E2D63CB99DE224');
+        $this->addSql('ALTER TABLE Historique DROP criteriaclimate');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528132537.php b/app/DoctrineMigrations/Version20210528132537.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6c96ee918257a31f88cb88d8313c6d66a42fe5e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528132537.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528132537 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    categorie (id, libelle, libelleen)
+VALUES
+       (nextval('categorie_id_seq'), 'Administration', 'Administration'),
+       (nextval('categorie_id_seq'),'Autre', 'Other'),
+       (nextval('categorie_id_seq'),'Bureau d''études', 'Engineering consultant'),
+       (nextval('categorie_id_seq'),'Chercheur', 'Researcher'),
+       (nextval('categorie_id_seq'),'Collectivité', 'Local authority'),
+       (nextval('categorie_id_seq'),'Entreprise', 'Company'),
+       (nextval('categorie_id_seq'),'Particulier', ' Private individual' )
+ON CONFLICT (libelle)
+DO UPDATE SET libelleen = EXCLUDED.libelleen;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM categorie');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528133524.php b/app/DoctrineMigrations/Version20210528133524.php
new file mode 100644
index 0000000000000000000000000000000000000000..abf5aff6446df671b9477ec7574a399991e3b315
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528133524.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528133524 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    objectifrecherche (id , libelle, libelleen)
+VALUES
+       (nextval('objectifrecherche_id_seq'), 'Agrosystème', 'Agrosystem'),
+       (nextval('objectifrecherche_id_seq'), 'Aménagement du territoire', 'Land use planning'),
+       (nextval('objectifrecherche_id_seq'), 'Biodiversité', 'Biodiversity'),
+       (nextval('objectifrecherche_id_seq'), 'Biogéochimie', 'Biogeochemistry'),
+       (nextval('objectifrecherche_id_seq'), 'Changement climatique', 'Climate change' ),
+       (nextval('objectifrecherche_id_seq'), 'Écologie', 'Ecology'),
+       (nextval('objectifrecherche_id_seq'),'Écologie du paysage', 'Landscape ecology' ),
+       (nextval('objectifrecherche_id_seq'),'Géochimie', 'Geochemistry' ),
+       (nextval('objectifrecherche_id_seq'),'Géologie', 'Geology' ),
+       (nextval('objectifrecherche_id_seq'),'Géophysique', 'Geophysics' ),
+       (nextval('objectifrecherche_id_seq'),'Gestion de l''eau', 'Water resource management' ),
+       (nextval('objectifrecherche_id_seq'),'Hydraulique', 'Hydraulics'  ),
+       (nextval('objectifrecherche_id_seq'),'Hydrogéologie', 'Hydrogeology' ),
+       (nextval('objectifrecherche_id_seq'),'Hydrologie', 'Hydrology'  ),
+       (nextval('objectifrecherche_id_seq'),'Météorologie', 'Meteorology'   ),
+       (nextval('objectifrecherche_id_seq'),'Microbiologie', 'Microbiology' ),
+       (nextval('objectifrecherche_id_seq'), 'Micropolluants', 'Micropollutants' ),
+       (nextval('objectifrecherche_id_seq'), 'Pédologie', 'Pedology' ),
+       (nextval('objectifrecherche_id_seq'), 'Sciences humaines', 'Humanities' ),
+       (nextval('objectifrecherche_id_seq'), 'Télédétection', 'Remote sensing' )
+
+ON CONFLICT (libelle)
+DO UPDATE SET libelleen = EXCLUDED.libelleen;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM objectifrecherche');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528141504.php b/app/DoctrineMigrations/Version20210528141504.php
new file mode 100644
index 0000000000000000000000000000000000000000..18270d60a41440f6c11c4785a8aa912370ee7e24
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528141504.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528141504 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    echantillonnage (id , nom, code, nomen, ordresortie, hasdirection)
+VALUES
+       (nextval('echantillonnage_id_seq'), 'Moyenne', 'mean', 'Mean', 8, true),
+       (nextval('echantillonnage_id_seq'), 'Cumul', 'cumulative', 'Accumulation', 12, true ),
+       (nextval('echantillonnage_id_seq'), 'Interpolation linéaire', 'instantaneous', 'Linear interpolation', 4, false)
+
+ON CONFLICT (nom)
+DO UPDATE SET nomen = EXCLUDED.nomen;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->addSql('DELETE FROM echantillonnage');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528142042.php b/app/DoctrineMigrations/Version20210528142042.php
new file mode 100644
index 0000000000000000000000000000000000000000..b162a148a28bc0c01d6a9aa2f9e0d2cdd3ba4164
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528142042.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528142042 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    typetravaux (id , libelle, libelleen)
+VALUES
+       (nextval('typetravaux_id_seq'), 'Autre', 'Other'),
+       (nextval('typetravaux_id_seq'), 'Enseignement', 'Education'),
+       (nextval('typetravaux_id_seq'), 'Étude', 'Consulting / design project' ),
+       (nextval('typetravaux_id_seq'), 'Recherche', 'Research')
+
+ON CONFLICT (libelle)
+DO UPDATE SET libelleen = EXCLUDED.libelleen;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->addSql('DELETE FROM typetravaux');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528142513.php b/app/DoctrineMigrations/Version20210528142513.php
new file mode 100644
index 0000000000000000000000000000000000000000..a536b559401e738da0c26d06098d90b7c343095d
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528142513.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528142513 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    pasechantillonnage (id , libelle, libelleen, unite, valeur, approxsecondes )
+VALUES
+       (nextval('pasechantillonnage_id_seq'),'5 minutes', '5 minutes', 'minute', 5, 300),
+       (nextval('pasechantillonnage_id_seq'), '6 minutes', '6 minutes', 'minute', 6, 360),
+       (nextval('pasechantillonnage_id_seq'), '15 minutes', '15 minutes', 'minute', 15, 900 ),
+       (nextval('pasechantillonnage_id_seq'), '30 minutes', '30 minutes','minute', 30, 1800),
+       (nextval('pasechantillonnage_id_seq'),'1 heure', '1 hour', 'hour', 1, 3600),
+       (nextval('pasechantillonnage_id_seq'), '6 heures', '6 hours', 'hour', 6, 21600),
+       (nextval('pasechantillonnage_id_seq'), '1 jour', '1 day','day', 1, 86400),
+       (nextval('pasechantillonnage_id_seq'),'1 mois', '1 month' ,'month', 1, 2629800),
+       (nextval('pasechantillonnage_id_seq'), '1 an', '1 year','year', 1, 31557600),
+       (nextval('pasechantillonnage_id_seq'), '1 événement', '1 event','event', 1, 2000000000 )
+
+ON CONFLICT (unite, valeur)
+DO UPDATE SET libelleen = EXCLUDED.libelleen;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->addSql('DELETE FROM pasechantillonnage');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210528145119.php b/app/DoctrineMigrations/Version20210528145119.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bed38554b5f220971ac2c47b2f0e624b369f355
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210528145119.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210528145119 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TEMPORARY TABLE optionechantillonnagesortie_temp (ech varchar(256), pdt varchar(256))');
+
+        $this->addSql(
+            <<<EOF
+            INSERT INTO optionechantillonnagesortie_temp VALUES
+                ('Cumul', '1 événement'),
+                ('Cumul', '1 an'),
+                ('Cumul', '1 mois'),
+                ('Cumul', '1 jour'),
+                ('Cumul', '6 heures'),
+                ('Cumul', '1 heure'),
+                ('Cumul', '30 minutes'),
+                ('Cumul', '15 minutes'),
+                ('Cumul', '6 minutes'),
+                ('Cumul', '5 minutes'),
+                ('Moyenne', '1 événement'),
+                ('Moyenne', '1 an'),
+                ('Moyenne', '1 mois'),
+                ('Moyenne', '1 jour'),
+                ('Moyenne', '6 heures'),
+                ('Moyenne', '1 heure'),
+                ('Moyenne', '30 minutes'),
+                ('Interpolation linéaire', '1 événement'),
+                ('Interpolation linéaire', '1 an'),
+                ('Interpolation linéaire', '1 mois'),
+                ('Interpolation linéaire', '1 jour'),
+                ('Interpolation linéaire', '6 heures'),
+                ('Interpolation linéaire', '1 heure')
+EOF
+        );
+
+        $this->addSql(
+            <<<EOF
+            INSERT INTO optionechantillonnagesortie (id, echantillonnageentree_id, pasechantillonnage_id)
+                SELECT
+                    nextval('optionechantillonnagesortie_id_seq'),
+                    e.id,
+                    pe.id
+                    FROM optionechantillonnagesortie_temp v
+                        INNER JOIN echantillonnage e ON (v.ech = e.nom)
+                        INNER JOIN pasechantillonnage pe ON (v.pdt = pe.libelle)
+            ON CONFLICT (echantillonnageentree_id, pasechantillonnage_id)
+                DO NOTHING
+EOF
+        );
+
+        $this->addSql("SELECT setval('optionechantillonnagesortie_id_seq', MAX(id)) FROM optionechantillonnagesortie");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM OptionEchantillonnageSortie');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210601091814.php b/app/DoctrineMigrations/Version20210601091814.php
new file mode 100644
index 0000000000000000000000000000000000000000..0addcb590ab6e5790291049514419eabed727d01
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210601091814.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210601091814 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+        $this->addSql("INSERT INTO
+    jeuqualite (id, nom, estAffectable)
+VALUES
+       (nextval('jeuqualite_id_seq'), 'Hydro2', false),
+       (nextval('jeuqualite_id_seq'),'VALIDE', true)
+       ON CONFLICT (nom)
+DO Nothing;
+");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM jeuqualite');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210601094741.php b/app/DoctrineMigrations/Version20210601094741.php
new file mode 100644
index 0000000000000000000000000000000000000000..e413be2e1baee83c6baff965e905717748bc2abb
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210601094741.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210601094741 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE TEMPORARY TABLE newqualite (jeu VARCHAR(256), code VARCHAR(256), libelle VARCHAR(256), libelleEn VARCHAR(256), ordre INT, type VARCHAR(256), style json)');
+
+        $this->addSql('ALTER TABLE qualite ADD CONSTRAINT unique_jeu_code UNIQUE (jeu_id, code)');
+
+        $this->addSql(
+            <<<EOF
+            INSERT INTO newqualite VALUES
+                ('VALIDE', 'v', 'Valide', 'Valid', 800, null, '{"color":[0,0,255],"thickness":1}'),
+                ('VALIDE', 'a', 'Absente', 'Missing', 300, null, '{"color":[0,242,255],"thickness":1}'),
+                ('VALIDE', 'l', 'Lacune', 'Gap', 100, 'gap', '{"color":[255,0,0],"thickness":5}'),
+                ('VALIDE', 'i', 'Invalide', 'Invalid', 200, 'gap', '{"color":[255,0,0],"thickness":5}'),
+                ('VALIDE', 'd', 'Douteuse', 'Uncertain', 400, null, '{"color":[0,255,43],"thickness":1}'),
+                ('VALIDE', 'e', 'Estimée', 'Estimated', 500, null, '{"color":[247,105,10],"thickness":1}'),
+                ('VALIDE', 'lq', 'Limite de quantification', 'Quantification limit', 600, null, '{"color":[255,0,242],"thickness":1}'),
+                ('VALIDE', 'ld', 'Limite de détection', 'Detection limit', 700, null, '{"color":[255,0,242],"thickness":1}'),
+                ('VALIDE', 'gap', 'Lacune technique', 'Technical gap', 100, 'gap', null),
+                ('Hydro2', '9', 'Bonne', 'Good', null, null, null),
+                ('Hydro2', '5', 'Estimée', 'Estimated', null, null, null),
+                ('Hydro2', '8', 'Reconstituée bonne', 'Rebuilt good', null, null, null),
+                ('Hydro2', 'I', 'Valeur inconnue faible', 'Unknown low value', null, null, null),
+                ('Hydro2', 'S', 'Valeur inconnue forte', 'Unknown high value', null, null, null),
+                ('Hydro2', 'gap', 'Lacune technique', 'Technical gap', null, null, null)
+EOF
+        );
+
+        $this->addSql(
+            <<<EOF
+            INSERT INTO qualite (id, jeu_id, code, libelle, libelleEn, ordre, type, style)
+                SELECT
+                       nextval('qualite_id_seq'),
+                       j.id,
+                       nq.code,
+                       nq.libelle,
+                       nq.libelleEn,
+                       nq.ordre,
+                       nq.type,
+                       nq.style
+                FROM newqualite nq INNER JOIN jeuqualite j ON (nq.jeu = j.nom)
+            ON CONFLICT ON CONSTRAINT unique_jeu_code
+                DO UPDATE SET
+                      libelle = excluded.libelle,
+                      libelleEn = excluded.libelleEn,
+                      ordre = excluded.ordre,
+                      type = excluded.type,
+                      style = excluded.style
+EOF
+        );
+
+        $this->addSql('ALTER TABLE qualite DROP CONSTRAINT unique_jeu_code');
+
+        $this->addSql("SELECT setval('qualite_id_seq', MAX(id)) FROM qualite");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM qualite');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210601144856.php b/app/DoctrineMigrations/Version20210601144856.php
new file mode 100644
index 0000000000000000000000000000000000000000..82b58a1fe6cbd57bc12b9f305bb726c842a9cfc3
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210601144856.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210601144856 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        //Traduction dans Valide de Hydro 2 en Valide
+        $this->addSql('CREATE TEMP TABLE newqualitejeuqualite (jeu_dest VARCHAR(256), code_dest VARCHAR(256), jeu_src VARCHAR(256), code_src VARCHAR(256))');
+        $this->addSql(
+            <<<EOF
+            INSERT INTO newqualitejeuqualite VALUES
+                ( 'Hydro2', '0',   'VALIDE', 'a'),
+                ( 'Hydro2', '5',   'VALIDE', 'd'),
+                ( 'Hydro2', '9',   'VALIDE', 'v'),
+                ( 'Hydro2', 'gap', 'VALIDE', 'gap'),
+                ( 'Hydro2', 'gap', 'VALIDE', 'l'),
+                ( 'VALIDE', 'a',   'Hydro2', '0'),
+                ( 'VALIDE', 'd',   'Hydro2', '5'),
+                ( 'VALIDE', 'd',   'Hydro2', 'I'),
+                ( 'VALIDE', 'd',   'Hydro2', 'S'),
+                ( 'VALIDE', 'l',   'Hydro2', 'gap'),
+                ( 'VALIDE', 'v',   'Hydro2', '8'),
+                ( 'VALIDE', 'v',   'Hydro2', '9'),
+                ( 'VALIDE', 'a',   'VALIDE', 'a'),
+                ( 'VALIDE', 'd',   'VALIDE', 'd'),
+                ( 'VALIDE', 'e',   'VALIDE', 'e'),
+                ( 'VALIDE', 'i',   'VALIDE', 'i'),
+                ( 'VALIDE', 'l',   'VALIDE', 'gap'),
+                ( 'VALIDE', 'l',   'VALIDE', 'l'),
+                ( 'VALIDE', 'ld',  'VALIDE', 'ld'),
+                ( 'VALIDE', 'lq',  'VALIDE', 'lq'),
+                ( 'VALIDE', 'v',   'VALIDE', 'v')
+EOF
+        );
+
+        // Déduplique
+        $this->addSql(
+            <<<EOF
+            WITH dupes AS (
+                SELECT array_remove(array_agg(id), min(id)) AS to_delete
+                FROM qualitejeuqualite
+                GROUP BY jeu_id, traduction_id, qualite_id
+                HAVING count(DISTINCT id) > 1
+            )
+            DELETE FROM qualitejeuqualite qjq USING dupes d WHERE qjq.id = ANY (d.to_delete)
+EOF
+        );
+
+        $this->addSql('ALTER TABLE qualitejeuqualite ADD CONSTRAINT unique_triplet UNIQUE (traduction_id, jeu_id, qualite_id)');
+
+        $this->addSql(
+            <<<EOF
+        INSERT INTO qualitejeuqualite (id, traduction_id, jeu_id, qualite_id)
+            SELECT
+                nextval('qualitejeuqualite_id_seq'),
+                dest_q.id,
+                dest_q.jeu_id,
+                src_q.id
+            FROM
+                newqualitejeuqualite new
+                    INNER JOIN jeuqualite dest_jeu ON (new.jeu_dest = dest_jeu.nom)
+                    INNER JOIN qualite dest_q ON (new.code_dest = dest_q.code AND dest_q.jeu_id = dest_jeu.id)
+                    INNER JOIN jeuqualite src_jeu ON (new.jeu_src = src_jeu.nom)
+                    INNER JOIN qualite src_q ON (new.code_src = src_q.code AND src_q.jeu_id = src_jeu.id)
+        ON CONFLICT (traduction_id, jeu_id, qualite_id)
+            DO NOTHING
+EOF
+        );
+
+        $this->addSql('ALTER TABLE qualitejeuqualite DROP CONSTRAINT unique_triplet');
+
+        $this->addSql("SELECT setval('qualitejeuqualite_id_seq', MAX(id)) FROM qualitejeuqualite");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM qualitejeuqualite');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210629071614.php b/app/DoctrineMigrations/Version20210629071614.php
new file mode 100644
index 0000000000000000000000000000000000000000..2370c535cb78ece50528ebf6e6666b44a5c5c1ac
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210629071614.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210629071614 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE doi ADD descriptionEn VARCHAR(750) DEFAULT NULL');
+        $this->addSql('ALTER TABLE station ADD commentaireEn VARCHAR(4000) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Doi DROP descriptionEn');
+        $this->addSql('ALTER TABLE Station DROP commentaireEn');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210630075833.php b/app/DoctrineMigrations/Version20210630075833.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e6a112dac24134a6f7378b66ae34a9599894cb3
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210630075833.php
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Migrations\IrreversibleMigrationException;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210630075833 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        // Ces deux commandes sont exécutées immédiatement plutôt que dans le flot des migrations
+        $conn = $this->connection->getWrappedConnection();
+        $conn->exec('
+            CREATE TEMPORARY TABLE newcommune(nom VARCHAR(255) NOT NULL, nomcomplet VARCHAR(255) NOT NULL, codePostal
+    VARCHAR(5) NOT NULL, codeInsee VARCHAR(5) NOT NULL, CONSTRAINT unique_postal_insee UNIQUE (codeInsee, codePostal));
+        ');
+        $conn->pgsqlCopyFromFile('newcommune', 'compress.zlib://' . __DIR__ . '/files/communes-2020.csv.gz', ',', 'NULL', 'codeinsee,codepostal,nomcomplet,nom');
+
+        // Supprime les communes non référencées par les autres tables
+        $this->addSql(
+            <<<SQL
+            DELETE FROM commune WHERE id NOT IN (
+                    SELECT commune_id FROM station WHERE commune_id IS NOT NULL
+                UNION
+                    SELECT commune_id FROM historique WHERE commune_id IS NOT NULL
+            )
+SQL
+        );
+
+        // Retrouve les codes postaux manquants à partir du code INSEE (risque mineur d'erreur)
+        $this->addSql('UPDATE commune c SET codePostal = nc.codePostal FROM newcommune nc WHERE
+            c.codePostal IS NULL AND c.codeInsee = nc.codeInsee');
+
+        // Déduplique les communes
+        // 1. crée une table temporaire avec les ids des doublons et un id que l'on conservera
+        // 2. met à jour les references
+        // 3. supprime les doublons
+        $this->addSql(
+            <<<SQL
+            CREATE TEMPORARY TABLE commune_dupes AS
+                SELECT min(id) AS winner, array_remove(array_agg(id), min(id)) AS losers
+                FROM commune
+                GROUP BY (codeInsee, codePostal)
+                HAVING count(id) > 1
+SQL
+        );
+        $this->addSql('UPDATE station s SET commune_id = d.winner FROM commune_dupes d WHERE s.commune_id = ANY (d.losers)');
+        $this->addSql('UPDATE historique h SET commune_id = d.winner FROM commune_dupes d WHERE h.commune_id = ANY (d.losers)');
+        $this->addSql('DELETE FROM commune c USING commune_dupes d WHERE c.id = ANY (d.losers)');
+
+        // Réajuste le générateur d'id (optionel)
+        $this->addSql("SELECT setval('commune_id_seq', max(id)) FROM commune");
+
+        // Met à jour la table
+        $this->addSql("ALTER TABLE commune ALTER COLUMN id SET DEFAULT nextval('commune_id_seq');");
+        $this->addSql('ALTER TABLE commune ADD CONSTRAINT unique_codes UNIQUE (codePostal, codeInsee);');
+
+        // Upsert les nouvelles communes
+        $this->addSql('INSERT INTO commune(nom, codeInsee, codePostal)
+            SELECT nc.nomComplet, nc.codeInsee, nc.codePostal FROM newcommune nc
+            ON CONFLICT ON CONSTRAINT unique_codes DO UPDATE SET nom = excluded.nom');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        throw new IrreversibleMigrationException();
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210701093025.php b/app/DoctrineMigrations/Version20210701093025.php
new file mode 100644
index 0000000000000000000000000000000000000000..747f59c07d1c9613f1832bf9b73e4b9a313951f9
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210701093025.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210701093025 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE unite ADD libelleEn VARCHAR(255) DEFAULT NULL');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_DCA5EE1C93C03288 ON unite (libelleEn)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX UNIQ_DCA5EE1C93C03288');
+        $this->addSql('ALTER TABLE Unite DROP libelleEn');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210702083955.php b/app/DoctrineMigrations/Version20210702083955.php
new file mode 100644
index 0000000000000000000000000000000000000000..4df89c8610d7fa40cfb632675fd087b8d9aeae53
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210702083955.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210702083955 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ADD theiaPassword VARCHAR(255) DEFAULT NULL');
+        $this->addSql('CREATE UNIQUE INDEX UNIQ_90B54B32B59831AB ON observatoire (theiaPassword)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX UNIQ_90B54B32B59831AB');
+        $this->addSql('ALTER TABLE Observatoire DROP theiaPassword');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210702134045.php b/app/DoctrineMigrations/Version20210702134045.php
new file mode 100644
index 0000000000000000000000000000000000000000..75f354d5a66654611d3bf69f99f854957aece884
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210702134045.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210702134045 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX uniq_90b54b32b59831ab');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE UNIQUE INDEX uniq_90b54b32b59831ab ON Observatoire (theiapassword)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210707125426.php b/app/DoctrineMigrations/Version20210707125426.php
new file mode 100644
index 0000000000000000000000000000000000000000..74693ebdf89b3be4e29ae588753b3cb4a45b3645
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210707125426.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210707125426 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        // Corrige les m^2 et m^3 des unités existantes
+        $this->addSql("UPDATE unite SET libelle = REPLACE(libelle, 'm2', 'm²'), libelleEn = REPLACE(libelleEn, 'm2', 'm²')");
+        $this->addSql("UPDATE unite SET libelle = REPLACE(libelle, 'm3', 'm³'), libelleEn = REPLACE(libelleEn, 'm3', 'm³')");
+
+        $this->addSql("INSERT INTO
+    unite (id, libelle, libelleEn)
+VALUES
+       (nextval('unite_id_seq'), 'm', 'm' ),
+       (nextval('unite_id_seq'), 'mm', 'mm' ),
+       (nextval('unite_id_seq'), 'cm', 'cm' ),
+       (nextval('unite_id_seq'), 'L/s', 'L/s' ),
+       (nextval('unite_id_seq'), 'm³/s', 'm³/s' ),
+       (nextval('unite_id_seq'), 'L', 'L' ),
+       (nextval('unite_id_seq'), '%', '%' ),
+       (nextval('unite_id_seq'), 'g', 'g' ),
+       (nextval('unite_id_seq'), 'kg', 'kg' ),
+       (nextval('unite_id_seq'), 'T', 'T' ),
+       (nextval('unite_id_seq'), 'm³', 'm³' ),
+       (nextval('unite_id_seq'), 'degrés', 'degrees' ),
+       (nextval('unite_id_seq'), '°C', '°C' ),
+       (nextval('unite_id_seq'), 'm/s', 'm/s' ),
+       (nextval('unite_id_seq'), 'km/h', 'km/h' ),
+       (nextval('unite_id_seq'), 'mm/h', 'mm/h' ),
+       (nextval('unite_id_seq'), 'L/m²', 'L/m²' ),
+       (nextval('unite_id_seq'), 'hPa', 'hPa' ),
+       (nextval('unite_id_seq'), 'mbar', 'mbar' ),
+       (nextval('unite_id_seq'), 'µS/cm', 'µS/cm' )
+
+       ON CONFLICT (libelle)
+            DO UPDATE SET libelleEn = excluded.libelleEn;
+");
+
+        $this->addSql("SELECT setval('unite_id_seq', MAX(id)) FROM unite");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DELETE FROM unite');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210707132605.php b/app/DoctrineMigrations/Version20210707132605.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0d3693da64fdbc76fe675ba30dff5fab3c4830e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210707132605.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210707132605 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        //Passage en migration des famille de paramètre
+        $this->addSql('CREATE TEMP TABLE newfamilleparametres (nom VARCHAR(256), nomEn VARCHAR(256), prefix VARCHAR(256), nomfamilleparente VARCHAR(256))');
+        $this->addSql(
+            <<<EOF
+            INSERT INTO newfamilleparametres VALUES
+               ('Hydrologie', 'Hydrology', '001', null),
+               ('Atmosphère - Météorologie', 'Atmosphere - Meteorology', '002', null),
+               ('Chimie', 'Chemistry', '003',  null),
+               ('Général', 'General', '1', 'Chimie')
+EOF
+        );
+
+        // Insère/met à jour les familles de paramètres
+        $this->addSql(
+            <<<EOF
+            INSERT INTO familleparametres (id, nom, nomEn, prefix, familleparente_id)
+                SELECT nextval('familleparametres_id_seq'), nf.nom, nf.nomEn, nf.prefix, null
+                FROM newfamilleparametres nf
+            ON CONFLICT (nom)
+                DO UPDATE SET nomEn = excluded.nomEn, prefix = excluded.prefix
+EOF
+        );
+
+        // Met à jour les relations hiérarchiques
+        $this->addSql(
+            <<<EOF
+            UPDATE familleparametres f set familleparente_id = pf.id
+                FROM newfamilleparametres nf
+                    INNER JOIN familleparametres pf ON (nf.nomfamilleparente = pf.nom)
+                WHERE nf.nom = f.nom
+EOF
+        );
+
+        $this->addSql("SELECT setval('familleparametres_id_seq', MAX(id)) FROM familleparametres");
+
+        //Passage en migration des type de paramètre
+        $this->addSql('CREATE TEMP TABLE newtypeparametre (nom VARCHAR(256), nomEn VARCHAR(256), code VARCHAR(256), famille VARCHAR(256))');
+        $this->addSql(
+            <<<EOF
+            INSERT INTO newtypeparametre VALUES
+                ('Hauteur d''eau', 'Water height', 'HT', 'Hydrologie'),
+                ('Débit', 'Discharge', 'DEB', 'Hydrologie'),
+                ('Température de l''eau', 'Water temperature', 'TEMPE', 'Hydrologie'),
+                ('Température de l''air', 'Air temperature', 'HT', 'Atmosphère - Météorologie'),
+                ('Niveau piézométrique', 'Groundwater level', 'PZ', 'Hydrologie'),
+                ('Vitesse de l''eau', 'Water speed', 'VE', 'Hydrologie'),
+                ('Vitesse du vent', 'Wind speed', 'VV', 'Atmosphère - Météorologie'),
+                ('Direction du vent', 'Wind direction', 'DIRV', 'Atmosphère - Météorologie'),
+                ('Précipitation', 'Precipitation', 'PRCP', 'Atmosphère - Météorologie'),
+                ('Pression atmosphérique', 'Atmospheric pressure', 'PA', 'Atmosphère - Météorologie'),
+                ('Volume d''eau', 'Water volume', 'VOLE', 'Hydrologie'),
+                ('Humidité de l''air', 'Humidity', 'HUMA', 'Atmosphère - Météorologie'),
+                ('pH', 'pH', 'PH', 'Général'),
+                ('Conductivité', 'Conductivity', 'COND', 'Général')
+EOF
+        );
+
+        $this->addSql(
+            <<<EOF
+            INSERT INTO typeparametre (id, nom, nomEn, code, familleparametres_id)
+                SELECT nextval('typeparametre_id_seq'), ntp.nom, ntp.nomEn, ntp.code, f.id
+                FROM newtypeparametre ntp
+                    INNER JOIN familleparametres f ON (ntp.famille = f.nom)
+            ON CONFLICT (nom)
+                DO UPDATE SET nomEn = excluded.nomEn, code = excluded.code, familleparametres_id = excluded.familleparametres_id
+EOF
+        );
+
+        $this->addSql("SELECT setval('typeparametre_id_seq', MAX(id)) FROM typeparametre");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->addSql('DELETE FROM familleparametres');
+        $this->addSql('DELETE FROM typeparametre');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210722132545.php b/app/DoctrineMigrations/Version20210722132545.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b39acd5dca13049ec40968e446d4b0f0be9d739
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210722132545.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210722132545 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ADD miseajourAutomatique BOOLEAN NOT NULL DEFAULT FALSE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Observatoire DROP miseajourAutomatique');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210726134943.php b/app/DoctrineMigrations/Version20210726134943.php
new file mode 100644
index 0000000000000000000000000000000000000000..acb31fb166b04c7270cdce1e667d5b26656f9523
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210726134943.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210726134943 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE observatoire ALTER miseajourautomatique DROP DEFAULT');
+        $this->addSql('ALTER TABLE observatoires_data_manager DROP CONSTRAINT fk_26c6793a98de13ac');
+        $this->addSql('DROP INDEX idx_26c6793a98de13ac');
+        $this->addSql('ALTER TABLE observatoires_data_manager DROP CONSTRAINT observatoires_data_manager_pkey');
+        $this->addSql('ALTER TABLE observatoires_data_manager RENAME COLUMN partenaire_id TO personnetheia_id');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD CONSTRAINT FK_26C6793A89274090 FOREIGN KEY (personnetheia_id) REFERENCES PersonneTheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_26C6793A89274090 ON observatoires_data_manager (personnetheia_id)');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD PRIMARY KEY (observatoire_id, personnetheia_id)');
+        $this->addSql('ALTER TABLE personnetheia DROP CONSTRAINT fk_3ba3d4e338898cf5');
+        $this->addSql('ALTER TABLE personnetheia DROP CONSTRAINT FK_3BA3D4E3FB88E14F');
+        $this->addSql('DROP INDEX idx_3ba3d4e338898cf5');
+        $this->addSql('ALTER TABLE personnetheia RENAME COLUMN partenaires_id TO partenaire_id');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E398DE13AC FOREIGN KEY (partenaire_id) REFERENCES Partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE personnetheia ADD CONSTRAINT FK_3BA3D4E3FB88E14F FOREIGN KEY (utilisateur_id) REFERENCES Utilisateur (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_3BA3D4E398DE13AC ON personnetheia (partenaire_id)');
+        $this->addSql('ALTER TABLE dataset DROP CONSTRAINT FK_40503EACD8B5F69');
+        $this->addSql('DROP INDEX idx_40503eacd8b5f69');
+        $this->addSql('ALTER TABLE dataset RENAME COLUMN dataconstraints_id TO dataconstraint_id');
+        $this->addSql('ALTER TABLE dataset ADD CONSTRAINT FK_40503EAC2FA57584 FOREIGN KEY (dataconstraint_id) REFERENCES DataConstraint (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX IDX_40503EAC2FA57584 ON dataset (dataconstraint_id)');
+        $this->addSql('ALTER TABLE theiacategories ALTER nom SET NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE Observatoire ALTER miseAJourAutomatique SET DEFAULT \'false\'');
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT FK_3BA3D4E398DE13AC');
+        $this->addSql('ALTER TABLE PersonneTheia DROP CONSTRAINT fk_3ba3d4e3fb88e14f');
+        $this->addSql('DROP INDEX IDX_3BA3D4E398DE13AC');
+        $this->addSql('ALTER TABLE PersonneTheia RENAME COLUMN partenaire_id TO partenaires_id');
+        $this->addSql('ALTER TABLE PersonneTheia ADD CONSTRAINT fk_3ba3d4e338898cf5 FOREIGN KEY (partenaires_id) REFERENCES partenaire (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('ALTER TABLE PersonneTheia ADD CONSTRAINT fk_3ba3d4e3fb88e14f FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_3ba3d4e338898cf5 ON PersonneTheia (partenaires_id)');
+        $this->addSql('ALTER TABLE observatoires_data_manager DROP CONSTRAINT FK_26C6793A89274090');
+        $this->addSql('DROP INDEX IDX_26C6793A89274090');
+        $this->addSql('DROP INDEX observatoires_data_manager_pkey');
+        $this->addSql('ALTER TABLE observatoires_data_manager RENAME COLUMN personnetheia_id TO partenaire_id');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD CONSTRAINT fk_26c6793a98de13ac FOREIGN KEY (partenaire_id) REFERENCES personnetheia (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+        $this->addSql('CREATE INDEX idx_26c6793a98de13ac ON observatoires_data_manager (partenaire_id)');
+        $this->addSql('ALTER TABLE observatoires_data_manager ADD PRIMARY KEY (observatoire_id, partenaire_id)');
+        $this->addSql('ALTER TABLE TheiaCategories ALTER nom DROP NOT NULL');
+        $this->addSql('ALTER TABLE DataSet DROP CONSTRAINT fk_40503eacd8b5f69');
+        $this->addSql('ALTER TABLE DataSet ADD CONSTRAINT fk_40503eacd8b5f69 FOREIGN KEY (dataconstraints_id) REFERENCES dataconstraint (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210729081201.php b/app/DoctrineMigrations/Version20210729081201.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd14dde59a8c81e9cc1ea34fe2b73b252590cc68
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210729081201.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210729081201 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE dataset ALTER description TYPE VARCHAR(4000)');
+        $this->addSql('ALTER TABLE dataset ALTER genealogie TYPE VARCHAR(4000)');
+        $this->addSql('ALTER TABLE dataset ALTER descriptionen TYPE VARCHAR(4000)');
+        $this->addSql('ALTER TABLE dataset ALTER genealogieen TYPE VARCHAR(4000)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE DataSet ALTER description TYPE VARCHAR(750)');
+        $this->addSql('ALTER TABLE DataSet ALTER genealogie TYPE VARCHAR(255)');
+        $this->addSql('ALTER TABLE DataSet ALTER descriptionEn TYPE VARCHAR(750)');
+        $this->addSql('ALTER TABLE DataSet ALTER genealogieEn TYPE VARCHAR(255)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210805145331.php b/app/DoctrineMigrations/Version20210805145331.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8764561479c59061c045a600f288c7a52b8c5b5
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210805145331.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210805145331 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX uniq_7da2a0a36c6e55b5');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE UNIQUE INDEX uniq_7da2a0a36c6e55b5 ON Partenaire (nom)');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20210806085745.php b/app/DoctrineMigrations/Version20210806085745.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c7d322fccc8c1247cc70815ddd3b459bf7b7570
--- /dev/null
+++ b/app/DoctrineMigrations/Version20210806085745.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\Bdoh\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Auto-generated Migration: Please modify to your needs!
+ */
+class Version20210806085745 extends AbstractMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // this up() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('CREATE UNIQUE INDEX unique_partenaire_by_obs ON partenaire (nom, observatoire_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // this down() migration is auto-generated, please modify it to your needs
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
+
+        $this->addSql('DROP INDEX unique_partenaire_by_obs');
+    }
+}
diff --git a/app/DoctrineMigrations/files/communes-2020.csv.gz b/app/DoctrineMigrations/files/communes-2020.csv.gz
new file mode 100644
index 0000000000000000000000000000000000000000..3f7d701a38dddc86809f6ea03ec0c6300d3d893c
Binary files /dev/null and b/app/DoctrineMigrations/files/communes-2020.csv.gz differ
diff --git a/app/Resources/JMSJobQueueBundle/views/Job/macros.html.twig b/app/Resources/JMSJobQueueBundle/views/Job/macros.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2febe03123f96a87221e83f5398f367ae04d9193
--- /dev/null
+++ b/app/Resources/JMSJobQueueBundle/views/Job/macros.html.twig
@@ -0,0 +1,39 @@
+{% macro state(job) -%}
+    {% if job.new -%}
+        <span class="label label-default">New</span>
+    {%- elseif job.pending -%}
+        <span class="label label-default">Pending</span>
+    {%- elseif job.running -%}
+        <span class="label label-primary">Running</span>
+    {%- elseif job.canceled -%}
+        <span class="label label-info">Canceled</span>
+    {%- elseif job.terminated -%}
+        <span class="label label-danger">Terminated</span>
+    {%- elseif job.failed -%}
+        <span class="label label-danger">Failed</span>
+    {%- elseif job.incomplete -%}
+        <span class="label label-danger">Incomplete</span>
+    {%- elseif job.finished -%}
+        <span class="label label-success">Finished</span>
+    {%- else -%}
+        <span class="label label-warning">Unknown</span>
+    {%- endif %}
+{%- endmacro %}
+
+{% macro command(job) -%}
+    <code style="width:300px; overflow:hidden; white-space:nowrap;">{{ job.command }} {{ job.args|jms_job_queue_args }}</code>
+{%- endmacro %}
+
+{% macro ago(time, format) -%}
+    <time class="timeago" datetime="{{ time.format(constant("DateTime::ISO8601")) }}">{{ time.format(format|default("Y-m-d H:i:s")) }}</time>
+{%- endmacro %}
+
+{% macro runtime(job) -%}
+    {%- if job.canceled or job.terminated or job.failed or job.incomplete or job.finished -%}
+        <span>{{ job.runTime }} s</span>
+    {%- endif %}
+{%- endmacro %}
+
+{% macro queue(job) -%}
+        <span>{{ job.queue }}</span>
+{%- endmacro %}
diff --git a/app/Resources/JMSJobQueueBundle/views/base.html.twig b/app/Resources/JMSJobQueueBundle/views/base.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bf20954cbd94227be681b3bfddddb9b64aa5a087
--- /dev/null
+++ b/app/Resources/JMSJobQueueBundle/views/base.html.twig
@@ -0,0 +1,7 @@
+{% extends '::layout.html.twig' %}
+
+{% block title %}{{ 'jobs'|trans }}{% endblock title %}
+
+{% block main %}
+    {% block content %}{% endblock %}
+{% endblock main %}
diff --git a/app/Resources/TwigBundle/translations/errors.fr.yml b/app/Resources/TwigBundle/translations/errors.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6c050abcdfcfc197b774c5be089464b86626bdb9
--- /dev/null
+++ b/app/Resources/TwigBundle/translations/errors.fr.yml
@@ -0,0 +1,22 @@
+
+http:
+    fallback:
+        title: Ooops !
+        body: Une erreur s'est produite.
+        alert: warning
+        icon: alert
+    403:
+        title: Accès refusé
+        body: Vous n'avez pas la permission d'accéder à cette information ou d'effectuer cette action.
+        alert: warning
+        icon: minus-sign
+    404:
+        title: Pas trouvé !
+        body: La page ou l'information que vous cherchez n'est pas à cet endroit.
+        alert: warning
+        icon: search
+    500:
+        title: Kaboom !
+        body: Le serveur a eu un gros souci ! Merci de réessayer utlérieurement !
+        alert: danger
+        icon: fire
diff --git a/app/Resources/TwigBundle/views/Exception/error.html.twig b/app/Resources/TwigBundle/views/Exception/error.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..65500a87e3b8c956ca5fd4175ebc97315dd408cb
--- /dev/null
+++ b/app/Resources/TwigBundle/views/Exception/error.html.twig
@@ -0,0 +1,33 @@
+{% extends '::layout.html.twig' %}
+
+{% set DOMAIN = 'errors' %}
+{% set PARAMS = {
+    '%code%': status_code,
+    '%text%': status_text,
+    '%message%': exception.message
+} %}
+
+{% set key = 'http.' ~ (status_code|default("fallback")) ~ '.' %}
+
+{% set titleKey = key ~ "title" %}
+{% set title = titleKey|trans(PARAMS, DOMAIN) %}
+
+{% if title == titleKey %}
+    {% set key = 'http.fallback.' %}
+    {% set title = 'http.fallback.title'|trans(PARAMS, DOMAIN) %}
+{% endif %}
+
+{% block title %}{{ title }}{% endblock %}
+
+{% block main %}
+    <h1>{{ title }}</h1>
+    <div class="alert alert-{{ (key ~ "alert")|trans(PARAMS, DOMAIN) }}">
+        <h2>
+            <span class="glyphicon glyphicon-{{ (key ~ "icon")|trans(PARAMS, DOMAIN) }}"></span>
+            {{ (key ~ "body")|trans(PARAMS, DOMAIN) -}}
+        </h2>
+        {% if app.request.server.has('UNIQUE_ID') %}
+            <p>Request id&nbsp;: <code>{{ app.request.server.get('UNIQUE_ID') }}</code></p>
+        {% endif %}
+    </div>
+{% endblock %}
diff --git a/app/Resources/translations/datetime.en.yml b/app/Resources/translations/datetime.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..68b09d9470b537e48cb50cac30193265e6c56e27
--- /dev/null
+++ b/app/Resources/translations/datetime.en.yml
@@ -0,0 +1,32 @@
+
+status:
+    ok: ''
+    required: 'Please enter a date.'
+    invalid: "'%input%' is not a valid date."
+    beforeMinDate: 'Please select a date after or equal to %minDate%.'
+    afterMaxDate: 'Please select a date before or equal to %maxDate%.'
+
+start.status:
+    ok: ''
+    required: 'Please enter a starting date.'
+    invalid: "'%input%' is not a valid starting date."
+    beforeMinDate: 'Please select a starting date before or equal to %minDate%.'
+    afterMaxDate: 'Please select a starting date after or equal to %maxDate%.'
+
+end.status:
+    ok: ''
+    required: 'Please enter a ending date.'
+    invalid: "'%input%' is not a valid ending date."
+    beforeMinDate: 'Please select a ending date before or equal to %minDate%.'
+    afterMaxDate: 'Please select a ending date after or equal to %maxDate%.'
+
+placeholder: 'DD/MM/YYYY HH:MM:SS'
+
+format:
+    long: 'DD/MM/YYYY HH:mm:ss'
+    short: 'DD/MM/YYYY'
+
+buttons:
+    set-min: Set the date to the minimum.
+    set-max: Set the date to the maximum.
+    reset: Reset the date.
diff --git a/app/Resources/translations/datetime.fr.yml b/app/Resources/translations/datetime.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0191860a0b2a14851cc308464cadb78951fdbb68
--- /dev/null
+++ b/app/Resources/translations/datetime.fr.yml
@@ -0,0 +1,32 @@
+
+status:
+    ok: ''
+    required: 'Veuillez saisir une date.'
+    invalid: "'%input%' n'est pas une date valide."
+    beforeMinDate: 'Veuillez choisir une date antérieure ou égale au %minDate%.'
+    afterMaxDate: 'Veuillez choisir une date postérieure ou égale au %maxDate%.'
+
+start.status:
+    ok: ''
+    required: 'Veuillez saisir une date de début.'
+    invalid: "'%input%' n'est pas une date de début valide."
+    beforeMinDate: 'Veuillez choisir une date de début antérieure ou égale au %minDate%.'
+    afterMaxDate: 'Veuillez choisir une date de début postérieure ou égale au %maxDate%.'
+
+end.status:
+    ok: ''
+    required: 'Veuillez saisir une date de fin.'
+    invalid: "'%input%' n'est pas une date de fin valide."
+    beforeMinDate: 'Veuillez choisir une date de fin antérieure ou égale au %minDate%.'
+    afterMaxDate: 'Veuillez choisir une date de fin postérieure ou égale au %maxDate%.'
+
+placeholder: 'JJ/MM/AAAA HH:MM:SS'
+
+format:
+    long: 'DD/MM/YYYY HH:mm:ss'
+    short: 'DD/MM/YYYY'
+
+buttons:
+    set-min: Fixer la date au minimum.
+    set-max: Fixer la date au maximum.
+    reset: Effacer la date.
diff --git a/app/Resources/views/Core/mentionLegale.html.twig b/app/Resources/views/Core/mentionLegale.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..88d243201eaf21af6156925285056d94a5791209
--- /dev/null
+++ b/app/Resources/views/Core/mentionLegale.html.twig
@@ -0,0 +1,23 @@
+<div>
+    <h3>
+        <small>
+            <p style='text-align: center;'>
+                Institut national de recherche en sciences et technologies pour l'environnement et l'agriculture (&copy; IRSTEA), établissement public à caractère scientifique et technologique
+                <br/>
+                {{'Siège'|trans}} :
+                <i class="glyphicon glyphicon-envelope"></i>
+                1 rue Pierre Gilles de Gennes, CS 10030, 92761 ANTONY Cedex,
+                Tel : +33 1 40 96 61 21
+                N° SIRET : n°180 070 013 00198
+                {{'Directeur de la Publication'|trans}} : Jean-Marc BOURNIGAL
+                <br/>
+                {{'Hébergeur'|trans}} :
+                &copy; Irstea
+                <i class="glyphicon glyphicon-envelope"></i> Centre de Lyon-Villeurbanne
+                5 rue de la Doua - CS70077
+                69626 VILLEURBANNE Cedex,
+                Tel : +33 4 72 20 87 87
+            </p>
+        </small>
+    </h3>
+</div>
diff --git a/app/Resources/views/Core/navigation-bar.html.twig b/app/Resources/views/Core/navigation-bar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..24b8d73b4c365018915c629b10b6a568fecc4749
--- /dev/null
+++ b/app/Resources/views/Core/navigation-bar.html.twig
@@ -0,0 +1,25 @@
+{#-- Navigation bar
+================================================== -#}
+<nav id="navbar" class="navbar navbar-default">
+    {#-- Links
+    ================================================== -#}
+    <ul class="nav navbar-nav">
+        {% if currentObservatoire() %}
+            <li><a href="{{ path('bdoh_home') }}">{{ currentObservatoire().nom }}</a></li>
+            {% if currentObservatoire().hasChronique() %}
+                <li class="divider"></li>
+                <li><a href="{{ path('bdoh_consult_advancedSearch') }}">{{ 'dataAccess'|trans }}</a></li>
+            {% endif %}
+        {% endif %}
+    </ul>
+
+    {#-- Contact and language(later) links  -#}
+    <ul class="nav navbar-nav navbar-right">
+        {% if currentObservatoire() %}
+            <li><a href="{{ path('bdoh_consult_contact') }}"><small>{{ 'contactHelp'|trans }}</small></a></li>
+            <li class="divider"></li>
+        {% endif %}
+        {% include "IrsteaBdohInternationalisationBundle::select-lang.html.twig" %}
+    </ul>
+</nav>
+{#-- END_Navigation bar -#}
diff --git a/app/Resources/views/Core/observatoires-selector.html.twig b/app/Resources/views/Core/observatoires-selector.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1fb89b4009c8029540445b49a4e207ac1043265f
--- /dev/null
+++ b/app/Resources/views/Core/observatoires-selector.html.twig
@@ -0,0 +1,12 @@
+{#-- Observatoire selector
+================================================== -#}
+<li class="dropdown">
+    <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'Observatoire.selector'|trans }} <b class="caret"></b></a>
+    <ul class="dropdown-menu">
+        <li><a href="{{ path('bdoh_all_home', {_observatoire: 'ALL'}) }}">{{ 'Observatoire.Tous'|trans }}</a></li>
+        <li class="divider"></li>
+        {% for observatoire in allObservatoires() %}
+            <li><a href="{{ path('bdoh_home', {'_observatoire' : observatoire.slug}) }}">{{ observatoire.nom }}</a></li>
+        {% endfor %}
+    </ul>
+</li>
diff --git a/app/Resources/views/Core/partenaires.html.twig b/app/Resources/views/Core/partenaires.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..faab1d4e00a9d48724d36b770e2c59e09384c523
--- /dev/null
+++ b/app/Resources/views/Core/partenaires.html.twig
@@ -0,0 +1,17 @@
+{% from '::macros.html.twig' import logo %}
+{#-- 'Partenaires' line
+================================================== -#}
+<table id="partenaires">
+    <tr>
+        <td>{{ logo('Irstea', logo_long_link_parameters, 'https://www.inrae.fr/') }}</td>
+        {% if currentObservatoire() %}
+            {% for partenaire in currentObservatoire().partenaires %}
+                {% if partenaire.pathLogo %}
+                    <td>{{ logo(partenaire.nom, partenaire.pathLogo, partenaire.lien) }}</td>
+                {% endif %}
+            {% endfor %}
+
+        {%endif%}
+    </tr>
+</table>
+{#-- END_'Partenaires' line -#}
diff --git a/app/Resources/views/Core/user-bar.html.twig b/app/Resources/views/Core/user-bar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0531c3d8b4e2d4e341f553cbad8e774f0341472c
--- /dev/null
+++ b/app/Resources/views/Core/user-bar.html.twig
@@ -0,0 +1,16 @@
+{#-- User bar
+================================================== -#}
+<div id="userbar" class="navbar navbar-inverse">
+    {% if currentObservatoire() is not null %}
+        <ul class="nav navbar-nav">
+            {% include is_granted('ROLE_USER') ?
+               'IrsteaBdohSecurityBundle:UserBar:connected-menu.html.twig' :
+               'IrsteaBdohSecurityBundle:UserBar:anonymous-menu.html.twig'
+            %}
+        </ul>
+    {% endif %}
+    <ul class="nav navbar-nav navbar-right">
+        {% include ":Core:observatoires-selector.html.twig" %}
+    </ul>
+</div>
+{#-- END_User bar -#}
diff --git a/app/Resources/views/form_fields.html.twig b/app/Resources/views/form_fields.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fa9ede02a3d09ac015492931b726ff8efe0e3454
--- /dev/null
+++ b/app/Resources/views/form_fields.html.twig
@@ -0,0 +1,9 @@
+{% use 'bootstrap_3_horizontal_layout.html.twig' %}
+
+{% block form_label_class -%}
+    col-sm-4
+{%- endblock form_label_class %}
+
+{% block form_group_class -%}
+    col-sm-20
+{%- endblock form_group_class %}
diff --git a/app/Resources/views/layout.html.twig b/app/Resources/views/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b6aab6bf9bb469d3cff2f13d8a29347b5001a568
--- /dev/null
+++ b/app/Resources/views/layout.html.twig
@@ -0,0 +1,78 @@
+{%- from '::macros.html.twig' import pageTitle, logoObservatoire %}
+
+<!DOCTYPE html>
+<html lang="{{ app.request.locale|split('_')[0] }}">
+<head>
+    {% block htmlmeta %}
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    {% endblock %}
+    <link rel="shortcut icon" href="{{ asset('favicon.ico') }}"/>
+    <title>{% block title %}{{ pageTitle() }}{% endblock title %}</title>
+
+    {#-- Common stylesheets #}
+    <link rel="stylesheet" href="{{ asset('assets/bdoh.css') }}" />
+
+    {#-- Additionnal stylesheets #}
+    {%- block stylesheets %}{% endblock stylesheets -%}
+
+    {#-- Customized theme stylesheets #}
+    <link rel="stylesheet" href="{{ asset(themeCssFile()) }}">
+</head>
+<body>
+<div id="page" class="container">
+
+    {#-- Header
+    ================================================== #}
+    <div id="header" class="row">
+        <div id="logo" class="col-md-3">{{ logoObservatoire(currentObservatoire()) }}</div>
+        <div id="header-bars" class="col-md-21">
+            {% include ":Core:navigation-bar.html.twig" -%}
+            {% include ":Core:user-bar.html.twig" -%}
+        </div>
+    </div>
+    {#-- END_Header --#}
+
+    {#-- Breadcrumb
+    ================================================== #}
+    {% block breadcrumb -%}
+    {% endblock breadcrumb -%}
+
+    {#-- Notice
+    ================================================== #}
+    <div id="notices" data-notices="{{ app.session.flashbag.all() | default([]) | json_encode | e('html_attr') }}"></div>
+
+    {#-- Main content
+    ================================================== #}
+    <div id="main" class="row">
+        {% block main -%}
+        {% endblock main -%}
+    </div>
+    {#-- END_Main content #}
+
+
+    {#-- Footer
+    ================================================== #}
+    <div id="footer">
+        {% include ":Core:partenaires.html.twig" %}
+    </div>
+    {#-- END_Footer #}
+
+    {% include ":Core:mentionLegale.html.twig" %}
+</div>
+
+{% block body_tail -%}
+{% endblock body_tail -%}
+
+{#-- Common javascript #}
+{% if app.debug %}
+    <script src="http://{{ app.request.host }}:35729/livereload.js"></script>
+{% endif %}
+<script src="{{ asset('assets/manifest.js') }}"></script>
+<script src="{{ asset('assets/vendor.js') }}"></script>
+<script src="{{ asset('assets/bdoh.js') }}"></script>
+<script src="{{ asset('assets/locales/' ~ (app.request.locale[:2]) ~ '.js') }}"></script>
+
+{#-- Additionnal javascript #}
+{%- block javascripts -%}{% endblock javascripts -%}
+</body>
+</html>
diff --git a/app/Resources/views/macros.html.twig b/app/Resources/views/macros.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cb94a58324a9f015f5966176cbda43a3c4e0bd45
--- /dev/null
+++ b/app/Resources/views/macros.html.twig
@@ -0,0 +1,222 @@
+{###############################################################################
+ #
+ # Some useful Twig macros for BDOH project.
+ #
+ ##############################################################################}
+
+{#
+# Page title: a root plus optional extra text
+#}
+{% macro pageTitle(extraText) %}
+    BDOH - {{ currentObservatoire() }}{% if extraText %} - {{ extraText }}{% endif %}
+{% endmacro pageTitle %}
+
+{##############################################################################}
+
+{# 
+ # Display the
+ #}
+{% macro logo(title, img, url) %}
+    {%- if url %}<a href="{{ url }}">{% endif -%}
+    <img class="logo" src="{{ asset(img) }}"{% if title %} alt="{{ title }}"{% endif %}>
+    {%- if url %}</a>{% endif %}
+{%- endmacro logo %}
+
+{# 
+ # Display the
+ #}
+{% macro logoObservatoire(obs) %}
+    {%- import _self as macros %}
+    {{- macros.logo(
+            obs ? obs.nom : 'Irstea',
+            obs and obs.pathLogo ? obs.pathLogo : '/images/inrae_logo.svg',
+            obs and obs.lien ? obs.lien : null
+        ) -}}
+{% endmacro logoObservatoire %}
+
+{##
+ # Rich display of a link.
+ #
+ # @param string href
+ # @param string display            Can be 'icon', 'text' or 'both'.
+ # @param string title              Depending on 'display' parameter, is displayed as text or as tooltip.
+ # @param string icon               A famfamfam icon, without the 'fam-' prefix.
+ # @param string tooltip_placement  Top, bottom, left or right.
+ # @param string attr               Extra attributes for the link.
+ #}
+{%- macro richLink(href, title, icon, display, tooltip_placement, attr) %}
+{%- spaceless %}
+    {%- import _self as macros %}
+    <a href="{{ href }}" class="iconText" {{ attr | default('') | raw }}>
+    {%- if display == 'both' -%}
+        <i class="fam-{{ icon }}"></i>&ensp;{{ title|trans }}
+    {%- elseif display == 'text' -%}
+        {{- title|trans -}}
+    {%- else -%}
+        {{ macros.tooltipedIcon(icon, title, tooltip_placement) }}
+    {%- endif -%}
+    </a>
+{%- endspaceless %}
+{%- endmacro %}
+
+{##
+ # Create a bootstrap tooltip.
+ #
+ # @param string content   Tooltip content.
+ # @param string placement Top, bottom, left or right.
+ #}
+{%- macro attachTooltip(content, placement) %}
+    {%- if content is not empty %}
+ data-toggle="tooltip" title="{{ content|trans|trim }}" data-placement="{{ placement | default('top') }}"
+    {%- endif -%}
+{%- endmacro %}
+
+{##############################################################################}
+
+
+{##
+ # Displays an icon with a bootstrap tooltip.
+ #}
+{%- macro tooltipedIcon(icon, title, placement) -%}
+    {%- import _self as macros %}
+    <i class="fam-{{ icon }}" {{ macros.attachTooltip(title, placement) }}></i>
+{%- endmacro %}
+
+{##############################################################################}
+
+
+{##
+ # A form button
+ #}
+{% macro button(name, text, classes, loading) %}
+    {% set classes = classes | default('btn') %}
+    {% set loading = loading | default('loading'|trans) %}
+
+    <input type="button" name="{{ name }}" value="{{ text }}" class="{{ classes }}"
+           data-loading-text="{{ loading }}" />
+{% endmacro %}
+
+{##############################################################################}
+
+
+{##
+ # A form submit button
+ #}
+{% macro submit(text, classes, loading) %}
+    {% set text    = text    | default('submit'|trans) %}
+    {% set classes = classes | default('btn') %}
+    {% set loading = loading | default('loading'|trans) %}
+
+    <!-- Submit button -->
+    <input type="submit" value="{{ text }}" class="{{ classes }} btn"
+           data-loading-text="{{ loading }}" />
+{% endmacro %}
+
+{##############################################################################}
+
+
+{##
+ # A form reset button
+ #}
+{% macro reset(text, classes) %}
+    {% set text    = text    | default('reset'|trans) %}
+    {% set classes = classes | default('btn') %}
+
+    <!-- Reset button -->
+    <input type="reset" value="{{ text }}" class="{{ classes }}" />
+{% endmacro %}
+
+{##############################################################################}
+
+{##
+ # A form to cancel anything : more secure than a link
+ # (eg: prevents open the target in a new browser tab).
+ #}
+{% macro cancelForm(route, text, loading) %}
+    {% set text    = text    | default('cancel'|trans) %}
+    {% set loading = loading | default('beingCanceled'|trans) %}
+    <a class="btn btn-danger" href="{{ path(route) }}" data-loading-text="{{ loading }}">{{ text }}</a>
+{% endmacro %}
+
+{##############################################################################}
+
+{##
+ # Macro to load an I18N plugin plus a set of message files in JavaScript
+ #}
+{% macro loadJsI18N(files, paths) %}
+    <script type="text/javascript" src="{{ asset('bundles/irsteabdoh/js/i18n.js') }}"></script>
+    {% set sessionLocale = app.session.get('_locale') %}
+    {% if sessionLocale %}
+        {% set locale = sessionLocale %}
+    {% endif %}
+    {% set shortLocale = locale|slice(0,2) %}
+
+    {% if not paths is iterable %}
+        {% set path = paths %}
+    {% endif %}
+
+    {% if files is iterable %}
+        {% for i in 0..(files|length - 1) %}
+            {% set file = files[i] %}
+
+            {% if paths is iterable %}
+                {% set path = paths[i] %}
+            {% endif %}
+
+            <script type="text/javascript" src="{{ asset(path~'/'~file~'.js') }}"></script>
+            <script type="text/javascript" src="{{ asset(path~'/'~file~'_'~shortLocale~'.js') }}"></script>
+            {% if locale != shortLocale %}
+                <script type="text/javascript" src="{{ asset(path~'/'~file~'_'~locale~'.js') }}"></script>
+            {% endif %}
+        {% endfor %}
+    {% else %}
+        <script type="text/javascript" src="{{ asset(path~'/'~files~'.js') }}"></script>
+        <script type="text/javascript" src="{{ asset(path~'/'~files~'_'~shortLocale~'.js') }}"></script>
+        {% if locale != shortLocale %}
+            <script type="text/javascript" src="{{ asset(path~'/'~files~'_'~locale~'.js') }}"></script>
+        {% endif %}
+    {% endif %}
+{% endmacro %}
+
+{##############################################################################}
+
+{##
+ # Macro to display an entity's label either with default locale or in English
+ #}
+{% macro i18nEntityLabel(entity, property, defaultMessage) %}
+{% spaceless %}
+    {% if app.session.get('_locale')|slice(0, 2) == 'en' %}
+        {{ attribute(entity, property~'En')|default(attribute(entity, property))|default(defaultMessage|trans)|raw }}
+    {% else %}
+        {{ attribute(entity, property)|default(defaultMessage|trans)|raw }}
+    {% endif %}
+{% endspaceless %}
+{% endmacro %}
+
+{##############################################################################}
+
+{# Macro to provide a DOI link & details #}
+{% macro doi_link(doi) %}
+    {%- import _self as macros %}
+    {% set doi_link = 'https://dx.doi.org/'~doi.identifiant %}
+    {{ macros.i18nEntityLabel(doi, 'description', 'noDescription') }} <a href="{{ doi_link }}">{{ doi_link }}</a>
+{% endmacro %}
+
+{% macro doi_list(dois) %}
+    {%- import _self as macros %}
+    {% set n_dois = dois|length %}
+    {% if n_dois > 0 %}
+        <p style="margin-bottom:0;">
+            {% if n_dois == 1 %}
+                <strong>{{ 'citeWithDoi'|trans }}</strong>
+            {% else %}
+                <strong>{{ 'citeWithDois'|trans }}</strong>
+            {% endif %}
+        </p>
+        <ul style="padding-inline-start:40px;">
+            {% for doi in dois %}
+                <li style="margin-top:4px;">{{- macros.doi_link(doi) -}}</li>
+            {% endfor %}
+        </ul>
+    {% endif %}
+{% endmacro %}
diff --git a/app/autoload.php b/app/autoload.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed036ba0972143c83c41a62177bd2eaf072af7f1
--- /dev/null
+++ b/app/autoload.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use Composer\Autoload\ClassLoader;
+use Doctrine\Common\Annotations\AnnotationRegistry;
+
+/**
+ * @var ClassLoader
+ */
+$loader = require __DIR__ . '/../vendor/autoload.php';
+
+AnnotationRegistry::registerLoader([$loader, 'loadClass']);
+
+return $loader;
diff --git a/app/config/bdoh-job-worker.service b/app/config/bdoh-job-worker.service
new file mode 100644
index 0000000000000000000000000000000000000000..d5a568e3ceea37ff36c0aba25f6acd171ec7ca3c
--- /dev/null
+++ b/app/config/bdoh-job-worker.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Executeur de jobs de BDOH
+Requires=postgresql.service
+After=postgresql.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/php /var/www/bdoh/current/app/console jms-job-queue:run --max-concurrent-jobs=2 --max-runtime=3600 --env=prod --no-interaction -vv
+Nice=10
+Restart=always
+User=www-data
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/app/config/config.yml b/app/config/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3bd36fd358a3f6da9e947db8ae29596d65c87d88
--- /dev/null
+++ b/app/config/config.yml
@@ -0,0 +1,165 @@
+imports:
+    - { resource: parameters.yml }
+    - { resource: security.yml }
+    - { resource: sonata.yml }
+    - { resource: "@IrsteaBdohBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohDataBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohConsultBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohAdminBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohInternationalisationBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohSecurityBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohLoggerBundle/Resources/config/services.yml" }
+    - { resource: "@IrsteaBdohTheiaOzcarBundle/Resources/config/services.yml" }
+
+parameters:
+    twig.options: null
+    jms_metadata.doctrine_cache.mem.class: Doctrine\Common\Cache\ArrayCache
+    irstea_bdoh_security.blowfish_cost: 10
+    locale: fr
+
+    absent_quality_codes:
+        VALID:     a
+        Hydro2:    0
+
+
+    # Format is
+    #   time_series_sampling:
+    #       samplings: [sampling_1, sampling_2]  that is, allowed samplings at export
+    #       steps: [[value_1, unit_1], [value_2, unit_2], ...]  that is, allowed time steps at export
+    default_allowed_exports:
+        instantaneous:
+            samplings: ['instantaneous', 'mean']
+            steps: [[1, 'hour'], [6, 'hour'], [1, 'day'], [1, 'month'], [1, 'year'], [1, 'event']]
+        mean:
+            samplings: ['mean', 'cumulative']
+            steps: [[1, 'day'], [1, 'month'], [1, 'year'], [1, 'event']]
+        cumulative:
+            samplings: ['cumulative']
+            steps: [[1, 'day'], [1, 'month'], [1, 'year'], [1, 'event']]
+
+framework:
+    #esi:             ~
+    translator:      { fallback: "%locale%" }
+    secret:          "%secret%"
+    router:
+        resource: "%kernel.root_dir%/config/routing.yml"
+        strict_requirements: "%kernel.debug%"
+    form:            true
+    csrf_protection: true
+    validation:      { enable_annotations: true }
+    templating:      { engines: ['twig'] } #assets_version: SomeVersionScheme
+    default_locale:  "%locale%"
+    trusted_proxies: "%trusted_proxies%"
+    serializer:      ~
+    session:
+        # Debian
+        gc_probability: 0
+
+# Twig Configuration
+twig:
+    debug:            "%kernel.debug%"
+    strict_variables: "%kernel.debug%"
+    globals:
+        exportFormats: "%irstea_bdoh_data.measure_export.exporters%"
+        exportFormatsDiscont: "%irstea_bdoh_data.measure_discontinuous_export.exporters%"
+        logo_long_link_parameters: "%logo_long_web_link%"
+        logo_short_link_parameters: "%logo_short_web_link%"
+    form:
+        resources:
+            - '::form_fields.html.twig'
+
+# Doctrine Configuration
+doctrine:
+    dbal:
+        driver:         "%database_driver%"
+        host:           "%database_host%"
+        port:           "%database_port%"
+        dbname:         "%database_name%"
+        user:           "%database_user%"
+        password:       "%database_password%"
+        server_version: "%database_server_version%"
+        charset:  UTF8
+        # N'accède qu'aux tables de l'utilisateur (avec ou sans le préfixe de schéma)
+        # et ignore la table interp_qualite
+        schema_filter: "/^(?:\\Q%database_user%.\\E)?(?!interp_qualite)[^\\.]+$/i"
+        types:
+            # To have datetime with milliseconds !
+            datetimems: Irstea\BdohDataBundle\Doctrine\DBAL\Types\DateTimeMsType
+            # Stockage des valeurs de barèmes
+            bareme:     Irstea\BdohDataBundle\Doctrine\DBAL\Types\BaremeType
+            # To handle postgis point
+            geometry:   Irstea\BdohDataBundle\Doctrine\DBAL\Types\GeometryType
+            textarray:  Irstea\BdohDataBundle\Doctrine\DBAL\Types\TextArrayType
+        mapping_types:
+            geometry:  geometry
+            timestamp: datetimems
+            _float8:   bareme
+            _text:     textarray
+
+    orm:
+        auto_generate_proxy_classes: "%kernel.debug%"
+        auto_mapping: true
+
+# Swiftmailer Configuration
+swiftmailer:
+    transport:        "%mailer_transport%"
+    host:             "%mailer_host%"
+    username:         "%mailer_user%"
+    password:         "%mailer_password%"
+    spool:            { type: memory }
+
+# Captcha generator and manager
+gregwar_captcha:
+    invalid_message: "captcha.invalid"
+
+# JS translations
+bazinga_js_translation:
+    locale_fallback: "%locale%"
+    default_domain: messages
+    active_locales: [fr, en]
+    active_domains: [messages, viewer, export, datetime]
+
+# Doctrine Migrations
+doctrine_migrations:
+    dir_name: "%kernel.root_dir%/DoctrineMigrations"
+    namespace: Irstea\Bdoh\Migrations
+    name: BDOH Migrations
+
+jms_di_extra:
+    cache_warmer: true
+    metadata:
+        cache: jms_metadata.doctrine_cache_adapter
+    locations:
+        all_bundles: false
+        directories: ["%kernel.root_dir%/../src"]
+
+jms_job_queue:
+    queue_options_defaults:
+        max_concurrent_jobs: 1
+
+services:
+    monolog.processor.web_processer:
+        class: Symfony\Bridge\Monolog\Processor\WebProcessor
+        arguments: []
+        tags:
+            - { name: monolog.processor }
+            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 2048 }
+
+    jms_metadata.doctrine_cache_adapter:
+        class: Metadata\Cache\DoctrineCacheAdapter
+        arguments:
+            - "jms_metadata"
+            - "@jms_metadata.doctrine_cache"
+
+    jms_metadata.doctrine_cache:
+        class: Doctrine\Common\Cache\ChainCache
+        arguments:
+            - [ "@jms_metadata.doctrine_cache.mem", "@jms_metadata.doctrine_cache.disk" ]
+
+    jms_metadata.doctrine_cache.mem:
+        class: "%jms_metadata.doctrine_cache.mem.class%"
+
+    jms_metadata.doctrine_cache.disk:
+        class: Doctrine\Common\Cache\FilesystemCache
+        arguments:
+            - "%kernel.cache_dir%/jms_metadata"
diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..00f167613a9c984ba50d75273577e4a1f81b880c
--- /dev/null
+++ b/app/config/config_dev.yml
@@ -0,0 +1,119 @@
+imports:
+    - { resource: config.yml }
+    - { resource: plant_uml.yml }
+
+framework:
+    router:   { resource: "%kernel.root_dir%/config/routing_dev.yml" }
+    profiler: { only_exceptions: false }
+    session:
+        cookie_lifetime: 0
+    ide: 'phpide://?file=%%f&line=%%l&map[%project_guest_path%]=%project_host_path%'
+
+web_profiler:
+    toolbar: "%dev_toolbar%"
+    intercept_redirects: false
+
+monolog:
+    handlers:
+        main:
+            type: rotating_file
+            path: "%kernel.logs_dir%/%kernel.environment%.log"
+            max_files: 5
+            level: debug
+            channels: ["!event","!translation","!security"]
+        translation:
+            type: rotating_file
+            path: "%kernel.logs_dir%/%kernel.environment%-translation.log"
+            max_files: 5
+            level: debug
+            channels: ["translation"]
+        security:
+            type: rotating_file
+            path: "%kernel.logs_dir%/%kernel.environment%-security.log"
+            max_files: 5
+            level: debug
+            channels: ["security"]
+        stderr:
+            type: stream
+            path: "php://stderr"
+            level: error
+
+irstea_plant_uml:
+    graphs:
+        bdoh:
+            sources:
+                type: entities
+                include:
+                    namespaces:
+                        - 'Irstea\BdohDataBundle\Entity'
+                        - 'Irstea\BdohSecurityBundle\Entity'
+                        - 'Irstea\BdohLoggerBundle\Entity'
+                exclude:
+                    namespaces:
+                        - 'Irstea\BdohDataBundle\Entity\Repository'
+                        - 'Irstea\BdohSecurityBundle\Entity\Repository'
+                        - 'Irstea\BdohLoggerBundle\Entity\Repository'
+            layout:
+                namespaces: entities
+            decoration:
+                decorators:
+                    - inheritance
+                    - entity
+                    - associations
+                    - fields
+        data:
+            sources:
+                type: entities
+                include:
+                    namespaces:
+                        - 'Irstea\BdohDataBundle\Entity'
+                exclude:
+                    namespaces:
+                        - 'Irstea\BdohDataBundle\Entity\Repository'
+            layout:
+                namespaces: entities
+            decoration:
+                decorators:
+                    - inheritance
+                    - entity
+                    - associations
+                    - fields
+        security:
+            sources:
+                type: entities
+                include:
+                    namespaces:
+                        - 'Irstea\BdohSecurityBundle\Entity'
+                exclude:
+                    namespaces:
+                        - 'Irstea\BdohSecurityBundle\Entity\Repository'
+            layout:
+                namespaces: entities
+            decoration:
+                decorators:
+                    - inheritance
+                    - entity
+                    - associations
+                    - fields
+        logger:
+            sources:
+                type: entities
+                include:
+                    namespaces:
+                        - 'Irstea\BdohLoggerBundle\Entity'
+                exclude:
+                    namespaces:
+                        - 'Irstea\BdohLoggerBundle\Entity\Repository'
+            layout:
+                namespaces: entities
+            decoration:
+                decorators:
+                    - inheritance
+                    - entity
+                    - associations
+                    - fields
+
+#services:
+#    debug.twig.extension:
+#        class: Twig_Extensions_Extension_Debug
+#        tags: [{ name: 'twig.extension' }]
diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml
new file mode 100644
index 0000000000000000000000000000000000000000..83f7f476eb6cb2f59baf84d1927063f3e3de8619
--- /dev/null
+++ b/app/config/config_prod.yml
@@ -0,0 +1,27 @@
+imports:
+    - { resource: config.yml }
+
+parameters:
+    jms_metadata.doctrine_cache.mem.class: Doctrine\Common\Cache\ApcuCache
+
+doctrine:
+    orm:
+        metadata_cache_driver: apc
+        #result_cache_driver: apc
+        query_cache_driver: apc
+
+monolog:
+    handlers:
+        main:
+            type:         fingers_crossed
+            action_level: error
+            handler:      nested
+        nested:
+            type:         stream
+            path:         "%kernel.logs_dir%/%kernel.environment%.log"
+            level:        debug
+        security:
+            type:         stream
+            path:         "%kernel.logs_dir%/security.log"
+            level:        info
+            channels:     [security]
diff --git a/app/config/config_test.yml b/app/config/config_test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fcea23f993e26a9e25c15c712534664c83a0a009
--- /dev/null
+++ b/app/config/config_test.yml
@@ -0,0 +1,21 @@
+imports:
+    - { resource: config_dev.yml }
+
+framework:
+    test: ~
+    session:
+        storage_id: session.storage.mock_file
+
+web_profiler:
+    toolbar: false
+    intercept_redirects: false
+
+swiftmailer:
+    disable_delivery: true
+
+doctrine:
+    dbal:
+        dbname:         "%database_name%-test"
+    orm:
+        auto_generate_proxy_classes: true
+        auto_mapping: true
diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..7ecf2671ed130e1f50670499d0c9d8daffed1ecf
--- /dev/null
+++ b/app/config/parameters.yml.dist
@@ -0,0 +1,33 @@
+parameters:
+    database_driver:   pdo_pgsql
+    database_host:     database
+    database_port:     5432
+    database_name:     bdoh
+    database_user:     bdoh
+    database_password: mdp4bdoh
+    database_server_version: 9.6
+
+    mailer_transport:  smtp
+    mailer_host:       smtp
+    mailer_user:       ~
+    mailer_password:   ~
+
+    secret: CHANGE-ME
+
+    trusted_proxies:    []
+
+    dev_toolbar:       true
+    project_guest_path: /var/www
+    project_host_path:  .
+
+    theia_password_secret_key: a1ac0607ebb219f227755751ac9a9e52ea0baaf79447c5c60eea6f50adeeff2f
+    uri_theia_ozcar: https://in-situ.theia-land.fr
+    uri_theia_send_data: https://in-situ.theia-land.fr/data/
+    uri_theia_ozcar_schema_json: https://in-situ.theia-land.fr/json-schema/pivotSchemaDraft7.json
+    logo_long_web_link: images/Logo_INRAE_REPUBLIQUE.png
+    logo_short_web_link: images/Logo_INRAE.png
+    mini_logo_sonata: images/MiniLogo_INRAE_REPUBLIQUE.png
+
+    router.request_context.host: 'bdoh.dvp'
+
+
diff --git a/app/config/plant_uml.yml b/app/config/plant_uml.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3029f4068a52e69af23d54a4530d4c25e13e6cff
--- /dev/null
+++ b/app/config/plant_uml.yml
@@ -0,0 +1,19 @@
+irstea_plant_uml:
+    binaries:
+        dot: /usr/bin/dot
+        plamtuml_jar: %kernel.root_dir%/../dev/plantuml.jar
+    graphs:
+        entities:
+            sources:
+                type: entities
+                include:
+                    namespaces:
+                        - Irstea\BdohDataBundle
+                        - Irstea\BdohSecurityBundle
+            layout:
+                namespaces: entities
+            decoration:
+                decorators:
+                    - inheritance
+                    - entity
+                    - associations
diff --git a/app/config/routing.yml b/app/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bcee268b9750b0992209b035deee5b9b624fcc56
--- /dev/null
+++ b/app/config/routing.yml
@@ -0,0 +1,16 @@
+IrsteaBdohInternationalBundle:
+    resource: "@IrsteaBdohInternationalisationBundle/Resources/config/routing.yml"
+
+_bazinga_jstranslation:
+    resource: "@BazingaJsTranslationBundle/Resources/config/routing/routing.yml"
+
+_observatoires:
+    resource: routing_observatory.yml
+    prefix:   /{_observatoire}
+    requirements:
+      _observatoire: ^[A-Z0-9_-]+$
+
+# Last position is mandatory : match all routes ! ( / )
+IrsteaBdohBundle_Main:
+    resource: "@IrsteaBdohBundle/Controller/"
+    type:     annotation
diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..552455fbd2a73a40d2c7777fb19336b62beec9dc
--- /dev/null
+++ b/app/config/routing_dev.yml
@@ -0,0 +1,15 @@
+
+_wdt:
+    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
+    prefix:   /_wdt
+
+_profiler:
+    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
+    prefix:   /_profiler
+
+_twig:
+    resource: "@TwigBundle/Resources/config/routing/errors.xml"
+    prefix:   /_twig
+
+_main:
+    resource: routing.yml
diff --git a/app/config/routing_observatory.yml b/app/config/routing_observatory.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6be2c35700e349c952e4cf3365726f749ff6a195
--- /dev/null
+++ b/app/config/routing_observatory.yml
@@ -0,0 +1,26 @@
+IrsteaBdohAdminBundle:
+    resource: "@IrsteaBdohAdminBundle/Resources/config/routing.yml"
+    prefix: /admin
+
+bdoh_security_login_check:
+    path:    /login_check
+
+bdoh_security_logout:
+    path:    /logout
+
+IrsteaBdohSecurityBundle:
+    resource: "@IrsteaBdohSecurityBundle/Controller/"
+    type:     annotation
+
+IrsteaBdohLoggerBundle:
+    resource: "@IrsteaBdohLoggerBundle/Resources/config/routing.yml"
+
+IrsteaBdohDataBundle:
+    resource: "@IrsteaBdohDataBundle/Resources/config/routing.yml"
+
+IrsteaBdohBundle:
+    resource: "@IrsteaBdohBundle/Resources/config/routing.yml"
+
+IrsteaBdohConsultBundle:
+    resource: "@IrsteaBdohConsultBundle/Controller/"
+    type:     annotation
diff --git a/app/config/security.yml b/app/config/security.yml
new file mode 100644
index 0000000000000000000000000000000000000000..054ceebcc2cb876d16acb6cd66d98406d0590397
--- /dev/null
+++ b/app/config/security.yml
@@ -0,0 +1,46 @@
+jms_security_extra:
+    secure_all_services: false
+    expressions: true
+
+security:
+    providers:
+        main:
+            entity:
+                class: Irstea\BdohSecurityBundle\Entity\Utilisateur
+
+    role_hierarchy:
+        ROLE_ADMIN_TECH:  [ROLE_ADMIN_FCT, ROLE_SUPER_ADMIN]
+        ROLE_ADMIN_FCT:   ROLE_ADMIN
+        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
+        ROLE_ADMIN:       ROLE_USER
+
+    encoders:
+        Irstea\BdohSecurityBundle\Entity\Utilisateur:
+            algorithm: bcrypt
+            cost:      10
+
+    firewalls:
+        dev:
+            pattern:  ^/(_(profiler|wdt)|css|images|js)/
+            security: false
+
+        secured_area:
+            pattern:    ^/
+            anonymous: ~
+            form_login:
+                use_referer: true
+                login_path: bdoh_security_login
+                check_path: bdoh_security_login_check
+                default_target_path: bdoh_home
+                success_handler: irstea_bdoh_security.security.success_handler
+            logout:
+                path:   bdoh_security_logout
+                target: bdoh_home
+
+    # Order is important : FIFO !
+    access_control:
+        - { path: /admin/shape/import, roles: ROLE_USER }
+        - { path: /admin/station, roles: [ROLE_USER] }
+        - { path: /admin/jobs, roles: ROLE_SUPER_ADMIN }
+        - { path: /admin, roles: [ROLE_ADMIN, ROLE_SUPER_ADMIN] }
+        - { path: /historique, roles: ROLE_ADMIN }
diff --git a/app/config/sonata.yml b/app/config/sonata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4b8b9b9a710390356bc2d2797ec697271c7c0834
--- /dev/null
+++ b/app/config/sonata.yml
@@ -0,0 +1,47 @@
+# Sonata Admin Configuration
+sonata_admin:
+    title: BDOH Admin
+    title_logo: "%mini_logo_sonata%"
+    show_mosaic_button: false
+
+    options:
+      confirm_exit: false
+
+    security:
+        handler: irstea_bdoh_security.admin.security.handler
+
+    templates:
+        layout: IrsteaBdohAdminBundle::standard_layout.html.twig
+        #ajax:   IrsteaBdohAdminBundle::ajax_layout.html.twig
+
+    dashboard:
+        blocks:
+            # display a dashboard block
+            - { position: left, type: sonata.admin.block.admin_list }
+
+        groups:
+            # group translations are in 'BdohAdminBundle/Resources/translations/SonataAdminBundle.*.yml'
+            AdminCenter: ~
+            AdminGeographic: ~
+            AdminPeripheral: ~
+            AdminTechnical: ~
+            AdminTheia: ~
+            AdminUser: ~
+
+
+    assets:
+        javascripts:
+            - assets/manifest.js
+            - assets/vendor.js
+            - assets/admin/sonata.js
+        stylesheets:
+            - assets/admin/sonata.css
+
+# Sonata Block Configuration
+sonata_block:
+    default_contexts: [cms]
+    blocks:
+        sonata.admin.block.admin_list:
+            contexts: [admin]
+        sonata.admin.block.search_result:
+            contexts: [admin]
diff --git a/app/console b/app/console
new file mode 100755
index 0000000000000000000000000000000000000000..3b4c367c981bf73f227d22fc2ddd8fcccd54525e
--- /dev/null
+++ b/app/console
@@ -0,0 +1,29 @@
+#!/usr/bin/env php
+<?php
+
+use Symfony\Bundle\FrameworkBundle\Console\Application;
+use Symfony\Component\Console\Input\ArgvInput;
+use Symfony\Component\Debug\Debug;
+
+// if you don't want to setup permissions the proper way, just uncomment the following PHP line
+// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
+//umask(0000);
+
+set_time_limit(0);
+
+/**
+ * @var Composer\Autoload\ClassLoader $loader
+ */
+$loader = require __DIR__.'/autoload.php';
+
+$input = new ArgvInput();
+$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
+$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod';
+
+if ($debug) {
+    Debug::enable();
+}
+
+$kernel = new AppKernel($env, $debug);
+$application = new Application($kernel);
+$application->run($input);
diff --git a/app/sql/bdoh_cross_quality_orders.sql b/app/sql/bdoh_cross_quality_orders.sql
new file mode 100644
index 0000000000000000000000000000000000000000..7b39abe73754d96b56afc46e0637a16b615a4b11
--- /dev/null
+++ b/app/sql/bdoh_cross_quality_orders.sql
@@ -0,0 +1,74 @@
+CREATE OR REPLACE FUNCTION bdoh_cross_quality_orders(
+        ordre1                INTEGER,
+        ordre2                INTEGER,
+        limitsAsGaps          BOOLEAN
+)
+RETURNS INTEGER AS $$
+DECLARE
+        resultingQualityOrder INTEGER;
+BEGIN
+-- Ordres : I = 200, E = 500, Ld = 600, Lq = 700, V >= 800
+-- Si limitsAsGaps = true, alors ordre1 ou ordre2 = Lq ou Ld force le resultat a etre I
+-- Sinon :
+-- {Lq|Ld}.V = E
+-- Plus petit ordre pour les autres croisements
+        IF limitsAsGaps AND (ordre1 IN (600, 700) OR ordre2 IN (600, 700)) THEN
+            resultingQualityOrder = 200;
+        ELSIF (ordre1 IN (600, 700) AND ordre2 >= 800) OR (ordre2 IN (600, 700) AND ordre1 >= 800) THEN
+            resultingQualityOrder = 500;
+        ELSIF ordre1 < ordre2 THEN
+            resultingQualityOrder = ordre1;
+        ELSE
+            resultingQualityOrder = ordre2;
+        END IF;
+
+        RETURN resultingQualityOrder;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE STRICT;
+
+--------------------------------------------------------------------------------
+
+CREATE OR REPLACE FUNCTION bdoh_cross_quality_orders(
+        ordre1 INTEGER,
+        ordre2 INTEGER
+)
+RETURNS INTEGER AS $$
+BEGIN
+        RETURN bdoh_cross_quality_orders(ordre1, ordre2, false);
+END;
+$$ LANGUAGE 'plpgsql' STABLE STRICT;
+
+--------------------------------------------------------------------------------
+
+-- CREATE OR REPLACE FUNCTION bdoh_final_quality_order(
+--         ordre INTEGER
+-- )
+-- RETURNS INTEGER AS $$
+-- BEGIN
+--         RETURN
+--             CASE WHEN ordre IN (600, 700) THEN 500
+--             ELSE ordre
+--             END;
+-- END;
+-- $$ LANGUAGE 'plpgsql' IMMUTABLE;
+
+
+--------------------------------------------------------------------------------
+
+DROP AGGREGATE IF EXISTS bdoh_min_quality_order(INTEGER);
+CREATE AGGREGATE bdoh_min_quality_order(INTEGER) (
+        SFUNC     = 'bdoh_cross_quality_orders',
+--        FINALFUNC = 'bdoh_final_quality_order',
+        STYPE     = INTEGER
+);
+DROP AGGREGATE IF EXISTS bdoh_min_quality_order(INTEGER, BOOLEAN);
+CREATE AGGREGATE bdoh_min_quality_order(INTEGER, BOOLEAN) (
+        SFUNC     = 'bdoh_cross_quality_orders',
+--        FINALFUNC = 'bdoh_final_quality_order',
+        STYPE     = INTEGER
+);
+
+--------------------------------------------------------------------------------
+
+DROP FUNCTION IF EXISTS bdoh_final_quality_order(INTEGER);
diff --git a/app/sql/bdoh_insert_sampling_steps.sql b/app/sql/bdoh_insert_sampling_steps.sql
new file mode 100644
index 0000000000000000000000000000000000000000..ed4af6637c65f3aa2423aa34ab68f017e070ed40
--- /dev/null
+++ b/app/sql/bdoh_insert_sampling_steps.sql
@@ -0,0 +1,105 @@
+CREATE OR REPLACE FUNCTION add_sampling_step(val INTEGER, unit VARCHAR, approxSeconds INTEGER, label VARCHAR, labelEn VARCHAR)
+RETURNS VOID AS
+$$
+BEGIN
+	IF NOT EXISTS (SELECT * FROM pasEchantillonnage WHERE unite = unit AND valeur = val) THEN
+		INSERT INTO pasEchantillonnage
+		VALUES (NEXTVAL('pasechantillonnage_id_seq'), unit, val, approxSeconds, label, labelEn);
+        ELSE
+                UPDATE pasEchantillonnage SET approxSecondes = approxSeconds, libelle = label, libelleEn = labelEn
+                WHERE unite = unit AND valeur = val;
+	END IF;
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
+----------------------------------------------------------------
+
+CREATE OR REPLACE FUNCTION add_sampling_option(sampling_id INTEGER, val INTEGER, unit VARCHAR)
+RETURNS VOID AS
+$$
+DECLARE
+	sampling_step_id INTEGER;
+BEGIN
+	sampling_step_id := id FROM pasEchantillonnage WHERE valeur = val AND unite = unit;
+	IF sampling_step_id IS NOT NULL
+            AND NOT EXISTS (SELECT * FROM optionEchantillonnageSortie
+            WHERE echantillonnageEntree_id = sampling_id AND pasEchantillonnage_id = sampling_step_id)
+        THEN
+		INSERT INTO optionEchantillonnageSortie
+		VALUES (NEXTVAL('optionechantillonnagesortie_id_seq'), sampling_id, sampling_step_id);
+	END IF;
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
+----------------------------------------------------------------
+
+CREATE OR REPLACE FUNCTION insert_sampling_steps()
+RETURNS VOID AS
+$$
+DECLARE
+	id_instant INTEGER;
+	id_mean INTEGER;
+	id_cumul INTEGER;
+BEGIN
+	id_instant := id FROM echantillonnage WHERE nom ILIKE 'instantan%';
+	id_mean := id FROM echantillonnage WHERE nom ILIKE 'moyenne';
+	id_cumul := id FROM echantillonnage WHERE nom ILIKE 'cumul';
+
+	-- Add time steps, i.e. value-unit pairs.
+	-- You can "add" a time step one or several times with "add_sampling_step".
+	-- It will be actually added only if not present in table "pasEchantillonnage".
+	PERFORM add_sampling_step(5, 'minute', 300, '5 minutes', '5 minutes');
+	PERFORM add_sampling_step(6, 'minute', 360, '6 minutes', '6 minutes');
+	PERFORM add_sampling_step(15, 'minute', 900, '15 minutes', '15 minutes');
+	PERFORM add_sampling_step(30, 'minute', 1800, '30 minutes', '30 minutes');
+	PERFORM add_sampling_step(1, 'hour', 3600, '1 heure', '1 hour');
+	PERFORM add_sampling_step(6, 'hour', 21600, '6 heures', '6 hours');
+	PERFORM add_sampling_step(1, 'day', 86400, '1 jour', '1 day');
+	PERFORM add_sampling_step(1, 'month', 2629800, '1 mois', '1 month');
+	PERFORM add_sampling_step(1, 'year', 31557600, '1 an', '1 year');
+	PERFORM add_sampling_step(1, 'event', 2000000000, '1 événement', '1 event');
+
+	-- Now, add "output sampling options", i.e. time steps associated with input sampling types (output is mean or cumulative).
+	-- Again, a multiple "insertion" with "add_sampling_option" will actually occur once only.
+	PERFORM add_sampling_option(id_instant, 1, 'hour');
+	PERFORM add_sampling_option(id_instant, 6, 'hour');
+	PERFORM add_sampling_option(id_instant, 1, 'day');
+	PERFORM add_sampling_option(id_instant, 1, 'month');
+	PERFORM add_sampling_option(id_instant, 1, 'year');
+	PERFORM add_sampling_option(id_instant, 1, 'event');
+
+	PERFORM add_sampling_option(id_mean, 30, 'minute');
+	PERFORM add_sampling_option(id_mean, 1, 'hour');
+	PERFORM add_sampling_option(id_mean, 6, 'hour');
+	PERFORM add_sampling_option(id_mean, 1, 'day');
+	PERFORM add_sampling_option(id_mean, 1, 'month');
+	PERFORM add_sampling_option(id_mean, 1, 'year');
+	PERFORM add_sampling_option(id_mean, 1, 'event');
+
+	PERFORM add_sampling_option(id_cumul, 5, 'minute');
+	PERFORM add_sampling_option(id_cumul, 6, 'minute');
+	PERFORM add_sampling_option(id_cumul, 15, 'minute');
+	PERFORM add_sampling_option(id_cumul, 30, 'minute');
+	PERFORM add_sampling_option(id_cumul, 1, 'hour');
+	PERFORM add_sampling_option(id_cumul, 6, 'hour');
+	PERFORM add_sampling_option(id_cumul, 1, 'day');
+	PERFORM add_sampling_option(id_cumul, 1, 'month');
+	PERFORM add_sampling_option(id_cumul, 1, 'year');
+	PERFORM add_sampling_option(id_cumul, 1, 'event');
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
+----------------------------------------------------------------
+
+SELECT insert_sampling_steps();
+
+DROP FUNCTION add_sampling_step(INTEGER, VARCHAR, INTEGER, VARCHAR, VARCHAR);
+DROP FUNCTION add_sampling_option(INTEGER, INTEGER, VARCHAR);
+DROP FUNCTION insert_sampling_steps();
+
+/*
+SELECT e.nom, s.valeur, s.unite FROM optionEchantillonnageSortie eps
+JOIN Echantillonnage e ON e.id = eps.echantillonnageentree_id
+JOIN pasEchantillonnage s ON s.id = eps.pasEchantillonnage_id;
+*/
\ No newline at end of file
diff --git a/app/sql/bdoh_integrate_instant_interval.sql b/app/sql/bdoh_integrate_instant_interval.sql
new file mode 100644
index 0000000000000000000000000000000000000000..b7e36c1df83e166b8d83f7b95af0ea376b2395a8
--- /dev/null
+++ b/app/sql/bdoh_integrate_instant_interval.sql
@@ -0,0 +1,64 @@
+CREATE OR REPLACE FUNCTION bdoh_integrate_instant_interval(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE
+)
+RETURNS TABLE(val DOUBLE PRECISION, quality_order INTEGER) AS $$
+DECLARE
+        minQualityOrder INTEGER;
+        integratedValue DOUBLE PRECISION;
+        nMeasures       INTEGER;
+
+        beginSeconds    DOUBLE PRECISION;
+        endSeconds      DOUBLE PRECISION;
+BEGIN
+
+------- Remember: 'gap' order = 100, 'invalid' order = 200
+
+        SELECT bdoh_min_quality_order(qualOrder), COUNT(*) INTO minQualityOrder, nMeasures
+            FROM bdoh_select_values_for_time_step(idChronique, beginDate, endDate);
+
+        IF minQualityOrder <= 200 OR nMeasures < 2 THEN
+            -- There was at least one gap or invalid measure, or there were not enough measures
+            integratedValue := -9999;
+            IF nMeasures < 2 THEN minQualityOrder := 100; END IF;
+        ELSE
+            -- We may compute an integrated value...
+            beginSeconds := EXTRACT(EPOCH FROM beginDate AT TIME ZONE 'UTC');
+            endSeconds := EXTRACT(EPOCH FROM endDate AT TIME ZONE 'UTC');
+
+            EXECUTE
+            'WITH date_value(seconds, value) AS ('
+            '    SELECT'
+            '    CASE'
+            '        WHEN timest < $1 THEN $1'
+            '        WHEN timest > $2 THEN $2'
+            '        ELSE timest'
+            '    END,'
+            '    CASE'
+            '        WHEN timest < $1 THEN'
+            '            ((LEAD(timest) OVER() - $1) * val'
+            '            + ($1 - timest) * LEAD(val) OVER()'
+            '            ) / (LEAD(timest) OVER() - timest)'
+            '        WHEN timest > $2 THEN'
+            '            ((timest - $2) * LAG(val) OVER ()'
+            '            + ($2 - LAG(timest) OVER()) * val'
+            '            ) / (timest - LAG(timest) OVER())'
+            '        ELSE val'
+            '    END'
+            '    FROM bdoh_select_values_for_time_step($3, $4, $5)'
+            '), '
+            'trapezium(surface) AS ('
+            '    SELECT COALESCE((LEAD(seconds) OVER() - seconds) * (LEAD(value) OVER() + value) / 2, 0)'
+            '    FROM date_value'
+            ')'
+            ' SELECT SUM(t.surface) FROM trapezium t;'
+            USING beginSeconds, endSeconds, idChronique, beginDate, endDate
+            INTO integratedValue;
+
+        END IF;
+
+        RETURN QUERY SELECT integratedValue, minQualityOrder;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/bdoh_integrate_mean_interval.sql b/app/sql/bdoh_integrate_mean_interval.sql
new file mode 100644
index 0000000000000000000000000000000000000000..37e04a2e15aaa58b42ed1dc0f21d35bc25e9a694
--- /dev/null
+++ b/app/sql/bdoh_integrate_mean_interval.sql
@@ -0,0 +1,103 @@
+CREATE OR REPLACE FUNCTION bdoh_integrate_mean_interval(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE
+)
+RETURNS TABLE(val DOUBLE PRECISION, quality_order INTEGER) AS $$
+DECLARE
+        measureDirection VARCHAR;
+
+        minQualityOrder  INTEGER;
+        integratedValue  DOUBLE PRECISION;
+        qualWhereClause  VARCHAR;
+
+        dateBefore       TIMESTAMP WITHOUT TIME ZONE;
+        dateAfter        TIMESTAMP WITHOUT TIME ZONE;
+
+        sec1             VARCHAR;
+        sec2             VARCHAR;
+        whereSec         VARCHAR;
+
+        beginSeconds     DOUBLE PRECISION;
+        endSeconds       DOUBLE PRECISION;
+BEGIN
+
+        -- Measure direction. If not found for time series, take default value 'ahead'
+        SELECT c.directionMesure INTO measureDirection
+            FROM chronique c WHERE c.id = idChronique;
+        IF measureDirection IS NULL THEN measureDirection := 'ahead'; END IF;
+
+        -- Last date before or at beginDate, & 1st date after or at endDate
+        SELECT MAX(m.date) INTO dateBefore
+            FROM mesure m WHERE m.chronique_id = idChronique
+            AND m.date <= beginDate;
+
+        SELECT MIN(m.date) INTO dateAfter
+            FROM mesure m WHERE chronique_id = idChronique
+            AND m.date >= endDate;
+
+        -- Depending on whether measures look 'ahead' or 'backward', find worst quality for our date interval
+        IF LOWER(measureDirection) = 'ahead' THEN
+            qualWhereClause := 'm.date >= (SELECT MAX(date) FROM mesure WHERE chronique_id = $1 AND date <= $2) AND m.date < $3';
+        ELSE
+            qualWhereClause := 'm.date > $2 AND m.date <= (SELECT MIN(date) FROM mesure WHERE chronique_id = $1 AND date >= $3)';
+        END IF;
+        EXECUTE 'SELECT bdoh_min_quality_order(q.ordre) FROM qualite q '
+                'LEFT JOIN mesure m ON m.qualite_id = q.id '
+                'WHERE m.chronique_id = $1 '
+                'AND ' || qualWhereClause
+        USING idChronique, beginDate, endDate
+        INTO minQualityOrder;
+
+        -- Now, it is time to perform an integral
+        IF dateBefore IS NULL OR dateAfter IS NULL THEN
+            -- Integration cannot be achieved because we lack measures
+            minQualityOrder := 100;
+        END IF;
+        IF minQualityOrder <= 200 THEN
+            -- There was at least one gap or invalid measure
+            integratedValue := -9999;
+        ELSE
+            -- We may compute an integrated value...
+            beginSeconds := EXTRACT(EPOCH FROM beginDate AT TIME ZONE 'UTC');
+            endSeconds := EXTRACT(EPOCH FROM endDate AT TIME ZONE 'UTC');
+
+            IF LOWER(measureDirection) = 'ahead' THEN
+                sec1 := 'seconds';
+                sec2 := 'LEAD(seconds) OVER()';
+                whereSec := 'sec_1 < $2';
+            ELSE
+                sec1 := 'LAG(seconds) OVER()';
+                sec2 := 'seconds';
+                whereSec := 'sec_2 > $1';
+            END IF;
+
+            EXECUTE
+            'WITH sv(seconds, value) AS ('
+            '    SELECT'
+            '    CASE'
+            '        WHEN x.seconds < $1 THEN $1'
+            '        WHEN x.seconds > $2 THEN $2'
+            '        ELSE x.seconds'
+            '    END,'
+            '    x.valeur'
+            '    FROM ('
+            '        SELECT EXTRACT(EPOCH FROM date AT TIME ZONE ''UTC'') AS seconds, valeur'
+            '        FROM mesure'
+            '        WHERE chronique_id = $3 AND date >= $4 and date <= $5'
+            '        ORDER BY date'
+            '    ) x'
+            '), '
+            'ssv(sec_1, sec_2, value) AS ('
+            '    SELECT ' || sec1 || ', ' || sec2 || ', value FROM sv'
+            ') '
+            'SELECT SUM((sec_2 - sec_1) * value) FROM ssv WHERE ' || whereSec
+            USING beginSeconds, endSeconds, idChronique, dateBefore, dateAfter
+            INTO integratedValue;
+
+        END IF;
+
+        RETURN QUERY SELECT integratedValue, minQualityOrder;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/bdoh_interp_cumul_to_cumul.sql b/app/sql/bdoh_interp_cumul_to_cumul.sql
new file mode 100644
index 0000000000000000000000000000000000000000..69eb5a7ca2aaebdb995f716f450c03ee72fac535
--- /dev/null
+++ b/app/sql/bdoh_interp_cumul_to_cumul.sql
@@ -0,0 +1,132 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_cumul_to_cumul(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE,
+        samplingStepId   INTEGER,
+        startAt          VARCHAR DEFAULT 'round-hour'
+)
+RETURNS TABLE(boundary_start TIMESTAMP WITHOUT TIME ZONE, boundary_end TIMESTAMP WITHOUT TIME ZONE,
+        value DOUBLE PRECISION, quality VARCHAR) AS $$
+DECLARE
+        jeuQualiteId     INTEGER;
+
+        stepValue        INTEGER;
+        stepUnit         VARCHAR;
+        isEvent          BOOLEAN;
+        stepInterval     INTERVAL;
+
+        chroniqueMinDate TIMESTAMP WITHOUT TIME ZONE;
+        measureDirection VARCHAR;
+
+        firstBoundary    TIMESTAMP WITHOUT TIME ZONE;
+        secondBoundary   TIMESTAMP WITHOUT TIME ZONE;
+
+        qualityDateWhere VARCHAR;
+        minQualityOrder  INTEGER;
+        accumDateWhere   VARCHAR;
+        accumulatedValue DOUBLE PRECISION;
+BEGIN
+
+        -- Get quality set ID from time series
+        jeuQualiteId := bdoh_jeu_qualite_id(idChronique);
+
+        -- Get output time step value & unit
+        SELECT p.valeur, p.unite INTO stepValue, stepUnit
+            FROM pasEchantillonnage p WHERE p.id = samplingStepId;
+        isEvent := (LOWER(stepUnit) = 'event');
+
+        -- Set very first boundary (date at which the interpolation begins)
+        IF startAt = 'existing-measure' THEN
+            -- Start from an existing measure
+
+            -- Min & max time series dates
+            SELECT MIN(m.date) INTO chroniqueMinDate
+                FROM mesure m
+                WHERE m.chronique_id = idChronique
+                AND m.date >= beginDate;
+
+            -- At least one measure is required!
+            IF chroniqueMinDate IS NULL THEN
+                RETURN;
+            END IF;
+
+            firstBoundary := chroniqueMinDate;
+        ELSE
+            -- Start from a round hour, i.e. firstDate here
+            firstBoundary := beginDate;
+        END IF;
+
+        -- We never know: if endDate is no later than firstBoundary, then exit now
+        IF endDate <= firstBoundary THEN
+            RETURN;
+        END IF;
+
+        -- Compute adequate time step
+        IF isEvent THEN
+            -- Single event required: set time step accordingly
+            stepInterval := endDate - firstBoundary;
+        ELSE
+            -- 'Normal' time step required: compute it from stepValue and stepUnit
+            stepInterval := stepValue || ' ' || stepUnit;
+        END IF;
+
+        -- Retrieve the 'measure direction' for our time series
+        SELECT COALESCE(c.directionMesure, 'backward') INTO measureDirection
+            FROM chronique c WHERE c.id = idChronique;
+
+        -- Set query parts used below, depending on 'measure direction'
+        IF measureDirection IN ('backward', 'backwards') THEN
+            qualityDateWhere := 'AND m.date > $2 AND m.date <= ('
+                                '    SELECT MIN(date) FROM mesure'
+                                '    WHERE chronique_id = $1'
+                                '    AND date >= $3'
+                                ')';
+            accumDateWhere := 'AND m.date > $2 AND m.date <= $3';
+        ELSE
+            qualityDateWhere := 'AND m.date >= ('
+                                '    SELECT MAX(date) FROM mesure'
+                                '    WHERE chronique_id = $1'
+                                '    AND date <= $2'
+                                ') AND date < $3';
+            accumDateWhere := 'AND m.date >= $2 AND m.date < $3';
+        END IF;
+
+        -- Compute!
+        secondBoundary := firstBoundary + stepInterval;
+        WHILE secondBoundary <= endDate LOOP
+
+            -- Find minimum quality order that applies to current histogram bin
+            EXECUTE 'SELECT bdoh_min_quality_order(q.ordre) FROM qualite q '
+                    'JOIN mesure m ON m.qualite_id = q.id '
+                    'WHERE q.jeu_id = $4 AND m.chronique_id = $1 '
+                    || qualityDateWhere
+            USING idChronique, firstBoundary, secondBoundary, jeuQualiteId
+            INTO minQualityOrder;
+
+            -- Get accumulated value
+            IF minQualityOrder > 200 THEN
+                -- Quality is high enough to accumulate in our bin
+                EXECUTE 'SELECT COALESCE(SUM(m.valeur), 0) FROM mesure m '
+                        'WHERE m.chronique_id = $1 '
+                        || accumDateWhere
+                USING idChronique, firstBoundary, secondBoundary
+                INTO accumulatedValue;
+
+            ELSE
+                -- Quality is too poor, affect gap value
+                accumulatedValue := -9999;
+            END IF;
+
+            RETURN QUERY SELECT firstBoundary, secondBoundary, accumulatedValue, q.code
+                FROM qualite q
+                WHERE q.jeu_id = jeuQualiteId
+                AND q.ordre = minQualityOrder
+                AND q.code <> 'gap';
+
+            firstBoundary := secondBoundary;
+            secondBoundary := firstBoundary + stepInterval;
+
+        END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
diff --git a/app/sql/bdoh_interp_instant_to_instant.sql b/app/sql/bdoh_interp_instant_to_instant.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a2c7fe79a57e19d1fa4a54d60188760ca098b004
--- /dev/null
+++ b/app/sql/bdoh_interp_instant_to_instant.sql
@@ -0,0 +1,129 @@
+DROP FUNCTION IF EXISTS bdoh_interp_instant_to_instant(INTEGER, TIMESTAMP, TIMESTAMP, DOUBLE PRECISION);
+
+CREATE OR REPLACE FUNCTION bdoh_interp_instant_to_instant(
+        idChronique   INTEGER,
+        beginDate     TIMESTAMP,
+        endDate       TIMESTAMP,
+        stepInMinutes DOUBLE PRECISION
+)
+RETURNS TABLE(date TIMESTAMP, valeur DOUBLE PRECISION, code_qualite VARCHAR) AS $$
+DECLARE
+
+        jeuQualiteId   INTEGER;
+
+        stepInSeconds  DOUBLE PRECISION;
+        measuresCursor CURSOR FOR SELECT timest, val, qualOrder FROM bdoh_select_values_for_time_step(idChronique, beginDate, endDate);
+
+        endSeconds     DOUBLE PRECISION;
+        minSeconds     DOUBLE PRECISION;
+        maxSeconds     DOUBLE PRECISION;
+
+        secondsInterp  DOUBLE PRECISION;
+        valueInterp    DOUBLE PRECISION;
+
+        secondsBefore  DOUBLE PRECISION;
+        valueBefore    DOUBLE PRECISION;
+        qOrderBefore   INTEGER;
+
+        secondsAfter   DOUBLE PRECISION;
+        valueAfter     DOUBLE PRECISION;
+        qOrderAfter    INTEGER;
+
+        qOrderInterp   INTEGER;
+        qCodeInterp    VARCHAR;
+BEGIN
+
+        -- Get quality set ID from time series
+        jeuQualiteId := bdoh_jeu_qualite_id(idChronique);
+
+        -- Interpolation time step should range from 1 minute to 1 day (1440 minutes)
+        IF stepInMinutes < 1 THEN
+            stepInSeconds := 1;
+        ELSIF stepInMinutes > 1440 THEN
+            stepInSeconds := 1440;
+        ELSE
+            stepInSeconds := stepInMinutes;
+        END IF;
+        -- Now, convert time step to seconds
+        stepInSeconds := stepInSeconds * 60;
+
+        -- Set 1st interpolation date (in seconds) & date not to exceed (endDate in seconds)
+	secondsInterp := EXTRACT(EPOCH FROM beginDate AT TIME ZONE 'UTC');
+	endSeconds    := EXTRACT(EPOCH FROM endDate AT TIME ZONE 'UTC');
+
+        -- Find min date in seconds for time series
+        minSeconds := EXTRACT(EPOCH FROM MIN(m.date) AT TIME ZONE 'UTC')
+            FROM mesure m WHERE m.chronique_id = idChronique;
+        -- Now, make sure that secondsInterp is not before minSeconds
+        -- by incrementing it enough times by stepInSeconds
+        WHILE secondsInterp < minSeconds LOOP
+            secondsInterp := secondsInterp + stepInSeconds;
+        END LOOP;
+
+        -- Find max date in seconds for time series
+        maxSeconds := EXTRACT(EPOCH FROM MAX(m.date) AT TIME ZONE 'UTC')
+            FROM mesure m WHERE m.chronique_id = idChronique;
+        -- Now set maxSeconds to the minimum value between itself and endSeconds
+        IF endSeconds < maxSeconds THEN
+            maxSeconds := endSeconds;
+        END IF;
+
+        -- Open cursor & fetch a 1st row
+        OPEN measuresCursor;
+        FETCH measuresCursor INTO secondsAfter, valueAfter, qOrderAfter;
+
+        -- Loop over all dates between beginDate & max. possible date (endDate or max. date in time series)
+        WHILE secondsInterp <= maxSeconds LOOP
+
+            WHILE secondsAfter < secondsInterp LOOP
+
+                secondsBefore := secondsAfter;
+                valueBefore := valueAfter;
+                qOrderBefore := qOrderAfter;
+
+                FETCH measuresCursor INTO secondsAfter, valueAfter, qOrderAfter;
+
+            END LOOP;
+
+            IF secondsAfter = secondsInterp THEN
+                -- Strict equality between secondsAfter and secondsInterp
+                -- That will seldom happen, but still, it can happen!
+                qOrderInterp := qOrderAfter;
+
+                IF qOrderInterp > 200 THEN
+                    valueInterp := valueAfter;
+                ELSE
+                    valueInterp := -9999;
+                END IF;
+
+            ELSE
+                -- Quite more likely: we must interpolate between secondsBefore and secondsAfter
+                -- Value is linearly interpolated, or set to -9999. Quality is the worse of the two boundaries.
+                qOrderInterp := bdoh_cross_quality_orders(qOrderBefore, qOrderAfter);
+
+                IF qOrderInterp > 200 THEN
+                    valueInterp := ((secondsAfter - secondsInterp) * valueBefore
+                                   + (secondsInterp - secondsBefore) * valueAfter)
+                                   / (secondsAfter - secondsBefore);
+                ELSE
+                    valueInterp := -9999;
+                END IF;
+
+            END IF;
+            
+            SELECT q.code INTO qCodeInterp
+                FROM qualite q
+                WHERE q.jeu_id = jeuQualiteId
+                AND q.ordre = qOrderInterp
+                AND q.code <> 'gap';
+
+            RETURN QUERY SELECT TO_TIMESTAMP(secondsInterp) AT TIME ZONE 'UTC', ROUND(valueInterp::NUMERIC, 3)::DOUBLE PRECISION, qCodeInterp;
+
+            secondsInterp := secondsInterp + stepInSeconds;
+
+        END LOOP;
+
+        CLOSE measuresCursor;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/bdoh_interp_instant_to_mean_or_cumul.sql b/app/sql/bdoh_interp_instant_to_mean_or_cumul.sql
new file mode 100644
index 0000000000000000000000000000000000000000..44f8732846afd0c83349a0c0e730055694d47676
--- /dev/null
+++ b/app/sql/bdoh_interp_instant_to_mean_or_cumul.sql
@@ -0,0 +1,107 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_instant_to_mean_or_cumul(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE,
+        samplingStepId   INTEGER,
+        --jeuQualiteId     INTEGER,
+        isMean           BOOLEAN,
+        measureDirection VARCHAR
+)
+RETURNS TABLE(date TIMESTAMP WITHOUT TIME ZONE, valeur DOUBLE PRECISION, quality VARCHAR) AS $$
+DECLARE
+        jeuQualiteId      INTEGER;
+
+        stepValue         INTEGER;
+        stepUnit          VARCHAR;
+        isEvent           BOOLEAN;
+        stepInterval      INTERVAL;
+
+        chroniqueMinDate  TIMESTAMP WITHOUT TIME ZONE;
+        chroniqueMaxDate  TIMESTAMP WITHOUT TIME ZONE;
+        maxDate           TIMESTAMP WITHOUT TIME ZONE;
+
+        firstBoundary     TIMESTAMP WITHOUT TIME ZONE;
+        secondBoundary    TIMESTAMP WITHOUT TIME ZONE;
+        printFirst        BOOLEAN;
+
+        integratedValue   DOUBLE PRECISION;
+        qualityOrder      INTEGER;
+        qualityCode       VARCHAR;
+BEGIN
+
+        -- Get quality set ID from time series
+        jeuQualiteId := bdoh_jeu_qualite_id(idChronique);
+
+        -- Get output time step value & unit
+        SELECT p.valeur, p.unite INTO stepValue, stepUnit
+            FROM pasEchantillonnage p WHERE p.id = samplingStepId;
+
+        -- Min & max time series dates
+        SELECT MIN(m.date), MAX(m.date) INTO chroniqueMinDate, chroniqueMaxDate
+            FROM mesure m WHERE m.chronique_id = idChronique;
+
+        isEvent := (LOWER(stepUnit) = 'event');
+        IF isEvent THEN
+            -- Process one event: only one interval defined by beginDate and endDate
+
+            -- If necessary, move beginDate & endDate inside the time series' range
+            IF beginDate < chroniqueMinDate THEN
+                firstBoundary := chroniqueMinDate;
+            ELSE
+                firstBoundary := beginDate;
+            END IF;
+            IF endDate > chroniqueMaxDate THEN
+                maxDate := chroniqueMaxDate;
+            ELSE
+                maxDate := endDate;
+            END IF;
+
+            -- Now compute interval length
+            stepInterval := maxDate - firstBoundary;
+
+        ELSE
+            -- Process 'normal' case: N intervals of a given span
+
+            -- Interval length is given by step value & step unit
+            stepInterval := stepValue || ' ' || stepUnit;
+
+            -- firstBoundary should not precede the time series' 1st date
+            firstBoundary := beginDate;
+            WHILE firstBoundary < chroniqueMinDate LOOP
+                firstBoundary := firstBoundary + stepInterval;
+            END LOOP;
+
+            -- Max date is end date
+            maxDate := endDate;
+
+        END IF;
+
+        -- Tell whether the output date should be the 1st boundary
+        printFirst := (LOWER(measureDirection) = 'ahead' OR isEvent);
+
+        secondBoundary := firstBoundary + stepInterval;
+        WHILE secondBoundary <= maxDate LOOP
+
+            SELECT vq.val, vq.quality_order, q.code INTO integratedValue, qualityOrder, qualityCode
+                FROM bdoh_integrate_instant_interval(idChronique, firstBoundary, secondBoundary) vq
+                LEFT JOIN qualite q ON q.jeu_id = jeuQualiteId AND q.ordre = vq.quality_order AND q.code <> 'gap';
+
+            IF isMean AND qualityOrder > 1 THEN
+                integratedValue := integratedValue / EXTRACT(EPOCH FROM (secondBoundary - firstBoundary));
+            END IF;
+
+            RETURN QUERY SELECT
+                CASE WHEN printFirst THEN firstBoundary ELSE secondBoundary END,
+                integratedValue, qualityCode;
+
+            firstBoundary := secondBoundary;
+            secondBoundary := firstBoundary + stepInterval;
+
+        END LOOP;
+
+        -- If working on an event, repeat output row but with end date instead of start date
+        -- HINT: see code just above: firstBoundary now contains the 'correct' value for the second boundary
+        IF isEvent THEN RETURN QUERY SELECT firstBoundary, integratedValue, qualityCode; END IF;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
diff --git a/app/sql/bdoh_interp_to_cumulative.sql b/app/sql/bdoh_interp_to_cumulative.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d2a478965c3f1e63bf3ea615d41f314080fc8ed2
--- /dev/null
+++ b/app/sql/bdoh_interp_to_cumulative.sql
@@ -0,0 +1,30 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_to_cumulative(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE,
+        samplingStepId   INTEGER,
+        startAt          VARCHAR DEFAULT 'round-hour'
+)
+RETURNS TABLE(boundary_start TIMESTAMP WITHOUT TIME ZONE, boundary_end TIMESTAMP WITHOUT TIME ZONE,
+        valeur DOUBLE PRECISION, qualite VARCHAR) AS $$
+DECLARE
+        inputSampling VARCHAR;
+BEGIN
+
+        SELECT COALESCE(LOWER(e.code), 'instantaneous') INTO inputSampling
+            FROM echantillonnage e
+            LEFT JOIN chronique c ON c.echantillonnage_id = e.id
+            WHERE c.id = idChronique;
+
+        IF inputSampling IN('instantaneous', 'mean') THEN
+            RETURN QUERY SELECT * FROM
+                bdoh_interp_to_mean_or_cumul(idChronique, beginDate, endDate, samplingStepId, false, startAt);
+        ELSIF inputSampling = 'cumulative' THEN
+            RETURN QUERY SELECT * FROM
+                bdoh_interp_cumul_to_cumul(idChronique, beginDate, endDate, samplingStepId, startAt);
+        ELSE
+            RETURN;
+        END IF;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
diff --git a/app/sql/bdoh_interp_to_mean_or_cumul.sql b/app/sql/bdoh_interp_to_mean_or_cumul.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8be9236e1a6ac7c761d4e8282d0609e9b597320f
--- /dev/null
+++ b/app/sql/bdoh_interp_to_mean_or_cumul.sql
@@ -0,0 +1,141 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_to_mean_or_cumul(
+        idChronique      INTEGER,
+        beginDate        TIMESTAMP WITHOUT TIME ZONE,
+        endDate          TIMESTAMP WITHOUT TIME ZONE,
+        samplingStepId   INTEGER,
+        isMean           BOOLEAN,
+        startAt          VARCHAR DEFAULT 'round-hour'
+)
+RETURNS TABLE(boundary_start TIMESTAMP WITHOUT TIME ZONE, boundary_end TIMESTAMP WITHOUT TIME ZONE,
+        value DOUBLE PRECISION, quality VARCHAR) AS $$
+DECLARE
+        jeuQualiteId      INTEGER;
+        inputSamplingCode VARCHAR;
+        integralFunction  VARCHAR;
+
+        stepValue         INTEGER;
+        stepUnit          VARCHAR;
+        isEvent           BOOLEAN;
+        stepInterval      INTERVAL;
+
+        chroniqueMinDate  TIMESTAMP WITHOUT TIME ZONE;
+        chroniqueMaxDate  TIMESTAMP WITHOUT TIME ZONE;
+        maxDate           TIMESTAMP WITHOUT TIME ZONE;
+
+        firstBoundary     TIMESTAMP WITHOUT TIME ZONE;
+        secondBoundary    TIMESTAMP WITHOUT TIME ZONE;
+
+        integratedValue   DOUBLE PRECISION;
+        qualityOrder      INTEGER;
+        qualityCode       VARCHAR;
+BEGIN
+
+        -- Min & max time series dates
+        SELECT MIN(m.date), MAX(m.date) INTO chroniqueMinDate, chroniqueMaxDate
+            FROM mesure m WHERE m.chronique_id = idChronique;
+
+        -- If there are less than 2 measures, then stop
+        IF chroniqueMinDate IS NULL OR chroniqueMaxDate = chroniqueMinDate THEN
+            RETURN;
+        END IF;
+
+        -- Get time series' sampling &
+        -- determine which store procedure should be used to integrate in each time interval
+        SELECT COALESCE(LOWER(e.code), 'instantaneous') INTO inputSamplingCode
+            FROM echantillonnage e
+            JOIN chronique c ON c.echantillonnage_id = e.id
+            WHERE c.id = idChronique;
+
+        IF inputSamplingCode = 'instantaneous' THEN
+            integralFunction := 'bdoh_integrate_instant_interval';
+        ELSIF inputSamplingCode = 'mean' THEN
+            integralFunction := 'bdoh_integrate_mean_interval';
+        ELSE
+            RETURN;
+        END IF;
+
+        -- Get quality set ID from time series
+        jeuQualiteId := bdoh_jeu_qualite_id(idChronique);
+
+        -- Get output time step value & unit
+        SELECT p.valeur, p.unite INTO stepValue, stepUnit
+            FROM pasEchantillonnage p WHERE p.id = samplingStepId;
+
+        isEvent := (LOWER(stepUnit) = 'event');
+        IF isEvent THEN
+            -- Process one event: only one interval defined by beginDate and endDate
+
+            -- If necessary, move beginDate & endDate inside the time series' range
+            IF beginDate < chroniqueMinDate THEN
+                firstBoundary := chroniqueMinDate;
+            ELSE
+                firstBoundary := beginDate;
+            END IF;
+            IF endDate > chroniqueMaxDate THEN
+                maxDate := chroniqueMaxDate;
+            ELSE
+                maxDate := endDate;
+            END IF;
+
+            -- If we start from an existing measure, then set firstBoundary properly.
+            -- In that case, also set maxDate to the date of an existing measure.
+            IF LOWER(startAt) = 'existing-measure' THEN
+                SELECT MIN(m.date), MAX(m.date) INTO firstBoundary, maxDate
+                    FROM mesure m WHERE m.chronique_id = idChronique
+                    AND m.date >= firstBoundary AND m.date <= maxDate;
+            END IF;
+
+            -- Now compute interval length
+            stepInterval := maxDate - firstBoundary;
+
+        ELSE
+            -- Process 'normal' case: N intervals of a given span
+
+            -- Interval length is given by step value & step unit
+            stepInterval := stepValue || ' ' || stepUnit;
+
+            -- firstBoundary should not precede the time series' 1st date
+            firstBoundary := beginDate;
+            WHILE firstBoundary < chroniqueMinDate LOOP
+                firstBoundary := firstBoundary + stepInterval;
+            END LOOP;
+
+            -- If we start from an existing measure, then set firstBoundary properly
+            IF LOWER(startAt) = 'existing-measure' THEN
+                SELECT MIN(m.date) INTO firstBoundary
+                    FROM mesure m WHERE m.chronique_id = idChronique
+                    AND m.date >= firstBoundary;
+            END IF;
+
+            -- Max date is end date
+            maxDate := endDate;
+
+        END IF;
+
+        -- We never know: if maxDate is no later than firstBoundary, then exit now
+        IF maxDate <= firstBoundary THEN
+            RETURN;
+        END IF;
+
+        secondBoundary := firstBoundary + stepInterval;
+        WHILE secondBoundary <= maxDate LOOP
+
+            EXECUTE 'SELECT vq.val, vq.quality_order, q.code '
+                    'FROM ' || integralFunction || '($1, $2, $3) vq '
+                    'JOIN qualite q ON q.jeu_id = $4 AND q.ordre = vq.quality_order AND q.code <> ''gap'''
+            USING idChronique, firstBoundary, secondBoundary, jeuQualiteId
+            INTO integratedValue, qualityOrder, qualityCode;
+
+            IF isMean AND qualityOrder > 200 THEN
+                integratedValue := integratedValue / EXTRACT(EPOCH FROM (secondBoundary - firstBoundary));
+            END IF;
+
+            RETURN QUERY SELECT firstBoundary, secondBoundary, ROUND(integratedValue::NUMERIC, 3)::DOUBLE PRECISION, qualityCode;
+
+            firstBoundary := secondBoundary;
+            secondBoundary := firstBoundary + stepInterval;
+
+        END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
diff --git a/app/sql/bdoh_jeu_qualite_id.sql b/app/sql/bdoh_jeu_qualite_id.sql
new file mode 100644
index 0000000000000000000000000000000000000000..945dcc99ee6c07792fdd9f8f911485aeca17e996
--- /dev/null
+++ b/app/sql/bdoh_jeu_qualite_id.sql
@@ -0,0 +1,19 @@
+CREATE OR REPLACE FUNCTION bdoh_jeu_qualite_id(
+        idChronique INTEGER
+)
+RETURNS INTEGER AS $$
+DECLARE
+        jeuQualiteId INTEGER;
+BEGIN
+        SELECT o.jeu_id INTO jeuQualiteId
+            FROM observatoire o
+            LEFT JOIN siteExperimental si ON si.observatoire_id = o.id
+            LEFT JOIN stations_sites ss ON ss.site_id = si.id
+            LEFT JOIN chronique c ON c.station_id = ss.station_id
+            WHERE c.id = idChronique
+            LIMIT 1;
+
+        RETURN jeuQualiteId;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
diff --git a/app/sql/bdoh_select_values_for_time_step.sql b/app/sql/bdoh_select_values_for_time_step.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d5e31526bf8dfbded6804e6afa6c252240f63531
--- /dev/null
+++ b/app/sql/bdoh_select_values_for_time_step.sql
@@ -0,0 +1,40 @@
+CREATE OR REPLACE FUNCTION bdoh_select_values_for_time_step(
+	idChronique INTEGER,
+        beginDate   TIMESTAMP WITHOUT TIME ZONE,
+        endDate     TIMESTAMP WITHOUT TIME ZONE
+	)
+	RETURNS TABLE(timest DOUBLE PRECISION, val DOUBLE PRECISION, qualOrder INTEGER, qual VARCHAR) AS $$
+
+BEGIN
+
+	RETURN QUERY EXECUTE
+		'SELECT EXTRACT(EPOCH FROM m.date AT TIME ZONE ''UTC'') as tst, m.valeur, q.ordre, q.code '
+		'FROM mesure m '
+                'INNER JOIN qualite q '
+                '    ON m.qualite_id = q.id '
+		'WHERE m.chronique_id = $1 '
+		'AND m.date > $2 '
+                'AND m.date < $3 '
+                'UNION '
+                'SELECT EXTRACT(EPOCH FROM m.date AT TIME ZONE ''UTC'') as tst, m.valeur, q.ordre, q.code '
+		'FROM mesure m '
+                'INNER JOIN qualite q '
+                '    ON m.qualite_id = q.id '
+		'WHERE m.chronique_id = $1 '
+		'AND m.date = (SELECT MAX(date) FROM mesure '
+                '              WHERE chronique_id = $1 '
+                '              AND date <= $2) '
+                'UNION '
+                'SELECT EXTRACT(EPOCH FROM m.date AT TIME ZONE ''UTC'') as tst, m.valeur, q.ordre, q.code '
+		'FROM mesure m '
+                'INNER JOIN qualite q '
+                '    ON m.qualite_id = q.id '
+		'WHERE m.chronique_id = $1 '
+		'AND m.date = (SELECT MIN(date) FROM mesure '
+                '              WHERE chronique_id = $1 '
+                '              AND date >= $3) '
+		'ORDER BY tst ASC '
+                USING idChronique, beginDate, endDate;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
\ No newline at end of file
diff --git a/app/sql/bdoh_subsampled_instantaneous.sql b/app/sql/bdoh_subsampled_instantaneous.sql
new file mode 100644
index 0000000000000000000000000000000000000000..ec849b794731a824412aeeb04fb5410c136cd273
--- /dev/null
+++ b/app/sql/bdoh_subsampled_instantaneous.sql
@@ -0,0 +1,101 @@
+-- Stored procedures used to extract subsets of measures from a chronicle.
+-- Measures are to be arranged into "series", each with a given start date and an end date.
+-- We subsample measures in each series as follow: the span of the series is divided in time subintervals
+-- of a given small span, and in each, we keep the min & max values with the corresponding dates. We also
+-- keep the very first & very last measures of the series.
+
+-- Gives the measures for a subsampled series
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_series_measures(
+	chroniqueId INTEGER,
+	startDate TIMESTAMP,
+	endDate TIMESTAMP,
+	subinterval DOUBLE PRECISION
+)
+RETURNS TABLE(milliseconds DOUBLE PRECISION, value DOUBLE PRECISION)
+AS $FUNC1$
+BEGIN
+	-- WITH clause yields measures with date in milliseconds, subinterval index (starting from zero) and value
+	-- First subselect (alias "vmin") yields, for each subinterval, the date & value for the measure with smallest value
+	-- Second subselect (alias "vmax") yields, for each subinterval, the date & value for the largest measure with greatest value
+	-- Finally, we append the very first & last measures in our date interval
+
+	RETURN QUERY
+		WITH miv(millisecs, index, val) AS (
+			SELECT 1000 * EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC'),
+			(EXTRACT(EPOCH FROM AGE(date, startDate))/subinterval)::INTEGER,
+			valeur
+			FROM mesure WHERE chronique_id = chroniqueId
+			AND date >= startDate AND date <= endDate
+			ORDER BY date
+		)
+		SELECT millisecs, val FROM (SELECT * FROM miv LIMIT 1) first_m -- very first measure
+		UNION
+		SELECT millisecs, val FROM -- row with min value per subinterval
+		(
+			SELECT ROW_NUMBER() OVER(PARTITION BY index ORDER BY val ASC) AS rank,
+			millisecs,
+			val
+			FROM miv
+		) vmin
+		WHERE vmin.rank = 1
+		UNION
+		SELECT millisecs, val FROM -- row with max value per subinterval
+		(
+			SELECT ROW_NUMBER() OVER(PARTITION BY index ORDER BY val DESC) AS rank,
+			millisecs,
+			val
+			FROM miv
+		) vmax
+		WHERE vmax.rank = 1
+		UNION
+		SELECT millisecs, val FROM (SELECT * FROM miv ORDER BY millisecs DESC LIMIT 1) last_m -- very last measure
+		ORDER BY millisecs
+        ;
+END;
+$FUNC1$ LANGUAGE 'plpgsql' STABLE;
+
+-- Gives the measures for a set of subsampled series
+-- NOTE: we assume that startDates, endDates, subintervals are equally sized and do not proceed to any checking
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_all_series_measures(
+	chroniqueId INTEGER,
+	startDates TIMESTAMP[],
+	endDates TIMESTAMP[],
+	subintervals DOUBLE PRECISION[]
+)
+RETURNS TABLE(milliseconds DOUBLE PRECISION, value DOUBLE PRECISION)
+AS $FUNC2$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT * FROM bdoh_subsampled_instantaneous_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i]);
+	END LOOP;
+
+END;
+$FUNC2$ LANGUAGE 'plpgsql' STABLE;
+
+-- Gives the measure counts for a set of subsampled series
+-- NOTE: we assume that startDates, endDates, subintervals are equally sized and do not proceed to any checking
+CREATE OR REPLACE FUNCTION bdoh_subsampled_instantaneous_all_series_lengths(
+	chroniqueId INTEGER,
+	startDates TIMESTAMP[],
+	endDates TIMESTAMP[],
+	subintervals DOUBLE PRECISION[]
+)
+RETURNS TABLE(measure_count BIGINT)
+AS $FUNC3$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT COUNT(*) FROM bdoh_subsampled_instantaneous_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i]);
+	END LOOP;
+
+END;
+$FUNC3$ LANGUAGE 'plpgsql' STABLE;
\ No newline at end of file
diff --git a/app/sql/bdoh_subsampled_mean.sql b/app/sql/bdoh_subsampled_mean.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d51ee7d391c10573c8bb125e1c11081f4e4d3269
--- /dev/null
+++ b/app/sql/bdoh_subsampled_mean.sql
@@ -0,0 +1,149 @@
+-- Stored procedures used to extract subsets of measures from a chronicle.
+-- Measures are to be arranged into "series", each with a given start date and an end date.
+-- We subsample measures in each series as follow: the span of the series is divided in time subintervals
+-- of a given small span, and in each, we keep the min & max values with the corresponding dates. We also
+-- keep the very first & very last measures of the series.
+
+-- Gives the measures for a subsampled series
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_series_measures(
+	chroniqueId INTEGER,
+	startDate TIMESTAMP,
+	endDate TIMESTAMP,
+	subinterval DOUBLE PRECISION,
+	direction VARCHAR DEFAULT 'AHEAD'
+)
+RETURNS TABLE(milliseconds DOUBLE PRECISION, value DOUBLE PRECISION)
+AS $$
+DECLARE
+	directionDateFilter VARCHAR;
+	shiftedDate VARCHAR;
+	overallQuery VARCHAR;
+	intervalFirstDate DOUBLE PRECISION;
+	intervalLastDate DOUBLE PRECISION;
+BEGIN
+	SELECT 1000 * MIN(EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC')) INTO intervalFirstDate
+		FROM mesure WHERE chronique_id = chroniqueId AND date >= startDate;
+	SELECT 1000 * MAX(EXTRACT(EPOCH FROM date AT TIME ZONE 'UTC')) INTO intervalLastDate
+		FROM mesure WHERE chronique_id = chroniqueId AND date <= endDate;
+
+	-- String replacement variables in ALL the stored procedure:
+	-- $1 = chroniqueId
+	-- $2 = startDate
+	-- $3 = endDate
+	-- $4 = subinterval
+	-- $5 = intervalFirstDate
+	-- $6 = intervalLastDate
+
+	CASE UPPER(direction)
+		WHEN 'AHEAD' THEN
+			directionDateFilter := 'AND date < (SELECT MAX(date) FROM mesure WHERE chronique_id = $1)';
+			shiftedDate := 'COALESCE(LEAD(date) OVER(obd),'
+				       '(SELECT MIN(date) FROM mesure WHERE chronique_id = $1 AND date > $3)'
+				       ')';
+		ELSE
+			directionDateFilter := 'AND date > (SELECT MIN(date) FROM mesure WHERE chronique_id = $1)';
+			shiftedDate := 'COALESCE(LAG(date) OVER(obd),'
+				       '(SELECT MAX(date) FROM mesure WHERE chronique_id = $1 AND date < $2)'
+				       ')';
+	END CASE;
+
+        -- Overall query
+        overallQuery := 'WITH dsiiv(millisecs, shifted_ms, meas_index, intvl_index, val) AS ('
+			'	SELECT 1000 * EXTRACT(EPOCH FROM date AT TIME ZONE ''UTC''),'
+			'	1000 * EXTRACT(EPOCH FROM ' || shiftedDate || ' AT TIME ZONE ''UTC''),'
+			'	ROW_NUMBER() OVER(obd),'
+			'	(EXTRACT(EPOCH FROM age(date, $2))/$4)::INTEGER,'
+			'	valeur FROM mesure WHERE chronique_id = $1'
+			'	AND date >= $2 AND date <= $3 ' || directionDateFilter ||
+			'	WINDOW obd AS (ORDER BY date)'
+			'	ORDER BY date'
+			'), vmin(millisecs, shifted_ms, meas_index, rank, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index,'
+			'	ROW_NUMBER() OVER(PARTITION BY intvl_index ORDER BY val ASC),'
+			'	val FROM dsiiv'
+			'), vmin_filtered(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM vmin WHERE rank = 1'
+			'), vmax(millisecs, shifted_ms, meas_index, rank, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index,'
+			'	ROW_NUMBER() OVER(PARTITION BY intvl_index ORDER BY val DESC),'
+			'	val FROM dsiiv'
+			'), vmax_filtered(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM vmax WHERE rank = 1'
+			'), vfirst(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM dsiiv WHERE millisecs = $5'
+			'), vlast(millisecs, shifted_ms, meas_index, val) AS ('
+			'	SELECT millisecs, shifted_ms, meas_index, val'
+			'	FROM dsiiv WHERE millisecs = $6'
+			')'
+			'SELECT millisecs, val FROM('
+			'	SELECT millisecs, val, meas_index FROM vfirst'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vfirst'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vmin_filtered'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vmin_filtered'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vmax_filtered'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vmax_filtered'
+			'	UNION'
+			'	SELECT millisecs, val, meas_index FROM vlast'
+			'	UNION SELECT shifted_ms, val, meas_index FROM vlast'
+			'	ORDER BY millisecs, meas_index'
+			') x'
+			;
+
+	RETURN QUERY EXECUTE overallQuery USING
+		chroniqueId, startDate, endDate, subinterval, intervalFirstDate, intervalLastDate;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
+
+-- Gives the measures for a set of subsampled series
+-- NOTE: we assume that startDates, endDates, subintervals are equally sized and do not proceed to any checking
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_all_series_measures(
+	chroniqueId INTEGER,
+	startDates TIMESTAMP[],
+	endDates TIMESTAMP[],
+	subintervals DOUBLE PRECISION[],
+	direction VARCHAR DEFAULT 'AHEAD'
+)
+RETURNS TABLE(milliseconds DOUBLE PRECISION, value DOUBLE PRECISION)
+AS $$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT * FROM bdoh_subsampled_mean_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i], direction);
+	END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
+
+-- Gives the measure counts for a set of subsampled series
+-- NOTE: we assume that startDates, endDates, subintervals are equally sized and do not proceed to any checking
+CREATE OR REPLACE FUNCTION bdoh_subsampled_mean_all_series_lengths(
+	chroniqueId INTEGER,
+	startDates TIMESTAMP[],
+	endDates TIMESTAMP[],
+	subintervals DOUBLE PRECISION[],
+	direction VARCHAR DEFAULT 'AHEAD'
+)
+RETURNS TABLE(measure_count BIGINT)
+AS $$
+DECLARE
+	nSeries BIGINT;
+	i BIGINT;
+BEGIN
+	nSeries := ARRAY_LENGTH(startDates, 1);
+	FOR i IN 1..nSeries LOOP
+		RETURN QUERY SELECT COUNT(*) FROM bdoh_subsampled_mean_series_measures(chroniqueId,
+			startDates[i], endDates[i], subintervals[i], direction);
+	END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
diff --git a/app/sql/bdoh_update_samplings.sql b/app/sql/bdoh_update_samplings.sql
new file mode 100644
index 0000000000000000000000000000000000000000..c41800c48d4230dc3c5dacd561b8d7d3280ec2de
--- /dev/null
+++ b/app/sql/bdoh_update_samplings.sql
@@ -0,0 +1,4 @@
+UPDATE echantillonnage SET hasdirection = false, ordresortie = 4, code = 'instantaneous', nom = 'Interpolation linéaire',
+    nomEn = 'Linear interpolation' WHERE (nom LIKE 'Instantan%' OR nom = 'Interpolation linéaire');
+UPDATE echantillonnage SET hasdirection = true, ordresortie = 8, code = 'mean', nomEn = 'Mean' WHERE nom = 'Moyenne';
+UPDATE echantillonnage SET hasdirection = true, ordresortie = 12, code = 'cumulative', nomEn = 'Accumulation' WHERE nom = 'Cumul';
diff --git a/app/sql/chronique_calcul_dates_mesures.sql b/app/sql/chronique_calcul_dates_mesures.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9ebb64e610d21a9fe87a082a7e72af324a7a4c1b
--- /dev/null
+++ b/app/sql/chronique_calcul_dates_mesures.sql
@@ -0,0 +1,38 @@
+CREATE OR REPLACE FUNCTION bdoh_chronique_calcul_dates_mesures (idChronique INTEGER, dtype VARCHAR)
+RETURNS INTEGER AS $$
+
+DECLARE
+    firstDate   TIMESTAMP;
+    lastDate    TIMESTAMP;
+    nbMes       INTEGER;
+
+BEGIN
+    IF dtype = 'discontinue' THEN
+        SELECT INTO firstDate, lastDate, nbMes MIN(p.debut), MAX(p.fin), COUNT(p.chronique_id)
+        FROM plage p
+        WHERE p.chronique_id = idChronique
+        GROUP BY p.chronique_id;
+    ELSE
+        SELECT INTO firstDate, lastDate, nbMes MIN(m.date), MAX(m.date), COUNT(m.chronique_id)
+        FROM mesure m
+        WHERE m.chronique_id = idChronique
+        GROUP BY m.chronique_id;
+    END IF;
+
+
+    IF firstDate IS NOT NULL AND lastDate IS NOT NULL AND nbMes IS NOT NULL THEN
+        UPDATE chronique SET (dateDebutMesures, dateFinMesures, nbMesures) = (firstDate, lastDate, nbMes)
+        WHERE id = idChronique;
+
+        RETURN 0;
+    ELSE
+        UPDATE chronique SET (dateDebutMesures, dateFinMesures, nbMesures) = (NULL, NULL, NULL)
+        WHERE id = idChronique;
+
+        RETURN 1;
+    END IF;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+-- exemple request to update all chronicles
+SELECT c.id, bdoh_chronique_calcul_dates_mesures(c.id, c.dtype) FROM chronique c ORDER BY c.id;
diff --git a/app/sql/compute_chronique.sql b/app/sql/compute_chronique.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8c1bb9843c8e62870e83b59f7d4903ac6963bf30
--- /dev/null
+++ b/app/sql/compute_chronique.sql
@@ -0,0 +1,47 @@
+CREATE OR REPLACE FUNCTION bdoh_compute_chronique(
+  	chroniqueFilleId INTEGER
+	)
+	RETURNS INTEGER AS $$
+
+DECLARE
+	transfoMainId   INTEGER;
+	transfoSecondId INTEGER;
+	jeuQualiteId    INTEGER;
+        delayMain       DOUBLE PRECISION;
+        delaySecond     DOUBLE PRECISION;
+BEGIN
+
+        jeuQualiteId := bdoh_jeu_qualite_id(chroniqueFilleId);
+
+	PERFORM bdoh_purge_mesures_child_chronique(chroniqueFilleId);
+
+	transfoMainId := (SELECT premiereentree_id FROM chronique WHERE id = chroniqueFilleId);
+	transfoSecondId := (SELECT secondeentree_id FROM chronique WHERE id = chroniqueFilleId);
+
+	IF transfoSecondId IS NULL THEN
+		RETURN bdoh_insert_mesures_one_transformation(chroniqueFilleId, jeuQualiteId, transfoMainId);
+
+	ELSE
+                delayMain := (SELECT j.delaipropagation FROM jeubareme j WHERE j.id =
+                        (SELECT t.jeubaremeactuel_id FROM transformation t WHERE t.id = transfoMainId));
+                IF delayMain IS NULL THEN
+                        delayMain := 0;
+                END IF;
+                delaySecond := (SELECT j.delaipropagation FROM jeubareme j WHERE j.id =
+                        (SELECT t.jeubaremeactuel_id FROM transformation t WHERE t.id = transfoSecondId));
+                IF delaySecond IS NULL THEN
+                        delaySecond := 0;
+                END IF;
+
+		RETURN bdoh_insert_mesures_two_transformations(chroniqueFilleId, jeuQualiteId, transfoMainId, transfoSecondId,
+			delayMain, delaySecond, (SELECT facteurmultiplicatif FROM chronique WHERE id = chroniqueFilleId));
+
+	END IF;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 32;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/copyFromCsv.sql b/app/sql/copyFromCsv.sql
new file mode 100644
index 0000000000000000000000000000000000000000..123b669e6eae8c785b37b0ecf4986014d445d5fc
--- /dev/null
+++ b/app/sql/copyFromCsv.sql
@@ -0,0 +1,18 @@
+CREATE OR REPLACE FUNCTION copy_from_csv(table_name text, table_fieds text, file_path text, delimeter text DEFAULT ';'::text)
+  RETURNS void AS
+$BODY$
+
+declare statement text;
+begin
+
+statement := 'COPY ' || table_name || ' (' || table_fieds || ') ' || 'FROM ''' || file_path || ''' WITH ';
+statement := statement || 'DELIMITER ''' || delimeter || '''  CSV';
+
+execute statement;
+end;
+$BODY$
+  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
+  COST 100;
+
+revoke all on function copy_from_csv(text, text, text, text) from bdoh;
+grant execute on function copy_from_csv(text, text, text, text) to bdoh;
\ No newline at end of file
diff --git a/app/sql/fill_technical_baremes.sql b/app/sql/fill_technical_baremes.sql
new file mode 100644
index 0000000000000000000000000000000000000000..441db2fd1c5388cfc1ab897fb8936eb8e41ca1ed
--- /dev/null
+++ b/app/sql/fill_technical_baremes.sql
@@ -0,0 +1,26 @@
+CREATE FUNCTION fill_technical_baremes() RETURNS VOID AS $$
+BEGIN
+
+    IF (SELECT nom FROM bareme WHERE nom = 'identite') IS NULL THEN
+        INSERT INTO bareme (id, nom, valeurs, dateCreation) VALUES
+        (NEXTVAL('BAREME_ID_SEQ'), 'identite', '{{-1000000000,-1000000000,4},{1000000000,1000000000,4}}', '1900-01-01');
+    END IF;
+
+    IF (SELECT nom FROM bareme WHERE nom = 'lacune') IS NULL THEN
+        INSERT INTO bareme (id, nom, valeurs, dateCreation) VALUES
+        (NEXTVAL('BAREME_ID_SEQ'), 'lacune', '{{-1000000000,-9999,0},{1000000000,-9999,0}}', '1900-01-01');
+    END IF;
+
+    IF (SELECT nom FROM bareme WHERE nom = 'manuel') IS NULL THEN
+        INSERT INTO bareme (id, nom, valeurs, dateCreation) VALUES
+        (NEXTVAL('BAREME_ID_SEQ'), 'manuel', '{{-1000000000,-1000000000,4},{1000000000,1000000000,4}}', '1900-01-01');
+    END IF;
+
+    RETURN;
+END;
+$$ LANGUAGE 'plpgsql'
+VOLATILE;
+
+SELECT fill_technical_baremes();
+
+DROP FUNCTION fill_technical_baremes();
\ No newline at end of file
diff --git a/app/sql/insert_mesures_one_transformation.sql b/app/sql/insert_mesures_one_transformation.sql
new file mode 100644
index 0000000000000000000000000000000000000000..85c704f8b74723ac579d6fca0e31ce84e49b95be
--- /dev/null
+++ b/app/sql/insert_mesures_one_transformation.sql
@@ -0,0 +1,39 @@
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_one_transformation(
+  	chroniqueFilleId INTEGER,
+  	jeuQualiteId     INTEGER,
+	transfoId        INTEGER
+	)
+	RETURNS INTEGER AS $$
+
+DECLARE
+	curseur       CURSOR FOR SELECT date, valeur FROM bdoh_transformed_mesures(transfoId) ORDER BY date;
+	dateInsert    TIMESTAMP;
+	valeurQualite DOUBLE PRECISION[];
+	qualiteId     INTEGER;
+BEGIN
+	OPEN curseur;
+
+	FETCH curseur INTO dateInsert, valeurQualite;
+
+	WHILE dateInsert IS NOT NULL LOOP
+
+		qualiteId = (SELECT id FROM qualite WHERE ordre = ROUND(valeurQualite[2]) AND jeu_id = jeuQualiteId AND code <> 'gap');
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, valeurQualite[1], true);
+
+		FETCH curseur INTO dateInsert, valeurQualite;
+
+	END LOOP;
+
+	CLOSE curseur;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/insert_mesures_two_transformations.sql b/app/sql/insert_mesures_two_transformations.sql
new file mode 100644
index 0000000000000000000000000000000000000000..5b590322fc519ba7d0e30aae04f9c05002acc604
--- /dev/null
+++ b/app/sql/insert_mesures_two_transformations.sql
@@ -0,0 +1,105 @@
+CREATE OR REPLACE FUNCTION bdoh_insert_mesures_two_transformations(
+  	chroniqueFilleId INTEGER,
+  	jeuQualiteId     INTEGER,
+	transfoMainId    INTEGER,
+  	transfoSecondId  INTEGER,
+        delayMain        DOUBLE PRECISION DEFAULT 0.0,
+        delaySecond      DOUBLE PRECISION DEFAULT 0.0,
+  	coefficient      DOUBLE PRECISION DEFAULT 1.0
+	)
+	RETURNS INTEGER AS $$
+
+DECLARE
+	cursorMain         CURSOR FOR SELECT date + delayMain * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoMainId) ORDER BY date;
+	cursorSecond       CURSOR FOR SELECT date + delaySecond * INTERVAL '1 MINUTE', valeur
+                                   FROM bdoh_transformed_mesures(transfoSecondId) ORDER BY date;
+	dateMain           TIMESTAMP;
+	dateMainAvant      TIMESTAMP;
+	dateSecond         TIMESTAMP;
+	dateSecondAvant    TIMESTAMP;
+	valeurMain         DOUBLE PRECISION[];
+	valeurMainAvant    DOUBLE PRECISION[];
+	valeurSecond       DOUBLE PRECISION[];
+	valeurSecondAvant  DOUBLE PRECISION[];
+	dateInsert         TIMESTAMP;
+	valeurMainInsert   DOUBLE PRECISION[];
+	valeurSecondInsert DOUBLE PRECISION[];
+	yInsert            DOUBLE PRECISION;
+	qualiteInsert      DOUBLE PRECISION;
+	qualiteId          INTEGER;
+BEGIN
+	OPEN cursorMain;
+	OPEN cursorSecond;
+
+	dateMainAvant := NULL;
+	valeurMainAvant := NULL;
+	dateSecondAvant := NULL;
+	valeurSecondAvant := NULL;
+	FETCH cursorMain INTO dateMain, valeurMain;
+	FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+	WHILE dateMain IS NOT NULL OR dateSecond IS NOT NULL LOOP
+
+		IF dateMain < dateSecond OR dateSecond IS NULL THEN
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := bdoh_interp_between_dates(dateInsert, dateSecondAvant, valeurSecondAvant, dateSecond, valeurSecond);
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+
+		ELSIF dateSecond < dateMain OR dateMain IS NULL THEN
+			dateInsert := dateSecond;
+			valeurMainInsert := bdoh_interp_between_dates(dateInsert, dateMainAvant, valeurMainAvant, dateMain, valeurMain);
+			valeurSecondInsert := valeurSecond;
+
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		ELSE
+			dateInsert := dateMain;
+			valeurMainInsert := valeurMain;
+			valeurSecondInsert := valeurSecond;
+
+			dateMainAvant := dateMain;
+			valeurMainAvant := valeurMain;
+			FETCH cursorMain INTO dateMain, valeurMain;
+			dateSecondAvant := dateSecond;
+			valeurSecondAvant := valeurSecond;
+			FETCH cursorSecond INTO dateSecond, valeurSecond;
+
+		END IF ;
+
+                qualiteInsert := bdoh_cross_quality_orders(ROUND(valeurMainInsert[2])::INTEGER, ROUND(valeurSecondInsert[2])::INTEGER);
+		IF qualiteInsert < 300 THEN
+			yInsert := -9999;
+		ELSE
+			yInsert := valeurMainInsert[1] * valeurSecondInsert[1] * coefficient;
+		END IF;
+
+		SELECT id INTO qualiteId
+                    FROM qualite
+                    WHERE ordre = ROUND(qualiteInsert)
+                    AND jeu_id = jeuQualiteId
+                    AND code <> 'gap';
+
+		INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, estcalculee)
+		VALUES(NEXTVAL('MESURE_ID_SEQ'), qualiteId, chroniqueFilleId, dateInsert, yInsert, true);
+
+	END LOOP;
+
+	CLOSE cursorMain;
+	CLOSE cursorSecond;
+
+	RETURN 0;
+
+EXCEPTION
+
+	WHEN OTHERS THEN
+		RETURN 16;
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/interp_between_dates.sql b/app/sql/interp_between_dates.sql
new file mode 100644
index 0000000000000000000000000000000000000000..4f98685cc1cb8601c28f6d71ca6f058b53fee4d6
--- /dev/null
+++ b/app/sql/interp_between_dates.sql
@@ -0,0 +1,50 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_between_dates(
+	dateInterp TIMESTAMP,
+	dateAvant TIMESTAMP,
+	valeurAvant DOUBLE PRECISION[],
+	dateApres TIMESTAMP,
+	valeurApres DOUBLE PRECISION[]
+	)
+	RETURNS DOUBLE PRECISION[] AS $$ -- TODO voir type renvoyé par la fonction
+
+DECLARE
+
+	valeur        DOUBLE PRECISION;
+	qualite       DOUBLE PRECISION;
+	secondes      DOUBLE PRECISION;
+	secondesAvant DOUBLE PRECISION;
+	secondesApres DOUBLE PRECISION;
+
+BEGIN
+
+	IF dateAvant IS NULL OR dateApres IS NULL OR valeurAvant IS NULL OR valeurApres IS NULL THEN
+		RETURN ARRAY[-9999, 100];
+	END IF;
+
+	IF valeurAvant[2] < 300 THEN
+		RETURN ARRAY[-9999, valeurAvant[2]];
+	END IF;
+
+	IF valeurApres[2] < 300 THEN
+		RETURN valeurAvant;
+	END IF;
+
+	secondes := EXTRACT(EPOCH FROM dateInterp AT TIME ZONE 'UTC');
+	secondesAvant := EXTRACT(EPOCH FROM dateAvant AT TIME ZONE 'UTC');
+	secondesApres := EXTRACT(EPOCH FROM dateApres AT TIME ZONE 'UTC');
+	valeur := ((secondesApres - secondes) * valeurAvant[1]
+		+ (secondes - secondesAvant) * valeurApres[1])
+		/ (secondesApres - secondesAvant);
+	qualite := bdoh_cross_quality_orders(ROUND(valeurAvant[2])::INTEGER, ROUND(valeurApres[2])::INTEGER);
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
+
+
+--SELECT interp_between_dates(
+--	TIMESTAMP '2002-01-01 12:00:00',
+--	TIMESTAMP '2002-01-01 00:00:00',
+--	ARRAY[2.0, 2],
+--	TIMESTAMP '2002-01-02 00:00:00',
+--	ARRAY[5.0, 4]);
\ No newline at end of file
diff --git a/app/sql/interp_for_bareme.sql b/app/sql/interp_for_bareme.sql
new file mode 100644
index 0000000000000000000000000000000000000000..721ada757b9f1b70159bf7d6aa260cad641d7feb
--- /dev/null
+++ b/app/sql/interp_for_bareme.sql
@@ -0,0 +1,72 @@
+CREATE OR REPLACE FUNCTION bdoh_interp_for_bareme(
+	entree          DOUBLE PRECISION,
+	qualiteEntree   INTEGER,
+	bareme          DOUBLE PRECISION[],
+        limitsAsGaps    BOOLEAN DEFAULT false,
+        limitsAddCoeff  DOUBLE PRECISION DEFAULT 0.0,
+        limitsMultCoeff DOUBLE PRECISION DEFAULT 1.0
+        )
+	RETURNS DOUBLE PRECISION[] AS $$
+
+DECLARE
+
+        entree_adaptee DOUBLE PRECISION;
+	minBareme       DOUBLE PRECISION;
+	maxBareme       DOUBLE PRECISION;
+	longueur        INTEGER;
+	indice          INTEGER;
+	indiceMin       INTEGER;
+	indiceMax       INTEGER;
+	lignePrecedente DOUBLE PRECISION[];
+	ligneSuivante   DOUBLE PRECISION[];
+        valeur          DOUBLE PRECISION;
+	qualite         DOUBLE PRECISION;
+BEGIN
+
+        IF qualiteEntree IN (600, 700) THEN
+                IF limitsAsGaps THEN
+                    RETURN ARRAY[-9999.0, 200.0];
+                END IF;
+                entree_adaptee := entree * limitsMultCoeff + limitsAddCoeff;
+        ELSE
+                entree_adaptee := entree;
+        END IF;
+
+	minBareme := bareme[1][1];
+	longueur := array_length(bareme, 1);
+	maxBareme := bareme[longueur][1];
+
+	IF qualiteEntree < 300 THEN
+		RETURN ARRAY[-9999.0, qualiteEntree];
+	END IF;
+	IF entree_adaptee < minBareme OR entree_adaptee > maxBareme
+	THEN
+		RETURN ARRAY[-9999.0, 100.0];
+	END IF;
+
+	indiceMin := 1;
+	indiceMax := longueur - 1;
+	indice := longueur / 2;
+
+	WHILE entree_adaptee < bareme[indice][1]
+		OR entree_adaptee > bareme[indice+1][1]
+	LOOP
+		IF entree_adaptee < bareme[indice][1]
+		THEN indice := indice-1;
+		ELSE indice := indice+1;
+		END IF;
+	END LOOP;
+
+	lignePrecedente := bareme[indice:indice][1:3];
+	ligneSuivante := bareme[indice+1:indice+1][1:3];
+        qualite := bdoh_cross_quality_orders(ROUND(lignePrecedente[1][3])::INTEGER, ROUND(ligneSuivante[1][3])::INTEGER, limitsAsGaps);
+        qualite := bdoh_cross_quality_orders(ROUND(qualite)::INTEGER, qualiteEntree, limitsAsGaps);
+
+        valeur := ((ligneSuivante[1][1] - entree_adaptee) * lignePrecedente[1][2]
+                + (entree_adaptee - lignePrecedente[1][1]) * ligneSuivante[1][2])
+                / (ligneSuivante[1][1] - lignePrecedente[1][1]);
+
+	RETURN ARRAY[valeur, qualite];
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
\ No newline at end of file
diff --git a/app/sql/modifyOrderQuality.sql b/app/sql/modifyOrderQuality.sql
new file mode 100644
index 0000000000000000000000000000000000000000..ca2a004fc402c253754f09068ae087ff2142cf0a
--- /dev/null
+++ b/app/sql/modifyOrderQuality.sql
@@ -0,0 +1,7 @@
+-- Modification de l'ordre des qualités Draix
+update qualite set ordre = 0 where code = '0' and jeu_id in (select id from jeuqualite where nom like 'Draix');
+update qualite set ordre = 1 where code = '5' and jeu_id in (select id from jeuqualite where nom like 'Draix');
+update qualite set ordre = 2 where code = '4' and jeu_id in (select id from jeuqualite where nom like 'Draix');
+update qualite set ordre = 3 where code = '1' and jeu_id in (select id from jeuqualite where nom like 'Draix');
+update qualite set ordre = 4 where code = '3' and jeu_id in (select id from jeuqualite where nom like 'Draix');
+update qualite set ordre = 5 where code = '2' and jeu_id in (select id from jeuqualite where nom like 'Draix');
\ No newline at end of file
diff --git a/app/sql/purge_mesures_child_chronique.sql b/app/sql/purge_mesures_child_chronique.sql
new file mode 100644
index 0000000000000000000000000000000000000000..39696002b1be760d88725553fd7ae4bf5352dbb4
--- /dev/null
+++ b/app/sql/purge_mesures_child_chronique.sql
@@ -0,0 +1,25 @@
+CREATE OR REPLACE FUNCTION bdoh_purge_mesures_child_chronique(
+	chroniqueFilleId INTEGER
+	)
+	RETURNS VOID AS $$
+
+BEGIN
+
+        -- Suppression de toutes les "mesures" calculees de la chronique
+        DELETE FROM mesure WHERE chronique_id = chroniqueFilleId AND estcalculee;
+
+        -- Suppression des mesures entrees manuellement et se retrouvant desormais dans la plage d'un bareme
+	DELETE FROM mesure WHERE id IN (
+		SELECT m.id
+		FROM mesure m
+		LEFT JOIN chronique c on c.id = m.chronique_id
+		LEFT JOIN transformation t ON t.id = c.premiereentree_id OR t.id = c.secondeentree_id
+		LEFT JOIN jeuBareme jb ON jb.id = t.jeuBaremeActuel_id
+		LEFT JOIN baremeJeuBareme bjb ON bjb.jeuBareme_id = jb.id AND m.date >= bjb.debutValidite AND (m.date < bjb.finValidite OR bjb.finValidite IS NULL)
+		LEFT JOIN bareme b ON bjb.bareme_id = b.id
+		WHERE m.chronique_id = chroniqueFilleId
+		AND b.nom <> 'manuel'
+	);
+
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
\ No newline at end of file
diff --git a/app/sql/toPlayOnDatabase.sql b/app/sql/toPlayOnDatabase.sql
new file mode 100644
index 0000000000000000000000000000000000000000..4500eea088d4f7f70ece25da5dc02ea8deacef09
--- /dev/null
+++ b/app/sql/toPlayOnDatabase.sql
@@ -0,0 +1,53 @@
+-- "Majusculisation" de tous les codes
+update station set code = upper(code);
+update chronique set code = upper(code);
+update siteexperimental set slug = upper(slug);
+update observatoire set slug = upper(slug);
+
+-- Déclaration à la main des colonnes géométriques
+delete from geometry_columns;
+
+insert into geometry_columns
+(
+  f_table_catalog,
+  f_table_schema,
+  f_table_name,
+  f_geometry_column,
+  coord_dimension,
+  srid,
+  "type"
+)
+values
+(
+'', 'bdoh', 'station', 'point', 2, 2154, 'GEOMETRY' --'POINT'
+);
+
+insert into geometry_columns
+(
+  f_table_catalog,
+  f_table_schema,
+  f_table_name,
+  f_geometry_column,
+  coord_dimension,
+  srid,
+  "type"
+)
+values
+(
+'', 'bdoh', 'bassin', 'perimetre', 2, 2154, 'GEOMETRY' --'POLYGON'
+);
+
+insert into geometry_columns
+(
+  f_table_catalog,
+  f_table_schema,
+  f_table_name,
+  f_geometry_column,
+  coord_dimension,
+  srid,
+  "type"
+)
+values
+(
+'', 'bdoh', 'courseau', 'trace', 2, 2154, 'GEOMETRY' --'LINESTRING'
+);
\ No newline at end of file
diff --git a/app/sql/transformed_mesures.sql b/app/sql/transformed_mesures.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d8b825e83566811a8c12fb70c49010b39d67c4b2
--- /dev/null
+++ b/app/sql/transformed_mesures.sql
@@ -0,0 +1,74 @@
+CREATE OR REPLACE FUNCTION bdoh_transformed_mesures(
+	transfoId    INTEGER
+	)
+	RETURNS TABLE(date TIMESTAMP, valeur DOUBLE PRECISION[]) AS $$
+DECLARE
+        typeTransfoLimites VARCHAR;
+        turnLimitsToGap    BOOLEAN;
+        coeffLimitsAdd     DOUBLE PRECISION;
+        coeffLimitsMult    DOUBLE PRECISION;
+BEGIN
+
+        typeTransfoLimites := valuelimittransformationtype FROM jeubareme jb
+            JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.gap' THEN
+        -- Policy = turn value limits to gaps
+            turnLimitsToGap := true;
+            coeffLimitsAdd  := -9999.0;
+            coeffLimitsMult := 0.0;
+        ELSE
+            turnLimitsToGap := false;
+        END IF;
+
+        IF typeTransfoLimites IS NULL OR typeTransfoLimites = 'chronique.lq_ld.options.true_value' THEN
+        -- Policy = use value limits as "true" values
+            coeffLimitsAdd  := 0.0;
+            coeffLimitsMult := 1.0;
+        END IF;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.half_value' THEN
+        -- Policy = use the half of value limits as "true" values
+            coeffLimitsAdd  := 0.0;
+            coeffLimitsMult := 0.5;
+        END IF;
+
+        IF typeTransfoLimites = 'chronique.lq_ld.options.placeholder' THEN
+        -- Policy = replace value limits by the time series' placeholder
+            coeffLimitsAdd  := valuelimitplaceholder FROM jeubareme jb
+                JOIN transformation t ON t.jeubaremeactuel_id = jb.id WHERE t.id = transfoId;
+            coeffLimitsMult := 0.0;
+        END IF;
+
+	RETURN QUERY
+		SELECT m.date,
+		CASE
+                    WHEN b.nom = 'lacune' THEN
+                        ARRAY[-9999, 100]
+                    WHEN turnLimitsToGap AND q.ordre IN (600, 700) THEN
+                        ARRAY[-9999, 200]
+                    WHEN b.nom = 'identite' THEN
+                        CASE
+                            WHEN q.ordre IN (600, 700) THEN
+                                ARRAY[m.valeur * coeffLimitsMult + coeffLimitsAdd, q.ordre]
+                            ELSE
+                                ARRAY[m.valeur, q.ordre]
+                        END
+                    WHEN b.nom = 'manuel' THEN
+                        NULL
+                    ELSE
+                        replace(bdoh_interp_for_bareme(m.valeur, q.ordre, b.valeurs, turnLimitsToGap, coeffLimitsAdd, coeffLimitsMult)::varchar,
+                            '{NULL,NULL}', '{-9999,100}')::DOUBLE PRECISION[]
+		END
+		FROM transformation t
+		LEFT JOIN mesure m ON m.chronique_id = t.entree_id
+		LEFT JOIN qualite q ON m.qualite_id = q.id
+		LEFT JOIN jeuBareme jb ON jb.id = t.jeuBaremeActuel_id
+		LEFT JOIN baremeJeuBareme bjb ON bjb.jeuBareme_id = jb.id AND m.date >= bjb.debutValidite AND (m.date < bjb.finValidite OR bjb.finValidite IS NULL)
+		LEFT JOIN bareme b ON bjb.bareme_id = b.id
+		WHERE t.id = transfoId
+		AND b.nom <> 'manuel'
+		ORDER BY m.valeur DESC;
+
+END;
+$$ LANGUAGE 'plpgsql' STABLE;
\ No newline at end of file
diff --git a/app/sql/trunc_timestamp_function_create.sql b/app/sql/trunc_timestamp_function_create.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9a4df861bef94e674d719beba02e60d9a0cdfbcf
--- /dev/null
+++ b/app/sql/trunc_timestamp_function_create.sql
@@ -0,0 +1,33 @@
+-- Function: trunc_timestamp(timestamp without time zone, integer)
+
+-- This line is only useful if the language is not already active on DB :
+--CREATE LANGUAGE plpgsql;
+
+-- DROP FUNCTION trunc_timestamp(timestamp without time zone, integer);
+
+CREATE OR REPLACE FUNCTION trunc_timestamp(my_timestamp timestamp without time zone, my_precision integer)
+  RETURNS timestamp without time zone AS
+$BODY$
+DECLARE
+	day_beginning TIMESTAMP;
+	gap_seconds   INTEGER;
+	precision_day INTEGER;
+	precision_sec INTEGER;
+BEGIN
+	IF     my_precision = 1     THEN RETURN DATE_TRUNC('second', my_timestamp);
+	ELSEIF my_precision = 60    THEN RETURN DATE_TRUNC('minute', my_timestamp);
+	ELSEIF my_precision = 3600  THEN RETURN DATE_TRUNC('hour',   my_timestamp);
+	ELSEIF my_precision = 86400 THEN RETURN DATE_TRUNC('day',    my_timestamp);
+	ELSE
+		precision_day := my_precision / 86400;
+		precision_sec := my_precision % 86400;
+		day_beginning := DATE_TRUNC('day', my_timestamp);
+		gap_seconds   := DATE_PART('epoch', (my_timestamp - day_beginning))::INTEGER;
+		RETURN my_timestamp - (gap_seconds % precision_sec) * '1 second'::INTERVAL
+		                    - precision_day * '1 day'::INTERVAL;
+	END IF;
+END;
+$BODY$
+  LANGUAGE 'plpgsql' VOLATILE
+  COST 100;
+--ALTER FUNCTION trunc_timestamp(timestamp without time zone, integer) OWNER TO postgres;
diff --git a/bin/composer b/bin/composer
new file mode 100755
index 0000000000000000000000000000000000000000..361c68333ed4111472efa38eac2633b5c27e9892
Binary files /dev/null and b/bin/composer differ
diff --git a/bin/php-cs-fixer b/bin/php-cs-fixer
new file mode 100755
index 0000000000000000000000000000000000000000..e349aa7599c11467bb85b3c40248d066c59dc6b8
Binary files /dev/null and b/bin/php-cs-fixer differ
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..68293ebae22ebb6a183f7e2fc5f5b9e7057fc451
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,283 @@
+{
+    "name": "irstea/bdoh",
+    "description": "BD Observatoires Hydrologiques",
+    "type": "project",
+    "license": "AGPL-3.0-or-later",
+    "homepage": "https://gitlab.irstea.fr/pole-is/bdoh",
+    "readme": "README.md",
+    "authors": [
+        {
+            "name": "Flora Branger",
+            "role": "Product Owner"
+        },
+        {
+            "name": "Fabien Thollet",
+            "role": "Product Owner"
+        },
+        {
+            "name": "Guillaume Perréal",
+            "role": "Developper"
+        },
+        {
+            "name": "Luc Jamet",
+            "role": "Developper"
+        },
+        {
+            "name": "Benoit Vila",
+            "role": "Developper"
+        },
+        {
+            "name": "Mathieu Poisbeau",
+            "role": "Developper"
+        },
+        {
+            "name": "Maxime Crochemore",
+            "role": "Developper"
+        },
+        {
+            "name": "Thibault Degiuli",
+            "role": "Developper"
+        },
+        {
+            "name": "Daniel Gesche",
+            "role": "Developper"
+        },
+        {
+            "name": "Nicolas Raidelet",
+            "role": "Developper"
+        }
+    ],
+    "support": {
+        "issues": "https://gitlab.irstea.fr/pole-is/bdoh/-/issues"
+    },
+    "autoload": {
+        "psr-0": {
+            "Irstea\\": "src/"
+        },
+        "psr-4": {
+            "Irstea\\Bdoh\\Migrations\\": "app/DoctrineMigrations/"
+        },
+        "classmap": [
+            "app/AppKernel.php",
+            "app/AppCache.php"
+        ]
+    },
+    "autoload-dev": {
+        "psr-0": {
+            "Irstea\\BdohBundle\\Tests\\": "src/",
+            "Irstea\\BdohDataBundle\\Tests\\": "src/",
+            "Irstea\\BdohSecurityBundle\\Tests\\": "src/"
+        }
+    },
+    "config": {
+        "sort-packages": true,
+        "preferred-install": "dist",
+        "platform": {
+            "php": "7.1.33"
+        }
+    },
+    "archive": {
+        "exclude": [
+            ".deploy",
+            ".idea",
+            "reports",
+            "dev",
+            ".git*",
+            "deploy.php",
+            "docker-compose.yml"
+        ]
+    },
+    "prefer-stable": true,
+    "require": {
+        "php": ">=7.1",
+        "ext-ctype": "*",
+        "ext-gd": "*",
+        "ext-hash": "*",
+        "ext-iconv": "*",
+        "ext-intl": "*",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "ext-pdo": "*",
+        "ext-pgsql": "*",
+        "ext-posix": "*",
+        "ext-sodium": "*",
+        "ext-xsl": "*",
+        "ext-zip": "*",
+        "doctrine/cache": "1.7.0",
+        "doctrine/collections": "^1.4",
+        "doctrine/common": "^2.7",
+        "doctrine/data-fixtures": "^1.2",
+        "doctrine/dbal": "^2.5.13",
+        "doctrine/doctrine-bundle": "^1.4",
+        "doctrine/doctrine-cache-bundle": "^1.3",
+        "doctrine/doctrine-fixtures-bundle": "^2.3",
+        "doctrine/doctrine-migrations-bundle": "^1.2",
+        "doctrine/migrations": "^1.5",
+        "doctrine/orm": "^2.4.8",
+        "gregwar/captcha-bundle": "v1.0.11",
+        "guzzlehttp/guzzle": "6.5.5",
+        "incenteev/composer-parameter-handler": "^2.0",
+        "jms/aop-bundle": "^1.3",
+        "jms/di-extra-bundle": "~1.8.1",
+        "jms/job-queue-bundle": "^1.4",
+        "jms/security-extra-bundle": "^1.5",
+        "jms/serializer": "^1.14",
+        "knplabs/knp-menu-bundle": "~2.1.0",
+        "ocramius/proxy-manager": "^1.0",
+        "opis/json-schema": "^1.1",
+        "oyejorge/less.php": "v1.7.0.3",
+        "pagerfanta/pagerfanta": "^1.0",
+        "psr/log": "^1.1",
+        "sensio/distribution-bundle": "^5.0",
+        "sensio/framework-extra-bundle": "^3.0.2",
+        "sonata-project/admin-bundle": "~3.23.0",
+        "sonata-project/block-bundle": "~3.13.0",
+        "sonata-project/core-bundle": "~3.5.1",
+        "sonata-project/doctrine-orm-admin-bundle": "^3.0",
+        "swiftmailer/swiftmailer": "^5.4",
+        "symfony/config": "^2.8",
+        "symfony/console": "^2.8",
+        "symfony/dependency-injection": "^2.8",
+        "symfony/doctrine-bridge": "^2.8",
+        "symfony/event-dispatcher": "^2.8",
+        "symfony/form": "^2.8",
+        "symfony/framework-bundle": "^2.8",
+        "symfony/http-foundation": "^2.8",
+        "symfony/http-kernel": "^2.8",
+        "symfony/monolog-bundle": "^2.4",
+        "symfony/options-resolver": "^2.8",
+        "symfony/property-access": "^2.8",
+        "symfony/routing": "^2.8",
+        "symfony/security": "^2.8",
+        "symfony/security-bundle": "^2.8",
+        "symfony/serializer": "^2.8",
+        "symfony/swiftmailer-bundle": "^2.3",
+        "symfony/translation": "^2.8",
+        "symfony/twig-bridge": "^2.8",
+        "symfony/twig-bundle": "^2.8",
+        "symfony/validator": "^2.8",
+        "symfony/yaml": "^2.8",
+        "twig/extensions": "^1.5.4",
+        "twig/twig": "^1.28",
+        "willdurand/js-translation-bundle": "^2.6",
+        "willdurand/negotiation": "^2.3"
+    },
+    "require-dev": {
+        "dama/doctrine-test-bundle": "^4.0",
+        "deployer/deployer": "^6.0",
+        "irstea/composer-require-checker-shim": "^2.0",
+        "irstea/phpcpd-shim": "^4.1",
+        "irstea/php-cs-fixer-config": "^3.0.2",
+        "irstea/phploc-shim": "^4.0",
+        "irstea/phpmd-config": "^1.0.0",
+        "irstea/plantuml-bundle": "^0.1",
+        "mikey179/vfsstream": "^1.6",
+        "php-parallel-lint/php-parallel-lint": "^1.2",
+        "phpstan/extension-installer": "^1.0.5",
+        "phpstan/phpstan": "~0.12.53",
+        "phpstan/phpstan-doctrine": "~0.12.22",
+        "phpunit/phpunit": "^5.7",
+        "roave/security-advisories": "dev-master",
+        "sensio/generator-bundle": "^2.3",
+        "symfony/browser-kit": "^2.8",
+        "symfony/debug-bundle": "^2.8",
+        "symfony/web-profiler-bundle": "^2.8"
+    },
+    "replace": {
+        "symfony/polyfill-ctype": "1.99",
+        "symfony/polyfill-intl-icu": "1.99",
+        "symfony/polyfill-intl-idn": "1.99",
+        "symfony/polyfill-intl-normalizer": "1.99",
+        "symfony/polyfill-mbstring": "1.99",
+        "symfony/polyfill-php54": "1.99",
+        "symfony/polyfill-php55": "1.99",
+        "symfony/polyfill-php56": "1.99",
+        "symfony/polyfill-php70": "1.99",
+        "symfony/polyfill-php71": "1.99"
+    },
+    "extra": {
+        "symfony-assets-install": "relative",
+        "symfony-app-dir": "app",
+        "symfony-web-dir": "web",
+        "incenteev-parameters": {
+            "file": "app/config/parameters.yml",
+            "env-map": {
+                "database_host": "POSTGRES_HOST",
+                "database_port": "POSTGRES_PORT",
+                "database_name": "POSTGRES_DB",
+                "database_user": "POSTGRES_USER",
+                "database_password": "POSTGRES_PASSWORD",
+                "database_server_version": "POSTGRES_VERSION",
+                "mailer_host": "SMTP_HOST",
+                "project_guest_path": "PROJECT_GUEST_PATH",
+                "project_host_path": "PROJECT_HOST_PATH"
+            }
+        }
+    },
+    "scripts": {
+        "pre-install-cmd": "@force-permissions",
+        "pre-update-cmd": "@force-permissions",
+        "post-install-cmd": "@symfony-scripts",
+        "post-update-cmd": "@symfony-scripts",
+        "force-permissions": "`which sudo 2>/dev/null || true` chown -R `id -u`:`id -g` app vendor || true",
+        "symfony-scripts": [
+            "`which sudo 2>/dev/null || true` rm -rf app/cache/${SYMFONY_ENV:-dev} || true",
+            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
+            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
+            "@php app/console cache:warmup"
+        ],
+        "install-assets": [
+            "@php app/console asset:install -n --symlink --relative",
+            "@php app/console bazinga:js-translation:dump -n src/Irstea/BdohInternationalisationBundle/Resources/assets --merge-domains --format=json"
+        ],
+        "update-database": "@db:migrate",
+        "unit-tests": "@test:phpunit",
+        "database-tests": "@test:phpunit:database",
+        "db:reset": [
+            "test \"$SYMFONY_ENV\" != \"prod\" #",
+            "@php app/console doctrine:database:drop -n --force --if-exists #",
+            "@php app/console doctrine:database:create -n --if-not-exists #"
+        ],
+        "db:migrate": [
+            "@php app/console doctrine:query:sql 'CREATE SCHEMA IF NOT EXISTS bdoh;' #",
+            "@php app/console doctrine:migrations:migrate -n --allow-no-migration #"
+        ],
+        "fix-cs": "@format",
+        "format": "@php vendor/bin/php-cs-fixer fix",
+        "phploc": "@php vendor/bin/phploc app src --exclude=app/cache",
+        "test": [
+            "@test:lint",
+            "@test:php-cs-fixer",
+            "@test:phpstan",
+            "@test:phpcpd",
+            "@test:phpmd",
+            "@test:phpunit",
+            "@test:phpunit:database",
+            "@test:security-checker",
+            "@test:composer-require-checker"
+        ],
+        "test:lint": [
+            "@php app/console lint:yaml app/config",
+            "@php app/console lint:yaml app/Resources",
+            "@php app/console lint:yaml src",
+            "@php app/console lint:twig app/Resources",
+            "@php app/console lint:twig src",
+            "@php vendor/bin/parallel-lint --exclude app/cache src app"
+        ],
+        "test:php-cs-fixer": "@format --dry-run",
+        "test:phpcpd": "@php vendor/bin/phpcpd app src --exclude=cache --fuzzy",
+        "test:phpstan": "@php vendor/bin/phpstan analyse",
+        "test:phpmd": "@php vendor/bin/phpmd app,src ansi phpmd-ruleset.xml --exclude 'app/cache/*,app/DoctrineMigrations/*'",
+        "test:phpunit": "@php vendor/bin/phpunit --group=unit",
+        "test:phpunit:database": [
+            "@php app/console doctrine:database:drop -e test -n --force --if-exists #",
+            "@php app/console doctrine:database:create -e test -n --if-not-exists #",
+            "@php app/console doctrine:query:sql -e test 'CREATE SCHEMA IF NOT EXISTS bdoh;' #",
+            "@php app/console doctrine:migrations:migrate -e test -n --allow-no-migration -q #",
+            "@php app/console doctrine:fixtures:load -e test --purge-with-truncate -n --fixtures=src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ --fixtures=src/Irstea/BdohSecurityBundle/DataFixture/ORM/Test #",
+            "@php vendor/bin/phpunit --group=database"
+        ],
+        "test:security-checker": "@composer update --dry-run --quiet roave/security-advisories",
+        "test:composer-require-checker": "@php vendor/bin/composer-require-checker --config-file=$PWD/.composer-require-checker.json"
+    }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..3b890e24fdb5af3bb145023efc07f8ce53f874aa
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,9355 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "7331c6f50796a510ee58459d7d426cc9",
+    "packages": [
+        {
+            "name": "cocur/slugify",
+            "version": "v2.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/cocur/slugify.git",
+                "reference": "e8167e9a3236044afebd6e8ab13ebeb3ec9ca145"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/cocur/slugify/zipball/e8167e9a3236044afebd6e8ab13ebeb3ec9ca145",
+                "reference": "e8167e9a3236044afebd6e8ab13ebeb3ec9ca145",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "laravel/framework": "~5.1",
+                "latte/latte": "~2.2",
+                "league/container": "^2.2.0",
+                "mikey179/vfsstream": "~1.6",
+                "mockery/mockery": "~0.9",
+                "nette/di": "~2.2",
+                "phpunit/phpunit": "~4.8|~5.2",
+                "pimple/pimple": "~1.1",
+                "plumphp/plum": "~0.1",
+                "silex/silex": "~1.3",
+                "symfony/config": "~2.4|~3.0",
+                "symfony/dependency-injection": "~2.4|~3.0",
+                "symfony/http-kernel": "~2.4|~3.0",
+                "twig/twig": "~1.26|~2.0",
+                "zendframework/zend-modulemanager": "~2.2",
+                "zendframework/zend-servicemanager": "~2.2",
+                "zendframework/zend-view": "~2.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Cocur\\Slugify\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ivo Bathke",
+                    "email": "ivo.bathke@gmail.com"
+                },
+                {
+                    "name": "Florian Eckerstorfer",
+                    "email": "florian@eckerstorfer.co",
+                    "homepage": "https://florian.ec"
+                }
+            ],
+            "description": "Converts a string into a slug.",
+            "keywords": [
+                "slug",
+                "slugify"
+            ],
+            "time": "2017-03-23T21:52:55+00:00"
+        },
+        {
+            "name": "doctrine/annotations",
+            "version": "1.11.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/annotations.git",
+                "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
+                "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/lexer": "1.*",
+                "ext-tokenizer": "*",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/cache": "1.*",
+                "doctrine/coding-standard": "^6.0 || ^8.1",
+                "phpstan/phpstan": "^0.12.20",
+                "phpunit/phpunit": "^7.5 || ^9.1.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Docblock Annotations Parser",
+            "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "parser"
+            ],
+            "time": "2020-10-26T10:28:16+00:00"
+        },
+        {
+            "name": "doctrine/cache",
+            "version": "v1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/cache.git",
+                "reference": "53d9518ffeb019c51d542ff60cb578f076d3ff16"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/cache/zipball/53d9518ffeb019c51d542ff60cb578f076d3ff16",
+                "reference": "53d9518ffeb019c51d542ff60cb578f076d3ff16",
+                "shasum": ""
+            },
+            "require": {
+                "php": "~7.1"
+            },
+            "conflict": {
+                "doctrine/common": ">2.2,<2.4"
+            },
+            "require-dev": {
+                "alcaeus/mongo-php-adapter": "^1.1",
+                "mongodb/mongodb": "^1.1",
+                "phpunit/phpunit": "^5.7",
+                "predis/predis": "~1.0"
+            },
+            "suggest": {
+                "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Caching library offering an object-oriented API for many cache backends",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "cache",
+                "caching"
+            ],
+            "time": "2017-07-22T13:00:15+00:00"
+        },
+        {
+            "name": "doctrine/collections",
+            "version": "1.6.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/collections.git",
+                "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a",
+                "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1.3 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^6.0",
+                "phpstan/phpstan-shim": "^0.9.2",
+                "phpunit/phpunit": "^7.0",
+                "vimeo/psalm": "^3.8.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
+            "homepage": "https://www.doctrine-project.org/projects/collections.html",
+            "keywords": [
+                "array",
+                "collections",
+                "iterators",
+                "php"
+            ],
+            "time": "2020-07-27T17:53:49+00:00"
+        },
+        {
+            "name": "doctrine/common",
+            "version": "v2.8.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/common.git",
+                "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66",
+                "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/annotations": "1.*",
+                "doctrine/cache": "1.*",
+                "doctrine/collections": "1.*",
+                "doctrine/inflector": "1.*",
+                "doctrine/lexer": "1.*",
+                "php": "~7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\": "lib/Doctrine/Common"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Common Library for Doctrine projects",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "annotations",
+                "collections",
+                "eventmanager",
+                "persistence",
+                "spl"
+            ],
+            "time": "2017-08-31T08:43:38+00:00"
+        },
+        {
+            "name": "doctrine/data-fixtures",
+            "version": "1.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/data-fixtures.git",
+                "reference": "f0ee99c64922fc3f863715232b615c478a61b0a3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f0ee99c64922fc3f863715232b615c478a61b0a3",
+                "reference": "f0ee99c64922fc3f863715232b615c478a61b0a3",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "~2.2",
+                "php": "^7.1"
+            },
+            "conflict": {
+                "doctrine/phpcr-odm": "<1.3.0"
+            },
+            "require-dev": {
+                "alcaeus/mongo-php-adapter": "^1.1",
+                "doctrine/dbal": "^2.5.4",
+                "doctrine/mongodb-odm": "^1.3.0",
+                "doctrine/orm": "^2.5.4",
+                "phpunit/phpunit": "^7.0"
+            },
+            "suggest": {
+                "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7",
+                "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures",
+                "doctrine/orm": "For loading ORM fixtures",
+                "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                }
+            ],
+            "description": "Data Fixtures for all Doctrine Object Managers",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "database"
+            ],
+            "time": "2019-10-24T04:52:28+00:00"
+        },
+        {
+            "name": "doctrine/dbal",
+            "version": "v2.6.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/dbal.git",
+                "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13",
+                "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "^2.7.1",
+                "ext-pdo": "*",
+                "php": "^7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.4.6",
+                "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5",
+                "symfony/console": "2.*||^3.0"
+            },
+            "suggest": {
+                "symfony/console": "For helpful console commands such as SQL execution and import of files."
+            },
+            "bin": [
+                "bin/doctrine-dbal"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\DBAL\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                }
+            ],
+            "description": "Database Abstraction Layer",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "database",
+                "dbal",
+                "persistence",
+                "queryobject"
+            ],
+            "time": "2017-11-19T13:38:54+00:00"
+        },
+        {
+            "name": "doctrine/doctrine-bundle",
+            "version": "1.10.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/DoctrineBundle.git",
+                "reference": "907dafe1ba73c4c3b0f0ae8cfc1b9958c002e58c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/907dafe1ba73c4c3b0f0ae8cfc1b9958c002e58c",
+                "reference": "907dafe1ba73c4c3b0f0ae8cfc1b9958c002e58c",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/dbal": "^2.5.12",
+                "doctrine/doctrine-cache-bundle": "~1.2",
+                "jdorn/sql-formatter": "^1.2.16",
+                "php": "^5.5.9|^7.0",
+                "symfony/console": "~2.7|~3.0|~4.0",
+                "symfony/dependency-injection": "~2.7|~3.0|~4.0",
+                "symfony/doctrine-bridge": "~2.7|~3.0|~4.0",
+                "symfony/framework-bundle": "^2.7.22|~3.0|~4.0"
+            },
+            "conflict": {
+                "symfony/http-foundation": "<2.6"
+            },
+            "require-dev": {
+                "doctrine/orm": "~2.4",
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^4.8.36|^5.7|^6.4",
+                "symfony/phpunit-bridge": "~2.7|~3.0|~4.0",
+                "symfony/property-info": "~2.8|~3.0|~4.0",
+                "symfony/validator": "~2.7|~3.0|~4.0",
+                "symfony/web-profiler-bundle": "~2.7|~3.0|~4.0",
+                "symfony/yaml": "~2.7|~3.0|~4.0",
+                "twig/twig": "~1.26|~2.0"
+            },
+            "suggest": {
+                "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
+                "symfony/web-profiler-bundle": "To use the data collector."
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.9.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Bundle\\DoctrineBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Doctrine Project",
+                    "homepage": "http://www.doctrine-project.org/"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony DoctrineBundle",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "database",
+                "dbal",
+                "orm",
+                "persistence"
+            ],
+            "time": "2019-04-04T08:03:53+00:00"
+        },
+        {
+            "name": "doctrine/doctrine-cache-bundle",
+            "version": "1.3.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/DoctrineCacheBundle.git",
+                "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927",
+                "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/cache": "^1.4.2",
+                "doctrine/inflector": "~1.0",
+                "php": ">=5.3.2",
+                "symfony/doctrine-bridge": "~2.7|~3.3|~4.0"
+            },
+            "require-dev": {
+                "instaclick/coding-standard": "~1.1",
+                "instaclick/object-calisthenics-sniffs": "dev-master",
+                "instaclick/symfony2-coding-standard": "dev-remaster",
+                "phpunit/phpunit": "~4.8.36|~5.6|~6.5|~7.0",
+                "predis/predis": "~0.8",
+                "satooshi/php-coveralls": "^1.0",
+                "squizlabs/php_codesniffer": "~1.5",
+                "symfony/console": "~2.7|~3.3|~4.0",
+                "symfony/finder": "~2.7|~3.3|~4.0",
+                "symfony/framework-bundle": "~2.7|~3.3|~4.0",
+                "symfony/phpunit-bridge": "~2.7|~3.3|~4.0",
+                "symfony/security-acl": "~2.7|~3.3",
+                "symfony/validator": "~2.7|~3.3|~4.0",
+                "symfony/yaml": "~2.7|~3.3|~4.0"
+            },
+            "suggest": {
+                "symfony/security-acl": "For using this bundle to cache ACLs"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Bundle\\DoctrineCacheBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Fabio B. Silva",
+                    "email": "fabio.bat.silva@gmail.com"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@hotmail.com"
+                },
+                {
+                    "name": "Doctrine Project",
+                    "homepage": "http://www.doctrine-project.org/"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Bundle for Doctrine Cache",
+            "homepage": "https://www.doctrine-project.org",
+            "keywords": [
+                "cache",
+                "caching"
+            ],
+            "abandoned": true,
+            "time": "2018-11-09T06:25:35+00:00"
+        },
+        {
+            "name": "doctrine/doctrine-fixtures-bundle",
+            "version": "v2.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/DoctrineFixturesBundle.git",
+                "reference": "74b8cc70a4a25b774628ee59f4cdf3623a146273"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273",
+                "reference": "74b8cc70a4a25b774628ee59f4cdf3623a146273",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/data-fixtures": "~1.0",
+                "doctrine/doctrine-bundle": "~1.0",
+                "php": ">=5.3.2",
+                "symfony/doctrine-bridge": "~2.7|~3.0|~4.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Bundle\\FixturesBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Doctrine Project",
+                    "homepage": "http://www.doctrine-project.org"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony DoctrineFixturesBundle",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "Fixture",
+                "persistence"
+            ],
+            "time": "2017-10-30T19:26:42+00:00"
+        },
+        {
+            "name": "doctrine/doctrine-migrations-bundle",
+            "version": "v1.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git",
+                "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce",
+                "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/doctrine-bundle": "~1.0",
+                "doctrine/migrations": "^1.1",
+                "php": ">=5.4.0",
+                "symfony/framework-bundle": "~2.7|~3.3|~4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^7.4"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Bundle\\MigrationsBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Doctrine Project",
+                    "homepage": "http://www.doctrine-project.org"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony DoctrineMigrationsBundle",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "dbal",
+                "migrations",
+                "schema"
+            ],
+            "time": "2018-12-03T11:55:33+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1",
+                "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "inflection",
+                "pluralize",
+                "singularize",
+                "string"
+            ],
+            "time": "2019-10-30T19:59:35+00:00"
+        },
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^8.0",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "https://ocramius.github.io/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-10T18:47:58+00:00"
+        },
+        {
+            "name": "doctrine/lexer",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/lexer.git",
+                "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8",
+                "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "lexer",
+                "parser",
+                "php"
+            ],
+            "time": "2019-06-08T11:03:04+00:00"
+        },
+        {
+            "name": "doctrine/migrations",
+            "version": "v1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/migrations.git",
+                "reference": "c81147c0f2938a6566594455367e095150547f72"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/migrations/zipball/c81147c0f2938a6566594455367e095150547f72",
+                "reference": "c81147c0f2938a6566594455367e095150547f72",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/dbal": "~2.2",
+                "ocramius/proxy-manager": "^1.0|^2.0",
+                "php": "^5.5|^7.0",
+                "symfony/console": "~2.3|~3.0",
+                "symfony/yaml": "~2.3|~3.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "dev-master",
+                "doctrine/orm": "2.*",
+                "jdorn/sql-formatter": "~1.1",
+                "johnkary/phpunit-speedtrap": "~1.0@dev",
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^0.9.4",
+                "phpunit/phpunit": "~4.7",
+                "satooshi/php-coveralls": "^1.0"
+            },
+            "suggest": {
+                "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command."
+            },
+            "bin": [
+                "bin/doctrine-migrations"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "v1.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1"
+            ],
+            "authors": [
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Michael Simonson",
+                    "email": "contact@mikesimonson.com"
+                }
+            ],
+            "description": "Database Schema migrations using Doctrine DBAL",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "database",
+                "migrations"
+            ],
+            "time": "2016-12-25T22:54:00+00:00"
+        },
+        {
+            "name": "doctrine/orm",
+            "version": "v2.5.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/orm.git",
+                "reference": "810a7baf81462a5ddf10e8baa8cb94b6eec02754"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/orm/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754",
+                "reference": "810a7baf81462a5ddf10e8baa8cb94b6eec02754",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/cache": "~1.4",
+                "doctrine/collections": "~1.2",
+                "doctrine/common": ">=2.5-dev,<2.9-dev",
+                "doctrine/dbal": ">=2.5-dev,<2.7-dev",
+                "doctrine/instantiator": "^1.0.1",
+                "ext-pdo": "*",
+                "php": ">=5.4",
+                "symfony/console": "~2.5|~3.0|~4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "symfony/yaml": "~2.3|~3.0|~4.0"
+            },
+            "suggest": {
+                "symfony/yaml": "If you want to use YAML Metadata Mapping Driver"
+            },
+            "bin": [
+                "bin/doctrine",
+                "bin/doctrine.php"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\ORM\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                }
+            ],
+            "description": "Object-Relational-Mapper for PHP",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "database",
+                "orm"
+            ],
+            "time": "2017-12-17T02:57:51+00:00"
+        },
+        {
+            "name": "gregwar/captcha",
+            "version": "v1.0.11",
+            "target-dir": "Gregwar/Captcha",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Gregwar/Captcha.git",
+                "reference": "68c27a070922cf306984dc04a92a27525e534e83"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/68c27a070922cf306984dc04a92a27525e534e83",
+                "reference": "68c27a070922cf306984dc04a92a27525e534e83",
+                "shasum": ""
+            },
+            "require": {
+                "ext-gd": "*",
+                "php": ">=5.3.0"
+            },
+            "type": "captcha",
+            "autoload": {
+                "psr-0": {
+                    "Gregwar\\Captcha": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Grégoire Passault",
+                    "email": "g.passault@gmail.com",
+                    "homepage": "http://www.gregwar.com/"
+                },
+                {
+                    "name": "Jeremy Livingston",
+                    "email": "jeremy.j.livingston@gmail.com"
+                }
+            ],
+            "description": "Captcha generator",
+            "homepage": "https://github.com/Gregwar/Captcha",
+            "keywords": [
+                "bot",
+                "captcha",
+                "spam"
+            ],
+            "time": "2014-03-19T15:13:34+00:00"
+        },
+        {
+            "name": "gregwar/captcha-bundle",
+            "version": "v1.0.11",
+            "target-dir": "Gregwar/CaptchaBundle",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Gregwar/CaptchaBundle.git",
+                "reference": "f2e07fe6f297da5720b16f5784ca5bc4c241ee41"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/f2e07fe6f297da5720b16f5784ca5bc4c241ee41",
+                "reference": "f2e07fe6f297da5720b16f5784ca5bc4c241ee41",
+                "shasum": ""
+            },
+            "require": {
+                "gregwar/captcha": "v1.0.11",
+                "php": ">=5.3.0"
+            },
+            "type": "captcha-bundle",
+            "autoload": {
+                "psr-0": {
+                    "Gregwar\\CaptchaBundle": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Grégoire Passault",
+                    "email": "g.passault@gmail.com",
+                    "homepage": "http://www.gregwar.com/"
+                },
+                {
+                    "name": "Jeremy Livingston",
+                    "email": "jeremy.j.livingston@gmail.com"
+                }
+            ],
+            "description": "Captcha bundle",
+            "homepage": "https://github.com/Gregwar/CaptchaBundle",
+            "keywords": [
+                "Symfony2",
+                "bot",
+                "captcha",
+                "code",
+                "security",
+                "spam",
+                "visual"
+            ],
+            "time": "2014-03-19T15:15:10+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.5.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
+                "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.0",
+                "guzzlehttp/psr7": "^1.6.1",
+                "php": ">=5.5",
+                "symfony/polyfill-intl-idn": "^1.17.0"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+                "psr/log": "^1.1"
+            },
+            "suggest": {
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.5-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2020-06-16T21:01:06+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^4.4 || ^5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "time": "2021-03-07T09:25:29+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.8.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "dc960a912984efb74d0a90222870c72c87f10c91"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91",
+                "reference": "dc960a912984efb74d0a90222870c72c87f10c91",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0",
+                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "ext-zlib": "*",
+                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "time": "2021-04-26T09:17:50+00:00"
+        },
+        {
+            "name": "incenteev/composer-parameter-handler",
+            "version": "v2.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Incenteev/ParameterHandler.git",
+                "reference": "084befb11ec21faeadcddefb88b66132775ff59b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/084befb11ec21faeadcddefb88b66132775ff59b",
+                "reference": "084befb11ec21faeadcddefb88b66132775ff59b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "symfony/yaml": "^2.3 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0@dev",
+                "symfony/filesystem": "^2.3 || ^3 || ^4 || ^5",
+                "symfony/phpunit-bridge": "^4.0 || ^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Incenteev\\ParameterHandler\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christophe Coevoet",
+                    "email": "stof@notk.org"
+                }
+            ],
+            "description": "Composer script handling your ignored parameter file",
+            "homepage": "https://github.com/Incenteev/ParameterHandler",
+            "keywords": [
+                "parameters management"
+            ],
+            "time": "2020-03-17T21:10:00+00:00"
+        },
+        {
+            "name": "jdorn/sql-formatter",
+            "version": "v1.2.17",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jdorn/sql-formatter.git",
+                "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc",
+                "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "3.7.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "lib"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeremy Dorn",
+                    "email": "jeremy@jeremydorn.com",
+                    "homepage": "http://jeremydorn.com/"
+                }
+            ],
+            "description": "a PHP SQL highlighting library",
+            "homepage": "https://github.com/jdorn/sql-formatter/",
+            "keywords": [
+                "highlight",
+                "sql"
+            ],
+            "time": "2014-01-12T16:20:24+00:00"
+        },
+        {
+            "name": "jms/aop-bundle",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/JMSAopBundle.git",
+                "reference": "4ee2089a81b54ce94a8c94e95b48d5bb353dd8d0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/JMSAopBundle/zipball/4ee2089a81b54ce94a8c94e95b48d5bb353dd8d0",
+                "reference": "4ee2089a81b54ce94a8c94e95b48d5bb353dd8d0",
+                "shasum": ""
+            },
+            "require": {
+                "jms/cg": "^1.1",
+                "php": ">=5.3.9",
+                "symfony/framework-bundle": "^2.3 || ^3.0 || ^4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.36 | ^5.0",
+                "symfony/phpunit-bridge": "^2.7 || ^4.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JMS\\AopBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Adds AOP capabilities to Symfony2",
+            "keywords": [
+                "annotations",
+                "aop"
+            ],
+            "time": "2018-01-16T10:22:28+00:00"
+        },
+        {
+            "name": "jms/cg",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/cg-library.git",
+                "reference": "2152ea2c48f746a676debb841644ae64cae27835"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/cg-library/zipball/2152ea2c48f746a676debb841644ae64cae27835",
+                "reference": "2152ea2c48f746a676debb841644ae64cae27835",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": ">=4.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "CG\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache2"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Toolset for generating PHP code",
+            "keywords": [
+                "code generation"
+            ],
+            "time": "2016-04-07T10:21:44+00:00"
+        },
+        {
+            "name": "jms/di-extra-bundle",
+            "version": "1.8.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/JMSDiExtraBundle.git",
+                "reference": "bd261ce117608be02533b901b07c5366997c5846"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/bd261ce117608be02533b901b07c5366997c5846",
+                "reference": "bd261ce117608be02533b901b07c5366997c5846",
+                "shasum": ""
+            },
+            "require": {
+                "jms/aop-bundle": "~1.1",
+                "jms/metadata": "~1.0",
+                "php": "~5.3|~7.0",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/finder": "~2.3|~3.0",
+                "symfony/framework-bundle": "~2.3|~3.0",
+                "symfony/http-kernel": "^2.3.24|~3.0",
+                "symfony/process": "~2.3|~3.0",
+                "symfony/routing": "~2.3|~3.0"
+            },
+            "require-dev": {
+                "doctrine/doctrine-bundle": "~1.5",
+                "doctrine/orm": "~2.3",
+                "jms/security-extra-bundle": "~1.0",
+                "phpcollection/phpcollection": ">=0.2,<0.3-dev",
+                "sensio/framework-extra-bundle": "~2.0|~3.0",
+                "symfony/browser-kit": "~2.3|~3.0",
+                "symfony/class-loader": "~2.3|~3.0",
+                "symfony/expression-language": "~2.6|~3.0",
+                "symfony/form": "~2.3|~3.0",
+                "symfony/phpunit-bridge": "~2.7",
+                "symfony/security-bundle": "~2.3",
+                "symfony/twig-bundle": "~2.3|~3.0",
+                "symfony/validator": "~2.3|~3.0",
+                "symfony/yaml": "~2.3|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JMS\\DiExtraBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Allows to configure dependency injection using annotations",
+            "homepage": "http://jmsyst.com/bundles/JMSDiExtraBundle",
+            "keywords": [
+                "annotations",
+                "dependency injection"
+            ],
+            "time": "2017-05-31T11:52:22+00:00"
+        },
+        {
+            "name": "jms/job-queue-bundle",
+            "version": "1.4.2",
+            "target-dir": "JMS/JobQueueBundle",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/JMSJobQueueBundle.git",
+                "reference": "4d0779030414ba593a3d7d29856c66c5375173c9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/JMSJobQueueBundle/zipball/4d0779030414ba593a3d7d29856c66c5375173c9",
+                "reference": "4d0779030414ba593a3d7d29856c66c5375173c9",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "^2.3",
+                "jms/di-extra-bundle": "^1.1",
+                "php": "^5.5.0 || ^7.0",
+                "symfony/debug": "^2.3 || ^3.0",
+                "symfony/framework-bundle": "^2.1 || ^3.1"
+            },
+            "require-dev": {
+                "doctrine/doctrine-bundle": "*",
+                "doctrine/doctrine-fixtures-bundle": "*",
+                "doctrine/orm": "*",
+                "phpunit/phpunit": "^5.2",
+                "sensio/framework-extra-bundle": "*",
+                "symfony/browser-kit": "*",
+                "symfony/class-loader": "*",
+                "symfony/css-selector": "*",
+                "symfony/finder": "*",
+                "symfony/form": "*",
+                "symfony/intl": "*",
+                "symfony/process": "*",
+                "symfony/twig-bundle": "*",
+                "symfony/validator": "*",
+                "symfony/yaml": "*"
+            },
+            "suggest": {
+                "sensio/framework-extra-bundle": "Required when using the webinterface.",
+                "symfony/twig-bundle": "Required when using the webinterface."
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "JMS\\JobQueueBundle": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache2"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Allows to schedule Symfony2 console commands as jobs.",
+            "homepage": "http://jmsyst.com/bundles/JMSJobQueueBundle",
+            "keywords": [
+                "job",
+                "queue"
+            ],
+            "time": "2017-06-28T06:26:38+00:00"
+        },
+        {
+            "name": "jms/metadata",
+            "version": "1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/metadata.git",
+                "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8",
+                "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "doctrine/cache": "~1.0",
+                "symfony/cache": "~3.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Metadata\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Asmir Mustafic",
+                    "email": "goetas@gmail.com"
+                },
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Class/method/property metadata management in PHP",
+            "keywords": [
+                "annotations",
+                "metadata",
+                "xml",
+                "yaml"
+            ],
+            "time": "2018-10-26T12:40:10+00:00"
+        },
+        {
+            "name": "jms/parser-lib",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/parser-lib.git",
+                "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d",
+                "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d",
+                "shasum": ""
+            },
+            "require": {
+                "phpoption/phpoption": ">=0.9,<2.0-dev"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "JMS\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache2"
+            ],
+            "description": "A library for easily creating recursive-descent parsers.",
+            "time": "2012-11-18T18:08:43+00:00"
+        },
+        {
+            "name": "jms/security-extra-bundle",
+            "version": "1.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/JMSSecurityExtraBundle.git",
+                "reference": "8d3b81d62601dcbafafc5e0c2d20f3383e475525"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/JMSSecurityExtraBundle/zipball/8d3b81d62601dcbafafc5e0c2d20f3383e475525",
+                "reference": "8d3b81d62601dcbafafc5e0c2d20f3383e475525",
+                "shasum": ""
+            },
+            "require": {
+                "jms/aop-bundle": "~1.0",
+                "jms/di-extra-bundle": "~1.4",
+                "jms/metadata": "~1.0",
+                "jms/parser-lib": "~1.0",
+                "php": "~5.3|~7.0",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/framework-bundle": "~2.3|~3.0",
+                "symfony/routing": "~2.3|~3.0",
+                "symfony/security-acl": "~2.2|~3.0",
+                "symfony/security-bundle": "~2.3|~3.0"
+            },
+            "require-dev": {
+                "doctrine/common": "~2.3",
+                "doctrine/doctrine-bundle": "~1.0",
+                "doctrine/orm": "~2.3",
+                "sensio/framework-extra-bundle": "^2.2.1|~3.0",
+                "symfony/browser-kit": "~2.0|~3.0",
+                "symfony/class-loader": "~2.1|~3.0",
+                "symfony/css-selector": "^2.0.5|~3.0",
+                "symfony/finder": "^2.0.5|~3.0",
+                "symfony/form": "~2.2|~3.0",
+                "symfony/phpunit-bridge": "~2.7|~3.0",
+                "symfony/process": "^2.0.5|~3.0",
+                "symfony/twig-bridge": "^2.2.6|~3.0",
+                "symfony/twig-bundle": "~2.2|~3.0",
+                "symfony/validator": "~2.2|~3.0",
+                "symfony/yaml": "^2.2.11|~3.0",
+                "twig/twig": "^1.23.1"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JMS\\SecurityExtraBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache2"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Enhances the Symfony2 Security Component by adding several new features",
+            "homepage": "http://jmsyst.com/bundles/JMSSecurityExtraBundle",
+            "keywords": [
+                "annotations",
+                "authorization",
+                "expression",
+                "secure",
+                "security"
+            ],
+            "time": "2016-08-04T14:40:55+00:00"
+        },
+        {
+            "name": "jms/serializer",
+            "version": "1.14.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/serializer.git",
+                "reference": "ba908d278fff27ec01fb4349f372634ffcd697c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ba908d278fff27ec01fb4349f372634ffcd697c0",
+                "reference": "ba908d278fff27ec01fb4349f372634ffcd697c0",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/annotations": "^1.0",
+                "doctrine/instantiator": "^1.0.3",
+                "jms/metadata": "^1.3",
+                "jms/parser-lib": "1.*",
+                "php": "^5.5|^7.0",
+                "phpcollection/phpcollection": "~0.1",
+                "phpoption/phpoption": "^1.1"
+            },
+            "conflict": {
+                "twig/twig": "<1.12"
+            },
+            "require-dev": {
+                "doctrine/orm": "~2.1",
+                "doctrine/phpcr-odm": "^1.3|^2.0",
+                "ext-pdo_sqlite": "*",
+                "jackalope/jackalope-doctrine-dbal": "^1.1.5",
+                "phpunit/phpunit": "^4.8|^5.0",
+                "propel/propel1": "~1.7",
+                "psr/container": "^1.0",
+                "symfony/dependency-injection": "^2.7|^3.3|^4.0",
+                "symfony/expression-language": "^2.6|^3.0",
+                "symfony/filesystem": "^2.1",
+                "symfony/form": "~2.1|^3.0",
+                "symfony/translation": "^2.1|^3.0",
+                "symfony/validator": "^2.2|^3.0",
+                "symfony/yaml": "^2.1|^3.0",
+                "twig/twig": "~1.12|~2.0"
+            },
+            "suggest": {
+                "doctrine/cache": "Required if you like to use cache functionality.",
+                "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.",
+                "symfony/yaml": "Required if you'd like to serialize data to YAML format."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-1.x": "1.14-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "JMS\\Serializer": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                },
+                {
+                    "name": "Asmir Mustafic",
+                    "email": "goetas@gmail.com"
+                }
+            ],
+            "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.",
+            "homepage": "http://jmsyst.com/libs/serializer",
+            "keywords": [
+                "deserialization",
+                "jaxb",
+                "json",
+                "serialization",
+                "xml"
+            ],
+            "time": "2020-02-22T20:59:37+00:00"
+        },
+        {
+            "name": "knplabs/knp-menu",
+            "version": "2.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/KnpLabs/KnpMenu.git",
+                "reference": "b6aade272c345b6fbd07fce5929a761cba0909b8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/b6aade272c345b6fbd07fce5929a761cba0909b8",
+                "reference": "b6aade272c345b6fbd07fce5929a761cba0909b8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6.0"
+            },
+            "conflict": {
+                "twig/twig": "<1.40|>=2,<2.9"
+            },
+            "require-dev": {
+                "psr/container": "^1.0",
+                "symfony/http-foundation": "~2.4|~3.0|^4.0",
+                "symfony/phpunit-bridge": "~3.3|^4.0",
+                "symfony/routing": "~2.3|~3.0|^4.0",
+                "twig/twig": "^1.40|^2.9"
+            },
+            "suggest": {
+                "twig/twig": "for the TwigRenderer and the integration with your templates"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Knp\\Menu\\": "src/Knp/Menu"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KnpLabs",
+                    "homepage": "https://knplabs.com"
+                },
+                {
+                    "name": "Christophe Coevoet",
+                    "email": "stof@notk.org"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://github.com/KnpLabs/KnpMenu/contributors"
+                }
+            ],
+            "description": "An object oriented menu library",
+            "homepage": "https://knplabs.com",
+            "keywords": [
+                "menu",
+                "tree"
+            ],
+            "time": "2019-09-02T10:16:14+00:00"
+        },
+        {
+            "name": "knplabs/knp-menu-bundle",
+            "version": "2.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/KnpLabs/KnpMenuBundle.git",
+                "reference": "0e4af7209dc03e39c51ec70b68ab2ba3177c25de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/0e4af7209dc03e39c51ec70b68ab2ba3177c25de",
+                "reference": "0e4af7209dc03e39c51ec70b68ab2ba3177c25de",
+                "shasum": ""
+            },
+            "require": {
+                "knplabs/knp-menu": "~2.2",
+                "symfony/framework-bundle": "~2.3|~3.0"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.4|~3.0",
+                "symfony/phpunit-bridge": "~2.7|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Knp\\Bundle\\MenuBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christophe Coevoet",
+                    "email": "stof@notk.org"
+                },
+                {
+                    "name": "Knplabs",
+                    "homepage": "http://knplabs.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://github.com/KnpLabs/KnpMenuBundle/contributors"
+                }
+            ],
+            "description": "This bundle provides an integration of the KnpMenu library",
+            "keywords": [
+                "menu"
+            ],
+            "time": "2016-09-22T12:24:40+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "1.25.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0",
+                "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/log": "~1.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "graylog2/gelf-php": "~1.0",
+                "php-amqplib/php-amqplib": "~2.4",
+                "php-console/php-console": "^3.1.3",
+                "php-parallel-lint/php-parallel-lint": "^1.0",
+                "phpunit/phpunit": "~4.5",
+                "ruflin/elastica": ">=0.90 <3.0",
+                "sentry/sentry": "^0.13",
+                "swiftmailer/swiftmailer": "^5.3|^6.0"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-mongo": "Allow sending log messages to a MongoDB server",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+                "sentry/sentry": "Allow sending log messages to a Sentry server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "http://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-23T08:35:51+00:00"
+        },
+        {
+            "name": "ocramius/proxy-manager",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Ocramius/ProxyManager.git",
+                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11",
+                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "zendframework/zend-code": ">2.2.5,<3.0"
+            },
+            "require-dev": {
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "1.5.*"
+            },
+            "suggest": {
+                "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
+                "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
+                "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)",
+                "zendframework/zend-stdlib": "To use the hydrator proxy",
+                "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "ProxyManager\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
+            "homepage": "https://github.com/Ocramius/ProxyManager",
+            "keywords": [
+                "aop",
+                "lazy loading",
+                "proxy",
+                "proxy pattern",
+                "service proxies"
+            ],
+            "time": "2015-08-09T04:28:19+00:00"
+        },
+        {
+            "name": "opis/json-schema",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/opis/json-schema.git",
+                "reference": "39d8072be8657a329a284339994401066406c43b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/opis/json-schema/zipball/39d8072be8657a329a284339994401066406c43b",
+                "reference": "39d8072be8657a329a284339994401066406c43b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "ext-bcmath": "*",
+                "ext-intl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "opis/string": "^1.4",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^9.4"
+            },
+            "suggest": {
+                "opis/string": "A standalone library for manipulating multibyte strings"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Opis\\JsonSchema\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Sorin Sarca",
+                    "email": "sarca_sorin@hotmail.com"
+                },
+                {
+                    "name": "Marius Sarca",
+                    "email": "marius.sarca@gmail.com"
+                }
+            ],
+            "description": "Json Schema Validator",
+            "homepage": "http://www.opis.io/json-schema",
+            "keywords": [
+                "json",
+                "schema",
+                "validation",
+                "validator"
+            ],
+            "time": "2021-04-14T20:02:50+00:00"
+        },
+        {
+            "name": "oyejorge/less.php",
+            "version": "v1.7.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/oyejorge/less.php.git",
+                "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/oyejorge/less.php/zipball/6e08ecb07e6f6d9170c23e8744c58fdd822ad0de",
+                "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2"
+            },
+            "bin": [
+                "bin/lessc"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Less": "lib/"
+                },
+                "classmap": [
+                    "lessc.inc.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Matt Agar",
+                    "homepage": "https://github.com/agar"
+                },
+                {
+                    "name": "Martin Jantošovič",
+                    "homepage": "https://github.com/Mordred"
+                },
+                {
+                    "name": "Josh Schmidt",
+                    "homepage": "https://github.com/oyejorge"
+                }
+            ],
+            "description": "PHP port of the Javascript version of LESS http://lesscss.org",
+            "homepage": "http://lessphp.gpeasy.com",
+            "keywords": [
+                "css",
+                "less",
+                "less.js",
+                "lesscss",
+                "php",
+                "stylesheet"
+            ],
+            "abandoned": true,
+            "time": "2015-03-10T18:12:59+00:00"
+        },
+        {
+            "name": "pagerfanta/pagerfanta",
+            "version": "v1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/BabDev/Pagerfanta.git",
+                "reference": "8400ab498e500018cff9a099ac22555e7949aa9a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/BabDev/Pagerfanta/zipball/8400ab498e500018cff9a099ac22555e7949aa9a",
+                "reference": "8400ab498e500018cff9a099ac22555e7949aa9a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "~2.3",
+                "doctrine/phpcr-odm": "1.*",
+                "jackalope/jackalope-doctrine-dbal": "1.*",
+                "jmikola/geojson": "~1.0",
+                "mandango/mandango": "~1.0@dev",
+                "mandango/mondator": "~1.0@dev",
+                "phpunit/phpunit": "^4.8.35 | ^5.7",
+                "propel/propel": "~2.0@dev",
+                "propel/propel1": "~1.6",
+                "ruflin/elastica": "~1.3",
+                "solarium/solarium": "~3.1"
+            },
+            "suggest": {
+                "doctrine/mongodb-odm": "To use the DoctrineODMMongoDBAdapter.",
+                "doctrine/orm": "To use the DoctrineORMAdapter.",
+                "doctrine/phpcr-odm": "To use the DoctrineODMPhpcrAdapter. >= 1.1.0",
+                "mandango/mandango": "To use the MandangoAdapter.",
+                "propel/propel": "To use the Propel2Adapter",
+                "propel/propel1": "To use the PropelAdapter",
+                "solarium/solarium": "To use the SolariumAdapter."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pagerfanta\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Pablo Díez",
+                    "email": "pablodip@gmail.com"
+                }
+            ],
+            "description": "Pagination for PHP 5.3",
+            "keywords": [
+                "page",
+                "pagination",
+                "paginator",
+                "paging"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/mbabker",
+                    "type": "github"
+                }
+            ],
+            "time": "2018-05-01T10:49:10+00:00"
+        },
+        {
+            "name": "phpcollection/phpcollection",
+            "version": "0.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/php-collection.git",
+                "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
+                "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
+                "shasum": ""
+            },
+            "require": {
+                "phpoption/phpoption": "1.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "PhpCollection": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache2"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "General-Purpose Collection Library for PHP",
+            "keywords": [
+                "collection",
+                "list",
+                "map",
+                "sequence",
+                "set"
+            ],
+            "time": "2015-05-17T12:39:23+00:00"
+        },
+        {
+            "name": "phpoption/phpoption",
+            "version": "1.7.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/php-option.git",
+                "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525",
+                "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpOption\\": "src/PhpOption/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "graham@alt-three.com"
+                }
+            ],
+            "description": "Option Type for PHP",
+            "keywords": [
+                "language",
+                "option",
+                "php",
+                "type"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-20T17:29:33+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "time": "2017-02-14T16:28:37+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "time": "2016-08-06T14:39:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2020-03-23T09:12:05+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "sensio/distribution-bundle",
+            "version": "v5.0.25",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sensiolabs/SensioDistributionBundle.git",
+                "reference": "80a38234bde8321fb92aa0b8c27978a272bb4baf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/80a38234bde8321fb92aa0b8c27978a272bb4baf",
+                "reference": "80a38234bde8321fb92aa0b8c27978a272bb4baf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "sensiolabs/security-checker": "~5.0|~6.0",
+                "symfony/class-loader": "~2.3|~3.0",
+                "symfony/config": "~2.3|~3.0",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/filesystem": "~2.3|~3.0",
+                "symfony/http-kernel": "~2.3|~3.0",
+                "symfony/process": "~2.3|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sensio\\Bundle\\DistributionBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Base bundle for Symfony Distributions",
+            "keywords": [
+                "configuration",
+                "distribution"
+            ],
+            "abandoned": true,
+            "time": "2019-06-18T15:43:58+00:00"
+        },
+        {
+            "name": "sensio/framework-extra-bundle",
+            "version": "v3.0.29",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git",
+                "reference": "bb907234df776b68922eb4b25bfa061683597b6a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a",
+                "reference": "bb907234df776b68922eb4b25bfa061683597b6a",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "~2.2",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/framework-bundle": "~2.3|~3.0|~4.0"
+            },
+            "require-dev": {
+                "doctrine/doctrine-bundle": "~1.5",
+                "doctrine/orm": "~2.4,>=2.4.5",
+                "symfony/asset": "~2.7|~3.0|~4.0",
+                "symfony/browser-kit": "~2.3|~3.0|~4.0",
+                "symfony/dom-crawler": "~2.3|~3.0|~4.0",
+                "symfony/expression-language": "~2.4|~3.0|~4.0",
+                "symfony/finder": "~2.3|~3.0|~4.0",
+                "symfony/phpunit-bridge": "~3.2|~4.0",
+                "symfony/psr-http-message-bridge": "^0.3|^1.0",
+                "symfony/security-bundle": "~2.4|~3.0|~4.0",
+                "symfony/templating": "~2.3|~3.0|~4.0",
+                "symfony/translation": "~2.3|~3.0|~4.0",
+                "symfony/twig-bundle": "~2.3|~3.0|~4.0",
+                "symfony/yaml": "~2.3|~3.0|~4.0",
+                "twig/twig": "~1.12|~2.0",
+                "zendframework/zend-diactoros": "^1.3"
+            },
+            "suggest": {
+                "symfony/expression-language": "",
+                "symfony/psr-http-message-bridge": "To use the PSR-7 converters",
+                "symfony/security-bundle": ""
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sensio\\Bundle\\FrameworkExtraBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "This bundle provides a way to configure your controllers with annotations",
+            "keywords": [
+                "annotations",
+                "controllers"
+            ],
+            "time": "2017-12-14T19:03:23+00:00"
+        },
+        {
+            "name": "sensiolabs/security-checker",
+            "version": "v6.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sensiolabs/security-checker.git",
+                "reference": "a576c01520d9761901f269c4934ba55448be4a54"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/a576c01520d9761901f269c4934ba55448be4a54",
+                "reference": "a576c01520d9761901f269c4934ba55448be4a54",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/console": "^2.8|^3.4|^4.2|^5.0",
+                "symfony/http-client": "^4.3|^5.0",
+                "symfony/mime": "^4.3|^5.0",
+                "symfony/polyfill-ctype": "^1.11"
+            },
+            "bin": [
+                "security-checker"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SensioLabs\\Security\\": "SensioLabs/Security"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien.potencier@gmail.com"
+                }
+            ],
+            "description": "A security checker for your composer.lock",
+            "abandoned": "https://github.com/fabpot/local-php-security-checker",
+            "time": "2019-11-01T13:20:14+00:00"
+        },
+        {
+            "name": "sonata-project/admin-bundle",
+            "version": "3.23.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/SonataAdminBundle.git",
+                "reference": "edbc6b755df5abae8b562eba2fdae6e7855cfdcc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/SonataAdminBundle/zipball/edbc6b755df5abae8b562eba2fdae6e7855cfdcc",
+                "reference": "edbc6b755df5abae8b562eba2fdae6e7855cfdcc",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "^2.2",
+                "doctrine/inflector": "^1.0",
+                "knplabs/knp-menu-bundle": "^2.1.1",
+                "php": "^5.3 || ^7.0",
+                "sonata-project/block-bundle": "^3.2",
+                "sonata-project/core-bundle": "^3.4",
+                "sonata-project/exporter": "^1.7",
+                "symfony/class-loader": "^2.3 || ^3.0",
+                "symfony/config": "^2.3.9 || ^3.0",
+                "symfony/console": "^2.3 || ^3.0",
+                "symfony/dependency-injection": "^2.3.3 || ^3.0",
+                "symfony/expression-language": "^2.4 || ^3.0",
+                "symfony/form": "^2.3.5 || ^3.0",
+                "symfony/http-foundation": "^2.3 || ^3.0",
+                "symfony/property-access": "^2.3 || ^3.0",
+                "symfony/routing": "^2.3 || ^3.0",
+                "symfony/security-acl": "^2.3 || ^3.0",
+                "symfony/security-bundle": "^2.3 || ^3.0",
+                "symfony/templating": "^2.3 || ^3.0",
+                "symfony/translation": "^2.3 || ^3.0",
+                "symfony/twig-bridge": "^2.3.5 || ^3.0",
+                "symfony/validator": "^2.3 || ^3.0",
+                "twig/extensions": "^1.0",
+                "twig/twig": "^1.28 || ^2.0"
+            },
+            "conflict": {
+                "jms/di-extra-bundle": "<1.7.0",
+                "sonata-project/exporter": "1.6.0"
+            },
+            "require-dev": {
+                "jms/di-extra-bundle": "^1.7",
+                "jms/translation-bundle": "^1.2",
+                "matthiasnoback/symfony-dependency-injection-test": "^0.7.6 || ^1.1",
+                "sensio/generator-bundle": "^2.3 || ^3.0",
+                "sllh/php-cs-fixer-styleci-bridge": "^2.0",
+                "sonata-project/intl-bundle": "^2.2.4",
+                "symfony/phpunit-bridge": "^2.7 || ^3.0",
+                "symfony/yaml": "^2.3 || ^3.0"
+            },
+            "suggest": {
+                "jms/di-extra-bundle": "Annotations for Admin definition",
+                "jms/translation-bundle": "Extract message keys from Admins",
+                "sensio/generator-bundle": "Add sonata:admin:generate command",
+                "sonata-project/intl-bundle": "Add localized date and number into the list"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\AdminBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/SonataAdminBundle/contributors"
+                },
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@sonata-project.org",
+                    "homepage": "https://sonata-project.org"
+                }
+            ],
+            "description": "The missing Symfony Admin Generator",
+            "homepage": "https://sonata-project.org/bundles/admin",
+            "keywords": [
+                "Admin Generator",
+                "admin",
+                "bootstrap",
+                "sonata"
+            ],
+            "time": "2017-09-01T14:15:32+00:00"
+        },
+        {
+            "name": "sonata-project/block-bundle",
+            "version": "3.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/SonataBlockBundle.git",
+                "reference": "72f1a2f5b0b5c996c7b924f60e1018382e9a7a67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/SonataBlockBundle/zipball/72f1a2f5b0b5c996c7b924f60e1018382e9a7a67",
+                "reference": "72f1a2f5b0b5c996c7b924f60e1018382e9a7a67",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "^2.3",
+                "php": "^5.6 || ^7.0",
+                "sonata-project/cache": "^1.0 || ^2.0",
+                "sonata-project/core-bundle": "^3.4",
+                "symfony/asset": "^2.8 || ^3.2 || ^4.0",
+                "symfony/config": "^2.8 || ^3.2 || ^4.0",
+                "symfony/console": "^2.8 || ^3.2 || ^4.0",
+                "symfony/dependency-injection": "^2.8 || ^3.2 || ^4.0",
+                "symfony/event-dispatcher": "^2.8 || ^3.2 || ^4.0",
+                "symfony/form": "^2.8 || ^3.2 || ^4.0",
+                "symfony/framework-bundle": "^2.8 || ^3.2 || ^4.0",
+                "symfony/http-foundation": "^2.8 || ^3.2 || ^4.0",
+                "symfony/http-kernel": "^2.8 || ^3.2 || ^4.0",
+                "symfony/options-resolver": "^2.8 || ^3.2 || ^4.0",
+                "symfony/templating": "^2.8 || ^3.2 || ^4.0",
+                "symfony/twig-bundle": "^2.8 || ^3.2 || ^4.0",
+                "twig/twig": "^1.34 || ^2.0"
+            },
+            "conflict": {
+                "jms/di-extra-bundle": "<1.7.0"
+            },
+            "require-dev": {
+                "jms/di-extra-bundle": "^1.7",
+                "knplabs/knp-menu-bundle": "^2.0",
+                "sonata-project/admin-bundle": "^3.22",
+                "symfony/debug": "^2.8 || ^3.2 || ^4.0",
+                "symfony/phpunit-bridge": "^4.0",
+                "symfony/stopwatch": "^2.8 || ^3.2 || ^4.0"
+            },
+            "suggest": {
+                "jms/di-extra-bundle": "Annotations for Block definition",
+                "knplabs/knp-menu-bundle": "^2.0",
+                "sonata-project/cache-bundle": "^3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\BlockBundle\\": "src/"
+                },
+                "files": [
+                    "src/Resources/stubs/symfony2.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/SonataBlockBundle/contributors"
+                },
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@sonata-project.org",
+                    "homepage": "https://sonata-project.org"
+                }
+            ],
+            "description": "Symfony SonataBlockBundle",
+            "homepage": "https://sonata-project.org/bundles/block",
+            "keywords": [
+                "block",
+                "sonata"
+            ],
+            "time": "2018-12-03T18:54:54+00:00"
+        },
+        {
+            "name": "sonata-project/cache",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/cache.git",
+                "reference": "2e2fdabf40bfe566c68406aae238a721cddabf74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/cache/zipball/2e2fdabf40bfe566c68406aae238a721cddabf74",
+                "reference": "2e2fdabf40bfe566c68406aae238a721cddabf74",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1",
+                "psr/log": "^1.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.5",
+                "doctrine/phpcr-odm": "^1.4",
+                "jackalope/jackalope-doctrine-dbal": "^1.2",
+                "predis/predis": "^1.1",
+                "sllh/php-cs-fixer-styleci-bridge": "^2.1",
+                "symfony/phpunit-bridge": "^3.3"
+            },
+            "suggest": {
+                "doctrine/orm": "ORM support",
+                "doctrine/phpcr-odm": "PHPCR ODM support",
+                "ext-apc": "Caching with ext/apc",
+                "ext-memcached": "Caching with ext/memcached",
+                "predis/predis": "Install redis php"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@gmail.com",
+                    "homepage": "https://sonata-project.org/"
+                },
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/cache/contributors"
+                }
+            ],
+            "description": "Cache library",
+            "homepage": "https://github.com/sonata-project/cache",
+            "keywords": [
+                "cache",
+                "memcached",
+                "mongodb",
+                "redis"
+            ],
+            "time": "2017-12-08T09:22:44+00:00"
+        },
+        {
+            "name": "sonata-project/core-bundle",
+            "version": "3.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/SonataCoreBundle.git",
+                "reference": "a8cc1731d832e6bde3fdad2334cfd158d1d45fbb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/SonataCoreBundle/zipball/a8cc1731d832e6bde3fdad2334cfd158d1d45fbb",
+                "reference": "a8cc1731d832e6bde3fdad2334cfd158d1d45fbb",
+                "shasum": ""
+            },
+            "require": {
+                "cocur/slugify": "^1.4 || ^2.0",
+                "php": "^5.3 || ^7.0",
+                "sonata-project/datagrid-bundle": "^2.0",
+                "symfony/config": "^2.3 || ^3.0",
+                "symfony/form": "^2.3.5 || ^3.0",
+                "symfony/framework-bundle": "^2.3 || ^3.0",
+                "symfony/http-foundation": "^2.3 || ^3.0",
+                "symfony/property-access": "^2.3 || ^3.0",
+                "symfony/security": "^2.3 || ^3.0",
+                "symfony/translation": "^2.3 || ^3.0",
+                "symfony/twig-bridge": "^2.3.5 || ^3.0",
+                "symfony/validator": "^2.3 || ^3.0",
+                "twig/extensions": "^1.0",
+                "twig/twig": "^1.23 || ^2.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.4",
+                "doctrine/phpcr-odm": "^1.0",
+                "friendsofsymfony/rest-bundle": "^1.1 || ^2.0",
+                "jackalope/jackalope-doctrine-dbal": "^1.0",
+                "jms/serializer-bundle": "0.11 - 0.13 || ^1.0",
+                "matthiasnoback/symfony-config-test": "^0.4 || ^1.0",
+                "matthiasnoback/symfony-dependency-injection-test": "^0.7",
+                "nelmio/api-doc-bundle": "^2.11",
+                "sensio/framework-extra-bundle": "^2.3 || ^3.0",
+                "sllh/php-cs-fixer-styleci-bridge": "^2.0",
+                "sonata-project/exporter": "^1.3",
+                "symfony/phpunit-bridge": "^2.7"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\CoreBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/SonataCoreBundle/contributors"
+                },
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@sonata-project.org"
+                }
+            ],
+            "description": "Symfony SonataCoreBundle",
+            "homepage": "https://sonata-project.org/bundles/core",
+            "keywords": [
+                "sonata"
+            ],
+            "abandoned": true,
+            "time": "2017-09-20T14:14:38+00:00"
+        },
+        {
+            "name": "sonata-project/datagrid-bundle",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/SonataDatagridBundle.git",
+                "reference": "aa0923768b705dbdab6b751f667a03ba6c5fd05a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/SonataDatagridBundle/zipball/aa0923768b705dbdab6b751f667a03ba6c5fd05a",
+                "reference": "aa0923768b705dbdab6b751f667a03ba6c5fd05a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0",
+                "symfony/config": "^2.8 || ^3.2 || ^4.0",
+                "symfony/dependency-injection": "^2.8 || ^3.2 || ^4.0",
+                "symfony/form": "^2.8 || ^3.2 || ^4.0",
+                "symfony/http-kernel": "^2.8 || ^3.2 || ^4.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.4",
+                "symfony/phpunit-bridge": "^4.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\DatagridBundle\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/SonataDatagridBundle/contributors"
+                },
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@sonata-project.org",
+                    "homepage": "https://sonata-project.org"
+                }
+            ],
+            "description": "Symfony SonataDatagridBundle",
+            "homepage": "https://sonata-project.org/bundles/datagrid",
+            "keywords": [
+                "datagrid",
+                "sonata"
+            ],
+            "time": "2018-10-09T20:50:18+00:00"
+        },
+        {
+            "name": "sonata-project/doctrine-orm-admin-bundle",
+            "version": "3.1.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle.git",
+                "reference": "b06d0103572c0c35fea2b6b59b9e939818b10d64"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/SonataDoctrineORMAdminBundle/zipball/b06d0103572c0c35fea2b6b59b9e939818b10d64",
+                "reference": "b06d0103572c0c35fea2b6b59b9e939818b10d64",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/orm": "^2.3",
+                "php": "^5.3 || ^7.0",
+                "sonata-project/admin-bundle": "^3.1",
+                "sonata-project/core-bundle": "^3.0",
+                "sonata-project/exporter": "^1.3.1",
+                "symfony/console": "^2.3 || ^3.0",
+                "symfony/doctrine-bridge": "^2.2 || ^3.0",
+                "symfony/form": "^2.3 || ^3.0",
+                "symfony/framework-bundle": "^2.2 || ^3.0",
+                "symfony/security": "^2.3 || ^3.0",
+                "symfony/security-acl": "^2.2 || ^3.0"
+            },
+            "conflict": {
+                "simplethings/entity-audit-bundle": ">=2.0"
+            },
+            "provide": {
+                "sonata-project/admin-bundle-persistency-layer": "1.0.0"
+            },
+            "require-dev": {
+                "knplabs/knp-menu-bundle": "^2.1.1",
+                "simplethings/entity-audit-bundle": "0.1 - 0.9 || ^1.0",
+                "sllh/php-cs-fixer-styleci-bridge": "^2.0",
+                "symfony/phpunit-bridge": "^2.7 || ^3.0"
+            },
+            "suggest": {
+                "simplethings/entity-audit-bundle": "If you want to support for versioning of entities and their associations."
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sonata\\DoctrineORMAdminBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sonata Community",
+                    "homepage": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle/contributors"
+                },
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@sonata-project.org",
+                    "homepage": "https://sonata-project.org"
+                }
+            ],
+            "description": "Symfony Sonata / Integrate Doctrine ORM into the SonataAdminBundle",
+            "homepage": "https://sonata-project.org/bundles/admin",
+            "keywords": [
+                "Admin Generator",
+                "admin",
+                "bootstrap",
+                "generator",
+                "sonata"
+            ],
+            "time": "2017-09-14T10:48:58+00:00"
+        },
+        {
+            "name": "sonata-project/exporter",
+            "version": "1.11.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sonata-project/exporter.git",
+                "reference": "a4925e3569fb3fa710fa7c6fecd85b6281c55f57"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sonata-project/exporter/zipball/a4925e3569fb3fa710fa7c6fecd85b6281c55f57",
+                "reference": "a4925e3569fb3fa710fa7c6fecd85b6281c55f57",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^2.5",
+                "doctrine/orm": "^2.4.5",
+                "matthiasnoback/symfony-config-test": "^2.0",
+                "matthiasnoback/symfony-dependency-injection-test": "^1.0",
+                "propel/propel1": "^1.6",
+                "symfony/config": "^2.8 || ^3.2 || ^4.0",
+                "symfony/dependency-injection": "^2.8 || ^3.2 || ^4.0",
+                "symfony/http-foundation": "^2.8 || ^3.2 || ^4.0",
+                "symfony/http-kernel": "^2.8 || ^3.2 || ^4.0",
+                "symfony/phpunit-bridge": "^4.0",
+                "symfony/property-access": "^2.8 || ^3.2 || ^4.0",
+                "symfony/routing": "^2.8 || ^3.2 || ^4.0"
+            },
+            "suggest": {
+                "ext-curl": "*",
+                "propel/propel1": "^1.6",
+                "symfony/property-access": "To be able to export from database entities",
+                "symfony/routing": "To be able to export the routes of a Symfony app"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Exporter\\": "aliases/",
+                    "Sonata\\Exporter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Thomas Rabaix",
+                    "email": "thomas.rabaix@gmail.com",
+                    "homepage": "https://sonata-project.org/"
+                }
+            ],
+            "description": "Lightweight Exporter library",
+            "homepage": "https://github.com/sonata-project/Exporter",
+            "keywords": [
+                "client",
+                "csv",
+                "data",
+                "export",
+                "xls"
+            ],
+            "time": "2019-04-17T21:05:17+00:00"
+        },
+        {
+            "name": "swiftmailer/swiftmailer",
+            "version": "v5.4.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/swiftmailer/swiftmailer.git",
+                "reference": "181b89f18a90f8925ef805f950d47a7190e9b950"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950",
+                "reference": "181b89f18a90f8925ef805f950d47a7190e9b950",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9.1",
+                "symfony/phpunit-bridge": "~3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "lib/swift_required.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Corbyn"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Swiftmailer, free feature-rich PHP mailer",
+            "homepage": "https://swiftmailer.symfony.com",
+            "keywords": [
+                "email",
+                "mail",
+                "mailer"
+            ],
+            "time": "2018-07-31T09:26:32+00:00"
+        },
+        {
+            "name": "symfony/asset",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/asset.git",
+                "reference": "63950b69e47b0f54c1cb70a54523007a8c8f8409"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/asset/zipball/63950b69e47b0f54c1cb70a54523007a8c8f8409",
+                "reference": "63950b69e47b0f54c1cb70a54523007a8c8f8409",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "symfony/http-foundation": "~2.4"
+            },
+            "suggest": {
+                "symfony/http-foundation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Asset\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Asset Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/class-loader",
+            "version": "v3.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/class-loader.git",
+                "reference": "00c66ca2de5a9a367706826338df721529a07ca8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/class-loader/zipball/00c66ca2de5a9a367706826338df721529a07ca8",
+                "reference": "00c66ca2de5a9a367706826338df721529a07ca8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "symfony/finder": "~2.8|~3.0",
+                "symfony/polyfill-apcu": "~1.1"
+            },
+            "suggest": {
+                "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\ClassLoader\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony ClassLoader Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-07-10T08:04:44+00:00"
+        },
+        {
+            "name": "symfony/config",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/config.git",
+                "reference": "7dd5f5040dc04c118d057fb5886563963eb70011"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/config/zipball/7dd5f5040dc04c118d057fb5886563963eb70011",
+                "reference": "7dd5f5040dc04c118d057fb5886563963eb70011",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/filesystem": "~2.3|~3.0.0",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "require-dev": {
+                "symfony/yaml": "~2.7|~3.0.0"
+            },
+            "suggest": {
+                "symfony/yaml": "To use the yaml reference dumper"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Config\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Config Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-26T09:38:12+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12",
+                "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/debug": "^2.7.2|~3.0.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/process": "~2.1|~3.0.0"
+            },
+            "suggest": {
+                "psr/log-implementation": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-20T15:55:20+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "74251c8d50dd3be7c4ce0c7b862497cdc641a5d0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/74251c8d50dd3be7c4ce0c7b862497cdc641a5d0",
+                "reference": "74251c8d50dd3be7c4ce0c7b862497cdc641a5d0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/class-loader": "~2.2|~3.0.0",
+                "symfony/http-kernel": "~2.3.24|~2.5.9|^2.6.2|~3.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/dependency-injection",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/dependency-injection.git",
+                "reference": "c306198fee8f872a8f5f031e6e4f6f83086992d8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c306198fee8f872a8f5f031e6e4f6f83086992d8",
+                "reference": "c306198fee8f872a8f5f031e6e4f6f83086992d8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "conflict": {
+                "symfony/expression-language": "<2.6"
+            },
+            "require-dev": {
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/yaml": "~2.3.42|~2.7.14|~2.8.7|~3.0.7"
+            },
+            "suggest": {
+                "symfony/config": "",
+                "symfony/expression-language": "For using expressions in service container configuration",
+                "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\DependencyInjection\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony DependencyInjection Component",
+            "homepage": "https://symfony.com",
+            "time": "2019-04-16T11:33:46+00:00"
+        },
+        {
+            "name": "symfony/doctrine-bridge",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/doctrine-bridge.git",
+                "reference": "b3a1a048020bea1ea69d31e35c01e2d927fa3ba8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b3a1a048020bea1ea69d31e35c01e2d927fa3ba8",
+                "reference": "b3a1a048020bea1ea69d31e35c01e2d927fa3ba8",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/common": "~2.4",
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+            },
+            "require-dev": {
+                "doctrine/data-fixtures": "1.0.*",
+                "doctrine/dbal": "~2.4",
+                "doctrine/orm": "^2.4.5",
+                "symfony/dependency-injection": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.2|~3.0.0",
+                "symfony/form": "^2.8.28|~3.3.10",
+                "symfony/http-kernel": "~2.2|~3.0.0",
+                "symfony/property-access": "~2.3|~3.0.0",
+                "symfony/property-info": "~2.8|3.0",
+                "symfony/security": "^2.8.31|^3.3.13",
+                "symfony/stopwatch": "~2.2|~3.0.0",
+                "symfony/translation": "^2.0.5|~3.0.0",
+                "symfony/validator": "~2.7.25|^2.8.18|~3.2.5"
+            },
+            "suggest": {
+                "doctrine/data-fixtures": "",
+                "doctrine/dbal": "",
+                "doctrine/orm": "",
+                "symfony/form": "",
+                "symfony/property-info": "",
+                "symfony/validator": ""
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\Doctrine\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Doctrine Bridge",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-26T09:36:25+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0",
+                "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "^2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.6|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-21T14:20:20+00:00"
+        },
+        {
+            "name": "symfony/expression-language",
+            "version": "v3.1.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/expression-language.git",
+                "reference": "581138880e70a99712c31be894af4b7a57198915"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/expression-language/zipball/581138880e70a99712c31be894af4b7a57198915",
+                "reference": "581138880e70a99712c31be894af4b7a57198915",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\ExpressionLanguage\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony ExpressionLanguage Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-01-02T20:31:54+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v3.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d",
+                "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-07-20T05:43:46+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "1444eac52273e345d9b95129bf914639305a9ba4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/1444eac52273e345d9b95129bf914639305a9ba4",
+                "reference": "1444eac52273e345d9b95129bf914639305a9ba4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/form",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/form.git",
+                "reference": "74382a47aa97496d181fbb598822fdfb9e1744e4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/form/zipball/74382a47aa97496d181fbb598822fdfb9e1744e4",
+                "reference": "74382a47aa97496d181fbb598822fdfb9e1744e4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
+                "symfony/options-resolver": "~2.6",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/property-access": "~2.3|~3.0.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/doctrine-bridge": "<2.7",
+                "symfony/framework-bundle": "<2.7",
+                "symfony/twig-bridge": "<2.7"
+            },
+            "require-dev": {
+                "doctrine/collections": "~1.0",
+                "symfony/dependency-injection": "~2.7|~3.0.0",
+                "symfony/http-foundation": "~2.2|~3.0.0",
+                "symfony/http-kernel": "~2.4|~3.0.0",
+                "symfony/security-csrf": "^2.8.31|^3.3.13",
+                "symfony/translation": "^2.0.5|~3.0.0",
+                "symfony/validator": "^2.8.18|~3.2.5"
+            },
+            "suggest": {
+                "symfony/framework-bundle": "For templating with PHP.",
+                "symfony/security-csrf": "For protecting forms against CSRF attacks.",
+                "symfony/twig-bridge": "For templating with Twig.",
+                "symfony/validator": "For form validation."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Form\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Form Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-12-06T11:12:46+00:00"
+        },
+        {
+            "name": "symfony/framework-bundle",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/framework-bundle.git",
+                "reference": "07b6056e3a84861fa8a54c33f70b189cf18a1aad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/07b6056e3a84861fa8a54c33f70b189cf18a1aad",
+                "reference": "07b6056e3a84861fa8a54c33f70b189cf18a1aad",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/annotations": "~1.0",
+                "doctrine/cache": "~1.0",
+                "ext-xml": "*",
+                "php": ">=5.3.9",
+                "symfony/asset": "~2.7|~3.0.0",
+                "symfony/class-loader": "~2.1|~3.0.0",
+                "symfony/config": "~2.8",
+                "symfony/dependency-injection": "~2.8.41",
+                "symfony/event-dispatcher": "~2.8|~3.0.0",
+                "symfony/filesystem": "~2.3|~3.0.0",
+                "symfony/finder": "^2.0.5|~3.0.0",
+                "symfony/http-foundation": "~2.7.36|^2.8.29",
+                "symfony/http-kernel": "^2.8.22",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/routing": "^2.8.17",
+                "symfony/security-core": "^2.8.41|^3.3.17",
+                "symfony/security-csrf": "^2.8.31|^3.3.13",
+                "symfony/stopwatch": "~2.3|~3.0.0",
+                "symfony/templating": "~2.7|~3.0.0",
+                "symfony/translation": "~2.8"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+            },
+            "require-dev": {
+                "phpdocumentor/reflection": "^1.0.7",
+                "sensio/framework-extra-bundle": "^3.0.2",
+                "symfony/browser-kit": "~2.4|~3.0.0",
+                "symfony/console": "~2.8.19|~3.2.7",
+                "symfony/css-selector": "^2.0.5|~3.0.0",
+                "symfony/dom-crawler": "^2.0.5|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/form": "^2.8.19",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/process": "^2.0.5|~3.0.0",
+                "symfony/property-info": "~2.8|~3.0.0",
+                "symfony/validator": "~2.5|~3.0.0",
+                "symfony/yaml": "^2.0.5|~3.0.0",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "suggest": {
+                "symfony/console": "For using the console commands",
+                "symfony/form": "For using forms",
+                "symfony/process": "For using the server:run, server:start, server:stop, and server:status commands",
+                "symfony/property-info": "For using the property_info service",
+                "symfony/serializer": "For using the serializer service",
+                "symfony/validator": "For using validation",
+                "symfony/yaml": "For using the debug:config and lint:yaml commands"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\FrameworkBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony FrameworkBundle",
+            "homepage": "https://symfony.com",
+            "time": "2019-04-16T10:01:35+00:00"
+        },
+        {
+            "name": "symfony/http-client",
+            "version": "v4.4.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-client.git",
+                "reference": "3ead7e297f4cc8a84661ef1f411c029acb34bc11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/3ead7e297f4cc8a84661ef1f411c029acb34bc11",
+                "reference": "3ead7e297f4cc8a84661ef1f411c029acb34bc11",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "psr/log": "^1.0",
+                "symfony/http-client-contracts": "^1.1.10|^2",
+                "symfony/polyfill-php73": "^1.11",
+                "symfony/service-contracts": "^1.0|^2"
+            },
+            "provide": {
+                "php-http/async-client-implementation": "*",
+                "php-http/client-implementation": "*",
+                "psr/http-client-implementation": "1.0",
+                "symfony/http-client-implementation": "1.1"
+            },
+            "require-dev": {
+                "guzzlehttp/promises": "^1.3.1",
+                "nyholm/psr7": "^1.0",
+                "php-http/httplug": "^1.0|^2.0",
+                "psr/http-client": "^1.0",
+                "symfony/dependency-injection": "^4.3|^5.0",
+                "symfony/http-kernel": "^4.4.13",
+                "symfony/process": "^4.2|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpClient\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpClient component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-24T11:50:19+00:00"
+        },
+        {
+            "name": "symfony/http-client-contracts",
+            "version": "v1.1.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-client-contracts.git",
+                "reference": "7e86f903f9720d0caa7688f5c29a2de2d77cbb89"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e86f903f9720d0caa7688f5c29a2de2d77cbb89",
+                "reference": "7e86f903f9720d0caa7688f5c29a2de2d77cbb89",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3"
+            },
+            "suggest": {
+                "symfony/http-client-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\HttpClient\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to HTTP clients",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-17T09:35:39+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "3929d9fe8148d17819ad0178c748b8d339420709"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3929d9fe8148d17819ad0178c748b8d339420709",
+                "reference": "3929d9fe8148d17819ad0178c748b8d339420709",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php54": "~1.0",
+                "symfony/polyfill-php55": "~1.0"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.4|~3.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "https://symfony.com",
+            "time": "2019-11-12T12:34:41+00:00"
+        },
+        {
+            "name": "symfony/http-kernel",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "c3be27b8627cd5ee8dfa8d1b923982f618ec521c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c3be27b8627cd5ee8dfa8d1b923982f618ec521c",
+                "reference": "c3be27b8627cd5ee8dfa8d1b923982f618ec521c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "psr/log": "~1.0",
+                "symfony/debug": "^2.6.2",
+                "symfony/event-dispatcher": "^2.6.7|~3.0.0",
+                "symfony/http-foundation": "~2.7.36|~2.8.29|~3.1.6",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php56": "~1.8"
+            },
+            "conflict": {
+                "symfony/config": "<2.7",
+                "twig/twig": "<1.34|<2.4,>=2"
+            },
+            "require-dev": {
+                "symfony/browser-kit": "~2.3|~3.0.0",
+                "symfony/class-loader": "~2.1|~3.0.0",
+                "symfony/config": "~2.8",
+                "symfony/console": "~2.3|~3.0.0",
+                "symfony/css-selector": "^2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.8|~3.0.0",
+                "symfony/dom-crawler": "^2.0.5|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/finder": "^2.0.5|~3.0.0",
+                "symfony/process": "^2.0.5|~3.0.0",
+                "symfony/routing": "~2.8|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0",
+                "symfony/templating": "~2.2|~3.0.0",
+                "symfony/translation": "^2.0.5|~3.0.0",
+                "symfony/var-dumper": "~2.6|~3.0.0"
+            },
+            "suggest": {
+                "symfony/browser-kit": "",
+                "symfony/class-loader": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": "",
+                "symfony/finder": "",
+                "symfony/var-dumper": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpKernel\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpKernel Component",
+            "homepage": "https://symfony.com",
+            "time": "2019-11-13T08:36:16+00:00"
+        },
+        {
+            "name": "symfony/intl",
+            "version": "v3.2.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/intl.git",
+                "reference": "3fd98dde8e7d1c34c974d65b09e9c32abe88dafe"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/intl/zipball/3fd98dde8e7d1c34c974d65b09e9c32abe88dafe",
+                "reference": "3fd98dde8e7d1c34c974d65b09e9c32abe88dafe",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-intl-icu": "~1.0"
+            },
+            "require-dev": {
+                "symfony/filesystem": "~2.8|~3.0"
+            },
+            "suggest": {
+                "ext-intl": "to use the component with locales other than \"en\""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Intl\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ],
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                },
+                {
+                    "name": "Eriksen Costa",
+                    "email": "eriksen.costa@infranology.com.br"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "i18n",
+                "icu",
+                "internationalization",
+                "intl",
+                "l10n",
+                "localization"
+            ],
+            "time": "2017-11-16T17:55:54+00:00"
+        },
+        {
+            "name": "symfony/mime",
+            "version": "v4.4.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/mime.git",
+                "reference": "360f9963b6d4db6c3454d58548fb2b085f97d3e2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/360f9963b6d4db6c3454d58548fb2b085f97d3e2",
+                "reference": "360f9963b6d4db6c3454d58548fb2b085f97d3e2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-intl-idn": "^1.10",
+                "symfony/polyfill-mbstring": "^1.0"
+            },
+            "conflict": {
+                "symfony/mailer": "<4.4"
+            },
+            "require-dev": {
+                "egulias/email-validator": "^2.1.10",
+                "symfony/dependency-injection": "^3.4|^4.1|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Mime\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A library to manipulate MIME messages",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "mime",
+                "mime-type"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-24T11:50:19+00:00"
+        },
+        {
+            "name": "symfony/monolog-bridge",
+            "version": "v3.2.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/monolog-bridge.git",
+                "reference": "bd009651bdff13e0eae9e9b24ff7da11f0eb904d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/bd009651bdff13e0eae9e9b24ff7da11f0eb904d",
+                "reference": "bd009651bdff13e0eae9e9b24ff7da11f0eb904d",
+                "shasum": ""
+            },
+            "require": {
+                "monolog/monolog": "~1.11",
+                "php": ">=5.5.9",
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "require-dev": {
+                "symfony/console": "~2.8|~3.0",
+                "symfony/event-dispatcher": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.",
+                "symfony/event-dispatcher": "Needed when using log messages in console commands.",
+                "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel."
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\Monolog\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Monolog Bridge",
+            "homepage": "https://symfony.com",
+            "time": "2017-04-12T14:13:17+00:00"
+        },
+        {
+            "name": "symfony/monolog-bundle",
+            "version": "v2.12.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/monolog-bundle.git",
+                "reference": "b0146bdca7ba2a65f3bbe7010423c7393b29ec3f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/b0146bdca7ba2a65f3bbe7010423c7393b29ec3f",
+                "reference": "b0146bdca7ba2a65f3bbe7010423c7393b29ec3f",
+                "shasum": ""
+            },
+            "require": {
+                "monolog/monolog": "~1.18",
+                "php": ">=5.3.2",
+                "symfony/config": "~2.3|~3.0",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/http-kernel": "~2.3|~3.0",
+                "symfony/monolog-bridge": "~2.3|~3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8",
+                "symfony/console": "~2.3|~3.0",
+                "symfony/yaml": "~2.3|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\MonologBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony MonologBundle",
+            "homepage": "http://symfony.com",
+            "keywords": [
+                "log",
+                "logging"
+            ],
+            "time": "2017-01-02T19:04:26+00:00"
+        },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "7aaab725bb58f0e18aa12c61bdadd4793ab4c32b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7aaab725bb58f0e18aa12c61bdadd4793ab4c32b",
+                "reference": "7aaab725bb58f0e18aa12c61bdadd4793ab4c32b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\OptionsResolver\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony OptionsResolver Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "config",
+                "configuration",
+                "options"
+            ],
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+                "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-util",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-util.git",
+                "reference": "fd2008fac0a11ae100537406d95887d5a9155e4f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/fd2008fac0a11ae100537406d95887d5a9155e4f",
+                "reference": "fd2008fac0a11ae100537406d95887d5a9155e4f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Util\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony utilities for portability of PHP codes",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compat",
+                "compatibility",
+                "polyfill",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-24T08:53:22+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v3.4.46",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca",
+                "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-10-24T10:57:07+00:00"
+        },
+        {
+            "name": "symfony/property-access",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/property-access.git",
+                "reference": "c8f10191183be9bb0d5a1b8364d3891f1bde07b6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/property-access/zipball/c8f10191183be9bb0d5a1b8364d3891f1bde07b6",
+                "reference": "c8f10191183be9bb0d5a1b8364d3891f1bde07b6",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\PropertyAccess\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony PropertyAccess Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "access",
+                "array",
+                "extraction",
+                "index",
+                "injection",
+                "object",
+                "property",
+                "property path",
+                "reflection"
+            ],
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "8b0df6869d1997baafff6a1541826eac5a03d067"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/8b0df6869d1997baafff6a1541826eac5a03d067",
+                "reference": "8b0df6869d1997baafff6a1541826eac5a03d067",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "conflict": {
+                "symfony/config": "<2.7"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "psr/log": "~1.0",
+                "symfony/config": "~2.7|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/http-foundation": "~2.3|~3.0.0",
+                "symfony/yaml": "^2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/dependency-injection": "For loading routes from a service",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Routing\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Routing Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "time": "2018-11-20T15:55:20+00:00"
+        },
+        {
+            "name": "symfony/security",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/security.git",
+                "reference": "b9e9130cf348d4e85e37ba1d0d27263e33b97534"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/security/zipball/b9e9130cf348d4e85e37ba1d0d27263e33b97534",
+                "reference": "b9e9130cf348d4e85e37ba1d0d27263e33b97534",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/event-dispatcher": "~2.2|~3.0.0",
+                "symfony/http-foundation": "^2.7.38|~3.3.13",
+                "symfony/http-kernel": "~2.4|~3.0.0",
+                "symfony/polyfill-php55": "~1.0",
+                "symfony/polyfill-php56": "~1.0",
+                "symfony/polyfill-php70": "~1.0",
+                "symfony/polyfill-util": "~1.0",
+                "symfony/property-access": "~2.3|~3.0.0",
+                "symfony/security-acl": "~2.7|~3.0.0"
+            },
+            "conflict": {
+                "symfony/http-foundation": "~2.8,<2.8.31"
+            },
+            "replace": {
+                "symfony/security-core": "self.version",
+                "symfony/security-csrf": "self.version",
+                "symfony/security-guard": "self.version",
+                "symfony/security-http": "self.version"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/finder": "~2.3|~3.0.0",
+                "symfony/ldap": "~2.8|~3.0.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/routing": "~2.2|~3.0.0",
+                "symfony/validator": "~2.7.25|^2.8.18|~3.2.5"
+            },
+            "suggest": {
+                "symfony/expression-language": "For using the expression voter",
+                "symfony/form": "",
+                "symfony/ldap": "For using the LDAP user and authentication providers",
+                "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs",
+                "symfony/validator": "For using the user password constraint"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Security\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Core/Tests/",
+                    "/Csrf/Tests/",
+                    "/Guard/Tests/",
+                    "/Http/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Security Component",
+            "homepage": "https://symfony.com",
+            "time": "2019-04-16T10:01:12+00:00"
+        },
+        {
+            "name": "symfony/security-acl",
+            "version": "v3.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/security-acl.git",
+                "reference": "dc8f10b3bda34e9ddcad49edc7accf61f31fce43"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/security-acl/zipball/dc8f10b3bda34e9ddcad49edc7accf61f31fce43",
+                "reference": "dc8f10b3bda34e9ddcad49edc7accf61f31fce43",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/security-core": "^2.8|^3.0|^4.0|^5.0"
+            },
+            "require-dev": {
+                "doctrine/common": "~2.2",
+                "doctrine/dbal": "~2.2",
+                "psr/log": "~1.0",
+                "symfony/phpunit-bridge": "^2.8|^3.0|^4.0|^5.0"
+            },
+            "suggest": {
+                "doctrine/dbal": "For using the built-in ACL implementation",
+                "symfony/class-loader": "For using the ACL generateSql script",
+                "symfony/finder": "For using the ACL generateSql script"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Security\\Acl\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Security Component - ACL (Access Control List)",
+            "homepage": "https://symfony.com",
+            "time": "2019-12-12T09:55:57+00:00"
+        },
+        {
+            "name": "symfony/security-bundle",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/security-bundle.git",
+                "reference": "4590b89b5e9b04944988f9d3b8c866abc7ff9423"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/security-bundle/zipball/4590b89b5e9b04944988f9d3b8c866abc7ff9423",
+                "reference": "4590b89b5e9b04944988f9d3b8c866abc7ff9423",
+                "shasum": ""
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=5.3.9",
+                "symfony/http-kernel": "~2.7|~3.0.0",
+                "symfony/polyfill-php70": "~1.0",
+                "symfony/security": "^2.8.45|^3.4.15",
+                "symfony/security-acl": "~2.7|~3.0.0"
+            },
+            "require-dev": {
+                "doctrine/doctrine-bundle": "~1.2",
+                "symfony/browser-kit": "~2.7|~3.0.0",
+                "symfony/console": "~2.7|~3.0.0",
+                "symfony/css-selector": "^2.7|~3.0.0",
+                "symfony/dependency-injection": "~2.8.41",
+                "symfony/dom-crawler": "^2.7|~3.0.0",
+                "symfony/expression-language": "~2.7|~3.0.0",
+                "symfony/form": "^2.8.18",
+                "symfony/framework-bundle": "^2.8.18",
+                "symfony/http-foundation": "~2.7|~3.0.0",
+                "symfony/process": "^2.7|~3.0.0",
+                "symfony/twig-bridge": "^2.7.4|~3.1.0",
+                "symfony/twig-bundle": "~2.7|~3.1.0",
+                "symfony/validator": "~2.7.25|^2.8.18|~3.2.5",
+                "symfony/yaml": "^2.7|~3.0.0",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\SecurityBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony SecurityBundle",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/serializer",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/serializer.git",
+                "reference": "2939e67396f7356aace05c90e5913736fcb46a20"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/serializer/zipball/2939e67396f7356aace05c90e5913736fcb46a20",
+                "reference": "2939e67396f7356aace05c90e5913736fcb46a20",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php55": "~1.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "doctrine/cache": "~1.0",
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/property-access": "~2.3|~3.0.0",
+                "symfony/yaml": "^2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+                "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+                "symfony/config": "For using the XML mapping loader.",
+                "symfony/property-access": "For using the ObjectNormalizer.",
+                "symfony/yaml": "For using the default YAML mapping loader."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Serializer\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Serializer Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v1.1.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b776d18b303a39f56c63747bcb977ad4b27aca26",
+                "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "psr/container": "^1.0"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-06T13:19:58+00:00"
+        },
+        {
+            "name": "symfony/stopwatch",
+            "version": "v3.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/stopwatch.git",
+                "reference": "49c0ea2f3d3a779df4780927671332edc406ea84"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/49c0ea2f3d3a779df4780927671332edc406ea84",
+                "reference": "49c0ea2f3d3a779df4780927671332edc406ea84",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Stopwatch\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Stopwatch Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-06-29T05:40:00+00:00"
+        },
+        {
+            "name": "symfony/swiftmailer-bundle",
+            "version": "v2.6.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/swiftmailer-bundle.git",
+                "reference": "c4808f5169efc05567be983909d00f00521c53ec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec",
+                "reference": "c4808f5169efc05567be983909d00f00521c53ec",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2",
+                "swiftmailer/swiftmailer": "~4.2|~5.0",
+                "symfony/config": "~2.7|~3.0",
+                "symfony/dependency-injection": "~2.7|~3.0",
+                "symfony/http-kernel": "~2.7|~3.0"
+            },
+            "require-dev": {
+                "symfony/console": "~2.7|~3.0",
+                "symfony/framework-bundle": "~2.7|~3.0",
+                "symfony/phpunit-bridge": "~3.3@dev",
+                "symfony/yaml": "~2.7|~3.0"
+            },
+            "suggest": {
+                "psr/log": "Allows logging"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\SwiftmailerBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony SwiftmailerBundle",
+            "homepage": "http://symfony.com",
+            "time": "2017-10-19T01:06:41+00:00"
+        },
+        {
+            "name": "symfony/templating",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/templating.git",
+                "reference": "7e64705b32855ebce87eff8cc5fbe6bf240c8e44"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/templating/zipball/7e64705b32855ebce87eff8cc5fbe6bf240c8e44",
+                "reference": "7e64705b32855ebce87eff8cc5fbe6bf240c8e44",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "require-dev": {
+                "psr/log": "~1.0"
+            },
+            "suggest": {
+                "psr/log-implementation": "For using debug logging in loaders"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Templating\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Templating Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-20T15:55:20+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
+                "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/config": "<2.7"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8",
+                "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
+                "symfony/yaml": "~2.2|~3.0.0"
+            },
+            "suggest": {
+                "psr/log-implementation": "To use logging capability in translator",
+                "symfony/config": "",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Translation Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-24T21:16:41+00:00"
+        },
+        {
+            "name": "symfony/twig-bridge",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/twig-bridge.git",
+                "reference": "ecc1e30d05fa99f25b504e2d6a8684555ae39f7c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ecc1e30d05fa99f25b504e2d6a8684555ae39f7c",
+                "reference": "ecc1e30d05fa99f25b504e2d6a8684555ae39f7c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "conflict": {
+                "symfony/form": "<2.8.23"
+            },
+            "require-dev": {
+                "symfony/asset": "~2.7|~3.0.0",
+                "symfony/console": "~2.8|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/finder": "~2.3|~3.0.0",
+                "symfony/form": "^2.8.23",
+                "symfony/http-foundation": "^2.8.29|~3.0.0",
+                "symfony/http-kernel": "~2.8|~3.0.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/routing": "~2.2|~3.0.0",
+                "symfony/security": "^2.8.31|^3.3.13",
+                "symfony/security-acl": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.2|~3.0.0",
+                "symfony/templating": "~2.1|~3.0.0",
+                "symfony/translation": "~2.7|~3.0.0",
+                "symfony/var-dumper": "~2.7.16|~2.8.9|~3.0.9",
+                "symfony/yaml": "^2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "symfony/asset": "For using the AssetExtension",
+                "symfony/expression-language": "For using the ExpressionExtension",
+                "symfony/finder": "",
+                "symfony/form": "For using the FormExtension",
+                "symfony/http-kernel": "For using the HttpKernelExtension",
+                "symfony/routing": "For using the RoutingExtension",
+                "symfony/security": "For using the SecurityExtension",
+                "symfony/stopwatch": "For using the StopwatchExtension",
+                "symfony/templating": "For using the TwigEngine",
+                "symfony/translation": "For using the TranslationExtension",
+                "symfony/var-dumper": "For using the DumpExtension",
+                "symfony/yaml": "For using the YamlExtension"
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\Twig\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Twig Bridge",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/twig-bundle",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/twig-bundle.git",
+                "reference": "e74af27dbe64dd4e5e7e3dfc9bcf480253b76c80"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e74af27dbe64dd4e5e7e3dfc9bcf480253b76c80",
+                "reference": "e74af27dbe64dd4e5e7e3dfc9bcf480253b76c80",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/asset": "~2.7|~3.0.0",
+                "symfony/http-foundation": "~2.5|~3.0.0",
+                "symfony/http-kernel": "~2.7.23|^2.8.16",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/twig-bridge": "~2.7|~3.0.0",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "symfony/config": "~2.8|~3.0.0",
+                "symfony/dependency-injection": "^2.6.6|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/finder": "^2.0.5",
+                "symfony/framework-bundle": "~2.7|~3.0.0",
+                "symfony/routing": "~2.1|~3.0.0",
+                "symfony/stopwatch": "~2.2|~3.0.0",
+                "symfony/templating": "~2.1|~3.0.0",
+                "symfony/yaml": "~2.3|~3.0.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\TwigBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony TwigBundle",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/validator",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/validator.git",
+                "reference": "d5d2090bba3139d8ddb79959fbf516e87238fe3a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/validator/zipball/d5d2090bba3139d8ddb79959fbf516e87238fe3a",
+                "reference": "d5d2090bba3139d8ddb79959fbf516e87238fe3a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation": "~2.4|~3.0.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "doctrine/cache": "~1.0",
+                "egulias/email-validator": "^1.2.1",
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/http-foundation": "~2.3|~3.0.0",
+                "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
+                "symfony/property-access": "~2.3|~3.0.0",
+                "symfony/yaml": "^2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+                "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+                "egulias/email-validator": "Strict (RFC compliant) email validation",
+                "symfony/config": "",
+                "symfony/expression-language": "For using the 2.4 Expression validator",
+                "symfony/http-foundation": "",
+                "symfony/intl": "",
+                "symfony/property-access": "For using the 2.4 Validator API",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Validator\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Validator Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-14T14:06:48+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "02c1859112aa779d9ab394ae4f3381911d84052b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/02c1859112aa779d9ab394ae4f3381911d84052b",
+                "reference": "02c1859112aa779d9ab394ae4f3381911d84052b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "twig/extensions",
+            "version": "v1.5.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig-extensions.git",
+                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
+                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
+                "shasum": ""
+            },
+            "require": {
+                "twig/twig": "^1.27|^2.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^3.4",
+                "symfony/translation": "^2.7|^3.4"
+            },
+            "suggest": {
+                "symfony/translation": "Allow the time_diff output to be translated"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Twig_Extensions_": "lib/"
+                },
+                "psr-4": {
+                    "Twig\\Extensions\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Common additional features for Twig that do not directly belong in core",
+            "keywords": [
+                "i18n",
+                "text"
+            ],
+            "abandoned": true,
+            "time": "2018-12-05T18:34:18+00:00"
+        },
+        {
+            "name": "twig/twig",
+            "version": "v1.43.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig.git",
+                "reference": "2311602f6a208715252febe682fa7c38e56a3373"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig/zipball/2311602f6a208715252febe682fa7c38e56a3373",
+                "reference": "2311602f6a208715252febe682fa7c38e56a3373",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "require-dev": {
+                "psr/container": "^1.0",
+                "symfony/phpunit-bridge": "^4.4.9|^5.0.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.43-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Twig_": "lib/"
+                },
+                "psr-4": {
+                    "Twig\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Twig Team",
+                    "role": "Contributors"
+                },
+                {
+                    "name": "Armin Ronacher",
+                    "email": "armin.ronacher@active-4.com",
+                    "role": "Project Founder"
+                }
+            ],
+            "description": "Twig, the flexible, fast, and secure template language for PHP",
+            "homepage": "https://twig.symfony.com",
+            "keywords": [
+                "templating"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-05T15:05:05+00:00"
+        },
+        {
+            "name": "willdurand/js-translation-bundle",
+            "version": "2.6.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/willdurand/BazingaJsTranslationBundle.git",
+                "reference": "9c80406dd4cc195f1f835a52e038fb80a96563b2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/willdurand/BazingaJsTranslationBundle/zipball/9c80406dd4cc195f1f835a52e038fb80a96563b2",
+                "reference": "9c80406dd4cc195f1f835a52e038fb80a96563b2",
+                "shasum": ""
+            },
+            "require": {
+                "symfony/console": "~2.7|~3.1|~4.0",
+                "symfony/finder": "~2.7|~3.1|~4.0",
+                "symfony/framework-bundle": "~2.7|~3.1|~4.0",
+                "symfony/intl": "~2.7|~3.1|~4.0",
+                "symfony/translation": "~2.7|~3.1|~4.0",
+                "symfony/twig-bundle": "~2.7|~3.1|~4.0"
+            },
+            "replace": {
+                "willdurand/expose-translation-bundle": "2.5.*"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8|~5.7",
+                "symfony/asset": "~2.7|~3.1|~4.0",
+                "symfony/browser-kit": "~2.7|~3.1|~4.0",
+                "symfony/phpunit-bridge": "~2.7|~3.1|~4.0",
+                "symfony/twig-bundle": "~2.7|~3.1|~4.0",
+                "symfony/yaml": "~2.7|~3.1|~4.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Bazinga\\Bundle\\JsTranslationBundle\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "William Durand",
+                    "email": "will+git@drnd.me"
+                }
+            ],
+            "description": "A pretty nice way to expose your translation messages to your JavaScript.",
+            "keywords": [
+                "javascript",
+                "symfony",
+                "translation"
+            ],
+            "time": "2018-02-11T14:19:14+00:00"
+        },
+        {
+            "name": "willdurand/negotiation",
+            "version": "v2.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/willdurand/Negotiation.git",
+                "reference": "03436ededa67c6e83b9b12defac15384cb399dc9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/03436ededa67c6e83b9b12defac15384cb399dc9",
+                "reference": "03436ededa67c6e83b9b12defac15384cb399dc9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Negotiation\\": "src/Negotiation"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "William Durand",
+                    "email": "will+git@drnd.me"
+                }
+            ],
+            "description": "Content Negotiation tools for PHP provided as a standalone library.",
+            "homepage": "http://williamdurand.fr/Negotiation/",
+            "keywords": [
+                "accept",
+                "content",
+                "format",
+                "header",
+                "negotiation"
+            ],
+            "time": "2017-05-14T17:21:12+00:00"
+        },
+        {
+            "name": "zendframework/zend-code",
+            "version": "2.6.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/zendframework/zend-code.git",
+                "reference": "95033f061b083e16cdee60530ec260d7d628b887"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887",
+                "reference": "95033f061b083e16cdee60530ec260d7d628b887",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5 || 7.0.0 - 7.0.4 || ^7.0.6",
+                "zendframework/zend-eventmanager": "^2.6 || ^3.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "fabpot/php-cs-fixer": "1.7.*",
+                "phpunit/phpunit": "^4.8.21",
+                "zendframework/zend-stdlib": "^2.7 || ^3.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
+                "zendframework/zend-stdlib": "Zend\\Stdlib component"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev",
+                    "dev-develop": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Zend\\Code\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "provides facilities to generate arbitrary code using an object oriented interface",
+            "homepage": "https://github.com/zendframework/zend-code",
+            "keywords": [
+                "code",
+                "zf2"
+            ],
+            "abandoned": "laminas/laminas-code",
+            "time": "2016-04-20T17:26:42+00:00"
+        },
+        {
+            "name": "zendframework/zend-eventmanager",
+            "version": "3.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/zendframework/zend-eventmanager.git",
+                "reference": "a5e2583a211f73604691586b8406ff7296a946dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd",
+                "reference": "a5e2583a211f73604691586b8406ff7296a946dd",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "athletic/athletic": "^0.1",
+                "container-interop/container-interop": "^1.1.0",
+                "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
+                "zendframework/zend-coding-standard": "~1.0.0",
+                "zendframework/zend-stdlib": "^2.7.3 || ^3.0"
+            },
+            "suggest": {
+                "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature",
+                "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev",
+                    "dev-develop": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Zend\\EventManager\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "Trigger and listen to events within a PHP application",
+            "homepage": "https://github.com/zendframework/zend-eventmanager",
+            "keywords": [
+                "event",
+                "eventmanager",
+                "events",
+                "zf2"
+            ],
+            "abandoned": "laminas/laminas-eventmanager",
+            "time": "2018-04-25T15:33:34+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "beberlei/assert",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/beberlei/assert.git",
+                "reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/beberlei/assert/zipball/d63a6943fc4fd1a2aedb65994e3548715105abcf",
+                "reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "php": "^7"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "*",
+                "phpstan/phpstan-shim": "*",
+                "phpunit/phpunit": ">=6.0.0 <8"
+            },
+            "suggest": {
+                "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Assert\\": "lib/Assert"
+                },
+                "files": [
+                    "lib/Assert/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Richard Quadling",
+                    "email": "rquadling@gmail.com",
+                    "role": "Collaborator"
+                }
+            ],
+            "description": "Thin assertion library for input validation in business models.",
+            "keywords": [
+                "assert",
+                "assertion",
+                "validation"
+            ],
+            "time": "2019-12-19T17:51:41+00:00"
+        },
+        {
+            "name": "dama/doctrine-test-bundle",
+            "version": "v4.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dmaicher/doctrine-test-bundle.git",
+                "reference": "438346b3380cc7675e37fbcdca912fdc33471d32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/438346b3380cc7675e37fbcdca912fdc33471d32",
+                "reference": "438346b3380cc7675e37fbcdca912fdc33471d32",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/dbal": "~2.5",
+                "doctrine/doctrine-bundle": "~1.4",
+                "php": ">=5.5.0",
+                "symfony/framework-bundle": "~2.7|~3.0|~4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.4.4|~6.0",
+                "symfony/yaml": "~2.7|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "David Maicher",
+                    "email": "mail@dmaicher.de"
+                }
+            ],
+            "description": "Symfony 2/3 bundle to isolate doctrine database tests and improve test performance",
+            "keywords": [
+                "Symfony 3",
+                "doctrine",
+                "isolation",
+                "performance",
+                "symfony",
+                "symfony 2",
+                "tests"
+            ],
+            "time": "2018-01-13T13:14:27+00:00"
+        },
+        {
+            "name": "deployer/deployer",
+            "version": "v6.7.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/deployphp/deployer.git",
+                "reference": "6242bb8748c714dab628d67e3a0e1c57cb8d4afe"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/deployphp/deployer/zipball/6242bb8748c714dab628d67e3a0e1c57cb8d4afe",
+                "reference": "6242bb8748c714dab628d67e3a0e1c57cb8d4afe",
+                "shasum": ""
+            },
+            "require": {
+                "deployer/phar-update": "~2.2",
+                "php": "~7.0",
+                "pimple/pimple": "~3.0",
+                "symfony/console": "~2.7|~3.0|~4.0|~5.0",
+                "symfony/process": "~2.7|~3.0|~4.0|~5.0",
+                "symfony/yaml": "~2.7|~3.0|~4.0|~5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8"
+            },
+            "bin": [
+                "bin/dep"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Deployer\\": "src/"
+                },
+                "files": [
+                    "src/Support/helpers.php",
+                    "src/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Anton Medvedev",
+                    "email": "anton@medv.io"
+                }
+            ],
+            "description": "Deployment Tool",
+            "homepage": "https://deployer.org",
+            "time": "2019-12-15T14:13:11+00:00"
+        },
+        {
+            "name": "deployer/phar-update",
+            "version": "v2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/deployphp/phar-update.git",
+                "reference": "9ad07422f2cd43a1382ee8e134bdcd3a374848e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/deployphp/phar-update/zipball/9ad07422f2cd43a1382ee8e134bdcd3a374848e3",
+                "reference": "9ad07422f2cd43a1382ee8e134bdcd3a374848e3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "symfony/console": "~2.7|~3.0|~4.0|~5.0"
+            },
+            "require-dev": {
+                "mikey179/vfsstream": "1.1.0",
+                "phpunit/phpunit": "3.7.*",
+                "symfony/process": "~2.7|~3.0|~4.0|~5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Deployer\\Component\\PharUpdate\\": "src/",
+                    "Deployer\\Component\\PHPUnit\\": "src/PHPUnit/",
+                    "Deployer\\Component\\Version\\": "src/Version/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kevin Herrera",
+                    "email": "kevin@herrera.io",
+                    "homepage": "http://kevin.herrera.io"
+                },
+                {
+                    "name": "Anton Medvedev",
+                    "email": "anton@medv.io",
+                    "homepage": "https://medv.io"
+                }
+            ],
+            "description": "Integrates Phar Update to Symfony Console.",
+            "homepage": "https://github.com/deployphp/phar-update",
+            "keywords": [
+                "console",
+                "phar",
+                "update"
+            ],
+            "abandoned": true,
+            "time": "2019-12-12T13:45:57+00:00"
+        },
+        {
+            "name": "irstea/composer-require-checker-shim",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/composer-require-checker-shim",
+                "reference": "d33b55b1c3a5125a8af9b64b935779cd678f80e8"
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-phar": "*",
+                "php": "^7.1"
+            },
+            "replace": {
+                "maglnet/composer-require-checker": "self.version"
+            },
+            "bin": [
+                "bin/composer-require-checker"
+            ],
+            "type": "library",
+            "autoload": {
+                "exclude-from-classmap": [
+                    "bin/composer-require-checker"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.io/"
+                },
+                {
+                    "name": "Matthias Glaub",
+                    "email": "magl@magl.net",
+                    "homepage": "http://magl.net"
+                }
+            ],
+            "description": "Shim repository for maglnet/composer-require-checker",
+            "homepage": "https://github.com/maglnet/ComposerRequireChecker",
+            "keywords": [
+                "analysis",
+                "cli",
+                "composer",
+                "dependency",
+                "imports",
+                "require",
+                "requirements",
+                "shim"
+            ],
+            "time": "2020-06-08T09:29:19+00:00"
+        },
+        {
+            "name": "irstea/php-cs-fixer-config",
+            "version": "3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/php-cs-fixer-config.git",
+                "reference": "53f39366abb032a300e0963c711da20d771ce09d"
+            },
+            "require": {
+                "beberlei/assert": "^3.2",
+                "ext-json": "*",
+                "irstea/php-cs-fixer-shim": "^2.16",
+                "php": "^7.1"
+            },
+            "require-dev": {
+                "irstea/composer-require-checker-shim": "^2.0.0",
+                "mikey179/vfsstream": "^1.6",
+                "phpunit/phpunit": "^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Irstea\\CS\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Irstea - DSI - pôle IS",
+                    "email": "dsi.poleis@irstea.fr"
+                }
+            ],
+            "description": "Jeux de règles pour php-cs-fixer.",
+            "time": "2020-09-03T11:15:54+00:00"
+        },
+        {
+            "name": "irstea/php-cs-fixer-shim",
+            "version": "v2.16.4",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/php-cs-fixer-shim.git",
+                "reference": "2f452ca5a4be13cab3835091a676b1c315a04efc"
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "php": "^5.6 || ^7.0"
+            },
+            "replace": {
+                "friendsofphp/php-cs-fixer": "self.version"
+            },
+            "suggest": {
+                "ext-dom": "For handling output formats in XML",
+                "ext-mbstring": "For handling non-UTF8 characters."
+            },
+            "bin": [
+                "php-cs-fixer"
+            ],
+            "type": "application",
+            "autoload": {
+                "exclude-from-classmap": [
+                    "php-cs-fixer"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Dariusz Rumiński",
+                    "email": "dariusz.ruminski@gmail.com"
+                }
+            ],
+            "description": "Shim repository for friendsofphp/php-cs-fixer",
+            "keywords": [
+                "shim"
+            ],
+            "time": "2020-06-28T02:20:17+00:00"
+        },
+        {
+            "name": "irstea/phpcpd-shim",
+            "version": "4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/phpcpd-shim.git",
+                "reference": "722efb5f721af98b659bcf908a9be3be17b0ed3f"
+            },
+            "require": {
+                "ext-dom": "*",
+                "php": "^7.1"
+            },
+            "replace": {
+                "sebastian/phpcpd": "self.version"
+            },
+            "bin": [
+                "phpcpd"
+            ],
+            "type": "library",
+            "autoload": {
+                "exclude-from-classmap": [
+                    "phpcpd"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Shim repository for sebastian/phpcpd",
+            "homepage": "https://github.com/sebastianbergmann/phpcpd",
+            "keywords": [
+                "shim"
+            ],
+            "time": "2020-06-08T09:29:17+00:00"
+        },
+        {
+            "name": "irstea/phploc-shim",
+            "version": "4.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/phploc-shim.git",
+                "reference": "b266a392d1d39c553159501d4c44cfa25166cf37"
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "replace": {
+                "phploc/phploc": "self.version"
+            },
+            "bin": [
+                "phploc"
+            ],
+            "type": "library",
+            "autoload": {
+                "exclude-from-classmap": [
+                    "phploc"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Shim repository for phploc/phploc",
+            "homepage": "https://github.com/sebastianbergmann/phploc",
+            "keywords": [
+                "shim"
+            ],
+            "time": "2020-06-08T09:29:15+00:00"
+        },
+        {
+            "name": "irstea/phpmd-config",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/phpmd-config.git",
+                "reference": "a762ec8faae42b071dd39ab3abd3ce80908af1e0"
+            },
+            "require": {
+                "irstea/phpmd-shim": "^2.6"
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Irstea - DSI - pôle IS",
+                    "email": "dsi.poleis@irstea.fr"
+                }
+            ],
+            "description": "Jeux de règles pour PHP Mess Detector.",
+            "homepage": "https://gitlab.irstea.fr/pole-is/tools/phpmd-config",
+            "keywords": [
+                "irstea",
+                "phpmd",
+                "ruleset"
+            ],
+            "time": "2020-01-24T10:03:41+00:00"
+        },
+        {
+            "name": "irstea/phpmd-shim",
+            "version": "2.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/tools/phpmd-shim.git",
+                "reference": "33be09aa3b916aa0c627880aeb42b26214595aed"
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=5.3.9"
+            },
+            "replace": {
+                "phpmd/phpmd": "self.version"
+            },
+            "bin": [
+                "src/bin/phpmd"
+            ],
+            "type": "library",
+            "autoload": {
+                "exclude-from-classmap": [
+                    "src/bin/phpmd"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Manuel Pichler",
+                    "email": "github@manuel-pichler.de",
+                    "homepage": "https://github.com/manuelpichler",
+                    "role": "Project Founder"
+                },
+                {
+                    "name": "Marc Würth",
+                    "email": "ravage@bluewin.ch",
+                    "homepage": "https://github.com/ravage84",
+                    "role": "Project Maintainer"
+                },
+                {
+                    "name": "Other contributors",
+                    "homepage": "https://github.com/phpmd/phpmd/graphs/contributors",
+                    "role": "Contributors"
+                }
+            ],
+            "description": "Shim repository for phpmd/phpmd",
+            "homepage": "https://phpmd.org/",
+            "keywords": [
+                "mess detection",
+                "mess detector",
+                "pdepend",
+                "phpmd",
+                "pmd",
+                "shim"
+            ],
+            "time": "2020-09-24T02:20:25+00:00"
+        },
+        {
+            "name": "irstea/plantuml-bundle",
+            "version": "0.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.irstea.fr/pole-is/bundles/plantuml-bundle",
+                "reference": "b8b8ea98b79778baf7f74621614b6b7fe87c4966"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://isdevtools.irstea.fr/satis/dist/irstea/plantuml-bundle/irstea-plantuml-bundle-b8b8ea98b79778baf7f74621614b6b7fe87c4966-zip-a66e96.zip",
+                "reference": "b8b8ea98b79778baf7f74621614b6b7fe87c4966",
+                "shasum": "39ef6ee8b395d57055288f8ce08cae6d7450394c"
+            },
+            "archive": {
+                "exclude": [
+                    "vendor",
+                    ".git*",
+                    "nbproject"
+                ]
+            },
+            "require": {
+                "doctrine/doctrine-bundle": "^1.6",
+                "php": ">=5.6",
+                "symfony/framework-bundle": "^2.7 || ^3.0"
+            },
+            "type": "symfony-bundle",
+            "autoload": {
+                "psr-4": {
+                    "Irstea\\PlantUmlBundle\\": "./"
+                }
+            },
+            "license": [
+                "proprietary"
+            ],
+            "authors": [
+                {
+                    "name": "Pôle Informatique Scientifique - Direction des Systèmes d'Information",
+                    "email": "dsi.poleis@lists.irstea.fr"
+                },
+                {
+                    "name": "Guillaume Perréal"
+                }
+            ],
+            "description": "Un bundle pour génerer des schémas UML à partir du code.",
+            "time": "2018-07-24T15:48:26+02:00"
+        },
+        {
+            "name": "mikey179/vfsstream",
+            "version": "v1.6.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/bovigo/vfsStream.git",
+                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5|^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "org\\bovigo\\vfs\\": "src/main/php"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Frank Kleine",
+                    "homepage": "http://frankkleine.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Virtual file system to mock the real file system in unit tests.",
+            "homepage": "http://vfs.bovigo.org/",
+            "time": "2019-10-30T15:31:00+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.10.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "replace": {
+                "myclabs/deep-copy": "self.version"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.0",
+                "doctrine/common": "^2.6",
+                "phpunit/phpunit": "^7.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                },
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-13T09:40:50+00:00"
+        },
+        {
+            "name": "php-parallel-lint/php-parallel-lint",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+                "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/474f18bc6cc6aca61ca40bfab55139de614e51ca",
+                "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=5.4.0"
+            },
+            "replace": {
+                "grogy/php-parallel-lint": "*",
+                "jakub-onderka/php-parallel-lint": "*"
+            },
+            "require-dev": {
+                "nette/tester": "^1.3 || ^2.0",
+                "php-parallel-lint/php-console-highlighter": "~0.3",
+                "squizlabs/php_codesniffer": "~3.0"
+            },
+            "suggest": {
+                "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+            },
+            "bin": [
+                "parallel-lint"
+            ],
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "./"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "ahoj@jakubonderka.cz"
+                }
+            ],
+            "description": "This tool check syntax of PHP files about 20x faster than serial check.",
+            "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+            "time": "2020-04-04T12:18:32+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-common",
+            "version": "2.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "opensource@ijaap.nl"
+                }
+            ],
+            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+            "homepage": "http://www.phpdoc.org",
+            "keywords": [
+                "FQSEN",
+                "phpDocumentor",
+                "phpdoc",
+                "reflection",
+                "static analysis"
+            ],
+            "time": "2020-04-27T09:25:28+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "4.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
+                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0",
+                "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+                "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
+                "webmozart/assert": "^1.0"
+            },
+            "require-dev": {
+                "doctrine/instantiator": "^1.0.5",
+                "mockery/mockery": "^1.0",
+                "phpdocumentor/type-resolver": "0.4.*",
+                "phpunit/phpunit": "^6.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+            "time": "2019-12-28T18:55:12+00:00"
+        },
+        {
+            "name": "phpdocumentor/type-resolver",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/TypeResolver.git",
+                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1",
+                "phpdocumentor/reflection-common": "^2.0"
+            },
+            "require-dev": {
+                "ext-tokenizer": "^7.1",
+                "mockery/mockery": "~1",
+                "phpunit/phpunit": "^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+            "time": "2019-08-22T18:11:29+00:00"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "v1.10.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "451c3cd1418cf640de218914901e51b064abb093"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+                "reference": "451c3cd1418cf640de218914901e51b064abb093",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.3|^7.0",
+                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+                "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+                "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^2.5 || ^3.2",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Prophecy\\": "src/Prophecy"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "time": "2020-03-05T15:02:03+00:00"
+        },
+        {
+            "name": "phpstan/extension-installer",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/extension-installer.git",
+                "reference": "5c2da3846819f951385cb6a25d3277051481c48a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/5c2da3846819f951385cb6a25d3277051481c48a",
+                "reference": "5c2da3846819f951385cb6a25d3277051481c48a",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1 || ^2.0",
+                "php": "^7.1 || ^8.0",
+                "phpstan/phpstan": ">=0.11.6"
+            },
+            "require-dev": {
+                "composer/composer": "^1.8",
+                "consistence/coding-standard": "^3.8",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "ergebnis/composer-normalize": "^2.0.2",
+                "phing/phing": "^2.16",
+                "php-parallel-lint/php-parallel-lint": "^1.2.0",
+                "phpstan/phpstan-strict-rules": "^0.11",
+                "slevomat/coding-standard": "^5.0.4"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PHPStan\\ExtensionInstaller\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\ExtensionInstaller\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Composer plugin for automatic installation of PHPStan extensions",
+            "time": "2020-08-30T12:06:42+00:00"
+        },
+        {
+            "name": "phpstan/phpstan",
+            "version": "0.12.56",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "007fd5d700c41e1bb27795fae15a2383f8fa4ba1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/007fd5d700c41e1bb27795fae15a2383f8fa4ba1",
+                "reference": "007fd5d700c41e1bb27795fae15a2383f8fa4ba1",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1|^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan-shim": "*"
+            },
+            "bin": [
+                "phpstan",
+                "phpstan.phar"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.12-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPStan - PHP Static Analysis Tool",
+            "funding": [
+                {
+                    "url": "https://github.com/ondrejmirtes",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/phpstan",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-16T22:59:18+00:00"
+        },
+        {
+            "name": "phpstan/phpstan-doctrine",
+            "version": "0.12.22",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan-doctrine.git",
+                "reference": "a4966eee1fb42383e752e9c84bd5b7b07b01e57a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/a4966eee1fb42383e752e9c84bd5b7b07b01e57a",
+                "reference": "a4966eee1fb42383e752e9c84bd5b7b07b01e57a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "phpstan/phpstan": "^0.12.33"
+            },
+            "conflict": {
+                "doctrine/collections": "<1.0",
+                "doctrine/common": "<2.7",
+                "doctrine/mongodb-odm": "<1.2",
+                "doctrine/orm": "<2.5",
+                "doctrine/persistence": "<1.3"
+            },
+            "require-dev": {
+                "consistence/coding-standard": "^3.10",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "doctrine/collections": "^1.0",
+                "doctrine/common": "^2.7 || ^3.0",
+                "doctrine/mongodb-odm": "^1.3 || ^2.1",
+                "doctrine/orm": "^2.5",
+                "doctrine/persistence": "^1.1 || ^2.0",
+                "ergebnis/composer-normalize": "^2.0.2",
+                "phing/phing": "^2.16.0",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpstan/phpstan-strict-rules": "^0.12",
+                "phpunit/phpunit": "^7.0",
+                "ramsey/uuid-doctrine": "^1.5.0",
+                "slevomat/coding-standard": "^6.4"
+            },
+            "type": "phpstan-extension",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.12-dev"
+                },
+                "phpstan": {
+                    "includes": [
+                        "extension.neon",
+                        "rules.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Doctrine extensions for PHPStan",
+            "time": "2020-10-24T20:53:39+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "4.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-xmlwriter": "*",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-file-iterator": "^1.3",
+                "phpunit/php-text-template": "^1.2",
+                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+                "sebastian/code-unit-reverse-lookup": "^1.0",
+                "sebastian/environment": "^1.3.2 || ^2.0",
+                "sebastian/version": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "ext-xdebug": "^2.1.4",
+                "phpunit/phpunit": "^5.7"
+            },
+            "suggest": {
+                "ext-xdebug": "^2.5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2017-04-02T07:44:40+00:00"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.4.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2017-11-27T13:52:08+00:00"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2015-06-21T13:50:34+00:00"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2017-02-26T11:10:40+00:00"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "791198a2c6254db10131eecfe8c06670700904db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+                "reference": "791198a2c6254db10131eecfe8c06670700904db",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": "^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.2.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "abandoned": true,
+            "time": "2017-11-27T05:48:46+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "5.7.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "myclabs/deep-copy": "~1.3",
+                "php": "^5.6 || ^7.0",
+                "phpspec/prophecy": "^1.6.2",
+                "phpunit/php-code-coverage": "^4.0.4",
+                "phpunit/php-file-iterator": "~1.4",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "^1.0.6",
+                "phpunit/phpunit-mock-objects": "^3.2",
+                "sebastian/comparator": "^1.2.4",
+                "sebastian/diff": "^1.4.3",
+                "sebastian/environment": "^1.3.4 || ^2.0",
+                "sebastian/exporter": "~2.0",
+                "sebastian/global-state": "^1.1",
+                "sebastian/object-enumerator": "~2.0",
+                "sebastian/resource-operations": "~1.0",
+                "sebastian/version": "^1.0.6|^2.0.1",
+                "symfony/yaml": "~2.1|~3.0|~4.0"
+            },
+            "conflict": {
+                "phpdocumentor/reflection-docblock": "3.0.2"
+            },
+            "require-dev": {
+                "ext-pdo": "*"
+            },
+            "suggest": {
+                "ext-xdebug": "*",
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.7.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2018-02-01T05:50:59+00:00"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "3.4.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
+                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-text-template": "^1.2",
+                "sebastian/exporter": "^1.2 || ^2.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.4"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "abandoned": true,
+            "time": "2017-06-30T09:13:00+00:00"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/container": "^1.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple, a simple Dependency Injection Container",
+            "homepage": "http://pimple.sensiolabs.org",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "time": "2018-01-21T07:42:36+00:00"
+        },
+        {
+            "name": "roave/security-advisories",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Roave/SecurityAdvisories.git",
+                "reference": "640ff0b5dcacc0958534c8c0255b90697f3eb2a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/640ff0b5dcacc0958534c8c0255b90697f3eb2a8",
+                "reference": "640ff0b5dcacc0958534c8c0255b90697f3eb2a8",
+                "shasum": ""
+            },
+            "conflict": {
+                "3f/pygmentize": "<1.2",
+                "adodb/adodb-php": "<5.20.12",
+                "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1",
+                "amphp/artax": "<1.0.6|>=2,<2.0.6",
+                "amphp/http": "<1.0.1",
+                "amphp/http-client": ">=4,<4.4",
+                "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6",
+                "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99",
+                "aws/aws-sdk-php": ">=3,<3.2.1",
+                "bagisto/bagisto": "<0.1.5",
+                "barrelstrength/sprout-base-email": "<1.2.7",
+                "barrelstrength/sprout-forms": "<3.9",
+                "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1",
+                "bolt/bolt": "<3.7.1",
+                "bolt/core": "<4.1.13",
+                "brightlocal/phpwhois": "<=4.2.5",
+                "buddypress/buddypress": "<5.1.2",
+                "bugsnag/bugsnag-laravel": ">=2,<2.0.2",
+                "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7",
+                "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4",
+                "cartalyst/sentry": "<=2.1.6",
+                "centreon/centreon": "<18.10.8|>=19,<19.4.5",
+                "cesnet/simplesamlphp-module-proxystatistics": "<3.1",
+                "codeigniter/framework": "<=3.0.6",
+                "composer/composer": "<=1-alpha.11",
+                "contao-components/mediaelement": ">=2.14.2,<2.21.1",
+                "contao/core": ">=2,<3.5.39",
+                "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0",
+                "contao/listing-bundle": ">=4,<4.4.8",
+                "datadog/dd-trace": ">=0.30,<0.30.2",
+                "david-garcia/phpwhois": "<=4.3.1",
+                "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1",
+                "doctrine/annotations": ">=1,<1.2.7",
+                "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2",
+                "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1",
+                "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2",
+                "doctrine/doctrine-bundle": "<1.5.2",
+                "doctrine/doctrine-module": "<=0.7.1",
+                "doctrine/mongodb-odm": ">=1,<1.0.2",
+                "doctrine/mongodb-odm-bundle": ">=2,<3.0.1",
+                "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1",
+                "dolibarr/dolibarr": "<11.0.4",
+                "dompdf/dompdf": ">=0.6,<0.6.2",
+                "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8",
+                "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8",
+                "endroid/qr-code-bundle": "<3.4.2",
+                "enshrined/svg-sanitize": "<0.13.1",
+                "erusev/parsedown": "<1.7.2",
+                "ezsystems/demobundle": ">=5.4,<5.4.6.1",
+                "ezsystems/ez-support-tools": ">=2.2,<2.2.3",
+                "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1",
+                "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1",
+                "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4",
+                "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6",
+                "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1",
+                "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1",
+                "ezsystems/ezplatform-user": ">=1,<1.0.1",
+                "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1",
+                "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1",
+                "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3",
+                "ezsystems/repository-forms": ">=2.3,<2.3.2.1",
+                "ezyang/htmlpurifier": "<4.1.1",
+                "firebase/php-jwt": "<2",
+                "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15",
+                "flarum/tags": "<=0.1-beta.13",
+                "fooman/tcpdf": "<6.2.22",
+                "fossar/tcpdf-parser": "<6.2.22",
+                "friendsofsymfony/oauth2-php": "<1.3",
+                "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
+                "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
+                "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
+                "fuel/core": "<1.8.1",
+                "getgrav/grav": "<1.7-beta.8",
+                "getkirby/cms": ">=3,<3.4.5",
+                "getkirby/panel": "<2.5.14",
+                "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
+                "gree/jose": "<=2.2",
+                "gregwar/rst": "<1.0.3",
+                "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1",
+                "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10",
+                "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4",
+                "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24",
+                "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
+                "illuminate/view": ">=7,<7.1.2",
+                "ivankristianto/phpwhois": "<=4.3",
+                "james-heinrich/getid3": "<1.9.9",
+                "joomla/session": "<1.3.1",
+                "jsmitty12/phpwhois": "<5.1",
+                "kazist/phpwhois": "<=4.2.6",
+                "kitodo/presentation": "<3.1.2",
+                "kreait/firebase-php": ">=3.2,<3.8.1",
+                "la-haute-societe/tcpdf": "<6.2.22",
+                "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24",
+                "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10",
+                "league/commonmark": "<0.18.3",
+                "librenms/librenms": "<1.53",
+                "livewire/livewire": ">2.2.4,<2.2.6",
+                "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3",
+                "magento/magento1ce": "<1.9.4.3",
+                "magento/magento1ee": ">=1,<1.14.4.3",
+                "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2",
+                "marcwillmann/turn": "<0.3.3",
+                "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1",
+                "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35",
+                "mittwald/typo3_forum": "<1.2.1",
+                "monolog/monolog": ">=1.8,<1.12",
+                "namshi/jose": "<2.2",
+                "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
+                "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
+                "nystudio107/craft-seomatic": "<3.3",
+                "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
+                "october/backend": ">=1.0.319,<1.0.470",
+                "october/cms": "= 1.0.469|>=1.0.319,<1.0.469",
+                "october/october": ">=1.0.319,<1.0.466",
+                "october/rain": "<1.0.472|>=1.1,<1.1.2",
+                "onelogin/php-saml": "<2.10.4",
+                "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
+                "openid/php-openid": "<2.3",
+                "openmage/magento-lts": "<19.4.8|>=20,<20.0.4",
+                "orchid/platform": ">=9,<9.4.4",
+                "oro/crm": ">=1.7,<1.7.4",
+                "oro/platform": ">=1.7,<1.7.4",
+                "padraic/humbug_get_contents": "<1.1.2",
+                "pagarme/pagarme-php": ">=0,<3",
+                "paragonie/random_compat": "<2",
+                "passbolt/passbolt_api": "<2.11",
+                "paypal/merchant-sdk-php": "<3.12",
+                "pear/archive_tar": "<1.4.12",
+                "personnummer/personnummer": "<3.0.2",
+                "phpfastcache/phpfastcache": ">=5,<5.0.13",
+                "phpmailer/phpmailer": "<6.1.6",
+                "phpmussel/phpmussel": ">=1,<1.6",
+                "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3",
+                "phpoffice/phpexcel": "<1.8.2",
+                "phpoffice/phpspreadsheet": "<1.16",
+                "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3",
+                "phpwhois/phpwhois": "<=4.2.5",
+                "phpxmlrpc/extras": "<0.6.1",
+                "pimcore/pimcore": "<6.3",
+                "pocketmine/pocketmine-mp": "<3.15.4",
+                "prestashop/autoupgrade": ">=4,<4.10.1",
+                "prestashop/contactform": ">1.0.1,<4.3",
+                "prestashop/gamification": "<2.3.2",
+                "prestashop/productcomments": ">=4,<4.2.1",
+                "prestashop/ps_facetedsearch": "<3.4.1",
+                "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2",
+                "propel/propel": ">=2-alpha.1,<=2-alpha.7",
+                "propel/propel1": ">=1,<=1.7.1",
+                "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6",
+                "pusher/pusher-php-server": "<2.2.1",
+                "rainlab/debugbar-plugin": "<3.1",
+                "robrichards/xmlseclibs": "<3.0.4",
+                "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
+                "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9",
+                "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11",
+                "sensiolabs/connect": "<4.2.3",
+                "serluck/phpwhois": "<=4.2.6",
+                "shopware/core": "<=6.3.4",
+                "shopware/platform": "<=6.3.5",
+                "shopware/shopware": "<5.6.9",
+                "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1",
+                "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2",
+                "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4",
+                "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1",
+                "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
+                "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4",
+                "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4",
+                "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1",
+                "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4",
+                "silverstripe/subsites": ">=2,<2.1.1",
+                "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1",
+                "silverstripe/userforms": "<3",
+                "simple-updates/phpwhois": "<=1",
+                "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4",
+                "simplesamlphp/simplesamlphp": "<1.18.6",
+                "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1",
+                "simplito/elliptic-php": "<1.0.6",
+                "slim/slim": "<2.6",
+                "smarty/smarty": "<3.1.33",
+                "socalnick/scn-social-auth": "<1.15.2",
+                "socialiteproviders/steam": "<1.1",
+                "spoonity/tcpdf": "<6.2.22",
+                "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1",
+                "ssddanbrown/bookstack": "<0.29.2",
+                "stormpath/sdk": ">=0,<9.9.99",
+                "studio-42/elfinder": "<2.1.49",
+                "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1",
+                "swiftmailer/swiftmailer": ">=4,<5.4.5",
+                "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2",
+                "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+                "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+                "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4",
+                "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3",
+                "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99",
+                "symbiote/silverstripe-versionedfiles": "<=2.0.3",
+                "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8",
+                "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4",
+                "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
+                "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
+                "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5",
+                "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
+                "symfony/mime": ">=4.3,<4.3.8",
+                "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/polyfill": ">=1,<1.10",
+                "symfony/polyfill-php55": ">=1,<1.10",
+                "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/routing": ">=2,<2.0.19",
+                "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7",
+                "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+                "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7",
+                "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+                "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+                "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
+                "symfony/serializer": ">=2,<2.0.11",
+                "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5",
+                "symfony/translation": ">=2,<2.0.17",
+                "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3",
+                "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
+                "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
+                "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7",
+                "t3g/svg-sanitizer": "<1.0.3",
+                "tecnickcom/tcpdf": "<6.2.22",
+                "thelia/backoffice-default-template": ">=2.1,<2.1.2",
+                "thelia/thelia": ">=2.1-beta.1,<2.1.3",
+                "theonedemon/phpwhois": "<=4.2.5",
+                "titon/framework": ">=0,<9.9.99",
+                "truckersmp/phpwhois": "<=4.3.1",
+                "twig/twig": "<1.38|>=2,<2.7",
+                "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10",
+                "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10",
+                "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5",
+                "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4",
+                "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
+                "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10",
+                "ua-parser/uap-php": "<3.8",
+                "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
+                "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4",
+                "vrana/adminer": "<4.7.9",
+                "wallabag/tcpdf": "<6.2.22",
+                "willdurand/js-translation-bundle": "<2.1.1",
+                "yii2mod/yii2-cms": "<1.9.2",
+                "yiisoft/yii": ">=1.1.14,<1.1.15",
+                "yiisoft/yii2": "<2.0.38",
+                "yiisoft/yii2-bootstrap": "<2.0.4",
+                "yiisoft/yii2-dev": "<2.0.15",
+                "yiisoft/yii2-elasticsearch": "<2.0.5",
+                "yiisoft/yii2-gii": "<2.0.4",
+                "yiisoft/yii2-jui": "<2.0.4",
+                "yiisoft/yii2-redis": "<2.0.8",
+                "yourls/yourls": "<1.7.4",
+                "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3",
+                "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2",
+                "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2",
+                "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5",
+                "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3",
+                "zendframework/zend-diactoros": ">=1,<1.8.4",
+                "zendframework/zend-feed": ">=1,<2.10.3",
+                "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-http": ">=1,<2.8.1",
+                "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+                "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3",
+                "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2",
+                "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4",
+                "zendframework/zend-validator": ">=2.3,<2.3.6",
+                "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+                "zendframework/zendframework": "<2.5.1",
+                "zendframework/zendframework1": "<1.12.20",
+                "zendframework/zendopenid": ">=2,<2.0.2",
+                "zendframework/zendxml": ">=1,<1.0.1",
+                "zetacomponents/mail": "<1.8.2",
+                "zf-commons/zfc-user": "<1.2.2",
+                "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3",
+                "zfr/zfr-oauth2-server-module": "<0.1.2"
+            },
+            "type": "metapackage",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "role": "maintainer"
+                },
+                {
+                    "name": "Ilya Tribusean",
+                    "email": "slash3b@gmail.com",
+                    "role": "maintainer"
+                }
+            ],
+            "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
+            "support": {
+                "issues": "https://github.com/Roave/SecurityAdvisories/issues",
+                "source": "https://github.com/Roave/SecurityAdvisories/tree/latest"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Ocramius",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-02-18T21:02:27+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "time": "2017-03-04T06:30:41+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.2",
+                "sebastian/exporter": "~1.2 || ~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2017-01-29T09:50:25+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff"
+            ],
+            "time": "2017-05-22T07:24:03+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "time": "2016-11-26T07:53:53+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "ext-mbstring": "*",
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2016-11-19T08:54:04+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2015-10-12T03:26:01+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "time": "2017-02-18T15:18:39+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "time": "2016-11-19T07:33:16+00:00"
+        },
+        {
+            "name": "sebastian/resource-operations",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/resource-operations.git",
+                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides a list of PHP built-in functions that operate on resources",
+            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+            "time": "2015-07-28T20:34:47+00:00"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "time": "2016-10-03T07:35:21+00:00"
+        },
+        {
+            "name": "sensio/generator-bundle",
+            "version": "v2.5.3",
+            "target-dir": "Sensio/Bundle/GeneratorBundle",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git",
+                "reference": "e50108c2133ee5c9c484555faed50c17a61221d3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/e50108c2133ee5c9c484555faed50c17a61221d3",
+                "reference": "e50108c2133ee5c9c484555faed50c17a61221d3",
+                "shasum": ""
+            },
+            "require": {
+                "symfony/console": "~2.5",
+                "symfony/framework-bundle": "~2.2"
+            },
+            "require-dev": {
+                "doctrine/orm": "~2.2,>=2.2.3",
+                "symfony/doctrine-bridge": "~2.2",
+                "twig/twig": "~1.11"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Sensio\\Bundle\\GeneratorBundle": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "This bundle generates code for you",
+            "abandoned": "symfony/maker-bundle",
+            "time": "2015-03-17T06:36:52+00:00"
+        },
+        {
+            "name": "symfony/browser-kit",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/browser-kit.git",
+                "reference": "b507697225f32a76a9d333d0766fb46353e9d00d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b507697225f32a76a9d333d0766fb46353e9d00d",
+                "reference": "b507697225f32a76a9d333d0766fb46353e9d00d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/dom-crawler": "~2.1|~3.0.0"
+            },
+            "require-dev": {
+                "symfony/css-selector": "^2.0.5|~3.0.0",
+                "symfony/process": "~2.3.34|^2.7.6|~3.0.0"
+            },
+            "suggest": {
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\BrowserKit\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony BrowserKit Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-26T06:55:10+00:00"
+        },
+        {
+            "name": "symfony/debug-bundle",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug-bundle.git",
+                "reference": "1ae929c17b503cf117cf0a3905fd0876c1e45c10"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/1ae929c17b503cf117cf0a3905fd0876c1e45c10",
+                "reference": "1ae929c17b503cf117cf0a3905fd0876c1e45c10",
+                "shasum": ""
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=5.3.9",
+                "symfony/http-kernel": "~2.6|~3.0.0",
+                "symfony/twig-bridge": "~2.6|~3.0.0",
+                "symfony/var-dumper": "~2.6|~3.0.0"
+            },
+            "require-dev": {
+                "symfony/config": "~2.3|~3.0.0",
+                "symfony/dependency-injection": "~2.3|~3.0.0",
+                "symfony/web-profiler-bundle": "~2.3|~3.0.0"
+            },
+            "suggest": {
+                "symfony/config": "For service container configuration",
+                "symfony/dependency-injection": "For using as a service from the container"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\DebugBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony DebugBundle",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "symfony/dom-crawler",
+            "version": "v3.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/dom-crawler.git",
+                "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/dff8fecf1f56990d88058e3a1885c2a5f1b8e970",
+                "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "require-dev": {
+                "symfony/css-selector": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/css-selector": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\DomCrawler\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony DomCrawler Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-07-30T07:22:48+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v3.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1f7e071aafc6676fcb6e3f0497f87c2397247377",
+                "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "require-dev": {
+                "twig/twig": "~1.20|~2.0"
+            },
+            "suggest": {
+                "ext-symfony_debug": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony mechanism for exploring and dumping PHP variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "time": "2016-07-26T08:03:56+00:00"
+        },
+        {
+            "name": "symfony/web-profiler-bundle",
+            "version": "v2.8.52",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/web-profiler-bundle.git",
+                "reference": "3aeef1328e46e83f7e8822f8a5093faa8ee776c2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3aeef1328e46e83f7e8822f8a5093faa8ee776c2",
+                "reference": "3aeef1328e46e83f7e8822f8a5093faa8ee776c2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/http-kernel": "~2.4|~3.0.0",
+                "symfony/routing": "~2.2|~3.0.0",
+                "symfony/twig-bridge": "~2.7|~3.0.0",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "require-dev": {
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/console": "~2.3|~3.0.0",
+                "symfony/dependency-injection": "~2.2|~3.0.0",
+                "symfony/stopwatch": "~2.2|~3.0.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\WebProfilerBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony WebProfilerBundle",
+            "homepage": "https://symfony.com",
+            "time": "2018-11-11T11:18:13+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0 || ^8.0",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<3.9.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
+                "assert",
+                "check",
+                "validate"
+            ],
+            "time": "2020-07-08T17:02:28+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "roave/security-advisories": 20
+    },
+    "prefer-stable": true,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=7.1",
+        "ext-ctype": "*",
+        "ext-gd": "*",
+        "ext-hash": "*",
+        "ext-iconv": "*",
+        "ext-intl": "*",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "ext-pdo": "*",
+        "ext-pgsql": "*",
+        "ext-posix": "*",
+        "ext-sodium": "*",
+        "ext-xsl": "*",
+        "ext-zip": "*"
+    },
+    "platform-dev": [],
+    "platform-overrides": {
+        "php": "7.1.33"
+    },
+    "plugin-api-version": "1.1.0"
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f5e27b3896bfad8b23c328842b0d02cd6bf0cfc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,52 @@
+{
+  "name": "bdoh",
+  "version": "1.0.0",
+  "description": "BD Observatoires Hydrologiques",
+  "main": "index.js",
+  "devDependencies": {
+    "@symfony/webpack-encore": "^0.15.1",
+    "babel-preset-env": "^1.6.0",
+    "eslint": "^4.6.1",
+    "less": "^2.3.1",
+    "less-loader": "^4.0.5",
+    "node-glob": "^1.2.0",
+    "webpack-livereload-plugin": "^1.0.0"
+  },
+  "scripts": {
+    "build-prod": "encore production",
+    "build-dev": "encore dev",
+    "watch-dev": "encore dev -w"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://gitlab-ssh.irstea.fr/pole-is/bdoh"
+  },
+  "author": "Guillaume Perréal <guillaume.perreal@irstea.fr>",
+  "license": "ISC",
+  "dependencies": {
+    "@claviska/jquery-minicolors": "^2.2.6",
+    "babel-polyfill": "^6.26.0",
+    "bootstrap": "^3.3",
+    "datatables.net": "^1.10.13",
+    "datatables.net-bs": "^1.10.13",
+    "drmonty-datatables-plugins": "^1.10.12",
+    "excanvas": "^1.0.0",
+    "jqplot": "https://github.com/jqPlot/jqPlot.git#master",
+    "jquery": ">=1.9.1 <3",
+    "jquery-form": "^3.46",
+    "jquery-ui": "^1.12",
+    "lodash": "^4.17.4",
+    "moment": "^2.16",
+    "rasterizehtml": "^1.2.4",
+    "rx": "^4.0",
+    "rx-jquery": "^1.1.7",
+    "script-loader": "^0.7.2",
+    "select2": "^4.0",
+    "select2-bootstrap-theme": "^0.1.0-beta.9",
+    "toastr": "^2.1.2",
+    "trumbowyg": "^2.8.1"
+  },
+  "resolutions": {
+    "jquery": "2.2.4"
+  }
+}
diff --git a/phpmd-ruleset.xml b/phpmd-ruleset.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4204ac7e80a283a120503a0e6bf8fbc731f2762f
--- /dev/null
+++ b/phpmd-ruleset.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<ruleset name="SYGADE PHPMD rule set"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+
+<rule ref="vendor/irstea/phpmd-config/loose.xml" />
+</ruleset>
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
new file mode 100644
index 0000000000000000000000000000000000000000..2cdd56ab62f91e19202de94f0107d905569d2853
--- /dev/null
+++ b/phpstan-baseline.neon
@@ -0,0 +1,170 @@
+parameters:
+    excludes_analyse:
+        - src/Irstea/BdohAdminBundle/Admin/Admin.php
+
+    ignoreErrors:
+        -
+            message: "#^Variable \\$mimeType might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php
+
+        -
+            message: "#^Variable \\$importer might not be defined\\.$#"
+            count: 3
+            path: src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php
+
+        -
+            message: "#^Variable \\$overlap might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php
+
+        -
+            message: "#^Variable \\$data might not be defined\\.$#"
+            count: 3
+            path: src/Irstea/BdohAdminBundle/Controller/PointControleController.php
+
+        -
+            message: "#^Variable \\$overlap might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/PointControleController.php
+
+        -
+            message: "#^Variable \\$mimeType might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/ShapeImportController.php
+
+        -
+            message: "#^Variable \\$data might not be defined\\.$#"
+            count: 3
+            path: src/Irstea/BdohAdminBundle/Controller/ShapeImportController.php
+
+        -
+            message: "#^Variable \\$dataAndErrorsSecondaire might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/TransformationController.php
+
+        -
+            message: "#^Variable \\$filePath might not be defined\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Controller/TransformationController.php
+
+        -
+            message: "#^Variable \\$importer might not be defined\\.$#"
+            count: 2
+            path: src/Irstea/BdohAdminBundle/Controller/TransformationController.php
+
+        -
+            message: "#^Variable \\$data might not be defined\\.$#"
+            count: 3
+            path: src/Irstea/BdohAdminBundle/Controller/TransformationController.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$dirPath\\.$#"
+            count: 2
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Variable \\$data might not be defined\\.$#"
+            count: 9
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$chronique\\.$#"
+            count: 6
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$firstDate\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$lastDate\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$controleRepo\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$tmpSqlTable\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Call to an undefined method Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:getChroniqueRepo\\(\\)\\.$#"
+            count: 1
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Bareme\\\\Manager\\:\\:\\$timezone\\.$#"
+            count: 2
+            path: src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohAdminBundle\\\\Importer\\\\Controle\\\\Manager\\:\\:\\$dirPath\\.$#"
+            count: 2
+            path: src/Irstea/BdohAdminBundle/Importer/Controle/Manager.php
+
+        -
+            message: "#^Variable \\$data might not be defined\\.$#"
+            count: 11
+            path: src/Irstea/BdohAdminBundle/Importer/Controle/Manager.php
+
+        -
+            message: "#^Variable \\$headerData might not be defined\\.$#"
+            count: 11
+            path: src/Irstea/BdohAdminBundle/Importer/Measure/BdohImporter.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohBundle\\\\Command\\\\Command\\:\\:\\$conn\\.$#"
+            count: 1
+            path: src/Irstea/BdohBundle/Command/Command.php
+
+        -
+            message: "#^Array has 2 duplicate keys with value 'none' \\('none', 'none'\\)\\.$#"
+            count: 1
+            path: src/Irstea/BdohBundle/Resources/translations/messages.en.php
+
+        -
+            message: "#^Array has 2 duplicate keys with value 'none' \\('none', 'none'\\)\\.$#"
+            count: 1
+            path: src/Irstea/BdohBundle/Resources/translations/messages.fr.php
+
+        -
+            message: "#^Access to undefined constant Irstea\\\\BdohDataBundle\\\\Command\\\\AbstractExportCommand\\:\\:EXTRACTOR_TYPE\\.$#"
+            count: 2
+            path: src/Irstea/BdohDataBundle/Command/AbstractExportCommand.php
+
+        -
+            message: "#^Access to an undefined property Irstea\\\\BdohDataBundle\\\\Doctrine\\\\Listener\\\\DocumentedEntityListener\\:\\:\\$warning\\.$#"
+            count: 1
+            path: src/Irstea/BdohDataBundle/Doctrine/Listener/DocumentedEntityListener.php
+
+        -
+            message: "#^Function sodium_hex2bin not found\\.$#"
+            count: 1
+            path: src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
+
+        -
+            message: "#^Function sodium_crypto_secretbox not found\\.$#"
+            count: 1
+            path: src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
+
+        -
+            message: "#^Function sodium_bin2base64 not found\\.$#"
+            count: 2
+            path: src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
+
+        -
+            message: "#^Function sodium_base642bin not found\\.$#"
+            count: 2
+            path: src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
+
+        -
+            message: "#^Function sodium_crypto_secretbox_open not found\\.$#"
+            count: 1
+            path: src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
+
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000000000000000000000000000000000000..89f48bae651f3e82c9338775fbb19278ac956f15
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,8 @@
+includes:
+    - phpstan-baseline.neon
+
+parameters:
+    level: 1
+    paths:
+        - src
+    tmpDir: .phpstan-cache
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ba2b566b9671bc9d41214e3a617f30e4abacb
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->
+<phpunit
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/5.7/phpunit.xsd"
+    backupGlobals="false"
+    backupStaticAttributes="false"
+    colors="true"
+    convertErrorsToExceptions="true"
+    convertNoticesToExceptions="true"
+    convertWarningsToExceptions="true"
+    processIsolation="false"
+    stopOnFailure="false"
+    syntaxCheck="false"
+    bootstrap="app/autoload.php">
+
+    <php>
+        <server name="KERNEL_DIR" value="app/"/>
+        <server name="SYMFONY_ENV" value="test"/>
+        <server name="LANG" value="fr_FR.UTF-8"/>
+        <ini name="zend.assertions" value="1"/>
+        <ini name="assert.active" value="1"/>
+        <ini name="assert.exception" value="1"/>
+    </php>
+
+    <testsuites>
+        <testsuite name="Project Test Suite">
+            <directory>src/*/*Bundle/Tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>src</directory>
+            <exclude>
+                <directory>src/*/*Bundle/Resources</directory>
+                <directory>src/*/*Bundle/Tests</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+
+    <listeners>
+        <listener class="\DAMA\DoctrineTestBundle\PHPUnit\PHPUnitListener" />
+    </listeners>
+
+</phpunit>
diff --git a/src/.htaccess b/src/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..3418e55a68383c1cbc687c52a2994d1e8ed83800
--- /dev/null
+++ b/src/.htaccess
@@ -0,0 +1 @@
+deny from all
\ No newline at end of file
diff --git a/src/Irstea/BdohAdminBundle/Admin/Admin.php b/src/Irstea/BdohAdminBundle/Admin/Admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..144825c102a5c43c22a1debfef2eec9ea651a5eb
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Admin.php
@@ -0,0 +1,167 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin;
+
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+use Irstea\BdohLoggerBundle\Logger\BdohLogger;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Sonata\AdminBundle\Admin\AbstractAdmin;
+use Sonata\AdminBundle\Translator\NoopLabelTranslatorStrategy;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+
+/**
+ * Defines some parameters & treatments for all BDOH admin classes.
+ */
+abstract class Admin extends AbstractAdmin
+{
+    /**
+     * @var BdohLogger
+     */
+    protected $logger;
+
+    /**
+     * @param BdohLogger $logger
+     */
+    public function setLogger(BdohLogger $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setRequest(Request $request = null)
+    {
+        if ($request !== null) {
+            parent::setRequest($request);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+            case 'list':
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:' . $name . '.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormGroups(array $formGroups)
+    {
+        foreach ($formGroups as &$formGroup) {
+            if ($formGroup['label'] === $this->getLabel()) {
+                $formGroup['label'] = $this->getContainer()->get('translator')->trans($this->getClassnameLabel(), [], 'entitiesSingulars');
+            }
+        }
+        parent::setFormGroups($formGroups);
+    }
+
+    public function configure()
+    {
+        /* Label name */
+        $this->setLabel($this->getContainer()->get('translator')->trans($this->getClassnameLabel(), [], 'entitiesPlurals'));
+
+        /* Labels translator strategy */
+        $transStrategy = new NoopLabelTranslatorStrategy();
+        $this->setLabelTranslatorStrategy($transStrategy);
+
+        /* Route name */
+        $this->baseRouteName = 'bdoh_admin_' . $this->urlize($this->getClassnameLabel());
+
+        /* Route pattern */
+        $this->baseRoutePattern = $this->urlize($this->getClassnameLabel(), '-');
+    }
+
+    /**
+     * Direct access to the service container.
+     *
+     * @return ContainerInterface
+     */
+    protected function getContainer()
+    {
+        return $this->getConfigurationPool()->getContainer();
+    }
+
+    /**
+     * Direct access to the current User.
+     *
+     * @return Utilisateur|null
+     */
+    protected function getUser()
+    {
+        /** @var TokenInterface $token */
+        $token = $this->getContainer()->get('security.token_storage')->getToken();
+
+        return $token ? $token->getUser() : null;
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     *
+     * @return
+     */
+    public function getRepository($entity)
+    {
+        return $this->getModelManager()->getEntityManager($entity)->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     *
+     * @return EntityRepository
+     */
+    public function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    /**
+     * No export formats.
+     */
+    public function getExportFormats()
+    {
+        return [];
+    }
+
+    /**
+     * No batch actions.
+     */
+    public function getBatchActions()
+    {
+        return [];
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Bareme.php b/src/Irstea/BdohAdminBundle/Admin/Data/Bareme.php
new file mode 100644
index 0000000000000000000000000000000000000000..843bd5964af04b42ffd5a650378d3e21c98ecae3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Bareme.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class Bareme.
+ */
+class Bareme extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create')
+            ->remove('update')
+            ->remove('delete');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('uniteEntree')
+            ->add('uniteSortie')
+            ->add('dateCreation', 'date', ['format' => $this->getContainer()->get('translator')->trans('formatDateTime')]);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Bassin.php b/src/Irstea/BdohAdminBundle/Admin/Data/Bassin.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd06e1311311383146367c2129051d9db3d98abf
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Bassin.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class Bassin.
+ */
+class Bassin extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('stationExutoire');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom')
+            ->add('stationExutoire');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationBassin(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.BassinUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationBassin(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.BassinRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Chronique.php b/src/Irstea/BdohAdminBundle/Admin/Data/Chronique.php
new file mode 100644
index 0000000000000000000000000000000000000000..670af2fd1708466dccf15487b90d4196245576db
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Chronique.php
@@ -0,0 +1,404 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use DateTime;
+use Doctrine\DBAL\Types\TextType;
+use Doctrine\ORM\EntityRepository;
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Qualite;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+use Sonata\CoreBundle\Validator\ErrorElement;
+use Sonata\DoctrineORMAdminBundle\Filter\DateFilter;
+
+/**
+ * Class Chronique.
+ */
+class Chronique extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_order' => 'DESC',
+        '_sort_by'    => 'dataset.titre',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les points de contrôle de la chronique.
+     */
+    private $checkpoints = null;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->add('list');
+    }
+
+    /**
+     * @return array|null
+     */
+    public function getCheckpoints()
+    {
+        if ($this->checkpoints === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->checkpoints = $this->getBdohRepo('PointControle')->findByChronique($this->getSubject());
+        }
+
+        return $this->checkpoints;
+    }
+
+    /**
+     * Les chroniques filles.
+     */
+    private $childrenTimeSeries = null;
+
+    /**
+     * @return array|null
+     */
+    public function getChildrenTimeSeries()
+    {
+        if ($this->childrenTimeSeries === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->childrenTimeSeries = $this->getBdohRepo('Chronique')->findChildren($this->getSubject());
+        }
+
+        return $this->childrenTimeSeries;
+    }
+
+    /**
+     * @var null
+     */
+    private $mustDefineMilieu = null;
+
+    /**
+     * @return bool
+     */
+    public function getMustDefineMilieu()
+    {
+        $subject = $this->getSubject();
+        if ($this->mustDefineMilieu === null) {
+            $this->mustDefineMilieu = $subject && $subject->getId() && $subject->getMilieu() === null;
+        }
+
+        return $this->mustDefineMilieu;
+    }
+
+    /**
+     * In order to automaticaly generate a Chronique.code from TypeParametre.code,
+     * the 'Chronique' admin uses its own editing template.
+     *
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-chronique.html.twig';
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-chronique.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+          ->add('code')
+          ->add('unite')
+          ->add('station')
+          ->add('station.sites', null, [], null, ['expanded' => false, 'multiple' => true])
+            ->add('producteur', null, [], null, ['expanded' => false, 'multiple' => true])
+            ->add('parametre', null, [], null, ['expanded' => false, 'multiple' => true])
+            ->add('parametre.familleParametres', null, [], null, ['expanded' => false, 'multiple' => true])
+            ->add('dateDebutMesures', DateFilter::class, [
+            ], null, ['widget' => 'single_text'])
+            ->add('dateFinMesures', DateFilter::class, [
+            ], null, ['widget' => 'single_text'])
+            ->add('dataset', null, [], null, ['expanded' => false, 'multiple' => true]);
+    }
+
+    /**
+     * @param ErrorElement $errorElement
+     * @param mixed        $object
+     */
+    public function validate(ErrorElement $errorElement, $object)
+    {
+        /**
+         * Les contraintes s'active uniquement si le code Theia a été renseigné et si la chronique est reliée à un jeu de donnée.
+         */
+        $observatoireCourant = $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        $theiaCode = $observatoireCourant->getTheiaCode();
+        $chronique = $this->getSubject();
+        $dataset = $chronique->getDataSet();
+
+        if ($theiaCode !== null && $dataset !== null) {
+            $errorElement
+                ->with('libelleEn')
+                ->assertNotNull(
+                    [
+                        'message' => 'Il faut au moins un libellé en anglais (Contraintes Theia/Ozcar)',
+                    ]
+                )
+                ->end();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $isLocaleEn = \strpos($this->getContainer()->get('translator')->getLocale(), 'en') === 0;
+        $label = $isLocaleEn ? 'nomEn' : 'nom';
+        $listMapper
+            ->addIdentifier('code', null, ['route' => ['name' => 'edit']])
+            ->add('estVisible')
+            ->add('unite')
+            ->add('parametre', null, ['associated_property' => $label])
+            ->add('parametre.familleParametres')
+            ->add('producteur')
+            ->add('dataSet')
+            ->add('station')
+            ->add('station.sites')
+            ->add('dateDebutMesures', TextType::class, [])
+            ->add('dateFinMesures', TextType::class, [])
+        ->add('_action', 'actions', [
+        'actions' => [
+            'edit'   => [],
+            'delete' => [],
+        ], ]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $repoPartenaire = $this->getBdohRepo('Partenaire');
+        $repoStation = $this->getBdohRepo('Station');
+        $repoParam = $this->getBdohRepo('TypeParametre');
+        $translator = $this->getContainer()->get('translator');
+        $dateDebutMesure = $this->getSubject()->getDateDebutMesures();
+        $dateFinMesure = $this->getSubject()->getDateFinMesures();
+
+        $propertyParameter = 'nom';
+        if (($isLocaleEn = \strpos($translator->getLocale(), 'en') === 0)) {
+            $propertyParameter .= 'En';
+        }
+
+        $formMapper
+            ->add('station', null, ['required' => true, 'query_builder' => $repoStation->createSecuredQueryBuilderForMesure($this->getUser())])
+            ->add(
+                'parametre',
+                null,
+                [
+                    'required'      => true,
+                    'property'      => $propertyParameter,
+                    'query_builder' => $repoParam->createQueryBuilder('p')->orderBy('p.' . $propertyParameter, 'ASC'),
+                ]
+            )
+            ->add('code')
+            ->add('libelle')
+            ->add(
+                'libelleEn',
+                null,
+                [
+                    'required' => true,
+                ]
+            )
+            ->add('genealogie', 'textarea', ['required' => false])
+            ->add('genealogieEn', 'textarea', ['required' => false]);
+
+        if ($dateDebutMesure !== null && $dateFinMesure !== null) {
+            $formMapper->add('dataset');
+        }
+
+        $formMapper
+            ->add('milieu', null, ['required' => true])
+            ->add('estVisible', 'checkbox', ['required' => false])
+            ->add('minimumValide', 'number', ['required' => false, 'precision' => 3])
+            ->add('maximumValide', 'number', ['required' => false, 'precision' => 3])
+            ->add('unite', null, ['required' => true])
+            ->add('producteur', 'sonata_type_model', ['btn_add' => $translator->trans('button.add'),
+                'required'                                      => false, 'query' => $repoPartenaire->createQueryBuilder(), ])
+
+            ->setHelps(
+                [
+                    'code'                                  => $translator->trans('admin.help.chronique.code'),
+                    'libelle'                               => $translator->trans('admin.help.chronique.libelle'),
+                    'estVisible'                            => $translator->trans('admin.help.chronique.estVisible'),
+                    'dateDebutMesures'                      => $translator->trans('admin.help.theia.theia-message'),
+                    'dateFinMesures'                        => $translator->trans('admin.help.theia.theia-message'),
+                    'libelleEn'                             => $translator->trans('admin.help.theia.theia-message'),
+                    'unite'                                 => $translator->trans('admin.help.theia.theia-message'),
+                ]
+            );
+
+        // Check whether the current "chronique"'s measures contain at least one
+        // "value limit" (quality order = 600 or 700)
+        $chronique = $this->getSubject();
+        $hasLimiteValeur = $chronique->getId() !== null;
+        if ($hasLimiteValeur) {
+            $repoName = ($chronique instanceof ChroniqueContinue) ? 'Mesure' : 'Plage';
+            /* @var $mesureOuPlageRepo EntityRepository */
+            $mesureOuPlageRepo = $this->getBdohRepo($repoName);
+            $hasLimiteValeur = (bool)
+                $mesureOuPlageRepo->createQueryBuilder('m')->select('m')
+                    ->where('m.chronique = :chronique')
+                    ->leftJoin('m.qualite', 'q')->andWhere('q.ordre IN (:ordres)')
+                    ->setParameters(['chronique' => $chronique, 'ordres' => Qualite::$ordresLimites])
+                    ->setMaxResults(1)->getQuery()->getOneOrNullResult();
+        }
+
+        $isConvertie = $chronique->isConvertie();
+        $valueLimits = (bool) $chronique->getAllowValueLimits();
+
+        if ($hasLimiteValeur) {
+            $formMapper->add(
+                $allowValueLimitsField = 'allowValueLimits_dummy',
+                'checkbox',
+                [
+                    'required' => true,
+                    'disabled' => true,
+                    'data'     => true,
+                    'mapped'   => false,
+                    'label'    => 'allowValueLimits',
+                ]
+            );
+            // s'il s'agit d'une chronique convertie, le champs est purrement informatif, il ne peut pas être modifié
+            if (!$isConvertie) {
+                $formMapper->add(
+                    'allowValueLimits',
+                    'hidden',
+                    [
+                        'required' => true,
+                        'data'     => true,
+                    ]
+                );
+            }
+            $formMapper->setHelps(
+                [
+                    $allowValueLimitsField => $isConvertie ? 'chronique.lq_ld.legacy_and_already_present' : 'chronique.lq_ld.forced_allow_already_present',
+                ]
+            );
+        } else {
+            if ($this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent()->getJeu()->hasValueLimits()) {
+                if ($isConvertie) {
+                    $formMapper
+                        ->add(
+                            $allowValueLimitsField = 'allowValueLimits_dummy',
+                            'checkbox',
+                            [
+                                'required' => false,
+                                'disabled' => true,
+                                'data'     => $valueLimits,
+                                'mapped'   => false,
+                                'label'    => 'allowValueLimits',
+                            ]
+                        )
+                        // s'il s'agit d'une chronique convertie, le champs est purrement informatif, il ne peut pas être modifié
+                        ->setHelps(
+                            [
+                                $allowValueLimitsField => 'chronique.lq_ld.legacy_parent_time_series',
+                            ]
+                        );
+                } else {
+                    $formMapper->add('allowValueLimits', 'checkbox', ['required' => false]);
+                }
+            }
+            // je ne sais pas ce qui est le mieux entre le laisser à NULL ou le forcer à FALSE quand ce n'est pas autorisé
+            /*else {
+                $formMapper->add(
+                    'allowValueLimits',
+                    'hidden',
+                    [
+                        'required' => false,
+                        'data'     => false,
+                    ]
+                );
+            }*/
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $em = $this->getModelManager()->getEntityManager($object);
+        $object->setEchantillonageSet(true);
+        $em->persist($object);
+        $em->flush();
+
+        $this->logger->createHistoriqueAdministrationChronique(
+            $this->getUser(),
+            new DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ChroniqueCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $em = $this->getModelManager()->getEntityManager($object);
+        $object->setEchantillonageSet(true);
+        $em->persist($object);
+        $em->flush();
+
+        $this->logger->createHistoriqueAdministrationChronique(
+            $this->getUser(),
+            new DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ChroniqueUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationChronique(
+            $this->getUser(),
+            new DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ChroniqueRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueCalculee.php b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueCalculee.php
new file mode 100644
index 0000000000000000000000000000000000000000..667364738343229e9cd7f89d6209c0cc4a183f9a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueCalculee.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+/**
+ * Class ChroniqueCalculee.
+ */
+class ChroniqueCalculee extends ChroniqueContinue
+{
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueContinue.php b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueContinue.php
new file mode 100644
index 0000000000000000000000000000000000000000..53c8770540a9393b78568892278844ab50501aff
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueContinue.php
@@ -0,0 +1,282 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Doctrine\ORM\EntityRepository;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue as ChroniqueContinueEntity;
+use Irstea\BdohDataBundle\Entity\OptionEchantillonnageSortie;
+use Sonata\AdminBundle\Form\FormMapper;
+
+/**
+ * Class ChroniqueContinue.
+ */
+class ChroniqueContinue extends Chronique
+{
+    /**
+     * @var array
+     */
+    private $samplings = null;
+
+    /**
+     * @var array
+     */
+    private $outputTimeSteps = null;
+
+    /**
+     * @var null
+     */
+    private $hadToSetExportOptions = null;
+
+    /**
+     * @return array
+     */
+    public function getSamplings()
+    {
+        if ($this->samplings === null) {
+            $this->samplings = [];
+            foreach ($this->getBdohRepo('Echantillonnage')->findAll() as $sampling) {
+                /* @var \Irstea\BdohDataBundle\Entity\Echantillonnage $sampling */
+                $this->samplings[$sampling->getCode()] = $sampling;
+            }
+        }
+
+        return $this->samplings;
+    }
+
+    /**
+     * @return array
+     */
+    public function getCumulativeSamplings()
+    {
+        return $this->filterMapSamplings(
+            null,
+            function (\Irstea\BdohDataBundle\Entity\Echantillonnage $s) {
+                return $s->getCode() === 'cumulative';
+            }
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getOrientedSamplings()
+    {
+        return $this->filterMapSamplings(
+            null,
+            function (\Irstea\BdohDataBundle\Entity\Echantillonnage $s) {
+                return $s->getHasDirection();
+            }
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getSamplingOrders()
+    {
+        return $this->filterMapSamplings(
+            function (\Irstea\BdohDataBundle\Entity\Echantillonnage $s) {
+                return $s->getOrdreSortie();
+            }
+        );
+    }
+
+    /**
+     * @param callable|null $map
+     * @param callable|null $filter
+     *
+     * @return array
+     */
+    private function filterMapSamplings(callable $map = null, callable $filter = null)
+    {
+        $samplings = $this->getSamplings();
+        $output = [];
+        foreach ($samplings as $sampling) {
+            /** @var \Irstea\BdohDataBundle\Entity\Echantillonnage $sampling */
+            if ($filter === null || call_user_func($filter, $sampling)) {
+                $output[$sampling->getId()] = $map ? call_user_func($map, $sampling) : true;
+            }
+        }
+
+        return $output;
+    }
+
+    /**
+     * @return array|null
+     */
+    public function getOutputTimeSteps()
+    {
+        if ($this->outputTimeSteps === null) {
+            $ots = [];
+            foreach ($this->getBdohRepo('OptionEchantillonnageSortie')->findAll() as $item) {
+                /* @var OptionEchantillonnageSortie $item */
+                $ots[$item->getId()] = $item->getEchantillonnageEntree()->getId();
+            }
+            $this->outputTimeSteps = $ots;
+        }
+
+        return $this->outputTimeSteps;
+    }
+
+    /**
+     * @param bool $excludeNew
+     *
+     * @return bool
+     */
+    public function getHadToSetDefaultExportOptions($excludeNew = false)
+    {
+        $subject = $this->getSubject();
+        if ($this->hadToSetExportOptions === null) {
+            $this->hadToSetExportOptions = $subject && $subject->getMustEditExportOptions();
+        }
+
+        return $this->hadToSetExportOptions && (!$excludeNew || ($subject && $subject->getId() !== null));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-chronique-continue.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        /* @var $chronique ChroniqueContinueEntity */
+        $chronique = $this->getSubject();
+
+        // If export options were not set for this time series, then set default values
+        if ($this->getHadToSetDefaultExportOptions()) {
+            // If no sampling was defined for this time series, set 'instantaneous'
+            $defaultSamplingCode = 'instantaneous';
+
+            $allSamplings = $this->getSamplings();
+
+            // Time series' sampling & its code
+            $sampling = $chronique->getEchantillonnage();
+            if (!$sampling) {
+                $sampling = $allSamplings[$defaultSamplingCode];
+                $chronique->setEchantillonnage($sampling);
+            }
+            $samplingCode = $sampling->getCode();
+
+            // Default export options
+            $dae = $this->getContainer()->getParameter('default_allowed_exports');
+            $daeForSampling = $dae[$samplingCode];
+
+            // Set default export samplings
+            foreach ($daeForSampling['samplings'] as $code) {
+                $chronique->addEchantillonnagesSortieLicite($allSamplings[$code]);
+            }
+
+            // Set default regular time steps
+            foreach ($daeForSampling['steps'] as $valueAndUnit) {
+                $qb = $this->getBdohRepo('OptionEchantillonnageSortie')->createQueryBuilder('oes')
+                    ->leftJoin('oes.pasEchantillonnage', 'pe')
+                    ->where('oes.echantillonnageEntree = :e')
+                    ->andWhere('pe.valeur = :v')
+                    ->andWhere('pe.unite = :u')
+                    ->setParameters(
+                        [
+                            'e' => $sampling,
+                            'v' => $valueAndUnit[0],
+                            'u' => $valueAndUnit[1],
+                        ]
+                    );
+                $oes = $qb->getQuery()->getSingleResult();
+                $chronique->addOptionsEchantillonnageSortie($oes);
+            }
+        }
+
+        if (!$chronique->getUniteCumul() && $chronique->getUnite()) {
+            $chronique->setUniteCumul($chronique->getUnite());
+        }
+
+        parent::configureFormFields($formMapper);
+
+        $translator = $this->getContainer()->get('translator');
+        $inEnglish = \strpos($translator->getLocale(), 'en') === 0;
+        $i18nSuffix = $inEnglish ? 'en' : '';
+
+        $formMapper
+            ->add(
+                'echantillonnage',
+                null,
+                [
+                    'required'                  => true,
+                    'choice_label'              => 'code',
+                    'choice_translation_domain' => 'echantillonnage',
+                ]
+            )
+            ->add(
+                'directionMesure',
+                'choice',
+                [ // Field for "measure direction"
+                    'choices'  => [
+                        'ahead'    => $translator->trans('period.ahead'),
+                        'backward' => $translator->trans('period.backward'),
+                    ],
+                    'multiple' => false,
+                    'expanded' => true,
+                ]
+            )
+            ->add(
+                'echantillonnagesSortieLicites',
+                null,
+                [ // Field for allowed regular-step sampling types
+                    'multiple'     => true,
+                    'expanded'     => true,
+                    'choice_label' => 'nom' . $i18nSuffix,
+                ]
+            )
+            ->add('uniteCumul')
+            ->add(
+                'optionsEchantillonnageSortie',
+                null,
+                [ // Field for allowed regular time steps
+                    'multiple'      => true,
+                    'expanded'      => true,
+                    'attr'          => ['class' => 'inputs-list-inline'],
+                    'choice_label'  => 'libelle' . $i18nSuffix,
+                    'query_builder' => function (EntityRepository $repo) {
+                        return $repo->createQueryBuilder('o')
+                            ->innerJoin('o.pasEchantillonnage', 'p')
+                            ->orderBy('p.approxSecondes', 'DESC');
+                    },
+                ]
+            )
+            ->setHelps(
+                [
+                    'unite' => $translator->trans('admin.help.chronique.update-unite-cumul'),
+                ]
+            );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueConvertie.php b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueConvertie.php
new file mode 100644
index 0000000000000000000000000000000000000000..8df2f596723c49e1d1e1dfdc872440d73a570d5e
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueConvertie.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+/**
+ * Class ChroniqueConvertie.
+ */
+class ChroniqueConvertie extends ChroniqueContinue
+{
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueDiscontinue.php b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueDiscontinue.php
new file mode 100644
index 0000000000000000000000000000000000000000..dac43c91da5d72cf7832d46678eaa63f2f80a1d6
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/ChroniqueDiscontinue.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+/**
+ * Class ChroniqueDiscontinue.
+ */
+class ChroniqueDiscontinue extends Chronique
+{
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Commune.php b/src/Irstea/BdohAdminBundle/Admin/Data/Commune.php
new file mode 100644
index 0000000000000000000000000000000000000000..e24dd672c83b0eb9a85bf2b45058c14372eac274
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Commune.php
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+
+/**
+ * Class Commune.
+ */
+class Commune extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les stations qui sont sur cette commune.
+     */
+    private $stations = null;
+
+    /**
+     * @return array|null
+     */
+    public function getStations()
+    {
+        if ($this->stations === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->stations = $this->getBdohRepo('Station')->findByCommune($this->getSubject());
+        }
+
+        return $this->stations;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-commune.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('codePostal')
+            ->add('codeInsee');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom')
+            ->add('codePostal')
+            ->add('codeInsee');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('nom')
+            ->add('codePostal');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationCommune(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CommuneCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationCommune(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CommuneUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationCommune(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CommuneRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/CoursEau.php b/src/Irstea/BdohAdminBundle/Admin/Data/CoursEau.php
new file mode 100644
index 0000000000000000000000000000000000000000..114a2ac53243624e8a3358789e8881d7a7895052
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/CoursEau.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class CoursEau.
+ */
+class CoursEau extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('codeHydro');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom')
+            ->add('codeHydro');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('nom')
+            ->add('codeHydro');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationCoursEau(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CoursEauUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationCoursEau(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CoursEauRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaClimat.php b/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaClimat.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6612d7c7a3b338acd64495a360e7422f648063f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaClimat.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class CriteriaClimat extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom', TextType::class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaClimate(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaClimateCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaClimate(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaClimateUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaClimate(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaClimateRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaGeology.php b/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaGeology.php
new file mode 100644
index 0000000000000000000000000000000000000000..d516c77ca2062ceaf16a327875826a950f36fe5c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/CriteriaGeology.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class CriteriaGeology extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom', TextType::class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaGeology(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaGeologyCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaGeology(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaGeologyUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationCriteriaGeology(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.CriteriaGeologyRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/DataConstraint.php b/src/Irstea/BdohAdminBundle/Admin/Data/DataConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..eeebe58b873c10ca15af720c54107286683ba881
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/DataConstraint.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class DataConstraint extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom', TextType::class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataconstraint(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DataconstraintCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataconstraint(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DataconstraintUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataconstraint(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DataconstraintRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/DataSet.php b/src/Irstea/BdohAdminBundle/Admin/Data/DataSet.php
new file mode 100644
index 0000000000000000000000000000000000000000..bee063900f10b4a7be34664f406cc40aa7d8d6ec
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/DataSet.php
@@ -0,0 +1,286 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\CoreBundle\Validator\ErrorElement;
+use Symfony\Component\Form\Extension\Core\Type\HiddenType;
+use Symfony\Component\Form\Extension\Core\Type\TextareaType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class DataSet extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'titre',  // name of the ordered field
+        // (default = the model's id field, if any)
+        //
+    ];
+
+    /**
+     * the 'Chronique' admin uses its own editing template.
+     *
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-dataset.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * Sets 'observatoire' attribute to the current 'observatoire'.
+     *
+     * {@inheritdoc}
+     */
+    public function prePersist($dataset)
+    {
+        $dataset->setObservatoire(
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent()
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('titre')
+            ->add('principalInvestigators')
+            ->add('portailSearchCriteriaClimat')
+            ->add('portailSearchCriteriaGeology');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('titre', null, ['route' => ['name' => 'edit']])
+            ->add('principalInvestigators')
+            ->add('observatoire')
+            ->add('portailSearchCriteriaClimat')
+            ->add('portailSearchCriteriaGeology');
+    }
+
+    public function validate(ErrorElement $errorElement, $object)
+    {
+        /**
+         * Les contraintes s'active uniquement si le code Theia a été renseigné.
+         */
+        $observatoireCourant = $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        $theiaCode = $observatoireCourant->getTheiaCode();
+        if ($theiaCode !== null) {
+            $errorElement
+                ->with('principalInvestigators')
+                ->assertCount(
+                    ['min'           => 1,
+                        'minMessage' => 'Il faut au moins un Principal Investigator (Contraintes Theia/Ozcar)',
+                    ]
+                )
+                ->end()
+                ->with('portailSearchCriteriaGeology')
+                ->assertCount(
+                    ['min'           => 1,
+                        'minMessage' => 'Il faut au moins un critère (Contraintes Theia/Ozcar)',
+                    ]
+                )
+                ->end()
+                ->with('portailSearchCriteriaClimat')
+                ->assertCount(
+                    ['min'           => 1,
+                        'minMessage' => 'Il faut au moins un critère (Contraintes Theia/Ozcar)',
+                    ]
+                )
+                ->end()
+                ->with('topicCategories')
+                ->assertCount(
+                    ['min'           => 1,
+                        'minMessage' => 'Il faut au moins une catégorie (Contraintes Theia/Ozcar)',
+                    ]
+                )
+                ->end();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+        $repoChronique = $this->getBdohRepo('Chronique');
+        $repoPersonneTheia = $this->getBdohRepo('PersonneTheia');
+
+        $dataset = $this->getSubject();
+
+        $formMapper
+            ->add('titre', TextType::class, [
+                'required' => true,
+            ])
+            ->add('titreEn', TextType::class, [
+                'required' => true,
+            ])
+            ->add('uuid', HiddenType::class)
+            ->add('description', TextareaType::class, [
+                'required' => true,
+            ])
+            ->add('descriptionEn', TextareaType::class, [
+                'required' => true,
+            ])
+            ->add('genealogie', TextareaType::class, [], [
+                'required' => true,
+            ])
+            ->add('genealogieEn', TextareaType::class, [], [
+                'required' => true,
+            ])
+            ->add('dataConstraint', null, [
+                'required' => true,
+            ])
+            ->add(
+                'doi',
+                'sonata_type_model_list',
+                [
+                    'btn_add'  => false,
+                    'required' => false,
+                ],
+                [
+                ]
+            )
+            ->end()
+            ->with('Contact', ['class' => 'col-md-6'])
+            ->add('principalInvestigators', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => true,
+                'multiple' => true,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->add('dataManagers', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => false,
+                'multiple' => true,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->add('dataCollectors', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => false,
+                'multiple' => true,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->add('projectMembers', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => false,
+                'multiple' => true,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->end()
+            ->with('Mots clés', ['class' => 'col-md-6'])
+            ->add('topicCategories', null, [
+                'required' => true,
+            ])
+            ->add('inspireTheme')
+            ->add('portailSearchCriteriaClimat', null, [
+                'required' => true,
+                'expanded' => true,
+            ])
+            ->add('portailSearchCriteriaGeology', null, [
+                'required' => true,
+                'expanded' => true,
+            ])
+            ->end()
+            ->with('Chroniques', ['class' => 'col-md-12'])
+            ->add('chroniques', 'sonata_type_model', [
+                'query'        => $repoChronique->createQueryBuilderFilter('Chronique', null, $dataset),
+                'required'     => false,
+                'btn_add'      => false,
+                'multiple'     => true,
+                'by_reference' => false,
+                'property'     => 'nomLong', ])
+            ->end()
+            ->setHelps(
+                [
+                    'chroniques'             => $translator->trans('admin.help.astuce'),
+                    'inspireTheme'           => $translator->trans('admin.help.astuce'),
+                    'topicCategories'        => $translator->trans('admin.help.astuce'),
+                    'projectMembers'         => $translator->trans('admin.help.astuce'),
+                    'dataCollectors'         => $translator->trans('admin.help.astuce'),
+                    'dataManagers'           => $translator->trans('admin.help.astuce'),
+                    'principalInvestigators' => $translator->trans('admin.help.astuce'),
+                    'description'            => $translator->trans('admin.help.dataset.description'),
+                    'genealogie'             => $translator->trans('admin.help.dataset.genealogy'),
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataSet(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DatasetCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataSet(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DatasetUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationDataSet(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DatasetRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Doi.php b/src/Irstea/BdohAdminBundle/Admin/Data/Doi.php
new file mode 100644
index 0000000000000000000000000000000000000000..018f39a8d4ad7738f1f3961afbfab76f02b1e765
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Doi.php
@@ -0,0 +1,132 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+/**
+ * Class Doi.
+ */
+class Doi extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'identifiant',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('identifiant')
+            ->add('description');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $list)
+    {
+        $list
+            ->addIdentifier('identifiant', null, ['route' => ['name' => 'edit']])
+            ->add('description');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $form)
+    {
+        $form
+            ->add('identifiant', TextType::class, ['attr' => ['maxlength' => '255']])
+            ->add('description', TextType::class, ['attr' => ['maxlength' => '750']])
+            ->add('descriptionEn', TextType::class, ['attr' => ['maxlength' => '750']])
+            ->setHelps(
+                [
+                    'identifiant' => 'admin.help.doi.identifiant',
+                    'description' => 'admin.help.doi.description',
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prePersist($doi)
+    {
+        /* @var \Irstea\BdohDataBundle\Entity\Doi $doi */
+        $doi->setObservatoire(
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent()
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationDoi(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DoiCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationDoi(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DoiUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationDoi(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.DoiRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Echantillonnage.php b/src/Irstea/BdohAdminBundle/Admin/Data/Echantillonnage.php
new file mode 100644
index 0000000000000000000000000000000000000000..34f941f1a291bb782bd719acc585a51ffa4a258d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Echantillonnage.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class Echantillonnage.
+ */
+class Echantillonnage extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create')
+            ->remove('update')
+            ->remove('delete');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('nomEn');
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/FamilleParametres.php b/src/Irstea/BdohAdminBundle/Admin/Data/FamilleParametres.php
new file mode 100644
index 0000000000000000000000000000000000000000..835376c1be15c6f79f117fd7f6e9f805764f2f00
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/FamilleParametres.php
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohDataBundle\Entity\Repository\FamilleParametresRepository;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+
+/**
+ * Class FamilleParametres.
+ */
+class FamilleParametres extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les familles qui utilisent cette famille comme famille mère.
+     */
+    private $childrenFamilies = null;
+
+    /**
+     * @return array|null
+     */
+    public function getChildrenFamilies()
+    {
+        if ($this->childrenFamilies === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->childrenFamilies = $this->getBdohRepo('FamilleParametres')->findByFamilleParente($this->getSubject());
+        }
+
+        return $this->childrenFamilies;
+    }
+
+    /**
+     * Les types de paramètres qui sont dans cette famille de paramètres.
+     */
+    private $parameterTypes = null;
+
+    /**
+     * @return array|null
+     */
+    public function getParameterTypes()
+    {
+        if ($this->parameterTypes === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->parameterTypes = $this->getBdohRepo('TypeParametre')->findByFamilleParametres($this->getSubject());
+        }
+
+        return $this->parameterTypes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-famille-parametres.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $isLocaleEn = \strpos($this->getContainer()->get('translator')->getLocale(), 'en') === 0;
+        $label = $isLocaleEn ? 'nomEn' : 'nom';
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->addIdentifier('nomEn', null, ['route' => ['name' => 'edit']])
+            ->addIdentifier('prefix')
+            ->add('familleParente', null, ['associated_property' => $label]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+        $isLocaleEn = \strpos($translator->getLocale(), 'en') === 0;
+        /** @var FamilleParametresRepository $familleRepo */
+        $familleRepo = $this->getBdohRepo('FamilleParametres');
+        $choices = $familleRepo->findAllHierachy($this->getSubject() ?: null, $isLocaleEn);
+        $label = $isLocaleEn ? 'nomEn' : 'nom';
+        $formMapper
+            ->add('nom')
+            ->add('nomEn')
+            ->add('prefix')
+            ->add(
+                'familleParente',
+                ChoiceType::class,
+                [
+                    'choices'           => $choices,
+                    'choice_label'      => $label,
+                    'choice_attr'       => function ($family) {
+                        /* @var \Irstea\BdohDataBundle\Entity\FamilleParametres $family */
+                        return ['class' => 'hierarchy-level-' . $family->depth];
+                    },
+                    'choices_as_values' => true,
+                    'required'          => false,
+                ]
+            )
+            ->setHelps(
+                [
+                    'prefix'         => $translator->trans('admin.help.familleParametres.help-prefix'),
+                    'familleParente' => $translator->trans('admin.help.familleParametres.help-familleParente'),
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('familleParente');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationFamilleParametres(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.FamilleParametresCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationFamilleParametres(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.FamilleParametresUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationFamilleParametres(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.FamilleParametresRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/InspireTheme.php b/src/Irstea/BdohAdminBundle/Admin/Data/InspireTheme.php
new file mode 100644
index 0000000000000000000000000000000000000000..4743f84738954abce67b0d4364d279152afd4c27
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/InspireTheme.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class InspireTheme extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+
+        $formMapper
+            ->add('nom', TextType::class)
+           ->setHelps(
+               [
+            'nom'    => $translator->trans('admin.help.inspireTheme.nom'),
+           ]
+           );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationInspireTheme(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.InspireThemeCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationInspireTheme(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.InspireThemeUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationInspireTheme(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.InspireThemeRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/JeuQualite.php b/src/Irstea/BdohAdminBundle/Admin/Data/JeuQualite.php
new file mode 100644
index 0000000000000000000000000000000000000000..60af35be57b6c54f01b662539b983c5d34a8ec2d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/JeuQualite.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class JeuQualite.
+ */
+class JeuQualite extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create')
+            ->remove('update')
+            ->remove('delete');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('estAffectable');
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Milieu.php b/src/Irstea/BdohAdminBundle/Admin/Data/Milieu.php
new file mode 100644
index 0000000000000000000000000000000000000000..766af40612116ad8ea365bb6711c1a85c316dd7b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Milieu.php
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class Milieu extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom', TextType::class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationMilieu(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.MilieuCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationMilieu(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.MilieuUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationMilieu(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.MilieuRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Observatoire.php b/src/Irstea/BdohAdminBundle/Admin/Data/Observatoire.php
new file mode 100644
index 0000000000000000000000000000000000000000..8afd47fade908a7a0e9c687e10805d63eb80a4d0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Observatoire.php
@@ -0,0 +1,475 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohAdminBundle\Form\Type\FileType;
+use Irstea\BdohAdminBundle\Form\Type\WysiwygType;
+use Irstea\BdohDataBundle\Entity\JeuQualite;
+use Irstea\BdohDataBundle\Entity\Repository\JeuQualiteRepository;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\CoreBundle\Validator\ErrorElement;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
+use Symfony\Component\Form\Extension\Core\Type\EmailType;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\Extension\Core\Type\UrlType;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * Class Observatoire.
+ */
+class Observatoire extends Admin
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Observatoire|null
+     */
+    protected $previousObs = null;
+
+    /**
+     * @var bool|null
+     */
+    protected $isCurrentObs = null;
+
+    /**
+     * @return bool|null
+     */
+    public function isCurrentObs()
+    {
+        if ($this->isCurrentObs === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->isCurrentObs =
+                $this->getSubject() === $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        }
+
+        return $this->isCurrentObs;
+    }
+
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * List of sites in the observatory.
+     */
+    private $sites = null;
+
+    /**
+     * @return array|null
+     */
+    public function getSites()
+    {
+        if ($this->sites === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->sites = $this->getSubject()->getSites();
+        }
+
+        return $this->sites;
+    }
+
+    /**
+     * Number of scales linked to the observatory.
+     */
+    private $scales = null;
+
+    /**
+     * @return array|null
+     */
+    public function getScales()
+    {
+        if ($this->scales === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->scales = $this->getBdohRepo('Bareme')->findByObservatoire($this->getSubject());
+        }
+
+        return $this->scales;
+    }
+
+    /**
+     * Number of basins linked to the observatory.
+     */
+    private $basins = null;
+
+    /**
+     * @return array|null
+     */
+    public function getBasins()
+    {
+        if ($this->basins === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->basins = $this->getBdohRepo('Bassin')->findByObservatoire($this->getSubject());
+        }
+
+        return $this->basins;
+    }
+
+    /**
+     * Number of river linked to the observatory.
+     */
+    private $rivers = null;
+
+    /**
+     * @return array|null
+     */
+    public function getRivers()
+    {
+        if ($this->rivers === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->rivers = $this->getBdohRepo('CoursEau')->findByObservatoire($this->getSubject());
+        }
+
+        return $this->rivers;
+    }
+
+    /**
+     * Number of DOIs linked to the observatory.
+     */
+    private $dois = null;
+
+    /**
+     * @return array|null
+     */
+    public function getDois()
+    {
+        if ($this->dois === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->dois = $this->getBdohRepo('Doi')->findByObservatoire($this->getSubject());
+        }
+
+        return $this->dois;
+    }
+
+    private $partenaires = null;
+
+    /**
+     * @return array|null
+     */
+    public function getPartenaires()
+    {
+        if ($this->partenaires === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->partenaires = $this->getBdohRepo('Partenaires')->findByObservatoire($this->getSubject());
+        }
+
+        return $this->partenaires;
+    }
+
+    /**
+     * @var null
+     */
+    private $mustDefineUpdate = null;
+
+    /**
+     * @return bool
+     */
+    public function getMustDefineUpdate()
+    {
+        $subject = $this->getSubject();
+        if ($this->mustDefineUpdate === null) {
+            $this->mustDefineUpdate = $subject && $subject->getId() && $subject->getTheiaCode() === null;
+        }
+
+        return $this->mustDefineUpdate;
+    }
+
+    /**
+     * Pre-update :
+     *  => Moves uploaded image files to webdir.
+     *
+     * {@inheritdoc}
+     */
+    public function preUpdate($object)
+    {
+        /*
+         * Before update, Doctrine has already persited in cache the modification
+         * That's why if we want to find the slug before pre update it doesn't exist
+         * Now we know there is a modification of slug if the result of the query returns null
+         */
+
+        $oldObs = $this->getBdohRepo('Observatoire')->findOneBySlug($object->getSlug());
+        $this->previousObs = $oldObs;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationObservatoire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ObservatoireCreate',
+            $object
+        );
+    }
+
+    /**
+     * Post-update :
+     *  => Removes 'observatoire' css file. It will be recreated on the next request.
+     *  => Redirect to home.
+     *
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationObservatoire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ObservatoireUpdate',
+            $object
+        );
+
+        /* on ne redirifge sur le nouveau slug que si c'est l'observatoire courant qui a été modifié */
+        if (!$this->previousObs && $this->isCurrentObs()) {
+            $redirect = new RedirectResponse(
+                $this->getContainer()->get('router')->generate(
+                    'bdoh_admin_observatoire_edit',
+                    ['id' => $object->getId(), '_observatoire' => $object->getSlug()]
+                )
+            );
+            $redirect->send();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        /* construction / enregistrement de l'information isCurrentObs avant la suppression */
+        $this->isCurrentObs();
+
+        $this->logger->createHistoriqueAdministrationObservatoire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.ObservatoireRemove',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postRemove($object)
+    {
+        /* redirection sur la page d'accueil de tous les observatoires si on supprime l'observatoire courant */
+        if ($this->isCurrentObs()) {
+            $redirect = new RedirectResponse(
+                $this->getContainer()->get('router')->generate('bdoh_all_home')
+            );
+            $redirect->send();
+        }
+    }
+
+    /**
+     * Since it uses "colopicker", "image" and "wysiwyg html editor" widgets,
+     * the 'Observatoire' admin uses its own editing template.
+     *
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-observatoire.html.twig';
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-observatoire.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('nom')
+            ->add('theiaCode')
+            ->add('projectLeader')
+            ->add('dataManagers')
+            ->add('titre')
+            ->add('partenaires')
+            ->add('dataSets');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('theiaCode')
+            ->add('projectLeader')
+            ->add('dataManagers')
+            ->add('titre')
+            ->add('partenaires')
+            ->add('dataSets');
+    }
+
+    public function validate(ErrorElement $errorElement, $object)
+    {
+        $errorElement
+            ->with('theiaCode')
+            ->assertLength([
+                'min' => 4,
+                'max' => 4, ])
+            ->assertRegex([
+                'pattern' => '/[a-z0-9]/',
+                'match'   => false,
+                'message' => 'Un Identifiant Theia doit faire 4 caractères et être en MAJUSCULE !!!',
+            ])
+            ->end();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+        $repoPersonneTheia = $this->getBdohRepo('PersonneTheia');
+
+        $formMapper
+            ->add(
+                'nom',
+                TextType::class,
+                [
+                    'required' => true,
+                ]
+            )
+            ->add(
+                'titre',
+                TextType::class,
+                [
+                    'required' => true,
+                ]
+            )
+            ->add(
+                'titreEn',
+                TextType::class,
+                [
+                    'required' => true,
+                ]
+            )
+            ->add('description', WysiwygType::class)
+            ->add('descriptionEn', WysiwygType::class)
+            ->add('email', EmailType::class, [
+                'required' => false,
+            ])
+            ->add('lien', UrlType::class, ['required' => false])
+            ->add(
+                'jeu',
+                EntityType::class,
+                [
+                    'required'      => true,
+                    'expanded'      => true,
+                    'multiple'      => false,
+                    'class'         => JeuQualite::class,
+                    'query_builder' => function (JeuQualiteRepository $repo) {
+                        return $repo->createQueryBuilder('jq')->where('jq.estAffectable = TRUE');
+                    },
+                ]
+            )
+            ->add(
+                'doiPrincipal',
+                'sonata_type_model_list',
+                [
+                    'btn_add'  => false,
+                    'required' => false,
+                ],
+                ['placeholder' => 'Pas de DOI',
+                ]
+            )
+            ->add(
+                'theiaCode',
+                TextType::class,
+                [
+                    'required' => false,
+                ]
+            )
+            ->add(
+                'theiaPassword',
+                PasswordType::class,
+                [
+                    'required' => false,
+                ]
+            )
+            ->end()
+            ->with('Contact', ['class' => 'col-md-12'])
+            ->add('projectLeader', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => true,
+                'multiple' => false,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->add('dataManagers', 'sonata_type_model', [
+                'query'    => $repoPersonneTheia->createQueryBuilder('PersonneTheia'),
+                'required' => false,
+                'multiple' => true,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->end()
+            ->with('fieldset.graphic', ['collapsed' => true])
+            // colorpicker 1st widget
+            ->add('couleurPrimaire', TextType::class, ['required' => true], ['block_name' => 'couleur'])
+            // colorpicker 2nd widget
+            ->add('couleurSecondaire', TextType::class, ['required' => true], ['block_name' => 'couleur'])
+            // image widget
+            ->add(
+                'pathLogo',
+                FileType::class,
+                ['required' => false, 'accept' => ['image/*', '.png', '.jpg', '.gif'], 'label' => 'fileLogo']
+            )
+            // image widget
+            ->add(
+                'pathPhotoPrincipale',
+                FileType::class,
+                ['required' => false, 'accept' => ['image/*', '.png', '.jpg', '.gif'], 'label' => 'filePhotoPrincipale']
+            )
+            // image widget
+            ->add(
+                'pathPhotoSecondaire',
+                FileType::class,
+                ['required' => false, 'accept' => ['image/*', '.png', '.jpg', '.gif'], 'label' => 'filePhotoSecondaire']
+            )
+            ->end()
+            ->setHelps(
+                [
+                    'jeu'          => $translator->trans('admin.help.observatoire.jeu'),
+                    'titre'        => $translator->trans('admin.help.observatoire.titre-info'),
+                    'email'        => $translator->trans('admin.help.observatoire.email-info'),
+                    'theiaCode'    => $translator->trans('admin.help.observatoire.theiaCode-message'),
+                    'doiPrincipal' => $translator->trans('admin.help.observatoire.doi-principal-message'),
+                    'dataManagers' => $translator->trans('admin.help.astuce'),
+                ]
+            );
+
+        // Met en place une gestion spéciale pour le mot de passe
+        $formMapper->get('theiaPassword')
+            ->addEventSubscriber($this->getContainer()->get('irstea_bdoh_theia_ozcar.password_event_subscriber'));
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Partenaire.php b/src/Irstea/BdohAdminBundle/Admin/Data/Partenaire.php
new file mode 100644
index 0000000000000000000000000000000000000000..3743888652373a757f9ed3c5c31a35f793019122
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Partenaire.php
@@ -0,0 +1,507 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohAdminBundle\Form\Type\FileType;
+use Irstea\BdohDataBundle\Entity\Partenaire as PartenaireEntity;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\CoreBundle\Validator\ErrorElement;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\Extension\Core\Type\UrlType;
+
+/**
+ * Class Partenaire.
+ */
+class Partenaire extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les chroniques qui utilisent ce partenaire.
+     */
+    private $timeSeries = null;
+
+    /**
+     * @return array|null
+     */
+    public function getTimeSeries()
+    {
+        if ($this->timeSeries === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->timeSeries = $this->getBdohRepo('Chronique')->findByProducteur($this->getSubject());
+        }
+
+        return $this->timeSeries;
+    }
+
+    /**
+     * Les observatoires qui utilisent ce partenaire.
+     */
+    private $observatories = null;
+
+    /**
+     * @return array|null
+     */
+    public function getObservatories()
+    {
+        if ($this->observatories === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->observatories = $this->getBdohRepo('Observatoire')->findByPartenaire($this->getSubject());
+        }
+
+        return $this->observatories;
+    }
+
+    protected function configureBatchActions($actions)
+    {
+        if ($this->hasRequest() && $this->getRequest()->get('no_batch')) {
+            return [];
+        }
+
+        return parent::configureBatchActions($actions);
+    }
+
+    public function getExportFormats()
+    {
+        if ($this->hasRequest() && $this->getRequest()->get('no_batch')) {
+            return [];
+        }
+
+        return parent::getExportFormats();
+    }
+
+    public function getFundings()
+    {
+        $subject = $this->getSubject();
+        $financeur = (bool) $subject->getEstFinanceur();
+
+        return $financeur;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-partenaire.html.twig';
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-partenaire.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationPartenaire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PartenaireCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationPartenaire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PartenaireUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationPartenaire(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PartenaireRemove',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNewInstance()
+    {
+        $object = parent::getNewInstance();
+
+        $object->setObservatoire(
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent()
+        );
+
+        return $object;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('lien')
+            ->add('iso')
+            ->add('estFinanceur')
+            ->add('observatoire');
+    }
+
+    public function validate(ErrorElement $errorElement, $object)
+    {
+        $subject = $this->getSubject();
+        $iso = (string) $subject->getIso();
+        $financeur = (bool) $subject->getEstFinanceur();
+
+        if ($iso == 'FR') {
+            $errorElement
+                ->with('scanR')
+                ->assertNotNull([
+                    'message' => 'IdScanR obligatoire pour un partenaire français',
+                ])
+                ->end();
+        }
+
+        $errorElement
+                ->with('typeFundings')
+                ->assertNotNull([
+                    'message'            => 'Compléter le champs',
+                ])
+                ->end();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        /* @var $subject PartenaireEntity */
+        $translator = $this->getContainer()->get('translator');
+
+        $formMapper
+            ->add('nom')
+            ->add('lien', UrlType::class, ['required' => false])
+            // image widget
+            ->add(
+                'pathLogo',
+                FileType::class,
+                [
+                    'required' => false,
+                    'accept'   => 'image/*,.png,.jpg,.gif',
+                    'label'    => 'fileLogo',
+                ]
+            )
+            ->end()
+            ->with('Pays', ['class' => 'col-md-6'])
+            ->add('iso', ChoiceType::class, [
+                'choices' => [
+                    'FR' => 'France',
+                    'AF' => 'Afghanistan',
+                    'AL' => 'Albanie',
+                    'DZ' => 'Algérie',
+                    'AS' => 'Samoa orientales',
+                    'AD' => 'Andorre',
+                    'AO' => 'Angola',
+                    'AI' => 'Anguilla',
+                    'AQ' => 'Antarctique',
+                    'AG' => 'Antigua-et-Barbuda',
+                    'AR' => 'Argentine',
+                    'AM' => 'Arménie',
+                    'AW' => 'Aruba',
+                    'AU' => 'Australie',
+                    'AT' => 'Autriche',
+                    'AZ' => 'Azerbaïdjan',
+                    'BS' => 'Bahamas',
+                    'BH' => 'Bahreïn',
+                    'BD' => 'Bangladesh',
+                    'BB' => 'Barbade',
+                    'BY' => 'Biélorussie',
+                    'BE' => 'Belgique',
+                    'BZ' => 'Bélize',
+                    'BJ' => 'Bénin',
+                    'BM' => 'Bermudes',
+                    'BT' => 'Bhoutan',
+                    'BO' => 'Bolivie',
+                    'BA' => 'Bosnie-Herzégovine',
+                    'BW' => 'Botswana',
+                    'BV' => 'Bouvet (ÃŽle)',
+                    'BR' => 'Brésil',
+                    'BN' => 'Bruneï',
+                    'BG' => 'Bulgarie',
+                    'BF' => 'Burkina Faso',
+                    'BI' => 'Burundi',
+                    'KH' => 'Cambodge',
+                    'CM' => 'Cameroun',
+                    'CA' => 'Canada',
+                    'CV' => 'Cap Vert',
+                    'KY' => 'Caïmans (Îles)',
+                    'CF' => 'République Centrafricaine',
+                    'TD' => 'Tchad',
+                    'CL' => 'Chili',
+                    'CN' => 'Chine',
+                    'CX' => 'Christmas (ÃŽle)',
+                    'CC' => 'Cocos / Keeling (ÃŽles)',
+                    'CO' => 'Colombie',
+                    'KM' => 'Comores',
+                    'CG' => 'Congo',
+                    'CD' => 'République Démocratique du Congo',
+                    'CK' => 'Cook (ÃŽles)',
+                    'CR' => 'Costa Rica',
+                    'CI' => 'Côte D Ivoire',
+                    'HR' => 'Croatie',
+                    'CU' => 'Cuba',
+                    'CY' => 'Chypre',
+                    'CZ' => 'République Tchèque',
+                    'DK' => 'Danemark',
+                    'DJ' => 'Djibouti',
+                    'DM' => 'Dominique',
+                    'DO' => 'République Dominicaine',
+                    'TP' => 'Timor-Oriental',
+                    'EC' => 'Equateur',
+                    'EG' => 'Egypte',
+                    'SV' => 'Salvador',
+                    'GQ' => 'Guinée Equatoriale',
+                    'ER' => 'Erythrée',
+                    'EE' => 'Estonie',
+                    'ET' => 'Ethiopie',
+                    'FK' => 'Falkland / Malouines (ÃŽles)',
+                    'FO' => 'Féroé (Îles)',
+                    'FJ' => 'Fiji',
+                    'FI' => 'Finlande',
+                    'FX' => 'France métropolitaine',
+                    'GF' => 'Guyane française',
+                    'PF' => 'Polynésie française',
+                    'TF' => 'Territoires Antarctiques français',
+                    'GA' => 'Gabon',
+                    'GM' => 'Gambie',
+                    'GE' => 'Géorgie',
+                    'DE' => 'Allemagne',
+                    'GH' => 'Ghana',
+                    'GI' => 'Gibraltar',
+                    'GR' => 'Grèce',
+                    'GL' => 'Groënland',
+                    'GD' => 'Grenade',
+                    'GP' => 'Guadeloupe',
+                    'GU' => 'Guam',
+                    'GT' => 'Guatemala',
+                    'GN' => 'Guinée',
+                    'GW' => 'Guinée-Bissau',
+                    'GY' => 'Guyana',
+                    'HT' => 'Haïti',
+                    'HM' => 'Territoire des ÃŽles Heard et McDonald',
+                    'VA' => 'Vatican',
+                    'HN' => 'Honduras',
+                    'HK' => 'Hong Kong',
+                    'HU' => 'Hongrie',
+                    'IS' => 'Islande',
+                    'IN' => 'Inde',
+                    'ID' => 'Indonésie',
+                    'IR' => 'Iran',
+                    'IQ' => 'Irak',
+                    'IE' => 'Irlande',
+                    'IL' => 'Israël',
+                    'IT' => 'Italie',
+                    'JM' => 'Jamaïque',
+                    'JP' => 'Japon',
+                    'JO' => 'Jordanie',
+                    'KZ' => 'Kazakstan',
+                    'KE' => 'Kenya',
+                    'KI' => 'Kiribati',
+                    'KP' => 'Corée (République populaire démocratique du)',
+                    'KR' => 'Corée (République démocratique du)',
+                    'KW' => 'Koweït',
+                    'KG' => 'Kyrgyzstan',
+                    'LA' => 'Laos (République populaire démocratique du)',
+                    'LV' => 'Lettonie',
+                    'LB' => 'Liban',
+                    'LS' => 'Lesotho',
+                    'LR' => 'Libéria',
+                    'LY' => 'Libye (Jamahiriya Arabe Libyenne)',
+                    'LI' => 'Liechtenstein',
+                    'LT' => 'Lithuanie',
+                    'LU' => 'Luxembourg',
+                    'MO' => 'Macau',
+                    'MK' => 'Macédoine (ancienne République yougoslave de)',
+                    'MG' => 'Madagascar',
+                    'MW' => 'Malawi',
+                    'MY' => 'Malaysie',
+                    'MV' => 'Maldives',
+                    'ML' => 'Mali',
+                    'MT' => 'Malte',
+                    'MH' => 'Marshall (ÃŽles)',
+                    'MQ' => 'Martinique',
+                    'MR' => 'Mauritanie',
+                    'MU' => 'Maurice',
+                    'YT' => 'Mayotte',
+                    'MX' => 'Mexique',
+                    'FM' => 'Micronésie (Etats fédérés de)',
+                    'MD' => 'Moldavie',
+                    'MC' => 'Monaco',
+                    'MN' => 'Mongolie',
+                    'MS' => 'Montserrat',
+                    'MA' => 'Maroc',
+                    'MZ' => 'Mozambique',
+                    'MM' => 'Myanmar',
+                    'NA' => 'Namibie',
+                    'NR' => 'Nauru',
+                    'NP' => 'Népal',
+                    'NL' => 'Pays-Bas',
+                    'AN' => 'Antilles néerlandaises',
+                    'NC' => 'Nouvelle-Calédonie',
+                    'NZ' => 'Nouvelle-Zélande',
+                    'NI' => 'Nicaragua',
+                    'NE' => 'Niger',
+                    'NG' => 'Nigéria',
+                    'NU' => 'Niue',
+                    'NF' => 'Norfolk (ÃŽle)',
+                    'MP' => 'Mariannes (ÃŽles)',
+                    'NO' => 'Norvège',
+                    'OM' => 'Oman',
+                    'PK' => 'Pakistan',
+                    'PW' => 'Palau',
+                    'PA' => 'Panama',
+                    'PG' => 'Papouasie Nouvelle-Guinée',
+                    'PY' => 'Paraguay',
+                    'PE' => 'Pérou',
+                    'PH' => 'Philippines',
+                    'PN' => 'Pitcaïrn',
+                    'PL' => 'Pologne',
+                    'PT' => 'Portugal',
+                    'PR' => 'Porto Rico',
+                    'QA' => 'Quatar',
+                    'RE' => 'Réunion',
+                    'RO' => 'Romania',
+                    'RU' => 'Russie (Fédération de)',
+                    'RW' => 'Rwanda',
+                    'KN' => 'Saint Kitts et Nevis',
+                    'LC' => 'Sainte Lucie',
+                    'VC' => 'Saint Vincent et Grenadines',
+                    'WS' => 'Samoa',
+                    'SM' => 'San Marin',
+                    'ST' => 'Sao Tomé et Principe',
+                    'SA' => 'Arabie Séoudite',
+                    'SN' => 'Sénégal',
+                    'SC' => 'Seychelles',
+                    'SL' => 'Sierra Léone',
+                    'SG' => 'Singapour',
+                    'SK' => 'Slovaquie',
+                    'SI' => 'Slovénie',
+                    'SB' => 'Salomon (ÃŽles)',
+                    'SO' => 'Somalie',
+                    'ZA' => 'Afrique du Sud',
+                    'GS' => 'Géorgie du Sud et îles Sandwich du Sud',
+                    'ES' => 'Espagne',
+                    'LK' => 'Sri Lanka',
+                    'SH' => 'Ste Hélène',
+                    'PM' => 'St. Pierre et Miquelon',
+                    'SD' => 'Soudan',
+                    'SR' => 'Surinam',
+                    'SJ' => 'Svalbard et Jan Mayen (ÃŽles)',
+                    'SZ' => 'Swaziland',
+                    'SE' => 'Suède',
+                    'CH' => 'Suisse',
+                    'SY' => 'Syrie (République arabe syrienne)',
+                    'TW' => 'Taïwan',
+                    'TJ' => 'Tadjikistan',
+                    'TZ' => 'Tanzanie',
+                    'TH' => 'Thaïlande',
+                    'TG' => 'Togo',
+                    'TK' => 'Tokelau',
+                    'TO' => 'Tonga',
+                    'TT' => 'Trinidad et Tobago',
+                    'TN' => 'Tunisie',
+                    'TR' => 'Turquie',
+                    'TM' => 'Turkménistan',
+                    'TC' => 'Turks et Caicos (ÃŽles)',
+                    'TV' => 'Tuvalu',
+                    'UG' => 'Ouganda',
+                    'UA' => 'Ukraine',
+                    'AE' => 'Emirats Arabes Unis',
+                    'GB' => 'Royaume-Uni',
+                    'US' => 'Etats-Unis',
+                    'UM' => 'Territoires non incorporés des États-Unis ',
+                    'UY' => 'Uruguay',
+                    'UZ' => 'Ouzbékistan',
+                    'VU' => 'Vanuatu',
+                    'VE' => 'Vénézuela',
+                    'VN' => 'Vietnam',
+                    'VG' => 'Vierges (ÃŽles) - RU',
+                    'VI' => 'Vierges (ÃŽles) - EU',
+                    'WF' => 'Wallis et Futuna (ÃŽles)',
+                    'EH' => 'Sahara Occidental',
+                    'YE' => 'Yemen',
+                    'YU' => 'Yougoslavie',
+                    'ZM' => 'Zambie',
+                    'ZW' => 'Zimbabwe',
+                ],
+            ])
+            ->add(
+                'scanR',
+                TextType::class,
+                [
+                    'required' => false,
+                ]
+            )
+            ->end()
+            ->with('Financeur/Organisation', ['class' => 'col-md-6'])
+            ->add('estFinanceur', ChoiceType::class, [
+                'expanded' => true,
+
+                'choices' => [
+                    false => 'Non',
+                    true  => 'Oui',
+                ],
+            ])
+            ->add('typeFundings', null, [
+                'required'    => true,
+            ])
+            ->end()
+            ->setHelps(
+                [
+                    'scanR'                    => $translator->trans('admin.help.partenaire.help-scanR'),
+                    'estFinanceur'             => $translator->trans('admin.help.partenaire.help-boolean'),
+                ]
+            );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/PersonneTheia.php b/src/Irstea/BdohAdminBundle/Admin/Data/PersonneTheia.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8dded2cacb0dc5bd71b4b8ede0876451541f3e8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/PersonneTheia.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class PersonneTheia extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('prenom')
+            ->add('email')
+            ->add('partenaire')
+            ->add('utilisateur');
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+        $repoPartenaire = $this->getBdohRepo('Partenaire');
+
+        $formMapper
+            ->add('nom', TextType::class)
+            ->add('prenom', TextType::class)
+            ->add('email', TextType::class)
+            ->add('partenaire', 'sonata_type_model', [
+                'query'    => $repoPartenaire->createQueryBuilder('p'),
+                'required' => true,
+                'multiple' => false,
+                'btn_add'  => $translator->trans('button.add'),
+            ])
+            ->add('utilisateur', null, [
+                'required' => false,
+    ]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationPersonneTheia(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PersonneTheiaCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationPersonneTheia(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PersonneTheiaUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationPersonneTheia(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.PersonneTheiaRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/SiteExperimental.php b/src/Irstea/BdohAdminBundle/Admin/Data/SiteExperimental.php
new file mode 100644
index 0000000000000000000000000000000000000000..30106034284d3a07a25f7a56d67d871533d2bfa8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/SiteExperimental.php
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohAdminBundle\Form\Type\WysiwygType;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+
+/**
+ * Class SiteExperimental.
+ */
+class SiteExperimental extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * List of stations in the site.
+     */
+    private $stations = null;
+
+    /**
+     * @return array|null
+     */
+    public function getStations()
+    {
+        if ($this->stations === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->stations = $this->getSubject()->getStations();
+        }
+
+        return $this->stations;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-site.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * Sets 'observatoire' attribute to the current 'observatoire'.
+     *
+     * {@inheritdoc}
+     */
+    public function prePersist($site)
+    {
+        $site->setObservatoire(
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent()
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom')
+            ->add('description', WysiwygType::class, ['required' => false])
+            ->add('descriptionEn', WysiwygType::class, ['required' => false]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationSiteExperimental(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.SiteExperimentalCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationSiteExperimental(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.SiteExperimentalUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationSiteExperimental(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.SiteExperimentalRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Station.php b/src/Irstea/BdohAdminBundle/Admin/Data/Station.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a3e3da8407798c9c168f4dc20b7d3fa6502e732
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Station.php
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+
+/**
+ * Class Station.
+ */
+class Station extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * List of time series in the station.
+     */
+    private $timeSeries = null;
+
+    /**
+     * @return array|null
+     */
+    public function getTimeSeries()
+    {
+        if ($this->timeSeries === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->timeSeries = $this->getSubject()->getChroniques();
+        }
+
+        return $this->timeSeries;
+    }
+
+    /**
+     * Les bassins qui utilisent cette station en tant que station exutoire.
+     */
+    private $basins = null;
+
+    /**
+     * @return array|null
+     */
+    public function getBasins()
+    {
+        if ($this->basins === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->basins = $this->getBdohRepo('Bassin')->findByStationExutoire($this->getSubject());
+        }
+
+        return $this->basins;
+    }
+
+    /**
+     * In order to delete the "add and delete" tools for Station.commune field,
+     * the 'Station' admin uses its own editing template.
+     *
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-station.html.twig';
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-station.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('code')
+            ->add('codeAlternatif')
+            ->add('commune')
+            ->add('altitude')
+            ->add('estActive');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+        $repoSite = $this->getBdohRepo('SiteExperimental');
+        $repoCommune = $this->getBdohRepo('Commune');
+
+        $formMapper
+            ->add('nom')
+            ->add('code')
+            ->add(
+                'commune',
+                'sonata_type_model_autocomplete',
+                ['property'  => ['nom', 'codePostal'], 'required'  => false]
+            )
+            ->add('sites', null, ['required' => true, 'query_builder' => $repoSite->createSecuredQueryBuilder($this->getUser())])
+            ->add('codeAlternatif')
+            ->add('altitude', 'number', ['required' => false, 'precision' => 3])
+            ->add('latitude', 'number', ['required' => false, 'precision' => 3])
+            ->add('longitude', 'number', ['required' => false, 'precision' => 3])
+            ->add('commentaire', 'textarea', ['required' => false])
+            ->add('commentaireEn', 'textarea', ['required' => false])
+            ->add('estActive', 'checkbox', ['required' => false])
+            ->setHelps(
+                [
+                    'code'           => $translator->trans('admin.help.station.code'),
+                    'codeAlternatif' => $translator->trans('admin.help.station.codeAlternatif'),
+                    'latitude'       => $translator->trans('admin.help.station.latlong'),
+                    'longitude'      => $translator->trans('admin.help.station.latlong'),
+                    'commune'        => $translator->trans('admin.help.station.town-name-is-case-sensitive'),
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationStation(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.StationCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $stationRepo = $this->getBdohRepo('Station');
+        $stationRepo->updatePosition($object);
+
+        $this->logger->createHistoriqueAdministrationStation(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.StationUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationStation(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.StationRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/TheiaCategories.php b/src/Irstea/BdohAdminBundle/Admin/Data/TheiaCategories.php
new file mode 100644
index 0000000000000000000000000000000000000000..df3363ddd34ee85a7b351602becbe38e91ceab86
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/TheiaCategories.php
@@ -0,0 +1,128 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohAdminBundle\Form\Type\TheiaThesaurusType;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\CoreBundle\Validator\ErrorElement;
+use Symfony\Component\Form\Extension\Core\Type\HiddenType;
+
+class TheiaCategories extends Admin
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->add('familleParametre')
+            ->add('milieu');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('milieu')
+            ->add('familleParametre');
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+
+        $formMapper
+            ->add('milieu', null, ['required' => true])
+            ->add('nom', HiddenType::class)
+            ->add('familleParametre', null, ['required' => true])
+            ->add(
+                'uriOzcarTheia',
+                TheiaThesaurusType::class,
+                [
+                    'multiple' => true,
+                    'required' => true,
+                ]
+            )
+        ->setHelps(['uriOzcarTheia' => $translator->trans('admin.help.theia.uriOzcarTheia')]);
+    }
+
+    public function validate(ErrorElement $errorElement, $object)
+    {
+        $errorElement
+            ->with('uriOzcarTheia')
+            ->assertCount(
+                [
+                    'min'        => 1,
+                    'minMessage' => 'Veuillez sélectionner au moins une catégorie',
+                ]
+            )
+            ->end();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationTheiaCategories(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TheiaCategoriesCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationTheiaCategories(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TheiaCategoriesUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationTheiaCategories(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TheiaCategoriesRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/TopicCategory.php b/src/Irstea/BdohAdminBundle/Admin/Data/TopicCategory.php
new file mode 100644
index 0000000000000000000000000000000000000000..76028d152a179fe6e95ec1cc284d839d5227268b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/TopicCategory.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class TopicCategory extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $translator = $this->getContainer()->get('translator');
+
+        $formMapper
+            ->add('nom', TextType::class)
+            ->setHelps(
+                [
+                    'nom'    => $translator->trans('admin.help.topicCategory.nom'),
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationTopicCategory(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TopicCategoryCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationTopicCategory(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TopicCategoryUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationTopicCategory(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TopicCategoryRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/TypeFunding.php b/src/Irstea/BdohAdminBundle/Admin/Data/TypeFunding.php
new file mode 100644
index 0000000000000000000000000000000000000000..d618a42839445168346528800a192db7c7edd8e5
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/TypeFunding.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+class TypeFunding extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']]);
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('nom', TextType::class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeFunding(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeFundingCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeFunding(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeFundingUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeFunding(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeFundingRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/TypeParametre.php b/src/Irstea/BdohAdminBundle/Admin/Data/TypeParametre.php
new file mode 100644
index 0000000000000000000000000000000000000000..536c22e9ae8e9d8262b3113d13ec4141c9df1ba7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/TypeParametre.php
@@ -0,0 +1,197 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Irstea\BdohDataBundle\Entity\Repository\FamilleParametresRepository;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+
+/**
+ * Class TypeParametre.
+ */
+class TypeParametre extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les chroniques qui utilisent ce type de paramètre.
+     */
+    private $timeSeries = null;
+
+    /**
+     * @return array|null
+     */
+    public function getTimeSeries()
+    {
+        if ($this->timeSeries === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->timeSeries = $this->getBdohRepo('Chronique')->findByParametre($this->getSubject());
+        }
+
+        return $this->timeSeries;
+    }
+
+    /**
+     * @var null
+     */
+    private $mustDefineParameterFamily = null;
+
+    /**
+     * @return bool
+     */
+    public function getMustDefineParameterFamily()
+    {
+        $subject = $this->getSubject();
+        if ($this->mustDefineParameterFamily === null) {
+            $this->mustDefineParameterFamily = $subject && $subject->getId() && $subject->getFamilleParametres() === null;
+        }
+
+        return $this->mustDefineParameterFamily;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-type-parametre.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $isLocaleEn = \strpos($this->getContainer()->get('translator')->getLocale(), 'en') === 0;
+        $label = $isLocaleEn ? 'nomEn' : 'nom';
+        $listMapper
+            ->addIdentifier('nom', null, ['route' => ['name' => 'edit']])
+            ->addIdentifier('nomEn', null, ['route' => ['name' => 'edit']])
+            ->add('code')
+            ->add('familleParametres', null, ['associated_property' => $label]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $isLocaleEn = \strpos($this->getContainer()->get('translator')->getLocale(), 'en') === 0;
+        /** @var FamilleParametresRepository $familleRepo */
+        $familleRepo = $this->getBdohRepo('FamilleParametres');
+        $choices = $familleRepo->findAllHierachy(null, $isLocaleEn);
+        $label = $isLocaleEn ? 'nomEn' : 'nom';
+        $formMapper
+            ->add('nom')
+            ->add('nomEn')
+            ->add('code')
+            ->add(
+                'familleParametres',
+                ChoiceType::class,
+                [
+                    'choices'           => $choices,
+                    'choice_label'      => $label,
+                    'choice_attr'       => function ($family) {
+                        /* @var \Irstea\BdohDataBundle\Entity\FamilleParametres $family */
+                        return ['class' => 'hierarchy-level-' . $family->depth];
+                    },
+                    'choices_as_values' => true,
+                    'required'          => true,
+                ]
+            )
+            ->add(
+                'unites',
+                'sonata_type_model',
+                [
+                    'expanded' => true,
+                    'multiple' => true,
+                    'required' => false,
+                    'query'    => $this->getBdohRepo('Unite')->createOrderedQueryBuilder(),
+                    'attr'     => ['class' => 'inputs-list-inline'],
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('familleParametres');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeParametre(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeParametreCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeParametre(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeParametreUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationTypeParametre(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.TypeParametreRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Data/Unite.php b/src/Irstea/BdohAdminBundle/Admin/Data/Unite.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b3279cce2e0b41937f86859dfe991ac22580efc
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Data/Unite.php
@@ -0,0 +1,167 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Data;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+
+/**
+ * Class Unite.
+ */
+class Unite extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'libelle',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * Les chroniques qui utilisent cette unité.
+     */
+    private $timeSeries = null;
+
+    /**
+     * @return array|null
+     */
+    public function getTimeSeries()
+    {
+        if ($this->timeSeries === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->timeSeries = $this->getBdohRepo('Chronique')->findByUnite($this->getSubject());
+        }
+
+        return $this->timeSeries;
+    }
+
+    /**
+     * Les bnarèmes qui utilisent cette unité.
+     */
+    private $scales = null;
+
+    /**
+     * @return array|null
+     */
+    public function getScales()
+    {
+        if ($this->scales === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->scales = $this->getBdohRepo('Bareme')->findByUnite($this->getSubject());
+        }
+
+        return $this->scales;
+    }
+
+    /**
+     * Les types de paramètre qui utilisent cette unité.
+     */
+    private $parameterTypes = null;
+
+    /**
+     * @return array|null
+     */
+    public function getParameterTypes()
+    {
+        if ($this->parameterTypes === null && $this->getSubject() && $this->getSubject()->getId()) {
+            $this->parameterTypes = $this->getBdohRepo('TypeParametre')->findByUnite($this->getSubject());
+        }
+
+        return $this->parameterTypes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTemplate($name)
+    {
+        switch ($name) {
+            case 'edit':
+                return 'IrsteaBdohAdminBundle:CRUD:edit-unite.html.twig';
+            case 'delete':
+                return 'IrsteaBdohAdminBundle:CRUD:delete-unite.html.twig';
+            default:
+                return parent::getTemplate($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('libelle', null, ['route' => ['name' => 'edit']]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('libelle')
+            ->add('libelleEn');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationUnite(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.UniteCreate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationUnite(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.UniteUpdate',
+            $object
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function preRemove($object)
+    {
+        $this->logger->createHistoriqueAdministrationUnite(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.UniteRemove',
+            $object
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/Security/Utilisateur.php b/src/Irstea/BdohAdminBundle/Admin/Security/Utilisateur.php
new file mode 100644
index 0000000000000000000000000000000000000000..841bb34df2a64b918ea71c96d3ef4db56ca07620
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/Security/Utilisateur.php
@@ -0,0 +1,158 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin\Security;
+
+use Irstea\BdohAdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
+
+/**
+ * Class Utilisateur.
+ */
+class Utilisateur extends Admin
+{
+    const DEFAULT_PASSWORD = 'password';
+
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'nom',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * @var
+     */
+    protected $encoder;
+
+    /**
+     * @param RouteCollection $collection
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('delete');
+    }
+
+    /**
+     * @param ListMapper $listMapper
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('email', null, ['route' => ['name' => 'edit']])
+            ->add('prenom')
+            ->add('nom')
+            ->add('organisme')
+            ->add('finAcces', 'datetime', ['format' => $this->getContainer()->get('translator')->trans('formatDateTime')]);
+    }
+
+    /**
+     * @param FormMapper $formMapper
+     */
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $categoryProperty = 'libelle';
+        $translator = $this->getContainer()->get('translator');
+        if (\strpos($translator->getLocale(), 'en') === 0) {
+            $categoryProperty .= 'En';
+        }
+        $categoryQueryBuilder = $this->getRepository('IrsteaBdohSecurityBundle:Categorie')
+            ->createQueryBuilder('c')->orderBy('c.' . $categoryProperty);
+
+        $formMapper
+            ->add('finAcces', 'date', ['required' => false])
+            ->add('email', 'email', ['attr' => ['class' => 'col-md-8']])
+            ->add('prenom', 'text')
+            ->add('nom', 'text')
+            ->add('organisme', 'text', ['attr' => ['class' => 'col-md-8']])
+            ->add('categorie', null, ['required' => true, 'property' => $categoryProperty, 'query_builder' => $categoryQueryBuilder])
+            ->add('telephone', 'text')
+            ->add('adresse', 'textarea', ['attr' => ['class' => 'col-md-10', 'style' => 'height: 80px;']]);
+    }
+
+    /**
+     * @param EncoderFactoryInterface $encoder
+     */
+    public function setEncoder(EncoderFactoryInterface $encoder)
+    {
+        $this->encoder = $encoder;
+    }
+
+    /**
+     * @param $object
+     */
+    public function postPersist($object)
+    {
+        $this->logger->createHistoriqueAdministrationUtilisateur(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.UtilisateurCreate',
+            $object
+        );
+
+        //Send a mail to inform the user of her new account
+        $message = \Swift_Message::newInstance()
+            ->setSubject($this->getContainer()->get('translator')->trans('utilisateur.newAccountMail.title'))
+            ->setFrom('no.reply.BDOH@irstea.fr')
+            ->setTo($object->getEmail())
+            ->setBody(
+                $this->getContainer()->get('templating')->render(
+                    'IrsteaBdohAdminBundle:Mail:newAccount.txt.twig',
+                    ['user' => $object]
+                )
+            );
+
+        $this->getContainer()->get('mailer')->send($message);
+    }
+
+    /**
+     * @param $object
+     */
+    public function postUpdate($object)
+    {
+        $this->logger->createHistoriqueAdministrationUtilisateur(
+            $this->getUser(),
+            new \DateTime(),
+            $this->getContainer()->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+            'historique.actions.UtilisateurUpdate',
+            $object
+        );
+    }
+
+    /**
+     * @param $object
+     */
+    public function prePersist($object)
+    {
+        $object->setPassword(
+            $this->encoder->getEncoder($object)->encodePassword(
+                self::DEFAULT_PASSWORD,
+                $object->getSalt()
+            )
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Admin/SimpleEntity.php b/src/Irstea/BdohAdminBundle/Admin/SimpleEntity.php
new file mode 100644
index 0000000000000000000000000000000000000000..a688230f4620b5b4f1667c3b5080f8c37a6a0124
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Admin/SimpleEntity.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Admin;
+
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+/**
+ * Class SimpleEntity.
+ */
+class SimpleEntity extends Admin
+{
+    /**
+     * Configure the ordered field.
+     */
+    protected $datagridValues = [
+        '_sort_by' => 'libelle',  // name of the ordered field
+        // (default = the model's id field, if any)
+    ];
+
+    /**
+     * @param RouteCollection $collection
+     */
+    protected function configureRoutes(RouteCollection $collection)
+    {
+        $collection
+            ->remove('create')
+            ->remove('update')
+            ->remove('delete');
+    }
+
+    /**
+     * @param ListMapper $listMapper
+     */
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('libelle', null, ['route' => ['name' => 'edit']])
+            ->add('libelleEn');
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Command/MeasureImportCommand.php b/src/Irstea/BdohAdminBundle/Command/MeasureImportCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..db4bab10210c7096154b889c08105a93825a3f4a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Command/MeasureImportCommand.php
@@ -0,0 +1,246 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Command;
+
+use Irstea\BdohAdminBundle\Importer\Measure\ImporterInterface;
+use Irstea\BdohBundle\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Import measures ('Mesure' or 'Plage') from a file into some 'chroniques'.
+ */
+class MeasureImportCommand extends Command
+{
+    protected $observatoire;
+
+    protected $station;
+
+    protected $filePath;
+
+    protected $importerClass;
+
+    protected function configure()
+    {
+        $this->setName('bdoh:import:measure');
+    }
+
+    /**
+     * Very first interactions with user. Asks him to select :
+     *    1) An 'observatoire' ;
+     *    2) A file containing measures ;
+     *    3) A file format .
+     */
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        $dialog = $this->getDialogHelper();
+        $manager = $this->getContainer()->get('irstea_bdoh_admin.manager.measure_import');
+
+        $dialog->writeSection($output, $this->trans('configuration_import'));
+
+        /**
+         * Selects the 'observatoire' in which to import measures.
+         */
+        $title = $this->trans('Observatoire', [], 'messages');
+        $allObs = $this->getAllObservatoires();
+        list(, $this->observatoire) = $dialog->getSelection($output, $title, $allObs);
+        $this->observatoire->defineAsCurrent();
+        $output->writeln('');
+
+        /**
+         * Path of file containing measures to import.
+         */
+        $files = $manager->getFiles();
+        list(, $this->filePath) = $dialog->getSelection($output, $this->trans('file_path'), $files, false, true);
+        $output->writeln('');
+
+        /**
+         * File format.
+         */
+        $formats = array_values($manager->importers->all());
+        list(, $this->importerClass) = $dialog->getSelection($output, $this->trans('file_format'), $formats);
+        $output->writeln('');
+    }
+
+    /**
+     * Performs the import of measures.
+     * If necessary, interacts with user.
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $dialog = $this->getDialogHelper();
+        $importer = new $this->importerClass(
+            $this->getContainer()->get('doctrine.orm.entity_manager'),
+            $this->getContainer()->get('translator'),
+            $this->filePath
+        );
+
+        /*
+         * Step 1 : 'station', timezone and 'chroniques'
+         */
+        try {
+            $importer->loadHeader();
+
+            /* Possible 'station' selection */
+            if (null === $importer->getStation()) {
+                $title = $this->trans('Station', [], 'messages');
+                $allStations = $this->getAllStations();
+                list(, $this->station) = $dialog->getSelection($output, $title, $allStations);
+                $importer->setStation($this->station);
+            }
+
+            /* Timezone selection */
+            if ($importer->getTimezone() === '') {
+                $timezone = $dialog->askAndValidate(
+                    $output,
+                    '<question>' . $this->trans('select_timezone') . '</question> ',
+                    function ($timezone) {
+                        $timezone = \Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer::bdohTimezone($timezone);
+                        if (!$timezone) {
+                            throw new \Exception('Bad timezone format');
+                        }
+
+                        return $timezone;
+                    }
+                );
+                $importer->setTimezone($timezone);
+            }
+
+            /* 'Chroniques' selection */
+            if ($importer->hasChroniques()) {
+                $this->selectChroniques($output, $importer);
+            } else {
+                $this->selectChroniquesFromEmpty($output, $importer);
+            }
+
+            if (false === $importer->hasChroniques()) {
+                throw new \RuntimeException($this->trans('no_chronique_selected'));
+            }
+        } catch (\Exception $error) {
+            $output->writeln("<error>$error</error>");
+        }
+
+        $t1 = time();
+        $importer->loadData();
+        echo time() - $t1;
+
+        return true;
+    }
+
+    /**
+     * Selects some 'chroniques' in which to import measures :
+     *    => depending on 'chroniques' number that importer expects (from 1 to +Inf) ;
+     *    => user is allowed to skips / not select a 'chronique'.
+     */
+    protected function selectChroniquesFromEmpty(OutputInterface $output, ImporterInterface $importer)
+    {
+        $dialog = $this->getDialogHelper();
+        $title = $this->trans('Chronique', [], 'messages');
+        $noMoreKey = $this->trans('selection.no_more.key');
+        $noMoreMsg = $this->trans('selection.no_more.msg');
+        $expectedChron = $importer->getExpectedChroniques();
+        $i = 0;
+
+        $dialog->writeSection($output, $this->trans('select_chroniques'));
+
+        /**
+         * Selection list :
+         *    => all 'chroniques' of the current 'observatoire' ;
+         *    => as the second last choice : the "not select" choice ;
+         *    => as the last choice, only in case of "an infinity" : the "stop selection" choice .
+         */
+        $elements = $this->getAllChroniques();
+
+        while ($i !== $expectedChron) {
+            list(
+                $key, $chronique
+                ) =
+                $dialog->getSelection($output, $title . ' N°' . ($i + 1), $elements, true, false, $expectedChron === INF);
+
+            // User stops the selection process
+            if ($key === -1 && $chronique === -1) {
+                $i = INF;
+            } // User skips the i-th 'chronique'
+            elseif ($key === -1 && $chronique === null) {
+                $importer->setChronique(null, $i++);
+            } // Adds selected 'chronique' and removes it to selection list
+            else {
+                $importer->setChronique($chronique, $i++);
+                unset($elements[$key]);
+            }
+        }
+    }
+
+    /**
+     * From an existing list of 'chroniques', asks user which ones to keep.
+     */
+    public function selectChroniques(OutputInterface $output, ImporterInterface $importer)
+    {
+        $dialog = $this->getDialogHelper();
+        $dialog->writeSection($output, $this->trans('select_chroniques'));
+
+        foreach ($importer->getChroniques() as $i => $chronique) {
+            $question = $this->trans(
+                'ask.keep_chronique(%n%, %chronique%)',
+                ['%n%' => $i, '%chronique%' => (string) $chronique]
+            );
+
+            if (false === $dialog->askConfirmation($output, "<question>$question</question> ")) {
+                $importer->setChronique(null, $i);
+            }
+        }
+    }
+
+    /**
+     * @see \Irstea\BdohDataBundle\Entity\ObservatoireRepository
+     */
+    protected function getAllObservatoires()
+    {
+        return $this->getContainer()->get('doctrine')->getEntityManager()
+            ->getRepository('IrsteaBdohDataBundle:Observatoire')
+            ->findAll();
+    }
+
+    /**
+     * @see \Irstea\BdohDataBundle\Entity\StationRepository
+     */
+    protected function getAllStations()
+    {
+        return $this->getContainer()->get('doctrine')->getEntityManager()
+            ->getRepository('IrsteaBdohDataBundle:Station')
+            ->findAll();
+    }
+
+    /**
+     * @see \Irstea\BdohDataBundle\Entity\ChroniqueRepository
+     */
+    protected function getAllChroniques()
+    {
+        $repChronique = $this->getContainer()->get('doctrine')->getEntityManager()
+            ->getRepository('IrsteaBdohDataBundle:Chronique');
+        if ($this->station) {
+            return $repChronique->findByStation($this->station);
+        }
+
+        return $repChronique->findAll();
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/ColorsController.php b/src/Irstea/BdohAdminBundle/Controller/ColorsController.php
new file mode 100644
index 0000000000000000000000000000000000000000..29b0cb4127795df5da4f1d47bc070a922b4e60b8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/ColorsController.php
@@ -0,0 +1,398 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohDataBundle\Entity\JeuQualite;
+use Irstea\BdohDataBundle\Entity\Qualite;
+use Irstea\BdohDataBundle\Entity\Repository\JeuQualiteRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+
+/**
+ * ColorsController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and user.isGestionnaireDesObservatoires()")
+ */
+class ColorsController extends Controller
+{
+    const CSRF_TOKEN_TIME_VALIDITY = 7200; // 2 heures (en secondes)
+
+    const MIN_THICKNESS = 1;
+    const MAX_THICKNESS = 9;
+    const SHAPES = [
+        'diamond'       => 'â—Š',
+        'circle'        => 'â—‹',
+        'square'        => 'â–¡',
+        'x'             => '×',
+        'plus'          => '+',
+        'dash'          => '−',
+        'filledDiamond' => 'â§«',
+        'filledCircle'  => '●',
+        'filledSquare'  => 'â– ',
+    ];
+    const MIN_STROKE = 1;
+    const MAX_STROKE = 9;
+    const MIN_SIZE = 1;
+    const MAX_SIZE = 50;
+
+    const HEX_COLOR_RE = '/^#[0-9A-F]{6}$/';
+
+    /**
+     * @param array $rgbArray
+     *
+     * @return string;
+     */
+    private function rgbArrayToHex(array $rgbArray)
+    {
+        if (!\is_array($rgbArray) || \count($rgbArray) !== 3) {
+            return '#000000';
+        }
+
+        $hex = '#';
+        foreach ($rgbArray as $color) {
+            $colorInt = \min(255, \max(0, (int) $color));
+            $hex .= $colorInt < 16 ? '0' : '';
+            $hex .= strtoupper(\dechex($colorInt));
+        }
+
+        return $hex;
+    }
+
+    /**
+     * @param string $hex
+     *
+     * @return array;
+     */
+    private function hexToRgbArray(string $hex)
+    {
+        if (!\is_string($hex) || \strlen($hex) !== 7 || $hex[0] !== '#') {
+            return [0, 0, 0];
+        }
+
+        $rgbArray = [];
+        $rgbArray[] = \min(255, \max(0, (int) \hexdec(substr($hex, 1, 2))));
+        $rgbArray[] = \min(255, \max(0, (int) \hexdec(substr($hex, 3, 2))));
+        $rgbArray[] = \min(255, \max(0, (int) \hexdec(substr($hex, 5, 2))));
+
+        return $rgbArray;
+    }
+
+    /**
+     * colorsAction.
+     *
+     * @Route("/colors/{jeuQualiteId}",
+     *     name="bdoh_admin_colors", requirements={"jeuQualiteId"="\d+"},
+     *     defaults={"jeuQualiteId": ""})
+     * @Method({"GET"})
+     * @Template("IrsteaBdohAdminBundle:Colors:colors.html.twig")
+     *
+     * @param Request $request
+     * @param string  $jeuQualiteId
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function colorsAction(Request $request, $jeuQualiteId)
+    {
+        $response = [];
+
+        /** @var Session $session */
+        $session = $request->getSession();
+
+        // token pour la protection CSRF
+        if (!$session->has('colors.CSRFTokenTime') ||
+            ((int) $session->get('colors.CSRFTokenTime', 0) +
+                self::CSRF_TOKEN_TIME_VALIDITY) <= (int) \date('U')) {
+            $CSRFTokenName = 'CSRFToken' . \bin2hex(\random_bytes(8));
+            $CSRFTokenValue = \bin2hex(\random_bytes(64));
+            $session->set('colors.CSRFTokenName', $CSRFTokenName);
+            $session->set('colors.CSRFTokenValue', $CSRFTokenValue);
+            $session->set('colors.CSRFTokenTime', \date('U'));
+        } else {
+            $CSRFTokenName = $session->get('colors.CSRFTokenName');
+            $CSRFTokenValue = $session->get('colors.CSRFTokenValue');
+        }
+        $response['CSRFTokenName'] = $CSRFTokenName;
+        $response['CSRFTokenValue'] = $CSRFTokenValue;
+
+        // construction de la liste des jeux de qualités affectables
+        /** @var JeuQualiteRepository $jeuQualiteRepo */
+        $jeuQualiteRepo = $this->getBdohRepo('JeuQualite');
+        $jeux = $jeuQualiteRepo->findAll();
+        $response['jeux'] = $jeux;
+
+        // récupération du jeu de qualité si fourni via le formulaire (en parametre de l'url)
+        if (ctype_digit($jeuQualiteId) && (int) $jeuQualiteId >= 1) {
+            /** @var JeuQualite $jeuQualite */
+            $jeuQualite = $jeuQualiteRepo->find($jeuQualiteId);
+
+            // vérification de l'existance du jeu de qualité et qu'il est affectable
+            if (!$jeuQualite || !$jeuQualite->getEstAffectable()) {
+                throw new AccessDeniedHttpException();
+            }
+
+            // construction du tableau des données de style pour les qualités du jeu
+            $qualitesData = [];
+            $isEnglish = \strpos($this->getTranslator()->getLocale(), 'en') === 0;
+            /** @var Qualite[] $qualites */
+            $qualites = $jeuQualite->getQualites();
+            foreach ($qualites as $qualite) {
+                if ($qualite->getCode() !== Qualite::GAP_CODE) {
+                    $id = $qualite->getId();
+                    $isGap = $qualite->isInvalide();
+                    $style = $qualite->getStyle();
+                    $color = $this->rgbArrayToHex($isGap ? Qualite::DEFAULT_GAP_COLOR : Qualite::DEFAULT_COLOR);
+                    if (\is_array($style) && isset($style['color']) && \is_array($style['color']) && \count($style['color']) === 3) {
+                        $color = $this->rgbArrayToHex($style['color']);
+                    }
+                    $thickness = $isGap ? Qualite::DEFAULT_GAP_THICKNESS : Qualite::DEFAULT_THICKNESS;
+                    if (\is_array($style) && isset($style['thickness'])) {
+                        $thickness = \min(self::MAX_THICKNESS, \max(self::MIN_THICKNESS, (int) $style['thickness']));
+                    }
+                    $qualitesData[$id] = [
+                        'id'        => $id,
+                        'label'     => $qualite->getLibelle($isEnglish ? 'en' : 'fr'),
+                        'code'      => $qualite->getCode(),
+                        'color'     => $color,
+                        'thickness' => $thickness,
+                        'gap'       => $isGap,
+                    ];
+                }
+            }
+            \ksort($qualitesData);
+
+            // construction des données de style pour les marqueurs des bornes des plages des discontinues
+            $discontinuousData = [
+                'shape'  => JeuQualite::DEFAULT_DISCONTINUOUS_SHAPE,
+                'stroke' => JeuQualite::DEFAULT_DISCONTINUOUS_STROKE,
+                'size'   => JeuQualite::DEFAULT_DISCONTINUOUS_SIZE,
+            ];
+            $discontinuousStyle = $jeuQualite->getDiscontinuousStyle();
+            if (\is_array($discontinuousStyle)) {
+                if (isset($discontinuousStyle['shape']) && \in_array($discontinuousStyle['shape'], \array_keys($this::SHAPES))) {
+                    $discontinuousData['shape'] = $discontinuousStyle['shape'];
+                }
+                if (isset($discontinuousStyle['stroke'])) {
+                    $discontinuousData['stroke'] = \min(self::MAX_STROKE, \max(self::MIN_STROKE, (int) $discontinuousStyle['stroke']));
+                }
+                if (isset($discontinuousStyle['size'])) {
+                    $discontinuousData['size'] = \min(self::MAX_SIZE, \max(self::MIN_SIZE, (int) $discontinuousStyle['size']));
+                }
+            }
+
+            // construction des données de style pour les points de contrôle
+            $checkpointData = [
+                'shape'  => JeuQualite::DEFAULT_CHECKPOINT_SHAPE,
+                'stroke' => JeuQualite::DEFAULT_CHECKPOINT_STROKE,
+                'color'  => $this->rgbArrayToHex(JeuQualite::DEFAULT_CHECKPOINT_COLOR),
+                'size'   => JeuQualite::DEFAULT_CHECKPOINT_SIZE,
+            ];
+            $checkpointStyle = $jeuQualite->getCheckpointStyle();
+            if (\is_array($checkpointStyle)) {
+                if (isset($checkpointStyle['shape']) && \in_array($checkpointStyle['shape'], \array_keys($this::SHAPES))) {
+                    $checkpointData['shape'] = $checkpointStyle['shape'];
+                }
+                if (isset($checkpointStyle['stroke'])) {
+                    $checkpointData['stroke'] = \min(self::MAX_STROKE, \max(self::MIN_STROKE, (int) $checkpointStyle['stroke']));
+                }
+                if (isset($checkpointStyle['color']) && \is_array($checkpointStyle['color']) && \count($checkpointStyle['color']) === 3) {
+                    $checkpointData['color'] = $this->rgbArrayToHex($checkpointStyle['color']);
+                }
+                if (isset($checkpointStyle['size'])) {
+                    $checkpointData['size'] = \min(self::MAX_SIZE, \max(self::MIN_SIZE, (int) $checkpointStyle['size']));
+                }
+            }
+
+            $response['jeuQualite'] = $jeuQualite;
+            $response['qualitesData'] = $qualitesData;
+            $response['discontinuousData'] = $discontinuousData;
+            $response['checkpointData'] = $checkpointData;
+            $response['thicknesses'] = \range(self::MIN_THICKNESS, self::MAX_THICKNESS);
+            $response['shapes'] = self::SHAPES;
+            $response['strokes'] = \range(self::MIN_STROKE, self::MAX_STROKE);
+            $response['sizes'] = \range(self::MIN_SIZE, self::MAX_SIZE);
+        } // pas de jeu de qualité fourni
+
+        return $response;
+    }
+
+    /**
+     * colorsFormAction.
+     *
+     * @Route("/colors", name="bdoh_admin_colors_form")
+     * @Method({"POST"})
+     *
+     * @param Request $request
+     *
+     * @throws \Exception
+     *
+     * @return Response
+     */
+    public function colorsFormAction(Request $request)
+    {
+        $jeuQualiteIdParam = '';
+
+        /** @var Session $session */
+        $session = $request->getSession();
+
+        if ($request->request->has('jeuQualiteId')
+            && ctype_digit($request->request->get('jeuQualiteId'))) {
+            $jeuQualiteId = $request->request->get('jeuQualiteId');
+
+            /** @var JeuQualiteRepository $jeuQualiteRepo */
+            $jeuQualiteRepo = $this->getBdohRepo('JeuQualite');
+            /** @var JeuQualite $jeuQualite */
+            $jeuQualite = $jeuQualiteRepo->find($jeuQualiteId);
+
+            // vérification de l'existance du jeu de qualité et qu'il est affectable
+            if (!$jeuQualite || !$jeuQualite->getEstAffectable()) {
+                throw new AccessDeniedHttpException();
+            }
+
+            // enregistrement du jeu de qualité pour l'affichage du formulaire de selection des couleurs
+            $jeuQualiteIdParam = $jeuQualite->getId();
+
+            // si il ne s'agit pas d'un simple changement du jeu de qualité on analyse les paramètres du formulaire
+            if (!$request->request->has('jeuQualiteChanged') ||
+                $request->request->get('jeuQualiteChanged') !== 'jeuQualiteChanged') {
+                // verification du token pour la protection CSRF
+                $CSRFTokenNameInSession = $session->get('colors.CSRFTokenName', false);
+                $CSRFTokenValueInSession = $session->get('colors.CSRFTokenValue', false);
+                $CSRFTokenTimeInSession = $session->get('colors.CSRFTokenTime', 0);
+                $CSRFTokenNameInRequest = $CSRFTokenNameInSession && $request->request->has($CSRFTokenNameInSession);
+                $CSRFTokenValueInRequest = $request->request->get($CSRFTokenNameInSession, false);
+                if ($CSRFTokenNameInRequest && $CSRFTokenValueInSession && $CSRFTokenTimeInSession &&
+                    ((int) $CSRFTokenTimeInSession + self::CSRF_TOKEN_TIME_VALIDITY) >= (int) \date('U') &&
+                    $CSRFTokenValueInSession === $CSRFTokenValueInRequest) {
+                    // traitement du style des qualités
+                    /** @var Qualite[] $qualites */
+                    $qualites = $jeuQualite->getQualites();
+                    foreach ($qualites as $qualite) {
+                        if ($qualite->getCode() !== Qualite::GAP_CODE) {
+                            $id = $qualite->getId();
+                            $isGap = $qualite->isInvalide();
+                            $style = $isGap ? Qualite::DEFAULT_GAP_STYLE : Qualite::DEFAULT_STYLE;
+                            if ($request->request->has('colorId_' . $id)) {
+                                $color = \strtoupper(\trim($request->request->get('colorId_' . $id)));
+                                if (\preg_match(self::HEX_COLOR_RE, $color) === 1) {
+                                    $style['color'] = $this->hexToRgbArray($color);
+                                }
+                            }
+                            if ($request->request->has('thicknessId_' . $id)) {
+                                $thickness = \trim($request->request->get('thicknessId_' . $id));
+                                if (\ctype_digit($thickness)) {
+                                    $thickness = (int) $thickness;
+                                    if ($thickness >= self::MIN_THICKNESS && $thickness <= self::MAX_THICKNESS) {
+                                        $style['thickness'] = $thickness;
+                                    }
+                                }
+                            }
+                            $qualite->setStyle($style);
+                            $this->getEm()->persist($qualite);
+                        }
+                    }
+                    // traitement du style des marqueurs des bornes des plages des discontinues
+                    $discontinuousStyle = JeuQualite::DEFAULT_DISCONTINUOUS_STYLE;
+                    $discontinuousId = $jeuQualite->getId();
+                    if ($request->request->has('discontinuousShapeId_' . $discontinuousId)) {
+                        $discontinuousShape = \trim($request->request->get('discontinuousShapeId_' . $discontinuousId));
+                        if (\array_key_exists($discontinuousShape, self::SHAPES)) {
+                            $discontinuousStyle['shape'] = $discontinuousShape;
+                        }
+                    }
+                    if ($request->request->has('discontinuousStrokeId_' . $discontinuousId)) {
+                        $discontinuousStroke = \trim($request->request->get('discontinuousStrokeId_' . $discontinuousId));
+                        if (\ctype_digit($discontinuousStroke)) {
+                            $discontinuousStroke = (int) $discontinuousStroke;
+                            if ($discontinuousStroke >= self::MIN_STROKE && $discontinuousStroke <= self::MAX_STROKE) {
+                                $discontinuousStyle['stroke'] = $discontinuousStroke;
+                            }
+                        }
+                    }
+                    if ($request->request->has('discontinuousSizeId_' . $discontinuousId)) {
+                        $discontinuousSize = \trim($request->request->get('discontinuousSizeId_' . $discontinuousId));
+                        if (\ctype_digit($discontinuousSize)) {
+                            $discontinuousSize = (int) $discontinuousSize;
+                            if ($discontinuousSize >= self::MIN_SIZE && $discontinuousSize <= self::MAX_SIZE) {
+                                $discontinuousStyle['size'] = $discontinuousSize;
+                            }
+                        }
+                    }
+                    $jeuQualite->setDiscontinuousStyle($discontinuousStyle);
+                    // traitement du style des points de contrôle
+                    $checkpointStyle = JeuQualite::DEFAULT_CHECKPOINT_STYLE;
+                    $checkpointId = $jeuQualite->getId();
+                    if ($request->request->has('checkpointShapeId_' . $checkpointId)) {
+                        $checkpointShape = \trim($request->request->get('checkpointShapeId_' . $checkpointId));
+                        if (\array_key_exists($checkpointShape, self::SHAPES)) {
+                            $checkpointStyle['shape'] = $checkpointShape;
+                        }
+                    }
+                    if ($request->request->has('checkpointStrokeId_' . $checkpointId)) {
+                        $checkpointStroke = \trim($request->request->get('checkpointStrokeId_' . $checkpointId));
+                        if (\ctype_digit($checkpointStroke)) {
+                            $checkpointStroke = (int) $checkpointStroke;
+                            if ($checkpointStroke >= self::MIN_STROKE && $checkpointStroke <= self::MAX_STROKE) {
+                                $checkpointStyle['stroke'] = $checkpointStroke;
+                            }
+                        }
+                    }
+                    if ($request->request->has('checkpointColorId_' . $checkpointId)) {
+                        $checkpointColor = \strtoupper(\trim($request->request->get('checkpointColorId_' . $checkpointId)));
+                        if (\preg_match(self::HEX_COLOR_RE, $checkpointColor) === 1) {
+                            $checkpointStyle['color'] = $this->hexToRgbArray($checkpointColor);
+                        }
+                    }
+                    if ($request->request->has('checkpointSizeId_' . $checkpointId)) {
+                        $checkpointSize = \trim($request->request->get('checkpointSizeId_' . $checkpointId));
+                        if (\ctype_digit($checkpointSize)) {
+                            $checkpointSize = (int) $checkpointSize;
+                            if ($checkpointSize >= self::MIN_SIZE && $checkpointSize <= self::MAX_SIZE) {
+                                $checkpointStyle['size'] = $checkpointSize;
+                            }
+                        }
+                    }
+                    $jeuQualite->setCheckpointStyle($checkpointStyle);
+                    $this->getEm()->persist($jeuQualite);
+                    $this->getEm()->flush();
+                    $session->getFlashBag()->add('success', $this->getTranslator()->trans('colors.success(%jeu%)', ['%jeu%' => $jeuQualite->getNom()]));
+                } else {
+                    // protection CSRF absente
+                    $session->getFlashBag()->add('error', $this->getTranslator()->trans('colors.CSRFerror'));
+                }
+            } // pas une traitement juste un changement de jeu de qualité
+        } // pas de jeu de qualité fourni
+
+        return $this->redirectToRoute(
+            'bdoh_admin_colors',
+            ['jeuQualiteId' => $jeuQualiteIdParam]
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/ConversionController.php b/src/Irstea/BdohAdminBundle/Controller/ConversionController.php
new file mode 100644
index 0000000000000000000000000000000000000000..77545d8a41ca19c17fb19a6d45593ef72c3d4270
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/ConversionController.php
@@ -0,0 +1,346 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+use Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue;
+use Irstea\BdohDataBundle\Entity\Conversion;
+use Irstea\BdohDataBundle\Entity\JeuConversion;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueConvertieRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueDiscontinueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+
+/**
+ * ConversionController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and (user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory() or user.isAContributorOfCurrentObservatory())")
+ */
+class ConversionController extends Controller
+{
+    const CSRF_TOKEN_TIME_VALIDITY = 7200; // 2 heures (en secondes)
+
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    private $jobManager;
+
+    /**
+     * conversionAction.
+     *
+     * @Route("/conversion/{chroniqueConvertieId}",
+     *     name="bdoh_admin_conversion", requirements={"chroniqueConvertieId"="\d+"},
+     *     defaults={"chroniqueConvertieId": ""})
+     * @Method({"GET"})
+     * @Template("IrsteaBdohAdminBundle:Conversion:conversion.html.twig")
+     *
+     * @param Request $request
+     * @param string  $chroniqueConvertieId
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function conversionAction(Request $request, $chroniqueConvertieId)
+    {
+        $response = [];
+
+        /** @var Session $session */
+        $session = $request->getSession();
+
+        // token pour la protection CSRF
+        if (!$session->has('conversion.CSRFTokenTime') ||
+            ((int) $session->get('conversion.CSRFTokenTime', 0) +
+                self::CSRF_TOKEN_TIME_VALIDITY) <= (int) \date('U')) {
+            $CSRFTokenName = 'CSRFToken' . \bin2hex(\random_bytes(8));
+            $CSRFTokenValue = \bin2hex(\random_bytes(64));
+            $session->set('conversion.CSRFTokenName', $CSRFTokenName);
+            $session->set('conversion.CSRFTokenValue', $CSRFTokenValue);
+            $session->set('conversion.CSRFTokenTime', \date('U'));
+        } else {
+            $CSRFTokenName = $session->get('conversion.CSRFTokenName');
+            $CSRFTokenValue = $session->get('conversion.CSRFTokenValue');
+        }
+        $response['CSRFTokenName'] = $CSRFTokenName;
+        $response['CSRFTokenValue'] = $CSRFTokenValue;
+
+        // construction de la liste des chroniques converties
+        $stations = [];
+        $chroniquesConverties = [];
+        /** @var ChroniqueConvertieRepository $chroniqueConvertieRepo */
+        $chroniqueConvertieRepo = $this->getBdohRepo('ChroniqueConvertie');
+        $allSecuredConverties = $chroniqueConvertieRepo->securedBigFindAll($this->getUser());
+        foreach ($allSecuredConverties as $chroniqueConvertie) {
+            $station = $chroniqueConvertie->getStation();
+            $stationId = $station->getId();
+            if (!isset($stations[$stationId])) {
+                $stations[$stationId] = $station;
+            }
+            $chroniquesConverties[$stationId][] = $chroniqueConvertie;
+        }
+        $response['stations'] = $stations;
+        $response['chroniquesConverties'] = $chroniquesConverties;
+
+        // récupération de la chronique convertie si fournie via le formulaire (en parametre de l'url)
+        if (ctype_digit($chroniqueConvertieId) && (int) $chroniqueConvertieId >= 1) {
+            /** @var ChroniqueConvertie $chroniqueConvertie */
+            $chroniqueConvertie = $chroniqueConvertieRepo->find($chroniqueConvertieId);
+
+            // vérification des droits sur la chronique (et que la chronique existe et qu'elle est convertie)
+            if (!$chroniqueConvertie
+                || !$chroniqueConvertie->isConvertie()
+                || !$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $chroniqueConvertie)) {
+                throw new AccessDeniedHttpException();
+            }
+
+            // récupération des données de la chronique convertie
+            /** @var ChroniqueRepository $chroniqueRepo */
+            $chroniqueRepo = $this->getBdohRepo('Chronique');
+            $children = $chroniqueRepo->findAllChildren($chroniqueConvertie);
+            $childrenList = join('<br>', $children);
+            $childrenCount = count($children);
+            $maj = $chroniqueConvertie->getMiseAJour();
+            $maj = $maj ? $maj->format($this->getTranslator()->trans('transformation.bareme.dateBareme'))
+                    . ' ' . $this->getTranslator()->trans('UTC') : '';
+            $response['chroniqueConvertie'] = $chroniqueConvertie;
+            $response['unite'] = $chroniqueConvertie->getUnite()->getLibelle();
+            $response['maj'] = $maj;
+            $response['genealogie'] = $chroniqueConvertie->getGenealogie();
+            $response['genealogieEn'] = $chroniqueConvertie->getGenealogieEn();
+            $response['hasChildren'] = $chroniqueConvertie->hasChildren();
+            $response['childrenList'] = $childrenList;
+            $response['childrenCount'] = $childrenCount;
+            $response['paramConversion'] = '';
+
+            $conversion = $chroniqueConvertie->getConversion();
+            if ($conversion) {
+                // récupération des données de la conversion
+                $response['chroniqueMere'] = $conversion->getEntree();
+                $response['paramConversion'] = $conversion->getJeuConversionActuel()->getParamConversion();
+            } else {
+                // ou construction de la liste des chroniques discontinues de la station avec la même unité
+                /** @var ChroniqueDiscontinueRepository $chroniqueDiscontinueRepo */
+                $chroniqueDiscontinueRepo = $this->getBdohRepo('ChroniqueDiscontinue');
+                $allDiscontinuesStation = $chroniqueDiscontinueRepo
+                    ->findByStationAndUnite($chroniqueConvertie->getStation(), $chroniqueConvertie->getUnite());
+                $response['chroniquesDiscontinues'] = $allDiscontinuesStation;
+            }
+        }
+
+        // recupération et envoie des erreurs ou informations si elles existent
+        if ($session->has('conversion.errors')) {
+            $response['errorsConversion'] = $session->get('conversion.errors');
+            $session->remove('conversion.errors');
+        }
+        if ($session->has('conversion.success')) {
+            $response['successConversion'] = $session->get('conversion.success');
+            $session->remove('conversion.success');
+        }
+
+        return $response;
+    }
+
+    /**
+     * conversionFormAction.
+     *
+     * @Route("/conversion", name="bdoh_admin_conversion_form")
+     * @Method({"POST"})
+     *
+     * @param Request $request
+     *
+     * @throws \Exception
+     *
+     * @return Response
+     */
+    public function conversionFormAction(Request $request)
+    {
+        $chroniqueConvertieIdParam = '';
+
+        $errors = new ImportErrors();
+
+        /** @var Session $session */
+        $session = $request->getSession();
+
+        if ($request->request->has('chroniqueConvertieId')
+            && ctype_digit($request->request->get('chroniqueConvertieId'))) {
+            $chroniqueConvertieId = $request->request->get('chroniqueConvertieId');
+
+            /** @var ChroniqueConvertieRepository $chroniqueConvertieRepo */
+            $chroniqueConvertieRepo = $this->getBdohRepo('ChroniqueConvertie');
+            /** @var ChroniqueConvertie $chroniqueConvertie */
+            $chroniqueConvertie = $chroniqueConvertieRepo->find($chroniqueConvertieId);
+
+            // vérification des droits sur la chronique (et que la chronique existe et qu'elle est convertie)
+            if (!$chroniqueConvertie
+                || !$chroniqueConvertie->isConvertie()
+                || !$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $chroniqueConvertie)) {
+                throw new AccessDeniedHttpException();
+            }
+
+            // enregistrement la chronique convertie pour le paramètre de l'action d'affichage de la conversion
+            $chroniqueConvertieIdParam = $chroniqueConvertie->getId();
+
+            // si il ne s'agit pas d'un simple changement de chronique convertie on analyse les paramètres du formulaire
+            if (!$request->request->has('chroniqueChanged') ||
+                $request->request->get('chroniqueChanged') !== 'chroniqueChanged') {
+                // verification du token pour la protection CSRF
+                $CSRFTokenNameInSession = $session->get('conversion.CSRFTokenName', false);
+                $CSRFTokenValueInSession = $session->get('conversion.CSRFTokenValue', false);
+                $CSRFTokenTimeInSession = $session->get('conversion.CSRFTokenTime', 0);
+                $CSRFTokenNameInRequest = $CSRFTokenNameInSession && $request->request->has($CSRFTokenNameInSession);
+                $CSRFTokenValueInRequest = $request->request->get($CSRFTokenNameInSession, false);
+                if ($CSRFTokenNameInRequest && $CSRFTokenValueInSession && $CSRFTokenTimeInSession &&
+                    ((int) $CSRFTokenTimeInSession + self::CSRF_TOKEN_TIME_VALIDITY) >= (int) \date('U') &&
+                    $CSRFTokenValueInSession === $CSRFTokenValueInRequest) {
+                    /** @var Conversion $conversion */
+                    $conversion = $chroniqueConvertie->getConversion();
+
+                    // si la chronique n'est pas encore convertie on essaye de récupèrer la chronique mère fournie
+                    $chroniqueMere = null;
+                    if (!$conversion) {
+                        // vérification de la chronique mère fournie (la chronique discontinue)
+                        if (!$request->request->has('chroniqueMereId')) {
+                            $errors->badParentTimeSeries();
+                        } else {
+                            $chroniqueMereId = $request->request->get('chroniqueMereId');
+                            if (!ctype_digit($chroniqueMereId)
+                                || (int) $chroniqueMereId < 1) {
+                                $errors->badParentTimeSeries();
+                            } else {
+                                /** @var ChroniqueDiscontinueRepository $chroniqueDiscontinueRepo */
+                                $chroniqueDiscontinueRepo = $this->getBdohRepo('ChroniqueDiscontinue');
+                                /** @var ChroniqueDiscontinue $chroniqueMere */
+                                $chroniqueMere = $chroniqueDiscontinueRepo->find($chroniqueMereId);
+                                if (!$chroniqueMere
+                                    || !$chroniqueMere->isDiscontinue()
+                                    || !($chroniqueMere->getUnite() === $chroniqueConvertie->getUnite())
+                                    || !$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $chroniqueMere)) {
+                                    $errors->badParentTimeSeries();
+                                }
+                            }
+                        }
+                    } else {
+                        $chroniqueMere = $conversion->getEntree();
+                    }
+
+                    // vérification du paramètre de conversion fourni (intervalle pour les lacunes)
+                    if (!$request->request->has('paramConversion')) {
+                        $errors->undefinedParamConversion();
+                        $paramConversion = null;
+                    } else {
+                        $paramConversion = trim($request->request->get('paramConversion'));
+                        if (!ctype_digit($paramConversion) || (int) $paramConversion < 1) {
+                            if ($paramConversion == '') {
+                                $errors->undefinedParamConversion();
+                            } else {
+                                $errors->badParamConversion($paramConversion);
+                            }
+                        } else {
+                            // conversion en secondes et limitation à 9999999 min pour rendre explicite la limitation
+                            // dans l'interface et rester en dessous de la valeur max des entiers en base
+                            $paramConversion = min(((int) $paramConversion) * 60, 599999940);
+                        }
+                    }
+
+                    // si on a des erreurs ici on s'arrète et on les affiche
+                    if ($errors->isDirty()) {
+                        $session->set('conversion.errors', $errors->translations($this->getTranslator()));
+
+                        return $this->redirectToRoute(
+                            'bdoh_admin_conversion',
+                            ['chroniqueConvertieId' => $chroniqueConvertieIdParam]
+                        );
+                    }
+
+                    // creation de la conversion si elle n'existe pas
+                    if (!$conversion) {
+                        $conversion = new Conversion();
+                        $conversion->setEntree($chroniqueMere);
+                        $chroniqueConvertie->setConversion($conversion); // fait aussi le setSortie sur la conversion
+                    }
+
+                    // date de création du jeu de conversion
+                    $date = new \DateTime('now', new \DateTimeZone('UTC'));
+
+                    // creation du nouveau jeu de conversion
+                    $newJeuConversion = new JeuConversion();
+                    $newJeuConversion->setParamConversion($paramConversion);
+                    // ajout du nouveau jeu si il est différent de l'actuel
+                    if (!$newJeuConversion->equals($conversion->getJeuConversionActuel())) {
+                        $newJeuConversion->setDateCreation($date);
+                        $conversion->setJeuConversionActuel($newJeuConversion);
+                        $conversion->addJeuConversionsHistoriques($newJeuConversion);
+                        $newJeuConversion->setConversion($conversion);
+                    }
+
+                    // récupération des autre paramètres
+                    $genealogie = $request->request->get('genealogie');
+                    $genealogieEn = $request->request->get('genealogieEn');
+                    $propagate = $request->request->get('propagate', false) === 'propagate';
+
+                    // mise à jour de la chronique et enregistrement des entities
+                    $chroniqueConvertie->setGenealogie($genealogie);
+                    $chroniqueConvertie->setGenealogieEn($genealogieEn);
+                    $this->getEm()->persist($chroniqueConvertie);
+                    $this->getEm()->flush();
+
+                    // lance le job de conversion
+                    $job = $this->jobManager->enqueueChronicleConversion($chroniqueConvertie, $this->getUser(), $propagate);
+
+                    // enregistrement des informations pour le message de succès
+                    $session->set('conversion.success', [
+                        'link' => $this->generateUrl(
+                            'bdoh_consult_chronique',
+                            [
+                                'station'   => $chroniqueConvertie->getStation()->getCode(),
+                                'chronique' => $chroniqueConvertie->getCode(),
+                            ]
+                        ),
+                        'chronique' => $chroniqueConvertie->__toString(),
+                        'jobPage'   => $this->generateUrl('bdoh_job_list'),
+                        'jobId'     => $job->getId(),
+                    ]);
+                } else {
+                    // protection CSRF absente
+                    $session->getFlashBag()->add('error', $this->getTranslator()->trans('conversion.CSRFerror'));
+                }
+            } // pas une conversion juste un changement de chronique
+        } // pas de chronique convertie fournie
+
+        return $this->redirectToRoute(
+            'bdoh_admin_conversion',
+            ['chroniqueConvertieId' => $chroniqueConvertieIdParam]
+        );
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/FillingRateController.php b/src/Irstea/BdohAdminBundle/Controller/FillingRateController.php
new file mode 100644
index 0000000000000000000000000000000000000000..d63a1db015dc5f21ccd52e87290bd4098627076b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/FillingRateController.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Doctrine\ORM\EntityNotFoundException;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+
+/**
+ * Class FillingRateController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and (user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory() or user.isAContributorOfCurrentObservatory())")
+ *
+ * TODO à virer ? normalement ce controller n'est plus utilisé
+ * (les calculs de taux de remplissage sont tout automatique)
+ */
+class FillingRateController extends Controller
+{
+    /**
+     * @var RegistryInterface
+     * @DI\Inject
+     */
+    public $doctrine;
+
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    public $jobManager;
+
+    /**
+     * @Route("/fillingrate", name="bdoh_admin_recalculate")
+     * @Method("GET")
+     *
+     * @param Request $request
+     *
+     * @throws \Exception
+     *
+     * @return Response
+     */
+    public function fillingRateRecalculateDoAction(Request $request)
+    {
+        $chroniqueId = (int) $request->query->get('id');
+        if (!$chroniqueId) {
+            throw new BadRequestHttpException();
+        }
+
+        /** @var ChroniqueContinueRepository $repo */
+        $repo = $this->doctrine->getRepository(ChroniqueContinue::class);
+
+        /** @var ChroniqueContinue $chronique */
+        $chronique = $repo->findOneById($chroniqueId);
+        if (!$chronique) {
+            throw new EntityNotFoundException();
+        }
+
+        if (!$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $chronique)) {
+            throw new AccessDeniedHttpException();
+        }
+
+        $this->jobManager->enqueueComputeFillingRates($chronique);
+
+        $url = $this->generateUrl(
+            'bdoh_consult_chronique',
+            [
+                'station'   => $chronique->getStation()->getCode(),
+                'chronique' => $chronique->getCode(),
+            ]
+        );
+
+        return $this->redirect($url);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/InfoController.php b/src/Irstea/BdohAdminBundle/Controller/InfoController.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ad5383e302f4d2f801bd09e8ccc677efc083646
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/InfoController.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Class InfoController.
+ */
+class InfoController extends Controller
+{
+    /**
+     * @return Response
+     *
+     * @Security("is_granted('ROLE_ADMIN')")
+     */
+    public function generateChroniqueCodeAction()
+    {
+        $request = $this->getRequest()->query;
+        $stationId = $request->get('station');
+        $parametreId = $request->get('parametre');
+
+        if (null === $station = $this->getBdohRepo('Station')->find($stationId)) {
+            return new Response('');
+        }
+
+        if (null === $parametre = $this->getBdohRepo('TypeParametre')->find($parametreId)) {
+            return new Response('');
+        }
+
+        $count = $this->getBdohRepo('Chronique')->countByStationAndParametre($station, $parametre) + 1;
+
+        return new Response($parametre->getCode() . ($count === 1 ? '' : ("-$count")));
+    }
+
+    /**
+     * @return Response
+     *
+     * @Security("is_granted('ROLE_ADMIN')")
+     */
+    public function getFilteredChroniquesAction()
+    {
+        $request = $this->getRequest()->query;
+        $bassinId = $request->get('bassinId');
+        $coursEauId = $request->get('coursEauId');
+
+        $chronRepo = $this->getBdohRepo('Chronique');
+
+        // cette methode n'existe pas ...
+        // TODO à virer ou à corriger, cette action ne semble pas être utilisée non plus
+        $chroniques = $chronRepo->richFindByGeography($bassinId, $coursEauId);
+
+        return new Response($chroniques);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php b/src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d976f3e48bfbba24a56f65c5e95108645b8738f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/MeasureImportController.php
@@ -0,0 +1,617 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Importer\Measure\ImporterInterface;
+use Irstea\BdohAdminBundle\IrsteaBdohAdminBundle;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\HttpFoundation\File\File;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class MeasureImportController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and (user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory() or user.isAContributorOfCurrentObservatory())")
+ */
+class MeasureImportController extends Controller
+{
+    /**
+     * @var ImporterInterface
+     */
+    protected $importer;
+
+    /**
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    /**
+     * @var EventDispatcherInterface
+     *
+     * @DI\Inject("event_dispatcher")
+     */
+    private $dispatcher;
+
+    /**
+     * From session, retrieves the importer and its errors manager.
+     *
+     * @return [Importer, ImporterErrors]
+     */
+    protected function retrieveImporter()
+    {
+        $this->importer = $this->getSession()->get('measure.importer');
+        $this->errors = $this->importer->getErrors();
+        $this->importer->wakeup($this->getEm(), $this->getTranslator());
+
+        return [$this->importer, $this->errors];
+    }
+
+    /**
+     * Stores the importer in session.
+     */
+    protected function storeImporter()
+    {
+        $this->getSession()->set('measure.importer', $this->importer);
+    }
+
+    /**
+     * Shortcut to return the 'irstea_bdoh_admin.manager.measure_import' service.
+     */
+    protected function getManager()
+    {
+        return $this->container->get('irstea_bdoh_admin.manager.measure_import');
+    }
+
+    /**
+     * Shortcut to return the Logger service.
+     */
+    protected function getLogger()
+    {
+        return $this->container->get('irstea_bdoh_logger.logger');
+    }
+
+    /**
+     * Redirects to step 1 page.
+     */
+    protected function redirectStep1()
+    {
+        return $this->redirect($this->generateUrl('bdoh_admin_measure_import'));
+    }
+
+    /**
+     * Prepares the response data in case of errors.
+     *
+     * @return array
+     */
+    protected function getErrorsResponse()
+    {
+        if ($this->importer) {
+            $this->importer->clean();
+        }
+
+        // Retrieves the identifier of current importer
+        $importers = $this->getManager()->importers->all();
+
+        $idImporter = null;
+        foreach ($importers as $key => $class) {
+            if (get_class($this->importer) === $class) {
+                $idImporter = $key;
+                break;
+            }
+        }
+
+        // Sends the error info
+        return [
+            'action'     => 'errors',
+            'idImporter' => $idImporter,
+            'view'       => $this->renderView(
+                'IrsteaBdohAdminBundle:MeasureImport:errors.html.twig',
+                [
+                    'errors'     => $this->errors->translations($this->getTranslator()),
+                    'idImporter' => $idImporter,
+                ]
+            ),
+        ];
+    }
+
+    /**
+     * Stops the measures import process and redirects to step 1 page.
+     */
+    public function stopAction()
+    {
+        list($importer) = $this->retrieveImporter();
+        $importer->clean();
+        $this->getSession()->getFlashBag()->add('error', $this->getTranslator()->trans('measure.import.info.wasCanceled'));
+
+        return $this->redirectStep1();
+    }
+
+    /**
+     * Displays step 1 : selection of file and file format.
+     */
+    public function step1Action()
+    {
+        return $this->render(
+            'IrsteaBdohAdminBundle:MeasureImport:step1.html.twig',
+            [
+                'fileFormats' => $this->getManager()->importers->keys(),
+            ]
+        );
+    }
+
+    /**
+     * => Checks request parameters of step 1.
+     * => Displays step 2 : selection/displaying of 'station', timezone and 'chroniques'.
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function step2Action(Request $request)
+    {
+        if (!$request->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $manager = $this->getManager();
+        $file = $request->files->get('file');
+        $format = $request->request->get('file-format');
+        $importerClass = $manager->importers->get($format);
+        $errors = $this->errors = new ImportErrors();
+
+        $user = $this->getUser();
+
+        /*
+         * Checks request parameters of step 1 : file and format.
+         */
+        if (null === $importerClass) {
+            // Bad format
+            $errors->badFormat($format);
+        } elseif (null === $file) {
+            // No file
+            $errors->noFile();
+        } elseif (UPLOAD_ERR_OK !== $file->getError()) {
+            // PHP upload error
+            $errors->phpUploadError($file->getError());
+        } else {
+            $mimeType = $file->getMimeType();
+            if (false === $manager->isValidMimeType($mimeType)) {
+                // Bad mime type for file
+                $errors->badMimeType($mimeType);
+            }
+        }
+
+        // No error for step 1 parameters ?
+        if ($errors->isClean()) {
+            // Moves uploaded file in "measures import" directory
+            $file = $file->move($manager->getDir());
+            $filePath = $file->getPathname();
+
+            // File is a zip archive ?
+            if ($manager->isValidMimeType($mimeType, 'zip')) {
+                // Extracts its first file
+                $zipPath = $filePath;
+                $filePath = IrsteaBdohAdminBundle::unzipFirst($zipPath, $manager->getDir());
+
+                if (null === $filePath) {
+                    $errors->badZip();
+                } else {
+                    // Checks mime type of this file (must be a text)
+                    $file = new File($filePath, false);
+                    $mimeType = $file->getMimeType();
+
+                    if (false === $manager->isValidMimeType($mimeType, 'txt')) {
+                        $errors->zipFirstBadMimeType($mimeType);
+                    }
+                }
+                // Removes the zip archive
+                unlink($zipPath);
+            }
+
+            // If no error, creates the importer and loads the file header
+            if ($errors->isClean()) {
+                $importer = $this->importer =
+                    new $importerClass($this->getEm(), $this->getTranslator(), $filePath, $errors);
+                $importer->loadHeader();
+
+                $this->importer->format = $format;
+            }
+        }
+
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } // No station ? Forces the user to enter one, before further !
+        elseif (null === $importer->getStation()) {
+            $data = [
+                'action' => 'step2.askStation',
+                'view'   => $this->renderView(
+                    'IrsteaBdohAdminBundle:MeasureImport:step2-askStation.html.twig',
+                    ['stations' => $this->getBdohRepo('Station')->securedFindAllForMesure($user)]
+                ),
+            ];
+        } else {
+            if (!$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $importer->getStation())) {
+                $errors->noRightOnStation($importer->getStation());
+                $data = $this->getErrorsResponse();
+            } else {
+                $data = $this->step2Next();
+            }
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->storeImporter();
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * => Retrieves the request parameter "station" from "step 2 - ask Station".
+     * => Stores it in the importer.
+     * => Checks the result.
+     * => Displays the final step 2.
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function step2NextAction(Request $request)
+    {
+        if (!$request->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $stationCode = $request->request->get('station');
+        list($importer, $errors) = $this->retrieveImporter();
+
+        // Stores the request parameter "station" in the importer
+        $importer->setStation($stationCode);
+
+        // And checks the result
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } else {
+            $data = $this->step2Next();
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->storeImporter();
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * The main/final step 2.
+     */
+    protected function step2Next()
+    {
+        $importer = $this->importer;
+        $errors = $this->errors;
+        $timezone = $importer->getTimezone() ? 'UTC' . substr($importer->getTimezone(), 0, 3) : null;
+
+        $user = $this->getUser();
+
+        $data = [
+            'action'      => 'step2',
+            'view'        => $this->renderView(
+                'IrsteaBdohAdminBundle:MeasureImport:step2.html.twig',
+                [
+                    'station'          => $importer->getStation(),
+                    'timezone'         => $timezone,
+                    'chroniques'       => $importer->getChroniques(),
+                    'chroniquesBoxTxt' => $this->getTranslator()->trans(
+                        $importer->getChroniqueType() . 'Box(%station%)',
+                        ['%station%' => $importer->getStation()]
+                    ),
+                ]
+            ),
+            'ignoredTimeSeries'  => $this->getTranslator()->trans('measure.import.ignoredTimeSeries'),
+            'titleDelete'        => $this->getTranslator()->trans('measure.import.removeTimeSeries'),
+            'titleRedo'          => $this->getTranslator()->trans('measure.import.restoreTimeSeries'),
+            'ignoreColumn'       => $this->getTranslator()->trans('ignoreColumn'),
+        ];
+
+        // No 'chronique' read from file header ?
+        if (false === $importer->hasChroniques()) {
+            // Gets all 'chroniques' of right type, of the importer 'station'
+            $tmpChron = $importer->getChroniqueRepo()->securedFindByStation($importer->getStation(), $user);
+
+            // At least one 'chronique' available
+            if ($tmpChron) {
+                $chroniquesAvailable = [];
+                foreach ($tmpChron as $chronique) {
+                    if (!$chronique->isConvertie()) {
+                        $chroniquesAvailable[$chronique->getCode()] = (string) $chronique;
+                    }
+                }
+                $data['expectedChroniques'] = $importer->getExpectedChroniques();
+                $data['chroniquesAvailable'] = $chroniquesAvailable;
+            } // No 'chronique' available => error !
+            else {
+                $func = 'noChronique' . $importer->getChroniqueType() . 'Available';
+                $errors->$func((string) $importer->getStation());
+                $data = $this->getErrorsResponse();
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * => Retrieves the request parameters "timezone" and "chroniques" from step 2.
+     * => Stores them in the importer.
+     * => Checks the result.
+     * => Reads the measures in file.
+     * => Displays the step 3 : validation of import.
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function step3Action(Request $request)
+    {
+        if (!$request->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $timezone = $request->request->get('timezone');
+        $chroniques = $request->request->get('chroniques');
+
+        list($importer, $errors) = $this->retrieveImporter();
+        $alreadyDefined = $importer->hasChroniques();
+
+        // Stores the request parameter "timezone" in the importer
+        if ($timezone) {
+            $importer->setTimezone('UTC' . $timezone);
+        }
+
+        // Stores each 'chronique' of the request parameter "chroniques", in the importer
+        for ($i = 0; $i < $importer->getExpectedChroniques(); ++$i) {
+            // 'Chronique' not found ? Don't import its new measures !
+            if (false === isset($chroniques[$i])) {
+                $importer->setChronique(null, $i);
+            } // 'Chronique' already stored / defined ? No need to redo !
+            elseif (false === $alreadyDefined) {
+                $importer->setChronique($chroniques[$i], $i);
+            }
+        }
+
+        // And checks the result
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } else {
+            // Reads the measures in file
+            $importer->loadData();
+
+            // Some errors ? Display it and quit !
+            if ($errors->isDirty()) {
+                $data = $this->getErrorsResponse();
+            } else {
+                // Is the checkbox for children computation needed
+                $hasChildrenGlobal = false;
+                // How many children may be computed (for translation)
+                $childrenCountGlobal = 0;
+                // Prepares (for Twig template) the data of each 'chronique' selected by user
+                $chroniques = [];
+                foreach ($importer->getChroniques() as $chronique) {
+                    if ($chronique) {
+                        $chroniqueData = $this->prepareChroniqueData($chronique);
+                        $hasChildrenGlobal = $hasChildrenGlobal || $chroniqueData['hasChildren'];
+                        $childrenCountGlobal += $chroniqueData['childrenCount'];
+                        $chroniques[] = $chroniqueData;
+                    }
+                }
+
+                $data = [
+                    'action'                  => 'step3',
+                    'view'                    => $this->renderView(
+                        'IrsteaBdohAdminBundle:MeasureImport:step3.html.twig',
+                        [
+                            'chroniques'          => $chroniques,
+                            'hasChildrenGlobal'   => $hasChildrenGlobal,
+                            'childrenCountGlobal' => $childrenCountGlobal,
+                        ]
+                    ),
+                    'numChroniquesToValidate' => count($chroniques),
+                ];
+            }
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->storeImporter();
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * => Retrieves the request parameter "importType" from step 3.
+     * => Runs the effective import of measures, depending of it.
+     * => Displays the step 4 : summary of import, or errors.
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function step4Action(Request $request)
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $importTypes = $request->request->get('importTypes');
+        list($importer, $errors) = $this->retrieveImporter();
+        $propagate = $request->request->get('propagate', false) === 'propagate';
+
+        // Stores the request parameter "propagate" in the importer
+        $importer->setPropagate($propagate);
+
+        // For each selected 'chronique', proceeds to the final import
+        $stats = $importer->importData($importTypes, $this->getUser(), $this->dispatcher);
+
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } else {
+            foreach ($stats as $stat) {
+                if ($stat['insert'] > 0) {
+                    $this->getLogger()->createHistoriqueDonneesImport(
+                        $this->container->get('security.context')->getToken()->getUser(),
+                        new \DateTime(),
+                        $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                        $stat['entity'],
+                        $stat['beginDate'],
+                        $stat['endDate'],
+                        $stat['insert'],
+                        $this->importer->format,
+                        $this->importer->getTimezone()
+                    );
+                }
+                /* update of measures' dates on the 'chronique' */
+                if ($stat['entity']) {
+                    $this->getBdohRepo('Chronique')->updateDatesMesuresByChronique($stat['entity']->getId());
+                }
+            }
+            $data = [
+                'action'      => 'step4',
+                'view'        => $this->renderView(
+                    'IrsteaBdohAdminBundle:MeasureImport:step4.html.twig',
+                    [
+                        'stats'         => $stats,
+                        'chroniqueType' => $importer->getChroniqueType(),
+                        'jobPageLink'   => $this->generateUrl('bdoh_job_list'),
+                    ]
+                ),
+            ];
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $request->getSession()->remove('measure.importer');
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * From a 'chronique' entity, returns an array with :
+     *  => this entity ;
+     *  => its first measure date ;
+     *  => its last measure date ;
+     *  => the importer first measure date ;
+     *  => the importer last measure date ;
+     *  => the category of dates overlap ;
+     *  => the "too small" new measures if there are ;
+     *  => the "too large" new measures if there are .
+     *
+     * @param Irstea\BdohDataBundle\Entity\Chronique|null $chronique
+     * @param int
+     *
+     * @return array|null returns null if $chronique isn't a valid 'Chronique' object
+     */
+    protected function prepareChroniqueData($chronique)
+    {
+        if (false === ($chronique instanceof Chronique)) {
+            return null;
+        }
+
+        // Exact 'Chronique' repository
+        $repChronique = $this->importer->getChroniqueRepo();
+
+        // Dates of first and last existing measures
+        list($existingFirstDate, $existingLastDate) = $repChronique->getFirstLastDates($chronique);
+
+        // Dates of first and last measures to import
+        $importFirstDate = $this->importer->firstDate;
+        $importLastDate = $this->importer->lastDate;
+
+        /*
+         * Computes the category of dates overlap.
+         */
+
+        // There is no existing measure
+        if ((null === $existingFirstDate) && (null === $existingLastDate)) {
+            $overlap = 'new';
+        } // New measures are completely BEFORE existing measures
+        elseif ($importLastDate < $existingFirstDate) {
+            $overlap = 'before';
+        } // New measures are completely AFTER existing measures
+        elseif ($importFirstDate > $existingLastDate) {
+            $overlap = 'after';
+        } // Bounds of new and old measures are exactly equal
+        elseif (($importFirstDate === $existingFirstDate) && ($importLastDate === $existingLastDate)) {
+            $overlap = 'boundsEqual';
+        } // New measures are completely IN existing measures
+        elseif (($importFirstDate >= $existingFirstDate) && ($importLastDate <= $existingLastDate)) {
+            $overlap = 'newInOld';
+        } // Existing measures are completely IN new measures
+        elseif (($importFirstDate < $existingFirstDate) && ($importLastDate > $existingLastDate)) {
+            $overlap = 'oldInNew';
+        } // Only some first new measures are IN existing measures
+        elseif (($importFirstDate >= $existingFirstDate) && ($importLastDate > $existingLastDate)) {
+            $overlap = 'firstIn';
+        } // Only some last new measures are IN existing measures
+        elseif (($importFirstDate < $existingFirstDate) && ($importLastDate <= $existingLastDate)) {
+            $overlap = 'lastIn';
+        }
+
+        $children = $repChronique->findAllChildren($chronique);
+        $childrenList = join('<br>', $children);
+        $childrenCount = count($children);
+
+        return [
+            'chronique'         => $chronique,
+            'existingFirstDate' => $existingFirstDate,
+            'existingLastDate'  => $existingLastDate,
+            'importerFirstDate' => $importFirstDate,
+            'importerLastDate'  => $importLastDate,
+            'overlap'           => $overlap,
+            'valeurTooSmall'    => $this->importer->getValeurTooSmall($chronique->getId()),
+            'valeurTooLarge'    => $this->importer->getValeurTooLarge($chronique->getId()),
+            'hasChildren'       => $chronique->hasChildren(),
+            'childrenList'      => $childrenList,
+            'childrenCount'     => $childrenCount,
+        ];
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/PointControleController.php b/src/Irstea/BdohAdminBundle/Controller/PointControleController.php
new file mode 100644
index 0000000000000000000000000000000000000000..c37e927259043ba8971553ba146860a0d2cfdf13
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/PointControleController.php
@@ -0,0 +1,439 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer;
+use Irstea\BdohBundle\Util\HttpFileResponse;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+
+/**
+ * Description of PointControleController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and (user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory() or user.isAContributorOfCurrentObservatory())")
+ */
+class PointControleController extends Controller
+{
+    /**
+     * @var Irstea\BdohAdminBundle\Importer\Controle\Manager
+     */
+    protected $controlePointManager;
+
+    /**
+     * @var Irstea\BdohAdminBundle\Errors\ImportErrors
+     */
+    protected $errors;
+
+    /**
+     * From session, retrieves the importer and its errors manager.
+     */
+    protected function retrieveImporter()
+    {
+        $this->controlePointManager = $this->getSession()->get('controle.importer');
+        $this->errors = $this->controlePointManager->getErrors();
+        $this->controlePointManager->wakeup($this->getEm(), $this->getTranslator());
+
+        return [$this->controlePointManager, $this->errors];
+    }
+
+    /**
+     * Stores the importer in session.
+     */
+    protected function storeImporter()
+    {
+        $this->getRequest()->getSession()->set('controle.importer', $this->controlePointManager);
+    }
+
+    /**
+     * Shortcut to return the 'irstea_bdoh_admin.manager.controle_import' service.
+     * !!! : different from controlePointManager.
+     */
+    protected function getManager()
+    {
+        return $this->container->get('irstea_bdoh_admin.manager.controle_import');
+    }
+
+    /**
+     * Shortcut to return the Logger service.
+     */
+    protected function getLogger()
+    {
+        return $this->container->get('irstea_bdoh_logger.logger');
+    }
+
+    /**
+     * Redirects to step 1 page.
+     */
+    protected function redirectStep1()
+    {
+        return $this->redirect($this->generateUrl('bdoh_admin_controle_import'));
+    }
+
+    /**
+     * Prepares the response data in case of errors.
+     *
+     * @return array
+     */
+    protected function getErrorsResponse()
+    {
+        if ($this->controlePointManager) {
+            $this->controlePointManager->clean();
+        }
+
+        $view = $this->renderView(
+            'IrsteaBdohAdminBundle:ControleManagement:errors.html.twig',
+            [
+                'errors'     => $this->errors->translations($this->getTranslator()),
+                'idImporter' => 'controle',
+            ]
+        );
+
+        // Sends the error info
+        return [
+            'action'     => 'errors',
+            'idImporter' => 'controle',
+            'view'       => $view,
+        ];
+    }
+
+    /**
+     * Stops the measures import process and redirects to step 1 page.
+     */
+    public function stopAction()
+    {
+        list($importer) = $this->retrieveImporter();
+        $importer->clean();
+        $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('controle.import.info.wasCanceled'));
+
+        return $this->redirectStep1();
+    }
+
+    /**
+     * Displays step 1 : selection of file and file format.
+     */
+    public function step1Action()
+    {
+        $user = $this->getUser();
+
+        $chroniques = $this->getBdohRepo('ChroniqueContinue')->securedFindAllHavingControlePoints($user);
+
+        return $this->render(
+            'IrsteaBdohAdminBundle:ControleManagement:step1.html.twig',
+            ['chroniques' => $chroniques]
+        );
+    }
+
+    public function step2Action()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $request = $this->getRequest();
+        $manager = $this->getManager();
+        $file = $request->files->get('file');
+        $importerClass = $manager->importers->get('controle');
+        $errors = $this->errors = new ImportErrors();
+
+        /*
+         * Checks request parameters of step 1 : file.
+         */
+        if (null === $file) {
+            $errors->noFile();  // No file
+        } else {
+            $mimeType = $file->getMimeType();
+
+            // Bad mime type for file
+            if (false === $manager->isValidMimeType($mimeType)) {
+                $errors->badMimeType($mimeType);
+            }
+        }
+
+        // No error for step 1 parameters ?
+        if ($errors->isClean()) {
+            // Moves uploaded file in import directory
+            $file = $file->move($manager->getDir());
+            $filePath = $file->getPathname();
+
+            // If no error, creates the importer and loads the file header
+            if ($errors->isClean()) {
+                $importer = $this->controlePointManager = new $importerClass($this->getEm(), $this->getTranslator(), $filePath, $errors);
+                $importer->loadHeader();
+                // Some errors ? Display it and quit !
+                if ($errors->isDirty()) {
+                    $data = $this->getErrorsResponse();
+                } else {
+                    if (!$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $importer->getStation())) {
+                        $errors->noRightOnStation($importer->getStation());
+                    }
+                    // Some errors ? Display it and quit !
+                    if ($errors->isDirty()) {
+                        $data = $this->getErrorsResponse();
+                    } else {
+                        // Reads the controles in file
+                        $importer->loadData();
+                        // Some errors ? Display it and quit !
+                        if ($errors->isDirty()) {
+                            $data = $this->getErrorsResponse();
+                        } else {
+                            // Prepares (for Twig template) the data of each 'chronique' selected by user
+                            $chroniqueData = $this->prepareChroniqueData($importer->getChronique());
+                            list($nbNewPointControle, $nbPointControle) =
+                                $this->getBdohRepo('PointControle')->importStats($importer->tmpSqlTable, $importer->getChronique()->getId());
+                            $data = [
+                                'action' => 'step3',
+                                'view'   => $this->renderView(
+                                    'IrsteaBdohAdminBundle:ControleManagement:step2.html.twig',
+                                    [
+                                        'chroniqueData'      => $chroniqueData,
+                                        'nbNewPointControle' => $nbNewPointControle,
+                                        'nbPointControle'    => $nbPointControle,
+                                        'station'            => $importer->getStation(),
+                                        'timezone'           => $importer->getTimezone(),
+                                        'chronique'          => $importer->getChronique(),
+                                    ]
+                                ),
+                            ];
+                        }
+                    }
+                }
+            }
+        }
+
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->storeImporter();
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * => Retrieves the request parameter "importType" from step 3.
+     * => Runs the effective import of measures, depending of it.
+     * => Displays the step 3 : summary of import, or errors.
+     */
+    public function step3Action()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $request = $this->getRequest();
+        $importType = $request->request->get('importType');
+        list($importer, $errors) = $this->retrieveImporter();
+
+        // For each selected 'chronique', proceeds to the final import
+        $stats = $importer->importData($importType);
+
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } else {
+            foreach ($stats as $stat) {
+                $this->getLogger()->createHistoriqueDonneesPointControle(
+                    $this->container->get('security.context')->getToken()->getUser(),
+                    new \DateTime(),
+                    $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                    $stat['entity'],
+                    $stat['beginDate'],
+                    $stat['endDate'],
+                    $stat['insert'],
+                    'historique.actions.PointControleImport',
+                    $this->controlePointManager->getTimezone()
+                );
+            }
+            $data = [
+                'action' => 'step4',
+                'view'   => $this->renderView(
+                    'IrsteaBdohAdminBundle:ControleManagement:step3.html.twig',
+                    [
+                        'stats' => $stats,
+                    ]
+                ),
+            ];
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->getRequest()->getSession()->remove('controle.importer');
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * From a 'chronique' entity, returns an array with :
+     *  => this entity ;
+     *  => its first measure date ;
+     *  => its last measure date ;
+     *  => the importer first measure date ;
+     *  => the importer last measure date ;
+     *  => the category of dates overlap ;
+     *  => the "too small" new measures if there are ;
+     *  => the "too large" new measures if there are .
+     *
+     * @param Irstea\BdohDataBundle\Entity\Chronique|null $chronique
+     * @param int
+     *
+     * @return array|null returns null if $chronique isn't a valid 'Chronique' object
+     */
+    protected function prepareChroniqueData($chronique)
+    {
+        // Dates of first and last existing controles
+        $existingDates = $this->controlePointManager->getControleRepo()->getFirstLastDates($chronique);
+
+        $existingFirstDate = $existingDates['first'];
+        $existingLastDate = $existingDates['last'];
+
+        // Dates of first and last controles to import
+        $importFirstDate = $this->controlePointManager->firstDate;
+        $importLastDate = $this->controlePointManager->lastDate;
+
+        /*
+         * Computes the category of dates overlap.
+         */
+
+        // There is no existing measure
+        if ((null === $existingFirstDate) && (null === $existingLastDate)) {
+            $overlap = 'new';
+        } // New measures are completely BEFORE existing measures
+        elseif ($importLastDate < $existingFirstDate) {
+            $overlap = 'before';
+        } // New measures are completely AFTER existing measures
+        elseif ($importFirstDate > $existingLastDate) {
+            $overlap = 'after';
+        } // Bounds of new and old measures are exactly equal
+        elseif (($importFirstDate === $existingFirstDate) && ($importLastDate === $existingLastDate)) {
+            $overlap = 'boundsEqual';
+        } // New measures are completely IN existing measures
+        elseif (($importFirstDate >= $existingFirstDate) && ($importLastDate <= $existingLastDate)) {
+            $overlap = 'newInOld';
+        } // Existing measures are completely IN new measures
+        elseif (($importFirstDate < $existingFirstDate) && ($importLastDate > $existingLastDate)) {
+            $overlap = 'oldInNew';
+        } // Only some first new measures are IN existing measures
+        elseif (($importFirstDate >= $existingFirstDate) && ($importLastDate > $existingLastDate)) {
+            $overlap = 'firstIn';
+        } // Only some last new measures are IN existing measures
+        elseif (($importFirstDate < $existingFirstDate) && ($importLastDate <= $existingLastDate)) {
+            $overlap = 'lastIn';
+        }
+
+        return [
+            'existingFirstDate' => $existingFirstDate,
+            'existingLastDate'  => $existingLastDate,
+            'importerFirstDate' => $importFirstDate,
+            'importerLastDate'  => $importLastDate,
+            'overlap'           => $overlap,
+        ];
+    }
+
+    public function exportAction()
+    {
+        $request = $this->getRequest();
+        $manager = $this->getManager();
+        $chroniqueId = $request->request->get('chronique');
+        $timezone = $request->request->get('timezone');
+        $importerClass = $manager->importers->get('controle');
+        $errors = $this->errors = new ImportErrors();
+
+        /*
+         * Checks request parameters of step 1 : chronique.
+         */
+
+        if (false === $timezone = ToUtcDiffTransformer::bdohTimezone('UTC' . $timezone)) {
+            $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('measure.export.error.badTimezone'));
+
+            return $this->redirectToReferer();
+        }
+
+        if (null === $chroniqueId || $chroniqueId === '') {
+            $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('controle.export.error.noChronique'));
+
+            return $this->redirectToReferer();
+        }
+
+        $exporter = $this->controlePointManager = new $importerClass(
+            $this->getEm(),
+            $this->getTranslator(),
+            '',
+            $errors,
+            true,
+            $timezone
+        );
+
+        try {
+            $chronique = $this->getBdohRepo('Chronique')->findOneById($chroniqueId);
+
+            if (!$this->get('security.authorization_checker')->isGranted('UPLOAD_DATA', $chronique)) {
+                $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('controle.export.error.noRight'));
+
+                return $this->redirectToReferer();
+            }
+
+            $defaultQualityCodes = $this->container->getParameter('absent_quality_codes');
+            $jeuName = Observatoire::getCurrent()->getJeu()->getNom();
+            $defaultQualityCode = \array_key_exists($jeuName, $defaultQualityCodes) ? $defaultQualityCodes[$jeuName] : '';
+
+            $exporter->run($chroniqueId, $defaultQualityCode);
+
+            $existingDates = $exporter->getControleRepo()->getFirstLastDates($chronique);
+
+            $existingFirstDate = $existingDates['first'];
+            $existingLastDate = $existingDates['last'];
+            $existingControlePointsNumber = $existingDates['number'];
+
+            //log the export
+            $this->getLogger()->createHistoriqueDonneesPointControle(
+                $this->container->get('security.context')->getToken()->getUser(),
+                new \DateTime(),
+                $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                $chronique,
+                $existingFirstDate,
+                $existingLastDate,
+                $existingControlePointsNumber,
+                'historique.actions.PointControleExport',
+                $this->controlePointManager->getTimezone()
+            );
+
+            return new HttpFileResponse($exporter->getFilePath(), 'text/csv');
+        } catch (\Exception $e) {
+            $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('controle.export.error.cantFinish'));
+
+            return $this->redirectToReferer();
+        }
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/ShapeImportController.php b/src/Irstea/BdohAdminBundle/Controller/ShapeImportController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1de01b4193dc16df9fc430d00480c65d9256d275
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/ShapeImportController.php
@@ -0,0 +1,327 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Importer\Shapefile\Manager;
+use Irstea\BdohAdminBundle\IrsteaBdohAdminBundle;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohDataBundle\Entity\Repository\BassinRepository;
+use Irstea\BdohDataBundle\Entity\Repository\CoursEauRepository;
+use Irstea\BdohDataBundle\Entity\Repository\StationRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class ShapeImportController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and user.isAManagerOfCurrentObservatory()")
+ */
+class ShapeImportController extends Controller
+{
+    /**
+     * @var Manager
+     */
+    protected $shapeManager;
+
+    /**
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    /*
+     * Tables that have geometry column
+     */
+    /**
+     * @var array
+     */
+    protected $geoTables = ['bassin', 'coursEau', 'station'];
+
+    /**
+     * From session, retrieves the importer and its errors manager.
+     */
+    protected function retrieveImporter()
+    {
+        $this->shapeManager = $this->getSession()->get('shape.importer');
+        if (!$this->shapeManager) {
+            return [null, null];
+        }
+        $this->errors = $this->shapeManager->getErrors();
+        $this->shapeManager->wakeup($this->getEm(), $this->getTranslator());
+
+        return [$this->shapeManager, $this->errors];
+    }
+
+    /**
+     * Stores the importer in session.
+     */
+    protected function storeImporter()
+    {
+        $this->getSession()->set('shape.importer', $this->shapeManager);
+    }
+
+    /**
+     * Shortcut to return the 'irstea_bdoh_admin.manager.shape_import' service.
+     */
+    protected function getManager()
+    {
+        return $this->container->get('irstea_bdoh_admin.manager.shape_import');
+    }
+
+    /**
+     * Shortcut to return the Logger service.
+     */
+    protected function getLogger()
+    {
+        return $this->container->get('irstea_bdoh_logger.logger');
+    }
+
+    /**
+     * Prepares the response data in case of errors.
+     *
+     * @return array
+     */
+    protected function getErrorsResponse()
+    {
+        if ($this->shapeManager) {
+            $this->shapeManager->clean();
+        }
+
+        // Sends the error info
+        $idImporter = null;
+        list($importer) = $this->retrieveImporter();
+        if ($importer && in_array($importer->getTargettedTable(), $this->geoTables)) {
+            $idImporter = $importer->getTargettedTable();
+        }
+
+        return [
+            'action'     => 'errors',
+            'idImporter' => $idImporter,
+            'view'       => $this->renderView(
+                'IrsteaBdohAdminBundle:ShapeImport:errors.html.twig',
+                [
+                    'errors'     => $this->errors->translations($this->getTranslator()),
+                    'idImporter' => $idImporter,
+                ]
+            ),
+        ];
+    }
+
+    /**
+     * Redirects to step 1 page.
+     */
+    protected function redirectStep1()
+    {
+        return $this->redirect($this->generateUrl('bdoh_admin_shape_import'));
+    }
+
+    /**
+     * Stops the measures import process and redirects to step 1 page.
+     */
+    public function stopAction()
+    {
+        list($importer) = $this->retrieveImporter();
+        $importer->clean();
+        $this->getSession()->getFlashBag()->add('error', $this->get('translator')->trans('shape.import.info.wasCanceled'));
+
+        return $this->redirectStep1();
+    }
+
+    /**
+     * Displays step 1 : selection of file and file format.
+     */
+    public function step1Action()
+    {
+        $security = $this->get('security.context');
+
+        return $this->render(
+            'IrsteaBdohAdminBundle:ShapeImport:step1.html.twig',
+            ['fileShapes' => $this->geoTables]
+        );
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function step2Action(Request $request)
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $manager = $this->getManager();
+        $file = $request->files->get('file');
+        $table = $request->get('file-shape');
+        $importerClass = $manager->importers->get('shape');
+        $errors = $this->errors = new ImportErrors();
+
+        /*
+         * Checks request parameters of step 1 : file.
+         */
+        if (null === $importerClass) {
+            // Bad format
+            $errors->badFormat($table);
+        } elseif (null === $file) {
+            // No file
+            $errors->noFile();
+        } elseif (UPLOAD_ERR_OK !== $file->getError()) {
+            // PHP upload error
+            $errors->phpUploadError($file->getError());
+        } else {
+            $mimeType = $file->getMimeType();
+            if (false === $manager->isValidMimeType($mimeType)) {
+                // Bad mime type for file
+                $errors->badMimeType($mimeType);
+            }
+        }
+
+        // No error for step 1 parameters ?
+        if ($errors->isClean()) {
+            // Moves uploaded file in import directory
+
+            $fileName = explode('.', $file->getClientOriginalName());
+            $file = $file->move($manager->getDir(), $fileName[0]);
+
+            $filePath = $file->getPathname();
+            if ($manager->isValidMimeType($mimeType, 'zip')) {
+                // Extracts its first file
+                $zipPath = $filePath;
+                if (!IrsteaBdohAdminBundle::unzipAll($zipPath, $manager->getDir())) {
+                    $errors->badZip();
+                }
+            }
+            if ($errors->isClean()) {
+                /** @var Manager $importer */
+                $importer = $this->shapeManager = new $importerClass($this->getEm(), $this->getTranslator(), $filePath, $table, $errors);
+
+                exec($importer->getShpToPgsqlCommand());
+
+                if (filesize($filePath . '_Success.log') === 0) {
+                    $errors->badShape(file_get_contents($filePath . '_Errors.log'));
+                }
+                if ($errors->isClean()) {
+                    $shapeData = $this->prepareShapeData($importer);
+                    if (isset($shapeData['error'])) {
+                        $errors->incoherentShape($this->getTranslator()->trans($shapeData['error']));
+                    }
+                    if ($errors->isClean()) {
+                        $data = [
+                            'action' => 'step2',
+                            'view'   => $this->renderView(
+                                'IrsteaBdohAdminBundle:ShapeImport:step2-' . \strtolower($shapeData['cible']) . '.html.twig',
+                                ['shapeData' => $shapeData]
+                            ),
+                        ];
+                    }
+                }
+            }
+        }
+        $this->storeImporter();
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @throws \Exception
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function step3Action(Request $request)
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectStep1();
+        }
+
+        $importType = $request->request->get('shapeImportType');
+
+        $token = $this->container->get('security.context')->getToken();
+        $user = $token ? $token->getUser() : null;
+        list($importer, $errors) = $this->retrieveImporter();
+        $stats = $importer->importData($importType, $user);
+        // Some errors ? Display it and quit !
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+        } else {
+            if ($stats[0] + $stats[1] > 0) {
+                $this->getLogger()->createHistoriqueSig(
+                    $this->container->get('security.context')->getToken()->getUser(),
+                    new \DateTime(),
+                    $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                    $stats,
+                    $importer->getTargettedTable()
+                );
+            }
+
+            $data = [
+                'action' => 'step3',
+                'view'   => $this->renderView(
+                    'IrsteaBdohAdminBundle:ShapeImport:step3.html.twig',
+                    [
+                        'stats' => $stats,
+                    ]
+                ),
+            ];
+        }
+        $importer->clean();
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * @param Manager $importer
+     *
+     * @return mixed|null
+     */
+    public function prepareShapeData($importer)
+    {
+        /** @var BassinRepository|StationRepository|CoursEauRepository $repoShape */
+        $repoShape = $this->getBdohRepo(ucfirst($importer->getTargettedTable()));
+        $token = $this->container->get('security.context')->getToken();
+        $user = $token ? $token->getUser() : null;
+
+        if (in_array($importer->getTargettedTable(), $this->geoTables)) {
+            return $repoShape->getDataFromShapeTable($importer->getTmpTable(), $user);
+        }
+
+        return null;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Controller/TransformationController.php b/src/Irstea/BdohAdminBundle/Controller/TransformationController.php
new file mode 100644
index 0000000000000000000000000000000000000000..fce99b27c1b5f47614ae7a84865b7e49ae85bc4d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Controller/TransformationController.php
@@ -0,0 +1,896 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Controller;
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Exporter\Bareme\BaremeExporter;
+use Irstea\BdohAdminBundle\Importer\Bareme\Manager;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohBundle\Util\HttpZipResponse;
+use Irstea\BdohDataBundle\Entity\BaremeJeuBareme;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\JeuBareme;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueCalculeeRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use Irstea\BdohDataBundle\Entity\Transformation;
+use Irstea\BdohLoggerBundle\Logger\BdohLogger;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Description of TransformationController.
+ *
+ * @Security("is_granted('ROLE_ADMIN') and (user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory() or user.isAContributorOfCurrentObservatory())")
+ */
+class TransformationController extends Controller
+{
+    const HISTO_TRANSFO_HEADER = '## ';
+
+    const HISTO_TRANSFO_SEP = ' || ';
+
+    /**
+     * @return BdohLogger
+     */
+    protected function getLogger()
+    {
+        return $this->container->get('irstea_bdoh_logger.logger');
+    }
+
+    /**
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    /**
+     * @var Manager
+     */
+    protected $baremeManager;
+
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    private $jobManager;
+
+    /**
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function displayAction()
+    {
+        $stations = [];
+        $chroniquesMeres = [];
+        $chroniquesFilles = [];
+
+        /** @var ChroniqueContinueRepository $repo */
+        $repo = $this->getBdohRepo('ChroniqueContinue');
+
+        /** @var ChroniqueContinue[] $all */
+        $all = $repo->bigFindAll();
+
+        foreach ($all as $chronique) {
+            $station = $chronique->getStation();
+            $stationId = $station->getId();
+
+            if (!isset($stations[$stationId])) {
+                $stations[$stationId] = $station;
+            }
+
+            $chroniquesMeres[$stationId][] = $chronique;
+        }
+
+        /** @var ChroniqueCalculeeRepository $repo */
+        $repo = $this->getBdohRepo('ChroniqueCalculee');
+
+        /** @var ChroniqueCalculee[] $all */
+        $all = $repo->securedBigFindAll($this->getUser());
+
+        foreach ($all as $chronique) {
+            $station = $chronique->getStation();
+            $stationId = $station->getId();
+
+            if (!isset($stations[$stationId])) {
+                $stations[$stationId] = $station;
+            }
+
+            $chroniquesFilles[$stationId][] = $chronique;
+        }
+
+        $baremes = $this->getBdohRepo('Bareme')->securedFindAll();
+        $jeuQualite = $this->getBdohRepo('Bareme')->getCurrentObservatoire()->getJeu();
+
+        return $this->render(
+            'IrsteaBdohAdminBundle:Transformation:main.html.twig',
+            [
+                'chroniquesFilles'   => $chroniquesFilles,
+                'stations'           => $stations,
+                'chroniques'         => $chroniquesMeres,
+                'baremes'            => $baremes,
+                'jeuQualite'         => $jeuQualite,
+                'valueLimitPolicies' => JeuBareme::getValueLimitTransformationTypeList(),
+                'hasChildren'        => true,
+            ]
+        );
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return JsonResponse
+     */
+    public function getChroniqueCalculeeAction(Request $request)
+    {
+        $chroniqueId = $request->get('id');
+
+        if ($chroniqueId !== -1) {
+            /** @var ChroniqueContinueRepository $chronRepo */
+            $chronRepo = $this->getBdohRepo('ChroniqueCalculee');
+
+            /** @var ChroniqueCalculee $chronique */
+            $chronique = $chronRepo->find($chroniqueId);
+
+            $children = $chronRepo->findAllChildren($chronique);
+            $childrenList = join('<br>', $children);
+            $childrenCount = count($children);
+
+            $maj = $chronique->getMiseAJour();
+            $response = [
+                'unite'         => $chronique->getUnite()->getLibelle(),
+                'maj'           => ($maj) ? $maj->format($this->getTranslator()->trans('transformation.bareme.dateBareme'))
+                    . ' ' . $this->getTranslator()->trans('UTC') : '',
+                'coefficient'   => $chronique->getFacteurMultiplicatif(),
+                'genealogie'    => $chronique->getGenealogie(),
+                'genealogieEn'  => $chronique->getGenealogieEn(),
+                'hasChildren'   => $chronique->hasChildren(),
+                'childrenList'  => $childrenList,
+                'childrenCount' => $childrenCount,
+            ];
+
+            foreach (['Principale', 'Secondaire'] as $block) {
+                $parent = ($block === 'Principale') ? $chronique->getPremiereEntree() : $chronique->getSecondeEntree();
+                /* @var $parent Transformation */
+                if ($parent) {
+                    $response['chroniqueMere' . $block] = $parent->getEntree()->getId();
+                    $response['delaiPropagation' . $block] = $parent->getJeuBaremeActuel()->getDelaiPropagation();
+                    $response['allowValueLimits' . $block] = $parent->getEntree()->getAllowValueLimits();
+                    $response['valueLimitPolicy' . $block] = $parent->getJeuBaremeActuel()->getValueLimitTransformationType();
+                    $response['valueLimitPlaceholder' . $block] = $parent->getJeuBaremeActuel()->getValueLimitPlaceholder();
+                    $baremeData = [];
+                    foreach ($parent->getJeuBaremeActuel()->getBaremeJeuBaremes() as $bjb) {
+                        $bareme = $bjb->getBareme();
+                        $dateEnd = $bjb->getFinValidite();
+                        $baremeData[] = [
+                            'id'    => $bareme->getId(),
+                            'begin' => $bjb->getDebutValidite()->format('Y-m-d H:i:s'),
+                            'end'   => ($dateEnd) ? $dateEnd->format('Y-m-d H:i:s') : null,
+                        ];
+                    }
+                    $response['baremes' . $block] = $baremeData;
+                }
+
+                if ($block === 'Principale') {
+                    $response['isFirstEdition'] = (!$parent);
+                }
+            }
+
+            return new JsonResponse($response);
+        }
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return JsonResponse
+     */
+    public function saveTransformationAction(Request $request)
+    {
+        if (!$this->isXmlHttpRequest()) {
+            $this->redirectTransformation();
+        }
+
+        $idChroniqueCalculee = $request->get('chroniqueCalculee');
+        $idChroniqueMerePrincipale = $request->get('selectChroniqueMerePrincipale');
+        $idChroniqueMereSecondaire = $request->get('selectChroniqueMereSecondaire');
+        $coefficient = $request->get('coefficient');
+        $genealogie = $request->get('genealogie');
+        $genealogieEn = $request->get('genealogieEn');
+        $propagate = $request->get('propagate', false) === 'propagate';
+        $dataJeuBaremePrincipale = $request->get('jeuBaremePrincipale');
+        $dataJeuBaremeSecondaire = $request->get('jeuBaremeSecondaire');
+        $delaiPrincipale = (float) $request->get('delaiPropagationPrincipale');
+        $delaiSecondaire = (float) $request->get('delaiPropagationSecondaire');
+        $limitPolicyPrincipale = $request->get('valueLimitsPrincipale');
+        $limitPolicySecondaire = $request->get('valueLimitsSecondaire');
+        $limitPlaceholderPrincipale = $request->get('limitPlaceholderPrincipale');
+        $limitPlaceholderSecondaire = $request->get('limitPlaceholderSecondaire');
+
+        $hasChroniqueMereSecondaire = ($idChroniqueMereSecondaire && is_numeric($idChroniqueMereSecondaire) &&
+            ($idChroniqueMereSecondaire = ((int) $idChroniqueMereSecondaire)) >= 0);
+
+        if (!$hasChroniqueMereSecondaire) {
+            $delaiPrincipale = $delaiSecondaire = null;
+        }
+
+        $chroniqueCalculee = (is_numeric($idChroniqueCalculee)) ?
+            $this->getBdohRepo('ChroniqueCalculee')->findOneById($idChroniqueCalculee) : null;
+
+        $chroniqueMerePrincipale = (is_numeric($idChroniqueMerePrincipale)) ?
+            $this->getBdohRepo('ChroniqueContinue')->findOneById($idChroniqueMerePrincipale) : null;
+
+        $chroniqueMereSecondaire = ($hasChroniqueMereSecondaire && is_numeric($idChroniqueMereSecondaire)) ?
+            $this->getBdohRepo('ChroniqueContinue')->findOneById($idChroniqueMereSecondaire) : null;
+
+        $uniteChroniqueFille = (!$hasChroniqueMereSecondaire && $chroniqueCalculee) ? $chroniqueCalculee->getUnite() : null;
+
+        $errors = [
+            'general'    => [],
+            'principale' => [],
+            'secondaire' => [],
+        ];
+
+        // Bad coefficient?
+        if ($coefficient && !is_numeric($coefficient)) {
+            $errors['general'][] = $this->translateTransfoErrors('coefficientNonNumerique', ['%coeff%' => $coefficient]);
+        }
+
+        // No child chronicle?
+        if (!$chroniqueCalculee) {
+            $errors['general'][] = $this->translateTransfoErrors('chroniqueFilleIntrouvable');
+        }
+
+        // First parent chronicle not found?
+        if (!$chroniqueMerePrincipale) {
+            $errors['principale'][] = $this->translateTransfoErrors('chroniqueMereIntrouvable');
+        }
+
+        // No grading scale for the first parent chronicle?
+        if (!$dataJeuBaremePrincipale) {
+            $errors['principale'][] = $this->translateTransfoErrors('aucunBareme');
+        }
+
+        // Check grading scales for the first parent chronicle
+        $dataAndErrorsPrincipale = $this->extractJeuBareme(
+            $dataJeuBaremePrincipale,
+            ($chroniqueMerePrincipale) ? $chroniqueMerePrincipale->getUnite() : null,
+            !$hasChroniqueMereSecondaire ? $uniteChroniqueFille : null
+        );
+        $errors['principale'] = array_merge($errors['principale'], $dataAndErrorsPrincipale['errors']);
+
+        // If there is a second parent chronicle...
+        if ($hasChroniqueMereSecondaire) {
+            // Second parent chronicle not found?
+            if (!$chroniqueMereSecondaire) {
+                $errors['secondaire'][] = $this->translateTransfoErrors('chroniqueMereIntrouvable');
+            } else {
+                // No grading scale for the second parent chronicle?
+                if (!$dataJeuBaremeSecondaire) {
+                    $dataAndErrorsSecondaire = null;
+                    $errors['secondaire'][] = $this->translateTransfoErrors('aucunBareme');
+                } else {
+                    // Check grading scales for the second parent chronicle
+                    $dataAndErrorsSecondaire = $this->extractJeuBareme(
+                        $dataJeuBaremeSecondaire,
+                        ($chroniqueMereSecondaire) ? $chroniqueMereSecondaire->getUnite() : null
+                    );
+                    $errors['secondaire'] = array_merge($errors['secondaire'], $dataAndErrorsSecondaire['errors']);
+                }
+            }
+
+            // For each of the first and second parent chronicles, all grading scales must hold the same output unit
+            foreach ([0, 1] as $i) {
+                $errorCase = ($i === 0) ? 'principale' : 'secondaire';
+                $outputUnits = $this->extractBaremeOutputUnits(($i === 0) ? $dataJeuBaremePrincipale : $dataJeuBaremeSecondaire);
+                if (($nUnits = count($outputUnits)) > 1) {
+                    $unitsOk = true;
+                    $firstUnitId = $outputUnits[0]->getId();
+                    for ($j = 1; $j < $nUnits && $unitsOk; ++$j) {
+                        $unitsOk = ($outputUnits[$j]->getId() === $firstUnitId);
+                    }
+
+                    if (!$unitsOk) {
+                        //$errors[$errorCase][] = $this->translateTransfoErrors("unitesSortieBaremesDifferentes");
+                        $outputUnitLabels = [];
+                        foreach ($outputUnits as $ou) {
+                            $outputUnitLabels[] = $ou->getLibelle();
+                        }
+                        $errors[$errorCase][] = $this->translateTransfoErrors('unitesSortieBaremesDifferentes') .
+                            $this->renderView(
+                                'IrsteaBdohAdminBundle:Transformation:bareme-output-unit-list.html.twig',
+                                ['labels' => $outputUnitLabels]
+                            );
+                    }
+                }
+
+                $delai = ($i === 0) ? $delaiPrincipale : $delaiSecondaire;
+                if (!\is_numeric($delai)) {
+                    $errors[$errorCase][] = $this->translateTransfoErrors('delaiNonNumerique', ['%delai%' => $delai]);
+                }
+
+                $limitPlaceholder = ($i === 0) ? $limitPlaceholderPrincipale : $limitPlaceholderSecondaire;
+                if ($limitPlaceholder !== null && $limitPlaceholder !== '' && !\is_numeric($limitPlaceholder)) {
+                    $errors[$errorCase][] =
+                        $this->translateTransfoErrors('limitPlaceholderNonNumerique', ['%placeholder%' => $limitPlaceholder]);
+                }
+            }
+        } else {
+            $dataAndErrorsSecondaire = null;
+        }
+
+        $numErrors = 0;
+        foreach ($errors as $categoryErrors) {
+            $numErrors += count($categoryErrors);
+        }
+        if ($numErrors > 0) {
+            return new JsonResponse(
+                [
+                    'errors' => $this->renderView(
+                        'IrsteaBdohAdminBundle:Transformation:errors-transformation.html.twig',
+                        ['errors' => $errors]
+                    ),
+                ]
+            );
+        }
+        // Input data are valid: persist them
+
+        $chroniqueCalculee->setFacteurMultiplicatif($coefficient);
+        $chroniqueCalculee->setGenealogie($genealogie);
+        $chroniqueCalculee->setGenealogieEn($genealogieEn);
+
+        // Backup the 1st Transformation's "JeuBareme" for comparison with the one that will be recorded
+        $this->setChronicleTransformation(
+            $chroniqueCalculee,
+            $chroniqueMerePrincipale,
+            $dataAndErrorsPrincipale['data'],
+            $delaiPrincipale,
+            $limitPolicyPrincipale,
+            $limitPlaceholderPrincipale
+        );
+        if ($chroniqueMereSecondaire) {
+            $this->setChronicleTransformation(
+                $chroniqueCalculee,
+                $chroniqueMereSecondaire,
+                $dataAndErrorsSecondaire['data'],
+                $delaiSecondaire,
+                $limitPolicySecondaire,
+                $limitPlaceholderSecondaire,
+                false
+            );
+        } else {
+            $chroniqueCalculee->setSecondeEntree(null);
+        }
+
+        $this->getEm()->persist($chroniqueCalculee);
+        $this->getEm()->flush();
+
+        // Call action to computed chronicle update
+        $job = $this->jobManager->enqueueChronicleComputation($chroniqueCalculee, $this->getUser(), $propagate);
+
+        return new JsonResponse(
+            [
+                'submitted' => [
+                    'chroniqueName' => $chroniqueCalculee->__toString(),
+                    'chroniqueCode' => $chroniqueCalculee->getCode(),
+                    'stationCode'   => $chroniqueCalculee->getStation()->getCode(),
+                    'jobId'         => $job->getId(),
+                    'jobPage'       => $this->generateUrl('bdoh_job_list'),
+                ],
+            ]
+        );
+    }
+
+    /**
+     * @param $dataJeuBareme
+     * @param $inputUnit
+     * @param null $outputUnit
+     *
+     * @return array
+     */
+    private function extractJeuBareme($dataJeuBareme, $inputUnit, $outputUnit = null)
+    {
+        $dataAndErrors = [
+            'data'   => [],
+            'errors' => [],
+        ];
+
+        $baremeRepo = $this->getBdohRepo('Bareme');
+
+        $dataLines = explode('|', $dataJeuBareme);
+        $numDataLines = count($dataLines);
+        $i = 1;
+        $dateEndPrevious = null;
+        foreach ($dataLines as $line) {
+            $lineElts = explode('_', $line);
+
+            $bareme = $baremeRepo->findOneById($lineElts[0]);
+            if (!$bareme) {
+                $dataAndErrors['errors'][] = $this->translateTransfoErrors('baremeIntrouvable', ['%numLigne%' => $i]);
+            } else {
+                if (($unit = $bareme->getUniteEntree()) && $unit != $inputUnit) {
+                    $dataAndErrors['errors'][] = $this->translateTransfoErrors(
+                        'uniteEntreeBaremeIncorrecte',
+                        [
+                            '%numLigne%'           => $i,
+                            '%uniteEntreeBareme%'  => $unit->getLibelle(),
+                            '%uniteChroniqueMere%' => $inputUnit->getLibelle(),
+                        ]
+                    );
+                }
+                if ($outputUnit && ($unit = $bareme->getUniteSortie()) && $unit != $outputUnit) {
+                    $dataAndErrors['errors'][] = $this->translateTransfoErrors(
+                        'uniteSortieBaremeIncorrecte',
+                        [
+                            '%numLigne%'            => $i,
+                            '%uniteSortieBareme%'   => $unit->getLibelle(),
+                            '%uniteChroniqueFille%' => $outputUnit,
+                        ]
+                    );
+                }
+            }
+
+            $UTC = new \DateTimeZone('UTC');
+
+            if (!empty($lineElts[1])) {
+                $dateBegin = new \DateTime($lineElts[1], $UTC);
+            } else {
+                $dataAndErrors['errors'][] = $this->translateTransfoErrors('dateDebutIndefinie', ['%numLigne%' => $i]);
+                $dateBegin = null;
+            }
+
+            if (!empty($lineElts[2])) {
+                $dateEnd = new \DateTime($lineElts[2], $UTC);
+            } else {
+                $dateEnd = null;
+                if ($i < $numDataLines) {
+                    $dataAndErrors['errors'][] = $this->translateTransfoErrors('dateFinIndefinie', ['%numLigne%' => $i]);
+                }
+            }
+
+            if ($dateBegin && $dateEnd && $dateEnd <= $dateBegin) {
+                $dataAndErrors['errors'][] = $this->translateTransfoErrors(
+                    'finAvantDebut',
+                    [
+                        '%numLigne%'  => $i,
+                        '%dateDebut%' => $dateBegin->format($this->getTranslator()->trans('transformation.bareme.dateBareme')),
+                        '%dateFin%'   => $dateEnd->format($this->getTranslator()->trans('transformation.bareme.dateBareme')),
+                    ]
+                );
+            }
+
+            if ($dateBegin && $dateEndPrevious && $dateEndPrevious != $dateBegin) {
+                $dataAndErrors['errors'][] = $this->translateTransfoErrors(
+                    'conflitDebutFinPrecedent',
+                    [
+                        '%numLigne%'  => $i,
+                        '%dateDebut%' => $dateBegin->format($this->getTranslator()->trans('transformation.bareme.dateBareme')),
+                        '%dateFin%'   => $dateEndPrevious->format($this->getTranslator()->trans('transformation.bareme.dateBareme')),
+                    ]
+                );
+            }
+
+            $dataAndErrors['data'][] = [
+                'bareme' => $bareme,
+                'begin'  => $dateBegin,
+                'end'    => $dateEnd,
+            ];
+
+            $dateEndPrevious = $dateEnd;
+            ++$i;
+        }
+
+        return $dataAndErrors;
+    }
+
+    /**
+     * @param $dataJeuBareme
+     *
+     * @return array
+     */
+    private function extractBaremeOutputUnits($dataJeuBareme)
+    {
+        $outputUnits = [];
+        $dataLines = explode('|', $dataJeuBareme);
+        $baremeRepo = $this->getBdohRepo('Bareme');
+        foreach ($dataLines as $line) {
+            $lineElts = explode('_', $line);
+            $bareme = $baremeRepo->findOneById($lineElts[0]);
+            if ($bareme && ($unit = $bareme->getUniteSortie())) {
+                $outputUnits[] = $unit;
+            }
+        }
+
+        return $outputUnits;
+    }
+
+    /**
+     * @param $key
+     * @param array $parms
+     *
+     * @return string
+     */
+    private function translateTransfoErrors($key, $parms = [])
+    {
+        return $this->getTranslator()->trans('transformation.erreur.' . $key, $parms);
+    }
+
+    /**
+     * @param $chroniqueFille
+     * @param $chroniqueMere
+     * @param $baremeData
+     * @param $delaiPropagation
+     * @param $limitPolicy
+     * @param $limitPlaceholder
+     * @param bool $isFirstParent
+     */
+    private function setChronicleTransformation(
+        $chroniqueFille,
+        $chroniqueMere,
+        $baremeData,
+        $delaiPropagation,
+        $limitPolicy,
+        $limitPlaceholder,
+        $isFirstParent = true
+    ) {
+        $jeuBareme = new JeuBareme();
+        $jeuBareme->setDelaiPropagation($delaiPropagation);
+        foreach ($baremeData as $dataOneBareme) {
+            $baremeJeuBareme = new BaremeJeuBareme();
+            $baremeJeuBareme->setJeuBareme($jeuBareme);
+            $baremeJeuBareme->setBareme($dataOneBareme['bareme']);
+            $baremeJeuBareme->setDebutValidite($dataOneBareme['begin']);
+            $baremeJeuBareme->setFinValidite($dataOneBareme['end']);
+            $jeuBareme->addBaremeJeuBareme($baremeJeuBareme);
+        }
+
+        if ($isFirstParent) {
+            $transformation = $chroniqueFille->getPremiereEntree();
+            if (!$transformation) {
+                $transformation = new Transformation();
+                $chroniqueFille->setPremiereEntree($transformation);
+            }
+        } else {
+            $transformation = $chroniqueFille->getSecondeEntree();
+            if (!$transformation) {
+                $transformation = new Transformation();
+                $chroniqueFille->setSecondeEntree($transformation);
+            }
+        }
+
+        $transformation->setEntree($chroniqueMere);
+
+        if (!$chroniqueMere->getAllowValueLimits()) {
+            $limitPolicy = null;
+            $limitPlaceholder = null;
+        } elseif ($limitPolicy !== JeuBareme::LQ_LD_PLACEHOLDER) {
+            $limitPlaceholder = null;
+        }
+        $jeuBareme->setValueLimitTransformationType($limitPolicy);
+        $jeuBareme->setValueLimitPlaceholder($limitPlaceholder !== null ? (float) $limitPlaceholder : null);
+
+        if (!$jeuBareme->equals($transformation->getJeuBaremeActuel())) {
+            $jeuBareme->setDateCreation(new \DateTime('now', new \DateTimeZone('UTC')));
+            $transformation->setJeuBaremeActuel($jeuBareme);
+            $transformation->addJeuBaremesHistorique($jeuBareme);
+            $jeuBareme->setTransformation($transformation);
+        }
+    }
+
+    /**
+     * Redirects to step 1 page.
+     */
+    protected function redirectTransformation()
+    {
+        return $this->redirect($this->generateUrl('bdoh_admin_transformation'));
+    }
+
+    /**
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function importBaremeStep2Action()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectTransformation();
+        }
+
+        $request = $this->getRequest();
+        $manager = $this->getManager();
+        $file = $request->files->get('file');
+        $importerClass = $manager->importers->get('bareme');
+        $errors = $this->errors = new ImportErrors();
+        $numDataLines = 0;
+
+        /*
+         * Checks request parameters of step 1 : file.
+         */
+        if (null === $file) {
+            $errors->noFile();  // No file
+        } else {
+            $mimeType = $file->getMimeType();
+            if (!$manager->isValidMimeType($mimeType)) {
+                $errors->badMimeType($mimeType);
+            }
+        }
+
+        if ($errors->isClean()) {
+            // Moves uploaded file in import directory
+            $file = $file->move($manager->getDir());
+            $filePath = $file->getPathname();
+        }
+
+        if ($errors->isClean()) {
+            $importer = $this->baremeManager = new $importerClass(
+                $this->getEm(),
+                $this->getTranslator(),
+                $filePath,
+                $errors
+            );
+            $importer->loadHeader();
+        }
+
+        if ($errors->isClean()) {
+            $numDataLines = $importer->read();
+        }
+
+        if ($errors->isClean()) {
+            $data = [
+                'action' => 'step3',
+                'view'   => $this->renderView(
+                    'IrsteaBdohAdminBundle:Transformation:bareme-modal-step2.html.twig',
+                    ['nbLines' => $numDataLines]
+                ),
+            ];
+        }
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+            $importer->clean();
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        $this->storeImporter();
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function importBaremeStep3Action()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectTransformation();
+        }
+
+        list($importer, $errors) = $this->retrieveImporter();
+        $summaryData = $importer->loadData();
+        if ($errors->isDirty()) {
+            $data = $this->getErrorsResponse();
+            $importer->clean();
+        } else {
+            $this->getLogger()->createHistoriqueBaremesImport(
+                $this->getUser(),
+                new \DateTime('now', new \DateTimeZone('UTC')),
+                $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                $summaryData['nom'],
+                $summaryData['uniteEntree'],
+                $summaryData['uniteSortie'],
+                $summaryData['xMin'],
+                $summaryData['xMax'],
+                $summaryData['dateCreation'],
+                $summaryData['nValues']
+            );
+
+            if ($summaryData['dateCreation'] instanceof \DateTime) {
+                $summaryData['dateCreation'] = $summaryData['dateCreation']->format($this->getTranslator()->trans('transformation.bareme.dateBareme'));
+            }
+            $data = [
+                'action'        => 'step4',
+                'view'          => $this->renderView(
+                    'IrsteaBdohAdminBundle:Transformation:bareme-modal-step3.html.twig',
+                    [
+                        'summary' => $summaryData,
+                    ]
+                ),
+                'newBaremeData' => $summaryData,
+            ];
+        }
+
+        // Patch: remove UTF-8 invalid characters in the view returned in order to avoid JsonResponse to throw an error
+        if ($data['view']) {
+            ini_set('mbstring.substitute_character', 'U+003F');
+            $data['view'] = mb_convert_encoding($data['view'], 'UTF-8', 'UTF-8');
+        }
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * Stops the scale import process.
+     */
+    public function importBaremeStopAction()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectTransformation();
+        }
+
+        list($importer) = $this->retrieveImporter();
+        $importer->clean();
+
+        return $this->renderJson('');
+    }
+
+    /**
+     * Prepares the response data in case of errors.
+     *
+     * @return array
+     */
+    protected function getErrorsResponse()
+    {
+        /*if($this->controlePointManager){
+            $this->controlePointManager->clean();
+        }*/
+
+        $view = $this->renderView(
+            'IrsteaBdohAdminBundle:Transformation:errors.html.twig',
+            [
+                'errors'     => $this->errors->translations($this->getTranslator()),
+                'jeuQualite' => $this->getBdohRepo('Bareme')->getCurrentObservatoire()->getJeu()->__toString(),
+            ]
+        );
+
+        // Sends the error info
+        return [
+            'action' => 'errors',
+            'view'   => $view,
+        ];
+    }
+
+    /**
+     * @return object
+     */
+    protected function getManager()
+    {
+        return $this->container->get('irstea_bdoh_admin.manager.bareme_import');
+    }
+
+    protected function storeImporter()
+    {
+        $this->getRequest()->getSession()->set('bareme.importer', $this->baremeManager);
+    }
+
+    /**
+     * @return array
+     */
+    protected function retrieveImporter()
+    {
+        $this->baremeManager = $this->getSession()->get('bareme.importer');
+        $this->errors = $this->baremeManager->getErrors();
+        $this->baremeManager->wakeup($this->getEm(), $this->getTranslator());
+
+        return [$this->baremeManager, $this->errors];
+    }
+
+    /**
+     * @return HttpZipResponse|\Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function exportJeuBaremeAction()
+    {
+        $childChronicleName = $this->getRequest()->query->get('child-chronicle-name');
+        $parentChronicleId = $this->getRequest()->query->get('parent-chronicle-id');
+
+        $jeuBaremeId = $this->getRequest()->query->get('jeu-bareme-id');
+        if (!($jeuBareme = $this->getBdohRepo('JeuBareme')->findOneById($jeuBaremeId))) {
+            $this->getSession()->getFlashBag()->add('error', $this->getTranslator()->trans('transformation.erreur.jeuBaremeIntrouvable'));
+
+            return $this->redirectToReferer();
+        }
+
+        $baremesData = [];
+        foreach ($jeuBareme->getBaremeJeuBaremes() as $bjb) {
+            $baremesData[] = [$bjb->getBareme()->getId(), $parentChronicleId, $bjb->getDebutValidite(), $bjb->getFinValidite()];
+        }
+
+        return $this->exportBaremes($childChronicleName, $baremesData);
+    }
+
+    /**
+     * @param string $childChronicleName
+     * @param array  $baremesData
+     *
+     * @return mixed
+     */
+    private function exportBaremes($childChronicleName, $baremesData)
+    {
+        $exporter = new BaremeExporter($this->getEm(), $this->getTranslator(), $childChronicleName);
+        foreach ($baremesData as $baremeLine) {
+            $exporter->run($baremeLine);
+
+            $info = $exporter->getInfoSelection();
+            $this->getLogger()->createHistoriqueBaremesExport(
+                $this->getUser(),
+                new \DateTime('now', new \DateTimeZone('UTC')),
+                $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                $info['name'],
+                $info['inputUnit'],
+                $info['outputUnit'],
+                $info['min'],
+                $info['max'],
+                $info['dateCreation'],
+                $info['number']
+            );
+        }
+
+        $filesToZip = $exporter->getBaremeFiles();
+        $filesToZip[] = $exporter->getReportPath();
+
+        // zip archive + main folder name : 'Observatoire' name + datetime
+        $zipName = $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent()->getSlug()
+            . '_' . date('Y-m-d_H-i-s');
+
+        try {
+            return new HttpZipResponse(sys_get_temp_dir(), $zipName, $filesToZip);
+        } catch (\Exception $e) {
+            $this->getSession()->getFlashBag()->add('error', $this->getTranslator()->trans('Error.zip.cantCreate'));
+
+            return $this->redirectToReferer();
+        }
+    }
+
+    /**
+     * @return HttpZipResponse|\Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function exportBaremeAction()
+    {
+        $childChronicleName = $this->getRequest()->request->get('child-chronicle-name');
+        $exportData = explode(
+            '|',
+            $this->getRequest()->request->get('baremes-export-info')
+        );
+
+        $baremesData = [];
+        foreach ($exportData as $exportLine) {
+            $baremesData[] = explode('_', $exportLine);
+        }
+
+        return $this->exportBaremes($childChronicleName, $baremesData);
+    }
+
+    /**
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function getBaremesForExportAction()
+    {
+        if (!$this->isXmlHttpRequest()) {
+            return $this->redirectTransformation();
+        }
+
+        $baremes = $this->getBdohRepo('Bareme')->securedFindAll(false);
+
+        return $this->render('IrsteaBdohAdminBundle:Transformation:bareme-export-table.html.twig', ['baremes' => $baremes]);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Errors/Errors.php b/src/Irstea/BdohAdminBundle/Errors/Errors.php
new file mode 100644
index 0000000000000000000000000000000000000000..c38e35ba82bf9ff8aefe48b4fa75b0c4c6746d6c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Errors/Errors.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Errors;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class providing errors management.
+ * For an example, see "ImportErrors.php".
+ */
+abstract class Errors
+{
+    const ERRORS_CATALOG = 'errors';
+
+    /**
+     * Number of errors.
+     */
+    public $count = 0;
+
+    /**
+     * Storage of errors.
+     */
+    protected $errors = [];
+
+    /**
+     * Returns true if no error have been stored.
+     */
+    public function isClean()
+    {
+        return $this->errors === [];
+    }
+
+    /**
+     * Returns true if some errors have been stored.
+     */
+    public function isDirty()
+    {
+        return $this->errors !== [];
+    }
+
+    /**
+     * Resolves the error translations and returns a flat array containing them.
+     *
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     *
+     * @return array A flat array containing strings
+     */
+    public function translations(TranslatorInterface $translator)
+    {
+        $errorsTrans = [];
+
+        foreach ($this->errors as $type => $errorsForType) {
+            foreach ($errorsForType as $params) {
+                $errorsTrans[] = $translator->trans($type, $params, static::ERRORS_CATALOG);
+            }
+        }
+
+        return $errorsTrans;
+    }
+
+    /**
+     * Facilitator allowing to add an error to the $errors attribute.
+     * Takes as parameters :
+     *    => the type of error to add ;
+     *    => a variable and even number of parameters, being alternately :
+     *       -> a translation placeholder ;
+     *       -> a value for this placeholder .
+     *
+     * @param mixed $type
+     */
+    public function addError($type)
+    {
+        $params = [];
+
+        for ($i = 1; $i < func_num_args(); $i += 2) {
+            $params['%' . func_get_arg($i) . '%'] = func_get_arg($i + 1);
+        }
+        $this->errors[$type][] = $params;
+
+        ++$this->count;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Errors/ImportErrors.php b/src/Irstea/BdohAdminBundle/Errors/ImportErrors.php
new file mode 100644
index 0000000000000000000000000000000000000000..5972b7009d8ee8a277734f0e61daceb19d608aca
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Errors/ImportErrors.php
@@ -0,0 +1,612 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Errors;
+
+/**
+ * Manages the errors of measures import process.
+ *
+ * Note : error translations are in "ImportErrors" catalog
+ * (eg: src/Irstea/BdohAdminBundle/Resources/translations/ImportErrors.fr.php)
+ */
+class ImportErrors extends Errors
+{
+    const ERRORS_CATALOG = 'importErrors';
+
+    /**
+     * Error types.
+     */
+    const TOO_MANY_ERRORS = 'tooManyErrors';
+
+    const NO_FILE = 'noFile';
+
+    const BAD_MIME_TYPE = 'badMimeType(%mimeType%)';
+
+    const BAD_ZIP = 'badZip';
+
+    const BAD_SHAPE = 'badShape(%errors%)';
+
+    const ZIP_FIRST_BAD_MIME_TYPE = 'zipFirst.badMimeType(%mimeType%)';
+
+    const BAD_FORMAT = 'badFormat(%format%)';
+
+    const BAD_STATION = 'badStation(%station%)';
+
+    const BAD_CHRONIQUE_CONTINUE = 'badChroniqueContinue(%chronique%, %station%)';
+
+    const BAD_CHRONIQUE_DISCONTINUE = 'badChroniqueDiscontinue(%chronique%, %station%)';
+
+    const BAD_UNIT_CHRONIQUE = 'badUnitForThisChronique(%chronique%, %unite%)';
+
+    const CHRONIQUE_ALREADY_EXISTS = 'chroniqueAlreadyExists';
+
+    const NO_CHRONIQUE_CONTINUE_AVAILABLE = 'noChroniqueContinueAvailable(%station%)';
+
+    const NO_CHRONIQUE_DISCONTINUE_AVAILABLE = 'noChroniqueDiscontinueAvailable(%station%)';
+
+    const INVALID_TIMEZONE = 'invalidTimezone(%timezone%)';
+
+    const BAD_LINE_SIZE = 'badLineSize(%numLine%, %found%, %expected%)';
+
+    const BAD_MIN_LINE_SIZE = 'badMinLineSize(%numLine%, %found%, %expected%)';
+
+    const BAD_CHAR_NUMBER = 'badCharNumber(%numLine%, %found%, %expected%)';
+
+    const BAD_LINE_BEGIN = 'badLineBegin(%numLine%, %expected%)';
+
+    const BAD_HEADER_NO_CHRONIQUE = 'badHeaderNoChronique';
+
+    const BAD_HEADER_FIRST_TWO_LINES = 'badHeaderFirstTwoLines';
+
+    const BAD_HEADER_SYNTAX = 'badHeaderSyntax';
+
+    const BAD_HEADER_UNIT = 'badHeaderUnit(%present%, %expected%)';
+
+    const DATE_REDUNDANCY = 'dateRedundancy(%chronique%, %date%, %count%, %numLines%)';
+
+    const RANGE_OVERLAP = 'rangeOverlap(%chronique%, %plages%, %numLines%)';
+
+    const NOT_IN_SOURCE_JEU = 'notInSourceJeu(%numLine%, %date%, %valeur%, %qualite%)';
+
+    const FORBIDDEN_VALUE_LIMIT = 'forbiddenValueLimit(%numLine%, %date%, %valeur%, %qualite%)';
+
+    const VALUE_LIMIT_IN_BAREME = 'valueLimitInBareme(%numLine%, %qualite%)';
+
+    const QUALITY_NOT_FOR_CHECKPOINT = 'qualityNotForCheckpoint(%numLine%, %date%, %valeur%, %qualite%)';
+
+    const NO_RIGHT_ON_STATION = 'noRightOnStation(%station%)';
+
+    const NO_TRANS_IN_OBSERVATOIRE_JEU = 'noTransInObservatoireJeu(%numLine%, %date%, %valeur%, %qualite%)';
+
+    const BAD_CODE_QUALITE = 'badCodeQualite(%numLine%, %qualite%)';
+
+    const VALEUR_NOT_NUMERIC = 'valeurNotNumeric(%numLine%, %date%, %valeur%)';
+
+    const VALID_NO_VALUE = 'validNoValue(%numLine%, %date%, %codeQualite%)';
+
+    const MINIMUM_NOT_NUMERIC = 'minimumNotNumeric(%numLine%, %date%, %valeur%, %minimum%)';
+
+    const MAXIMUM_NOT_NUMERIC = 'maximumNotNumeric(%numLine%, %date%, %valeur%, %maximum%)';
+
+    const DATE_INVALID_FORMAT = 'dateInvalidFormat(%numLine%, %date%, %valeur%)';
+
+    const DATE_AFTER_NOW = 'dateAfterNow(%numLine%, %date%, %valeur%)';
+
+    const INCOHERENT_GAP = 'incoherentGap(%numLine%, %date%, %valeur%, %qualite%)';
+
+    const INCOHERENT_DATES = 'incoherentDates(%numLine%, %valeur%)';
+
+    const BAD_UNIT_INPUT_BAREME = 'badUniteEntreeForBareme(%unite%)';
+
+    const BAD_UNIT_OUTPUT_BAREME = 'badUniteSortieForBareme(%unite%)';
+
+    const VARIABLE_NOT_NUMERIC = 'variableNotNumeric(%nomvaleur%, %valeur%)';
+
+    const NOT_ENOUGH_DATA = 'notEnoughData(%minDataLines%)';
+
+    const NOT_STRICTLY_ASCENDING = 'notStrictlyAscending(%numLine%, %valeur%, %valeurPrec%)';
+
+    const INCOHERENT_SHAPE = 'incoherentShape(%format%)';
+
+    const PHP_UPLOAD_ERROR = 'phpUploadError(%errorCode%)';
+
+    const NO_IMPORT_ON_CONVERTED = 'noImportOnConverted';
+
+    const NO_CHECKPOINT_ON_CONVERTED = 'noCheckpointOnConverted(%chronique%, %station%)';
+
+    const UNDEFINED_PARAM_CONVERSION = 'undefinedParamConversion';
+
+    const BAD_PARAM_CONVERSION = 'badParamConversion(%param%)';
+
+    const BAD_PARENT_TIME_SERIES = 'badParentTimeSeries';
+
+    /**
+     * Facilitator allowing to add a "line error" to the $errors attribute.
+     * Note : inspired by Errors::addError() function.
+     *
+     * @param mixed $numLine
+     * @param mixed $date
+     * @param mixed $valeur
+     * @param mixed $type
+     */
+    public function lineError($numLine, $date, $valeur, $type)
+    {
+        $params = [
+            '%numLine%' => $numLine,
+            '%date%'    => $date,
+            '%valeur%'  => $valeur,
+        ];
+
+        for ($i = 4; $i < func_num_args(); $i += 2) {
+            $params['%' . func_get_arg($i) . '%'] = func_get_arg($i + 1);
+        }
+        $this->errors[$type][] = $params;
+
+        ++$this->count;
+    }
+
+    /**
+     * Error handlers.
+     */
+    public function tooManyErrors()
+    {
+        $this->addError(static::TOO_MANY_ERRORS);
+    }
+
+    public function noFile()
+    {
+        $this->addError(static::NO_FILE);
+    }
+
+    /**
+     * @param $mimeType
+     */
+    public function badMimeType($mimeType)
+    {
+        $this->addError(static::BAD_MIME_TYPE, 'mimeType', $mimeType);
+    }
+
+    public function badZip()
+    {
+        $this->addError(static::BAD_ZIP);
+    }
+
+    /**
+     * @param $errors
+     */
+    public function badShape($errors)
+    {
+        $this->addError(static::BAD_SHAPE, 'errors', $errors);
+    }
+
+    /**
+     * @param $mimeType
+     */
+    public function zipFirstBadMimeType($mimeType)
+    {
+        $this->addError(static::ZIP_FIRST_BAD_MIME_TYPE, 'mimeType', $mimeType);
+    }
+
+    /**
+     * @param $format
+     */
+    public function badFormat($format)
+    {
+        $this->addError(static::BAD_FORMAT, 'format', $format);
+    }
+
+    /**
+     * @param $station
+     */
+    public function badStation($station)
+    {
+        $this->addError(static::BAD_STATION, 'station', $station);
+    }
+
+    /**
+     * @param $chronique
+     * @param $station
+     */
+    public function badChroniqueContinue($chronique, $station)
+    {
+        $this->addError(static::BAD_CHRONIQUE_CONTINUE, 'chronique', $chronique, 'station', $station);
+    }
+
+    /**
+     * @param $chronique
+     * @param $station
+     */
+    public function badChroniqueDiscontinue($chronique, $station)
+    {
+        $this->addError(static::BAD_CHRONIQUE_DISCONTINUE, 'chronique', $chronique, 'station', $station);
+    }
+
+    /**
+     * @param $chronique
+     * @param $unite
+     */
+    public function badUniteForThisChronique($chronique, $unite)
+    {
+        $this->addError(static::BAD_UNIT_CHRONIQUE, 'chronique', $chronique, 'unite', $unite);
+    }
+
+    /**
+     * @param $chronique
+     */
+    public function chroniqueAlreadyExists($chronique)
+    {
+        $this->addError(static::CHRONIQUE_ALREADY_EXISTS, 'chronique', $chronique);
+    }
+
+    /**
+     * @param $station
+     */
+    public function noChroniqueContinueAvailable($station)
+    {
+        $this->addError(static::NO_CHRONIQUE_CONTINUE_AVAILABLE, 'station', $station);
+    }
+
+    /**
+     * @param $station
+     */
+    public function noChroniqueDiscontinueAvailable($station)
+    {
+        $this->addError(static::NO_CHRONIQUE_DISCONTINUE_AVAILABLE, 'station', $station);
+    }
+
+    /**
+     * @param $timezone
+     */
+    public function invalidTimezone($timezone)
+    {
+        $this->addError(static::INVALID_TIMEZONE, 'timezone', $timezone);
+    }
+
+    /**
+     * @param $numLine
+     * @param $found
+     * @param $expected
+     */
+    public function badLineSize($numLine, $found, $expected)
+    {
+        $this->addError(static::BAD_LINE_SIZE, 'numLine', $numLine, 'found', $found, 'expected', $expected);
+    }
+
+    /**
+     * @param $numLine
+     * @param $found
+     * @param $expected
+     */
+    public function badMinLineSize($numLine, $found, $expected)
+    {
+        $this->addError(static::BAD_MIN_LINE_SIZE, 'numLine', $numLine, 'found', $found, 'expected', $expected);
+    }
+
+    /**
+     * @param $numLine
+     * @param $found
+     * @param $expected
+     */
+    public function badCharNumber($numLine, $found, $expected)
+    {
+        $this->addError(static::BAD_CHAR_NUMBER, 'numLine', $numLine, 'found', $found, 'expected', $expected);
+    }
+
+    /**
+     * @param $numLine
+     * @param $expected
+     */
+    public function badLineBegin($numLine, $expected)
+    {
+        $this->addError(static::BAD_LINE_BEGIN, 'numLine', $numLine, 'expected', $expected);
+    }
+
+    public function badHeaderNoChronique()
+    {
+        $this->addError(static::BAD_HEADER_NO_CHRONIQUE);
+    }
+
+    /**
+     * @param $present
+     * @param $expected
+     */
+    public function badHeaderUnit($present, $expected)
+    {
+        $this->addError(static::BAD_HEADER_UNIT, 'present', $present, 'expected', $expected);
+    }
+
+    public function badHeaderFirstTwoLines()
+    {
+        $this->addError(static::BAD_HEADER_FIRST_TWO_LINES);
+    }
+
+    public function badHeaderSyntax()
+    {
+        $this->addError(static::BAD_HEADER_SYNTAX);
+    }
+
+    /**
+     * @param $chronique
+     * @param $date
+     * @param $count
+     * @param $numLines
+     */
+    public function dateRedundancy($chronique, $date, $count, $numLines)
+    {
+        $this->addError(static::DATE_REDUNDANCY, 'chronique', $chronique, 'date', $date, 'count', $count, 'numLines', $numLines);
+    }
+
+    /**
+     * @param $chronique
+     * @param $plages
+     * @param $numLines
+     */
+    public function rangeOverlap($chronique, $plages, $numLines)
+    {
+        $this->addError(static::RANGE_OVERLAP, 'chronique', $chronique, 'plages', $plages, 'numLines', $numLines);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $qualite
+     */
+    public function notInSourceJeu($numLine, $date, $valeur, $qualite)
+    {
+        $this->lineError($numLine, $date, $valeur, static::NOT_IN_SOURCE_JEU, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $qualite
+     */
+    public function forbiddenValueLimit($numLine, $date, $valeur, $qualite)
+    {
+        $this->lineError($numLine, $date, $valeur, static::FORBIDDEN_VALUE_LIMIT, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $qualite
+     */
+    public function valueLimitInBareme($numLine, $qualite)
+    {
+        $this->addError(static::VALUE_LIMIT_IN_BAREME, 'numLine', $numLine, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $qualite
+     */
+    public function qualityNotForCheckpoint($numLine, $date, $valeur, $qualite)
+    {
+        $this->lineError($numLine, $date, $valeur, static::QUALITY_NOT_FOR_CHECKPOINT, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $station
+     */
+    public function noRightOnStation($station)
+    {
+        $this->addError(static::NO_RIGHT_ON_STATION, 'station', $station);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $qualite
+     */
+    public function noTransInObservatoireJeu($numLine, $date, $valeur, $qualite)
+    {
+        $this->lineError($numLine, $date, $valeur, static::NO_TRANS_IN_OBSERVATOIRE_JEU, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $qualite
+     */
+    public function badCodeQualite($numLine, $qualite)
+    {
+        $this->addError(static::BAD_CODE_QUALITE, 'numLine', $numLine, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     */
+    public function valeurNotNumeric($numLine, $date, $valeur)
+    {
+        $this->lineError($numLine, $date, $valeur, static::VALEUR_NOT_NUMERIC);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $codeQualite
+     */
+    public function validButNoValue($numLine, $date, $codeQualite)
+    {
+        $this->lineError($numLine, $date, null, static::VALID_NO_VALUE, 'qualite', $codeQualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $minimum
+     */
+    public function minimumNotNumeric($numLine, $date, $valeur, $minimum)
+    {
+        $this->lineError($numLine, $date, $valeur, static::MINIMUM_NOT_NUMERIC, 'minimum', $minimum);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $maximum
+     */
+    public function maximumNotNumeric($numLine, $date, $valeur, $maximum)
+    {
+        $this->lineError($numLine, $date, $valeur, static::MAXIMUM_NOT_NUMERIC, 'maximum', $maximum);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     */
+    public function dateInvalidFormat($numLine, $date, $valeur)
+    {
+        $this->lineError($numLine, $date, $valeur, static::DATE_INVALID_FORMAT);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     */
+    public function dateAfterNow($numLine, $date, $valeur)
+    {
+        $this->lineError($numLine, $date, $valeur, static::DATE_AFTER_NOW);
+    }
+
+    /**
+     * @param $numLine
+     * @param $date
+     * @param $valeur
+     * @param $qualite
+     */
+    public function incoherentGap($numLine, $date, $valeur, $qualite)
+    {
+        $this->lineError($numLine, $date, $valeur, static::INCOHERENT_GAP, 'qualite', $qualite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $valeur
+     */
+    public function incoherentDates($numLine, $valeur)
+    {
+        $this->addError(static::INCOHERENT_DATES, 'numLine', $numLine, 'valeur', $valeur);
+    }
+
+    /**
+     * @param $unite
+     */
+    public function badUniteEntreeForBareme($unite)
+    {
+        $this->addError(static::BAD_UNIT_INPUT_BAREME, 'unite', $unite);
+    }
+
+    /**
+     * @param $unite
+     */
+    public function badUniteSortieForBareme($unite)
+    {
+        $this->addError(static::BAD_UNIT_OUTPUT_BAREME, 'unite', $unite);
+    }
+
+    /**
+     * @param $numLine
+     * @param $nomValeur
+     * @param $valeur
+     */
+    public function variableNotNumeric($numLine, $nomValeur, $valeur)
+    {
+        $this->addError(static::VARIABLE_NOT_NUMERIC, 'numLine', $numLine, 'nomValeur', $nomValeur, 'valeur', $valeur);
+    }
+
+    /**
+     * @param $minDataLines
+     */
+    public function notEnoughData($minDataLines)
+    {
+        $this->addError(static::NOT_ENOUGH_DATA, 'minDataLines', $minDataLines);
+    }
+
+    /**
+     * @param $numLine
+     * @param $valeur
+     * @param $valeurPrec
+     */
+    public function notStrictlyAscending($numLine, $valeur, $valeurPrec)
+    {
+        $this->addError(static::NOT_STRICTLY_ASCENDING, 'numLine', $numLine, 'valeur', $valeur, 'valeurPrec', $valeurPrec);
+    }
+
+    /**
+     * @param $format
+     */
+    public function incoherentShape($format)
+    {
+        $this->addError(static::INCOHERENT_SHAPE, 'format', $format);
+    }
+
+    /**
+     * @param $errorCode
+     */
+    public function phpUploadError($errorCode)
+    {
+        $this->addError(static::PHP_UPLOAD_ERROR, 'errorCode', $errorCode);
+    }
+
+    /**
+     * @param $chronique
+     */
+    public function noImportOnConverted($chronique)
+    {
+        $this->addError(static::NO_IMPORT_ON_CONVERTED, 'chronique', $chronique);
+    }
+
+    /**
+     * @param $chronique
+     */
+    public function noCheckpointOnConverted($chronique)
+    {
+        $this->addError(static::NO_CHECKPOINT_ON_CONVERTED, 'chronique', $chronique);
+    }
+
+    public function undefinedParamConversion()
+    {
+        $this->addError(static::UNDEFINED_PARAM_CONVERSION);
+    }
+
+    /**
+     * @param $param
+     */
+    public function badParamConversion($param)
+    {
+        $this->addError(static::BAD_PARAM_CONVERSION, 'param', $param);
+    }
+
+    public function badParentTimeSeries()
+    {
+        $this->addError(static::BAD_PARENT_TIME_SERIES);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/EventListener/MenuBuilderListener.php b/src/Irstea/BdohAdminBundle/EventListener/MenuBuilderListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..59b5678a452e87e23d0cc6c1625908542bf0b8b7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/EventListener/MenuBuilderListener.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\EventListener;
+
+use Sonata\AdminBundle\Event\ConfigureMenuEvent;
+
+class MenuBuilderListener
+{
+    public function addMenuItems(ConfigureMenuEvent $event)
+    {
+        $menu = $event->getMenu();
+
+        $child = $menu->addChild(
+            'reports',
+            [
+                'route' => 'bdoh_consult_observatoire',
+            ]
+        );
+
+        $child->setLabel('backToBdoh');
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Exporter/Bareme/BaremeExporter.php b/src/Irstea/BdohAdminBundle/Exporter/Bareme/BaremeExporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..218cdfdc3c37c2916ae754801bbc27514e64b7fb
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Exporter/Bareme/BaremeExporter.php
@@ -0,0 +1,401 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Exporter\Bareme;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Exporter\Exception\StopExportException;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class BaremeExporter
+{
+    const GAP_VALUE = '-9999';
+
+    /***************************************************************************
+     * Some dependencies of this class, and their getter
+     **************************************************************************/
+
+    private $em;
+
+    private $translator;
+
+    /**
+     * Manager of 'qualites' translation.
+     *
+     * @var Irstea\BdohDataBundle\Util\JeuToJeu
+     */
+    private $ordreToCode;
+
+    /***************************************************************************
+     * Some format specific attributes, and their getter.
+     * Each attribute could be or should be (if no default value) set in the specific exporters.
+     **************************************************************************/
+
+    /**
+     * Name of a specific format : used in the report.
+     * It makes doubloon with that in src/Irstea/BdohDataBundle/Resources/config/services.yml : sorry :-(.
+     */
+    private $formatName;
+
+    // Field delimiter
+    private $delimiter = ';';
+
+    /***************************************************************************
+     * Attributes and their getters, about generated directory and files.
+     **************************************************************************/
+
+    // Path of the directory containing all generated files
+    private $dirPath;
+
+    // File containing the Terms of Uses
+    private $termsOfUsesPath;
+
+    public function getTermsOfUsesPath()
+    {
+        return $this->termsOfUsesPath;
+    }
+
+    // File containing the report of export, and its path
+    private $report;
+
+    private $reportPath;
+
+    public function getReportPath()
+    {
+        return $this->reportPath;
+    }
+
+    // Files of measures (one by successful export)
+    private $baremeFiles = [];
+
+    public function getBaremeFiles()
+    {
+        return $this->baremeFiles;
+    }
+
+    // 'Bareme' currently exported, and its measures file
+    private $bareme;
+
+    public function getBareme()
+    {
+        return $this->bareme;
+    }
+
+    private $file;
+
+    private $filePath;
+
+    // Information about the current measures selection
+    private $infoSelection;
+
+    public function getInfoSelection()
+    {
+        return $this->infoSelection;
+    }
+
+    // Useful little functions
+    private function getStringDate($date)
+    {
+        if ($date) {
+            return (is_string($date)) ? $date : $date->format($this->translator->trans('transformation.bareme.dateBareme'));
+        }
+
+        return $this->translator->trans('noneFeminine');
+    }
+
+    private function getUnitLabel($unit)
+    {
+        return ($unit) ? $unit->getLibelle() : $this->translator->trans('noneFeminine');
+    }
+
+    /***************************************************************************
+     * Other attributes and methods
+     **************************************************************************/
+
+    public function __construct(EntityManager $em, TranslatorInterface $translator, $childChronicle)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+        $observatoire = Observatoire::getCurrent();
+
+        // Prepares the manager of 'qualites' translation
+        $this->ordreToCode = $this->getBdohRepo('Qualite')->securedOrdresToCodes();
+
+        // Creates a directory, randomly named
+        if (!mkdir($this->dirPath = sys_get_temp_dir() . '/' . rand() . '/')) {
+            throw new StopExportException();
+        }
+
+        // Retrieves the quality set name
+        $this->formatName = $observatoire->getJeu()->getNom();
+
+        // Creates and fills "Terms of Uses" file
+        $this->termsOfUsesPath = $this->dirPath . 'TermsOfUses.txt';
+
+        $termsOfUses = strip_tags(html_entity_decode($observatoire->getConditionsUtilisation(), ENT_QUOTES, 'UTF-8'));
+        if (!$termsOfUses) {
+            $termsOfUses = $translator->trans('TermsOfUses.none');
+        }
+
+        if (!file_put_contents($this->termsOfUsesPath, $termsOfUses)) {
+            throw new StopExportException();
+        }
+
+        // Creates and fills report file
+        $this->reportPath = $this->dirPath . 'Report.txt';
+
+        if (!($this->report = fopen($this->reportPath, 'w'))) {
+            throw new StopExportException();
+        }
+
+        // Main line
+        fwrite(
+            $this->report,
+            $translator->trans(
+                'bareme.export.report.main(%format%, %date%, %chronicle%)',
+                [
+                    '%format%'    => $this->formatName,
+                    '%date%'      => (new \DateTime('now', new \DateTimeZone('UTC')))
+                        ->format($this->translator->trans('transformation.bareme.dateBareme')),
+                    '%chronicle%' => $childChronicle,
+                ]
+            )
+        );
+    }
+
+    /**
+     * Destructor : removes all generated files and directory.
+     */
+    public function __destruct()
+    {
+        fclose($this->report);
+
+        @unlink($this->termsOfUsesPath);
+        @unlink($this->reportPath);
+        foreach ($this->baremeFiles as $file) {
+            @unlink($file);
+        }
+
+        @rmdir($this->dirPath);
+    }
+
+    /**
+     * Proceeds to the export of a given 'chronique'.
+     *
+     * @param array Array containing a bareme ID and, optionally, a parent chronicle ID, a start date and an end date
+     * @param mixed $baremeData
+     *
+     * @return string returns the path of a file containing the exported measures
+     */
+    public function run($baremeData)
+    {
+        // Retrieves the 'chronique' entity from its id.
+        $this->bareme = $bareme = $this->getBdohRepo('Bareme')->findOneById($baremeData[0]);
+        if (!$bareme) {
+            fwrite(
+                $this->report,
+                $this->translator->trans(
+                    'bareme.export.error.badBareme(%$baremeId%)',
+                    ['%$baremeId%' => $baremeData[0]]
+                )
+            );
+            throw new StopExportException();
+        }
+
+        // Creates the data file
+        $fileName = sprintf(
+            '%s_%s.txt',
+            IrsteaBdohDataBundle::slugify($bareme->getNom()),
+            $bareme->getDateCreation()->format('Y-m-d_H-i-s')
+        );
+        $this->filePath = $filePath = $this->dirPath . $fileName;
+
+        if (!($this->file = $file = fopen($filePath, 'w'))) {
+            fwrite(
+                $this->report,
+                $this->translator->trans(
+                    'Error.file.cantCreate(%file%)',
+                    ['%file%' => $filePath]
+                )
+            );
+            throw new StopExportException();
+        }
+
+        // Writes the file header
+        $this->writeHeader();
+
+        foreach ($bareme->getValeurs() as $line) {
+            $this->writeBaremeLine($line);
+        }
+
+        $nData = sizeof($baremeData);
+        if ($nData > 1) {
+            $parentChronicle = $this->getBdohRepo('ChroniqueContinue')->findOneById($baremeData[1]);
+        } else {
+            $parentChronicle = null;
+        }
+
+        $values = $bareme->getValeurs();
+        $n = sizeof($values);
+        $this->infoSelection = [
+            'name'            => $bareme->getNom(),
+            'dateCreation'    => $bareme->getDateCreation(),
+            'inputUnit'       => $this->getUnitLabel($bareme->getUniteEntree()),
+            'outputUnit'      => $this->getUnitLabel($bareme->getUniteSortie()),
+            'number'          => $n,
+            'min'             => $values[0][0],
+            'max'             => $values[$n - 1][0],
+            'parentChronicle' => ($parentChronicle) ? $parentChronicle->__toString() : null,
+            'dateBegin'       => ($nData > 2) ? $this->getStringDate($baremeData[2]) : null,
+            'dateEnd'         => ($nData > 3 && $baremeData[3]) ? $this->getStringDate($baremeData[3]) : null,
+        ];
+
+        // Writes main report line about the 'chronique' export
+        $this->writeMainReportLine();
+
+        // Saves the measures file path, and returns it
+        fclose($file);
+
+        return $this->baremeFiles[] = $filePath;
+    }
+
+    /**
+     * Writes some data in one line of the current file.
+     *
+     * @param mixed $data
+     */
+    protected function writeLine($data)
+    {
+        fwrite($this->file, implode($data, $this->delimiter) . "\n");
+    }
+
+    /**
+     * Writes the main report line, about export of current 'chronique'.
+     */
+    protected function writeMainReportLine()
+    {
+        fwrite(
+            $this->report,
+            $this->translator->trans(
+                'bareme.export.report.bareme.base(%bareme%, %dateCreation%, %inputUnit%, %outputUnit%, %number%, %min%, %max%)',
+                [
+                    '%bareme%'       => $this->infoSelection['name'],
+                    '%dateCreation%' => $this->getStringDate($this->infoSelection['dateCreation']),
+                    '%inputUnit%'    => $this->infoSelection['inputUnit'],
+                    '%outputUnit%'   => $this->infoSelection['outputUnit'],
+                    '%number%'       => $this->infoSelection['number'],
+                    '%min%'          => $this->infoSelection['min'],
+                    '%max%'          => $this->infoSelection['max'],
+                ]
+            )
+        );
+
+        if ($this->infoSelection['parentChronicle']) {
+            fwrite(
+                $this->report,
+                $this->translator->trans(
+                    'bareme.export.report.bareme.parentChronicle(%parentChronicle%)',
+                    ['%parentChronicle%' => $this->infoSelection['parentChronicle']]
+                )
+            );
+            if ($this->infoSelection['dateEnd']) {
+                fwrite(
+                    $this->report,
+                    $this->translator->trans(
+                        'bareme.export.report.bareme.applyFromTo(%dateBegin%, %dateEnd%)',
+                        [
+                            '%dateBegin%' => $this->infoSelection['dateBegin'],
+                            '%dateEnd%'   => $this->infoSelection['dateEnd'],
+                        ]
+                    )
+                );
+            } else {
+                fwrite(
+                    $this->report,
+                    $this->translator->trans(
+                        'bareme.export.report.bareme.applyFrom(%dateBegin%)',
+                        [
+                            '%dateBegin%' => $this->infoSelection['dateBegin'],
+                        ]
+                    )
+                );
+            }
+        } else {
+            fwrite($this->report, $this->translator->trans('bareme.export.report.bareme.notApplied'));
+        }
+
+        fwrite(
+            $this->report,
+            $this->translator->trans(
+                'bareme.export.report.bareme.outputFile(%file%)',
+                ['%file%' => basename($this->filePath)]
+            )
+        );
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     */
+    private function getRepository($entity)
+    {
+        return $this->em->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     */
+    private function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    protected function writeHeader()
+    {
+        $line_1 = ['Nom', 'Unite entree', 'Unite sortie', 'Commentaire'];
+
+        $line_2 = [
+            $this->bareme->getNom(),
+            $this->getUnitLabel($this->bareme->getUniteEntree()),
+            $this->getUnitLabel($this->bareme->getUniteSortie()),
+            $this->bareme->getCommentaire(),
+        ];
+
+        $line_3 = ['X', 'Y', 'Qualité', 'Min (optionnel)', 'Max (optionnel)'];
+
+        $this->writeLine($line_1);
+        $this->writeLine($line_2);
+        $this->writeLine($line_3);
+    }
+
+    private function writeBaremeLine(array $line)
+    {
+        $line[2] = $this->ordreToCode[intval($line[2])];
+        $line = array_diff($line, [null, '', 'null', 'NULL']);
+
+        $this->writeLine($line);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Form/DataTransformer/FileTransformer.php b/src/Irstea/BdohAdminBundle/Form/DataTransformer/FileTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..535bf6974335e152b154a375bf3757ff48b2dc53
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Form/DataTransformer/FileTransformer.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Form\DataTransformer;
+
+use Symfony\Component\Form\DataTransformerInterface;
+
+class FileTransformer implements DataTransformerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function transform($value)
+    {
+        if (empty($value)) {
+            return ['new' => null, 'current' => null];
+        }
+
+        return ['new' => null, 'current' => $value];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reverseTransform($value)
+    {
+        if (isset($value['new'])) {
+            return $value['new'];
+        }
+        if (isset($value['current'])) {
+            return $value['current'];
+        }
+
+        return null;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Form/DataTransformer/TheiaThesaurusTransformer.php b/src/Irstea/BdohAdminBundle/Form/DataTransformer/TheiaThesaurusTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c7ed8dd99196032caa4a5dbdbdb9f2139e58309
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Form/DataTransformer/TheiaThesaurusTransformer.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Form\DataTransformer;
+
+use Symfony\Component\Form\DataTransformerInterface;
+
+class TheiaThesaurusTransformer implements DataTransformerInterface
+{
+    /**
+     * Transforms a string ($uriString) to an array ($uriArray).
+     *
+     * @param array|null $value
+     *
+     * @return string|null
+     */
+    public function transform($value): ?string
+    {
+        if (empty($value)) {
+            return null;
+        }
+
+        return implode(',', $value);
+    }
+
+    /**
+     * Transforms an array ($uriArray) to a string ($uriString).
+     *
+     * @param string|null $value
+     *
+     * @return array|null
+     */
+    public function reverseTransform($value): array
+    {
+        if (empty($value)) {
+            return [];
+        }
+
+        return explode(',', $value);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Form/Type/FileType.php b/src/Irstea/BdohAdminBundle/Form/Type/FileType.php
new file mode 100644
index 0000000000000000000000000000000000000000..87ce048c3df77babf36f952e78b1fd66d25c1b32
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Form/Type/FileType.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Form\Type;
+
+use Irstea\BdohAdminBundle\Form\DataTransformer\FileTransformer;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\FileType as BaseFileType;
+use Symfony\Component\Form\Extension\Core\Type\HiddenType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class FileType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $newFileOptions = $childOptions = [
+            'error_bubbling' => true,
+            'required'       => false,
+        ];
+        if (!empty($options['accept'])) {
+            $newFileOptions['attr']['accept'] = $options['accept'];
+        }
+
+        $builder
+            ->add('current', HiddenType::class, $childOptions)
+            ->add('new', BaseFileType::class, $newFileOptions)
+            ->addModelTransformer(new FileTransformer());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function buildView(FormView $view, FormInterface $form, array $options)
+    {
+        $view->vars['accept'] = empty($options['accept']) ? '' : $options['accept'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver
+            ->setDefault('accept', '')
+            ->addAllowedTypes('accept', ['string', 'array'])
+            ->setNormalizer(
+                'accept',
+                function (OptionsResolver $resolver, $value) {
+                    if (is_array($value)) {
+                        $value = implode(',', $value);
+                    }
+
+                    return $value;
+                }
+            );
+    }
+
+    public function getBlockPrefix()
+    {
+        return 'bdoh_file';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'bdoh_file';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParent()
+    {
+        return 'form';
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Form/Type/TheiaThesaurusType.php b/src/Irstea/BdohAdminBundle/Form/Type/TheiaThesaurusType.php
new file mode 100644
index 0000000000000000000000000000000000000000..80538557235364309016da90b9447cea2a31aea0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Form/Type/TheiaThesaurusType.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Form\Type;
+
+use Irstea\BdohAdminBundle\Form\DataTransformer\TheiaThesaurusTransformer;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class TheiaThesaurusType extends AbstractType
+{
+    /** @var string */
+    private $thesaurusUrl;
+
+    public function __construct(string $thesaurusUrl)
+    {
+        $this->thesaurusUrl = $thesaurusUrl;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder->setCompound(false);
+        $builder->addViewTransformer(new TheiaThesaurusTransformer());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function buildView(FormView $view, FormInterface $form, array $options)
+    {
+        $view->vars['multiple'] = $options['multiple'];
+        $view->vars['thesaurusUrl'] = $options['thesaurusUrl'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults([
+            'multiple'     => false,
+            'thesaurusUrl' => $this->thesaurusUrl,
+        ]);
+
+        $resolver->setAllowedTypes('multiple', ['bool']);
+        $resolver->setAllowedTypes('thesaurusUrl', ['string']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
+    {
+        return 'bdoh_theiathesaurus';
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Form/Type/WysiwygType.php b/src/Irstea/BdohAdminBundle/Form/Type/WysiwygType.php
new file mode 100644
index 0000000000000000000000000000000000000000..0843594ebeb5f68dc656f4a41b5962107273a44d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Form/Type/WysiwygType.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+
+class WysiwygType extends AbstractType
+{
+    public function getBlockPrefix()
+    {
+        return 'wysiwyg';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'wysiwyg';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParent()
+    {
+        return 'textarea';
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php b/src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7ab1c0dc9f9c6c7a7eee9c15368667bf4285396
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Bareme/Manager.php
@@ -0,0 +1,629 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Bareme;
+
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\NoResultException;
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Importer\Measure\Exception\StopImportException;
+use Irstea\BdohBundle\DataTransformer\FromDateTimeMsTransformer;
+use Irstea\BdohDataBundle\Entity\Bareme;
+use Irstea\BdohDataBundle\Entity\Qualite;
+use Irstea\BdohDataBundle\Exporter\Exception\StopExportException;
+use RuntimeException;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class Manager
+{
+    const GAP_VALUE = '-9999';
+    const TMP_DIR = '/tmp/';
+    const MAX_ERRORS_IN_LOAD_DATA = 10;
+    const COMMENT = '#';
+    const BAREME_HEADER_SIZE = 3;
+
+    /***************************************************************************
+     * Some dependencies of this class, and their getter
+     **************************************************************************/
+
+    protected $em;
+
+    protected $translator;
+
+    protected $delimiter = ';';
+
+    /**
+     * Errors manager.
+     *
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+
+    protected $nom = '';
+
+    protected $dateCreation = null;
+
+    /**
+     * Path of file to import.
+     *
+     * @var string
+     */
+    protected $filePath;
+
+    /**
+     * Handler on file to import.
+     *
+     * @var resource
+     */
+    protected $file;
+
+    /**
+     * 'Station' for import.
+     *
+     * @var Irstea\BdohDataBundle\Entity\Observatoire
+     */
+    protected $observatoire = null;
+
+    protected $uniteEntreeId = null;
+
+    protected $uniteSortieId = null;
+
+    private $commentaire = '';
+
+    private $baremeGrid = [];
+
+    protected $baremeRepo = null;
+
+    protected $uniteRepo = null;
+
+    protected $qualiteMap = [];
+
+    private $xPrevious = -1e35;
+
+    /**
+     * @param EntityManager                                     $em
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     * @param string                                            $file       Path of a readable file
+     * @param ImportErrors                                      $errors
+     * @param mixed                                             $isExport
+     *
+     * @throws RuntimeException if $file isn't a real file
+     */
+    public function __construct(EntityManager $em, TranslatorInterface $translator, $file, ImportErrors $errors = null, $isExport = false)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+        $this->filePath = $file;
+        $this->errors = (null === $errors) ? new ImportErrors() : $errors;
+
+        $this->baremeRepo = $this->getBdohRepo('Bareme');
+        $this->uniteRepo = $this->getBdohRepo('Unite');
+
+        $qualites = $this->getBdohRepo('Observatoire')->getCurrentObservatoire()->getJeu()->getQualites();
+        foreach ($qualites as $q) {
+            $this->qualiteMap[$q->getCode()] = $q->getOrdre();
+        }
+
+        if ($isExport) {
+            // Creates a directory, randomly named
+            if (!mkdir($this->dirPath = static::TMP_DIR . rand() . '/')) {
+                throw new StopExportException();
+            }
+        } else {
+            /* $file is really a file  ? */
+            if (!is_file($file)) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'Errors.notFile(%file%)',
+                        ['%file%' => $file]
+                    )
+                );
+            }
+        }
+    }
+
+    // Sets metadata of import by reading the file header.
+    protected function setMetadataFromHeader()
+    {
+        try {
+            // Three-line header, but only first and second lines are checked
+            for ($i = 0; $i < 2; ++$i) {
+                $data[$i] = explode(';', fgets($this->file));
+            }
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+        }
+
+        if ($this->errors->isDirty()) {
+            throw new StopImportException();
+        }
+
+        // First and second line should have the same columns number
+        if (count($data[0]) !== count($data[1])) {
+            $this->errors->badHeaderFirstTwoLines();
+            throw new StopImportException();
+        }
+
+        // First line should be : Nom ; Unite entree ; Unite sortie ; Commentaire
+        if (count($data[0]) !== 4 ||
+            'nom' !== trim(strtolower($data[0][0])) ||
+            'unite entree' !== trim(strtolower($data[0][1])) ||
+            'unite sortie' !== trim(strtolower($data[0][2])) ||
+            'commentaire' !== trim(strtolower($data[0][3]))) {
+            $this->errors->badHeaderSyntax();
+            throw new StopImportException();
+        }
+
+        // Second line should be the values for : scale name ; input unit ; output unit ; comment
+        $this->nom = trim($data[1][0]);
+
+        $data[1][1] = trim($data[1][1]);
+        if (($unite = $this->uniteRepo->findOneByLibelle($data[1][1]))) {
+            $this->uniteEntreeId = $unite;
+        } else {
+            $this->errors->badUniteEntreeForBareme($data[1][1]);
+        }
+
+        $data[1][2] = trim($data[1][2]);
+        if (($unite = $this->uniteRepo->findOneByLibelle($data[1][2]))) {
+            $this->uniteSortieId = $unite;
+        } else {
+            $this->errors->badUniteSortieForBareme($data[1][2]);
+        }
+
+        $this->commentaire = trim($data[1][3]);
+
+        // If bad station, retrieving of 'bareme' data will fail => so stops
+        if ($this->errors->isDirty()) {
+            throw new StopImportException();
+        }
+    }
+
+    // Reads file data.
+    public function read()
+    {
+        try {
+            //We skip the header
+            $numLine = self::BAREME_HEADER_SIZE + 1;
+            $numDataLines = 0;
+            $numCols = 5;
+            $minNumCols = 3;
+
+            if (!$this->file = fopen($this->filePath, 'r')) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            for ($i = 0; $i < self::BAREME_HEADER_SIZE; ++$i) {
+                fgets($this->file);
+            }
+
+            while (($line = fgets($this->file))) {
+                // If line begins with self::COMMENT => it's a comment
+                if ($line[0] !== self::COMMENT && $numLine > self::BAREME_HEADER_SIZE) {
+                    // If line contains self::COMMENT => rest of line is a comment
+                    $splitLine = strtok($line, self::COMMENT);
+                    $data = explode(';', $splitLine);
+
+                    $found = count($data);
+                    if ($found > $numCols) {
+                        $this->errors->badLineSize($numLine, $found, "$numCols");
+                        throw new StopImportException();
+                    }
+                    if ($found < $minNumCols) {
+                        $this->errors->badMinLineSize($numLine, $found, "$minNumCols");
+                        throw new StopImportException();
+                    }
+
+                    $this->treatLine($data, $numLine);
+                    ++$numDataLines;
+                }
+                ++$numLine;
+            }
+
+            // File must contain at least 2 data lines
+            if ($numDataLines < 2) {
+                $this->errors->notEnoughData(2);
+                throw new StopImportException();
+            }
+
+            return $numDataLines;
+        } catch (\Exception $e) {
+            if (!($e instanceof StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    protected function treatLine($line, $numLine)
+    {
+        /**
+         * One line should be : x ; y ; quality ; min (opt.) ; max (opt.).
+         */
+        $nData = sizeof($line);
+        $x = trim($line[0]);
+        $y = trim($line[1]);
+        $qualityCode = trim($line[2]);
+        $min = ($nData > 3) ? trim($line[3]) : '';
+        $max = ($nData > 4) ? trim($line[4]) : '';
+
+        $this->processBaremeLine($x, $y, $qualityCode, $min, $max, $numLine);
+    }
+
+    /**
+     * Loads metadata from file header.
+     */
+    final public function loadHeader()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Opens the file
+            if (!$this->file = fopen($this->filePath, 'r')) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            $this->setMetadataFromHeader();
+
+            fclose($this->file);
+            $this->file = null;
+        } catch (\Exception $e) {
+            if (!($e instanceof StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    /**
+     * Loads file data.
+     */
+    final public function loadData()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            $bareme = new Bareme();
+            $bareme->setNom($this->nom);
+            $bareme->setUniteEntree($this->uniteRepo->findOneById($this->uniteEntreeId));
+            $bareme->setUniteSortie($this->uniteRepo->findOneById($this->uniteSortieId));
+            $bareme->setValeurs($this->baremeGrid);
+            $bareme->setCommentaire($this->commentaire);
+            $bareme->setObservatoire($this->getBdohRepo('Observatoire')->getCurrentObservatoire());
+            $bareme->setDateCreation(new \DateTime('now', new \DateTimeZone('UTC')));
+
+            $this->em->persist($bareme);
+            $this->em->flush();
+
+            $values = $bareme->getValeurs();
+
+            return [
+                'nom'           => $this->nom,
+                'uniteEntree'   => $bareme->getUniteEntree()->getLibelle(),
+                'uniteEntreeId' => $bareme->getUniteEntree()->getId(),
+                'uniteSortie'   => $bareme->getUniteSortie()->getLibelle(),
+                'uniteSortieId' => $bareme->getUniteSortie()->getId(),
+                'nValues'       => sizeof($values),
+                'xMin'          => $values[0][0],
+                'xMax'          => $values[sizeof($values) - 1][0],
+                'commentaire'   => $this->commentaire,
+                'id'            => $bareme->getId(),
+                'dateCreation'  => $bareme->getDateCreation(),
+            ];
+        } catch (\Exception $e) {
+            if (false === ($e instanceof StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    /**
+     * Proceeds to the final controles import, depending on an importType :
+     *       -> 'doNotImport' == do not import measures
+     *       -> 'import' == delete existing controles and import all.
+     *
+     * @param mixed $importType
+     */
+    final public function importData($importType)
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Gets the entity of each 'chronique'
+            $chronique = $this->chronique;
+            $chroniqueId = $this->chronique->getId();
+
+            // Some stats : number of INSERT and DELETE.
+            $numInsertDelete = [];
+
+            // depending on its "import type", imports the controles
+
+            $delete = 0;
+            $insert = 0;
+            $effectiveBeginDate = $this->firstDate;
+            $effectiveEndDate = $this->lastDate;
+
+            if ('import' === $importType) {
+                list($delete, $insert) = $this->controleRepo->import($this->tmpSqlTable, $chroniqueId);
+            }
+
+            $numInsertDelete[(string) $chronique] = [
+                'entity'    => $chronique,
+                'delete'    => $delete,
+                'insert'    => $insert,
+                'beginDate' => $effectiveBeginDate,
+                'endDate'   => $effectiveEndDate,
+            ];
+
+            // Controles import is now finished ! So, cleans the importer.
+            $this->clean();
+
+            return $numInsertDelete;
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+            $this->clean();
+        }
+    }
+
+    /**
+     * Generic actions for processBareme():
+     *  Checks that 'x', 'y', 'minimum and 'maximum' are numeric and that 'quality code' is valid.
+     *
+     * @param mixed $x
+     * @param mixed $y
+     * @param mixed $qualityCode
+     * @param mixed $minimum
+     * @param mixed $maximum
+     * @param mixed $numLine
+     */
+    private function processBaremeLine($x, $y, $qualityCode, $minimum, $maximum, $numLine)
+    {
+        //Checks that 'x', 'y', 'minimum' and 'maximum' are numeric
+        //and that 'x' > value on previous line
+        if ($x === null || !is_numeric($x)) {
+            $this->errors->variableNotNumeric($numLine, 'x', $x);
+        }
+        if ($y === null || !is_numeric($y)) {
+            $this->errors->variableNotNumeric($numLine, 'y', $y);
+        }
+        if ($this->errors->isClean()) {
+            $xDouble = doubleval($x);
+            if ($xDouble <= $this->xPrevious) {
+                $this->errors->notStrictlyAscending($numLine, $x, $this->xPrevious);
+            }
+            $this->xPrevious = $xDouble;
+        }
+        if ($minimum && !is_numeric($minimum)) {
+            $this->errors->variableNotNumeric($numLine, 'minimum', $minimum);
+        }
+        if ($maximum && !is_numeric($maximum)) {
+            $this->errors->variableNotNumeric($numLine, 'maximum', $maximum);
+        }
+
+        // Try to convert quality code to quality order
+        if ($qualityCode === null || !array_key_exists($qualityCode, $this->qualiteMap) || $qualityCode === 'gap') {
+            $this->errors->badCodeQualite($numLine, $qualityCode);
+        } elseif (\in_array($this->qualiteMap[$qualityCode], Qualite::$ordresLimites)) {
+            $this->errors->valueLimitInBareme($numLine, $qualityCode);
+        }
+
+        // If too many errors => stops the controles import process !
+        if ($this->errors->count > static::MAX_ERRORS_IN_LOAD_DATA) {
+            $this->errors->tooManyErrors();
+            throw new StopImportException();
+        }
+
+        // Fill the bareme grid
+        if ($this->errors->isClean()) {
+            $this->baremeGrid[] = [$x, $y, strval($this->qualiteMap[$qualityCode]), $minimum, $maximum];
+        }
+    }
+
+    /**
+     * Treatments to do when serializing.
+     */
+    public function __sleep()
+    {
+        /* Attributes to serialize */
+        return [
+            'errors',
+            'filePath',
+            'nom',
+            'uniteEntreeId',
+            'uniteSortieId',
+            'commentaire',
+            'baremeGrid',
+        ];
+    }
+
+    /**
+     * Treatments to do when unserializing.
+     * NOTE : run manually this function !
+     *
+     * @param EntityManager                                     $em
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     */
+    public function wakeup(EntityManager $em, TranslatorInterface $translator)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+        $this->uniteRepo = $this->getBdohRepo('Unite');
+    }
+
+    /**
+     * Cleans the importer.
+     */
+    final public function clean()
+    {
+        // Closes file handlers
+        if ($this->file) {
+            fclose($this->file);
+            $this->file = null;
+        }
+
+        if ($this->filePath) {
+            unlink($this->filePath);
+            $this->filePath = null;
+        }
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     */
+    protected function getRepository($entity)
+    {
+        return $this->em->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     */
+    protected function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    public function run($chroniqueId)
+    {
+        // Retrieves the 'chronique' entity from its id.
+        try {
+            $this->chronique = $chronique = $this->getBdohRepo('Chronique')->findOneById($chroniqueId);
+            $chronRepo = $this->getChroniqueRepo();
+        } catch (NoResultException $e) {
+            throw new StopExportException();
+        }
+
+        // Creates the file
+        $fileName = sprintf('%s_%s_%s.txt', 'Controle', $chronique->getStation()->getCode(), $chronique->getCode());
+        $this->filePath = $filePath = $this->dirPath . $fileName;
+
+        if (false === ($this->file = $file = fopen($filePath, 'w'))) {
+            throw new StopExportException();
+        }
+
+        // Writes the file header
+        $this->writeHeader();
+
+        /*
+         * Retrieves :
+         *      => a "Doctrine statement" on measures selected ;
+         *      => some interesting information about this selection .
+         */
+        list(
+            $stmt, $this->infoSelection
+            ) =
+            $chronRepo->getControlePointsForExport($chronique, $this->timezone);
+
+        while ($controlePoint = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+            $this->writeControlePoint($controlePoint);
+        }
+
+        // Saves the measures file path, and returns it
+        fclose($file);
+
+        return $filePath;
+    }
+
+    public function getFilePath()
+    {
+        return $this->filePath;
+    }
+
+    public function writeHeader()
+    {
+        $line_1 = ['Station', 'Fuseau', 'Chronique', 'Unite'];
+
+        $line_2 = [
+            $this->chronique->getStation()->getCode(),
+            'UTC' . substr($this->timezone, 0, 3),
+            $this->chronique->getCode(),
+            $this->chronique->getUnite()->getLibelle(),
+        ];
+
+        $line_3 = ['DateHeure', 'Valeur', 'Min', 'Max'];
+
+        $this->writeLine($line_1);
+        $this->writeLine($line_2);
+        $this->writeLine($line_3);
+    }
+
+    public function writeControlePoint($controlePoint)
+    {
+        $line = [FromDateTimeMsTransformer::toFrenchDateTimeMs($controlePoint['date'])];
+
+        $line[] = (null === $controlePoint['valeur']) ? static::GAP_VALUE : $controlePoint['valeur'];
+        $line[] = $controlePoint['minimum'];
+        $line[] = $controlePoint['maximum'];
+
+        $this->writeLine($line);
+    }
+
+    /**
+     * Writes some data in one line of the current file.
+     *
+     * @param mixed $data
+     */
+    protected function writeLine($data)
+    {
+        fwrite($this->file, implode($data, $this->delimiter) . "\n");
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Controle/Manager.php b/src/Irstea/BdohAdminBundle/Importer/Controle/Manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..a15777ea3ff9552bbfd4dcbcea51ce58e25ec5cf
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Controle/Manager.php
@@ -0,0 +1,1002 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Controle;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Importer\Measure\Exception\StopImportException;
+use Irstea\BdohBundle\DataTransformer\FromDateTimeMsTransformer;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Qualite;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Exporter\Exception\StopExportException;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class Manager.
+ */
+class Manager
+{
+    const GAP_VALUE = '-9999';
+
+    const TMP_DIR = '/tmp/';
+
+    const MAX_ERRORS_IN_LOAD_DATA = 10;
+
+    const COMMENT = '#';
+
+    /***************************************************************************
+     * Some dependencies of this class, and their getter
+     **************************************************************************/
+
+    protected $em;
+
+    /**
+     * @var Symfony\Component\Translation\TranslatorInterface|TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * @var string
+     */
+    protected $delimiter = ';';
+
+    /**
+     * Errors manager.
+     *
+     * @var Irstea\BdohAdminBundle\Errors\ImportErrors
+     */
+    protected $errors;
+
+    /**
+     * @return ImportErrors|Irstea\BdohAdminBundle\Errors\ImportErrors
+     */
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+
+    /**
+     * @var null
+     */
+    public $firstDate = null;
+
+    /**
+     * @var null
+     */
+    public $lastDate = null;
+
+    /**
+     * Path of file to import.
+     *
+     * @var string
+     */
+    protected $filePath;
+
+    /**
+     * Handler on file to import.
+     *
+     * @var resource
+     */
+    protected $file;
+
+    /**
+     * Path of CSV file.
+     *
+     * @var string
+     */
+    protected $csvPath;
+
+    /**
+     * Handler on CSV file.
+     *
+     * @var resource
+     */
+    protected $csv;
+
+    /**
+     * Name of the temporary SQL table.
+     *
+     * @var string
+     */
+    public $tmpSqlTable;
+
+    /**
+     * 'Station' for import.
+     *
+     * @var Irstea\BdohDataBundle\Entity\Station
+     */
+    protected $station = null;
+
+    /**
+     * 'Chronique' for which file data should be inserted.
+     *
+     * @var Irstea\BdohDataBundle\Entity\Chronique
+     */
+    protected $chronique = null;
+
+    /**
+     * 'Unite' in which file data should be inserted.
+     *
+     * @var array
+     */
+    protected $unite = null;
+
+    /**
+     * Timezone of file dates.
+     *
+     * @var string Format : +/-hhmm (+02:00, -10:00, -04:30, +00:30...)
+     */
+    protected $timezone = '';
+
+    /**
+     * @var \Doctrine\ORM\EntityRepository|null
+     */
+    protected $controleRepo = null;
+
+    /**
+     * @var \Doctrine\ORM\EntityRepository|null
+     */
+    protected $chroniqueRepo = null;
+
+    /**
+     * @var \Doctrine\ORM\EntityRepository|null
+     */
+    protected $mesureRepo = null;
+
+    /**
+     * @var array
+     */
+    protected $qualityMap;
+
+    /**
+     * @var array
+     */
+    protected $qualityCodes;
+
+    /**
+     * @var array
+     */
+    protected $allowedQualityCodes;
+
+    /**
+     * @var \DateTime
+     */
+    protected $now;
+
+    /**
+     * @var string
+     */
+    protected $nowAsString;
+
+    /**
+     * @param Doctrine\ORM\EntityManager                        $em
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     * @param string                                            $file       Path of a readable file
+     * @param Irstea\BdohAdminBundle\Errors\ImportErrors        $errors
+     * @param mixed                                             $isExport
+     * @param mixed|null                                        $timezone
+     *
+     * @throws \RuntimeException if $file isn't a real file
+     */
+    public function __construct(
+        EntityManager $em,
+        TranslatorInterface $translator,
+        $file,
+        ImportErrors $errors = null,
+        $isExport = false,
+        $timezone = null
+    ) {
+        $this->em = $em;
+        $this->translator = $translator;
+        $this->filePath = $file;
+        $this->errors = (null === $errors) ? new ImportErrors() : $errors;
+
+        $this->controleRepo = $this->getBdohRepo('PointControle');
+        $this->chroniqueRepo = $this->getBdohRepo('ChroniqueContinue');
+        $this->mesureRepo = $this->getBdohRepo('Mesure');
+        $this->timezone = $timezone;
+
+        $obsQualities = Observatoire::getCurrent()->getJeu()->getQualites();
+        $this->qualityCodes = [];
+        $this->allowedQualityCodes = [];
+        $this->qualityMap = [];
+        foreach ($obsQualities as $q) {
+            $this->qualityCodes[] = $q->getCode();
+            if (!\in_array($q->getOrdre(), Qualite::$ordresInvalides, true) &&
+                !\in_array($q->getOrdre(), Qualite::$ordresLimites, true)) {
+                $this->allowedQualityCodes[] = $q->getCode();
+            }
+            $this->qualityMap[$q->getCode()] = $q->getId();
+        }
+
+        if ($isExport) {
+            // Creates a directory, randomly named
+            if (!mkdir($this->dirPath = static::TMP_DIR . rand() . '/')) {
+                throw new StopExportException();
+            }
+        } else {
+            /* $file is really a file  ? */
+            if (!is_file($file)) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Errors.notFile(%file%)',
+                        ['%file%' => $file]
+                    )
+                );
+            }
+        }
+
+        $this->now = new \DateTime();
+        $this->nowAsString = $this->now->format('Y-m-d H:i:s');
+    }
+
+    // Function allowing to validate/transform a timezone
+
+    /**
+     * @param $timezone
+     *
+     * @return bool|string
+     */
+    protected function validateTimezone($timezone)
+    {
+        return \Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer::bdohTimezone($timezone);
+    }
+
+    // Function allowing to validate/transform a datetime
+
+    /**
+     * @param $dateTimeMs
+     *
+     * @return bool|string
+     */
+    protected function validateDateTimeMs($dateTimeMs)
+    {
+        return \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varFrenchDateTimeMs($dateTimeMs);
+    }
+
+    // Sets metadata of import by reading the file header.
+
+    /**
+     * @throws StopImportException
+     */
+    protected function setMetadataFromHeader()
+    {
+        try {
+            // Three-line header, but only first and second lines are checked
+            for ($i = 0; $i < 2; ++$i) {
+                $data[$i] = explode(';', fgets($this->file));
+            }
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+            throw new StopImportException();
+        }
+
+        // First and second line should have the same columns number
+        if (count($data[0]) !== count($data[1])) {
+            $this->errors->badHeaderFirstTwoLines();
+            throw new StopImportException();
+        }
+
+        // First line should be : Station ; Fuseau ; Chronique ; Unité
+
+        if (count($data[0]) !== 4 ||
+            'station' !== trim(strtolower($data[0][0])) ||
+            'fuseau' !== trim(strtolower($data[0][1])) ||
+            'chronique' !== trim(strtolower($data[0][2])) ||
+            'unite' !== trim(strtolower($data[0][3]))) {
+            $this->errors->badHeaderSyntax();
+            throw new StopImportException();
+        }
+
+        // Second line should be : codeStation ; valeurFuseau ; codeChronique ; valeurUnite
+        // Try to assign attributes from this line
+        if (!$this->setStation(trim($data[1][0]))
+            || !$this->setTimezone($data[1][1])
+            || !$this->setChronique(trim($data[1][2]))
+            || !$this->setUnite(trim($data[1][3]))
+        ) {
+            throw new StopImportException();
+        }
+    }
+
+    // Reads file data.
+
+    /**
+     * @throws StopImportException
+     */
+    protected function read()
+    {
+        //We skip the header
+        $numLine = 4;
+
+        while (($line = fgets($this->file)) !== false) {
+            // If line begins with self::COMMENT => it's a comment
+            if ($line[0] !== self::COMMENT && $numLine > 3) {
+                // If line contains self::COMMENT => rest of line is a comment
+                $splitLine = strtok($line, self::COMMENT);
+                $data = explode(';', $splitLine);
+
+                if (($found = count($data)) > 5) {
+                    $this->errors->badLineSize($numLine, $found, '5');
+                    throw new StopImportException();
+                }
+
+                if (($found = count($data)) < 3) {
+                    $this->errors->badMinLineSize($numLine, $found, '3');
+                    throw new StopImportException();
+                }
+
+                $this->treatLine($data, $numLine);
+            }
+            ++$numLine;
+        }
+    }
+
+    /**
+     * @param $line
+     * @param $numLine
+     *
+     * @throws StopImportException
+     */
+    protected function treatLine($line, $numLine)
+    {
+        /**
+         * One line should be : DateTime ; value ; quality ; min ; max.
+         */
+        $nData = \sizeof($line);
+
+        $date = trim($line[0]);
+        $value = trim($line[1]);
+        $quality = ($nData > 2) ? trim($line[2]) : null;
+        $min = ($nData > 3) ? trim($line[3]) : null;
+        $max = ($nData > 4) ? trim($line[4]) : null;
+
+        $this->processControle($date, $value, $quality, $min, $max, $numLine);
+    }
+
+    /**
+     * Loads metadata from file header.
+     */
+    final public function loadHeader()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Opens the file
+            if (!$this->file = fopen($this->filePath, 'r')) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            $this->setMetadataFromHeader();
+
+            fclose($this->file);
+            $this->file = null;
+        } catch (\Exception $e) {
+            if (false === ($e instanceof StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    /**
+     * Loads file data.
+     */
+    final public function loadData()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Opens the file
+            if (!($this->file = fopen($this->filePath, 'r'))) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            // Creates a temporary CSV file
+            $this->csvPath = tempnam('/tmp', 'import_');
+
+            if (!($this->csv = fopen($this->csvPath, 'w'))) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantCreate(%file%)',
+                        ['%file%' => $this->csvPath]
+                    )
+                );
+            }
+            if (false === chmod($this->csvPath, 0755)) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.chmodFailed(%file%,%mode%)',
+                        ['%file%' => $this->csvPath, '%mode%' => '0755']
+                    )
+                );
+            }
+
+            // Skips the file header
+            for ($i = 0; $i < 3;
+                ++$i) {
+                fgets($this->file);
+            }
+
+            // Reads each line of the file, and writes the CSV file
+            $this->read();
+
+            if ($this->errors->isClean()) {
+                // Creates a temporary SQL table
+                $this->tmpSqlTable = $this->controleRepo->createTemporaryTable();
+                // And inserts controles in it (from the CSV file)
+                $this->controleRepo->copyIntoTemporaryTable($this->tmpSqlTable, $this->csvPath);
+
+                // Detects date redundancies
+                if ([] !== $redundancies = $this->controleRepo->detectDateRedundancies($this->tmpSqlTable)) {
+                    // If there are some, creates corresponding errors
+                    foreach ($redundancies as $date => $redundancy) {
+                        $this->errors->dateRedundancy(
+                            $this->chronique->getCode(),
+                            $date,
+                            $redundancy['count'],
+                            $redundancy['numLines']
+                        );
+                    }
+                    throw new StopImportException();
+                }
+
+                // Adjusts the SQL table dates depending on timezone
+                $tmpTz = $this->timezone;
+                $tmpTz[0] = $tmpTz[0] === '+' ? '-' : '+';
+                $this->mesureRepo->adjustDates($tmpTz, $this->tmpSqlTable);
+
+                // Gets the first and last dates from the SQL table
+                list($this->firstDate, $this->lastDate) =
+                    $this->mesureRepo->getTemporaryFirstLastDates($this->tmpSqlTable);
+            }
+
+            fclose($this->file);
+            $this->file = null;
+            fclose($this->csv);
+            $this->csv = null;
+        } catch (\Exception $e) {
+            if (!($e instanceof StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    /**
+     * Proceeds to the final controles import, depending on an importType :
+     *       -> 'doNotImport' == do not import measures
+     *       -> 'import' == delete existing controles and import all.
+     *
+     * @param mixed $importType
+     */
+    final public function importData($importType)
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'controle.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Gets the entity of each 'chronique'
+            $chronique = $this->chronique;
+            $chroniqueId = $this->chronique->getId();
+
+            // Some stats : number of INSERT and DELETE.
+            $numInsertDelete = [];
+
+            // depending on its "import type", imports the controles
+
+            $delete = 0;
+            $insert = 0;
+            $effectiveBeginDate = $this->firstDate;
+            $effectiveEndDate = $this->lastDate;
+
+            if ('import' === $importType) {
+                list($delete, $insert) = $this->controleRepo->import($this->tmpSqlTable, $chroniqueId);
+            }
+
+            $numInsertDelete[(string) $chronique] = [
+                'entity'    => $chronique,
+                'delete'    => $delete,
+                'insert'    => $insert,
+                'beginDate' => $effectiveBeginDate,
+                'endDate'   => $effectiveEndDate,
+            ];
+
+            // Controles import is now finished ! So, cleans the importer.
+            $this->clean();
+
+            return $numInsertDelete;
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+            $this->clean();
+        }
+    }
+
+    /**
+     * If validation/transformation of given timezone by the validateTimezone() function is OK :
+     *      => sets "timezone" attribute with the transformed/validated timezone.
+     * Else => sets an error.
+     *
+     * @param string $timezone
+     */
+    final public function setTimezone($timezone)
+    {
+        if (($tmpTz = $this->validateTimezone($timezone))) {
+            $this->timezone = $tmpTz;
+
+            return true;
+        }
+        $this->errors->invalidTimezone($timezone);
+
+        return false;
+    }
+
+    /**
+     * Gets the timezone.
+     *
+     * @return string
+     */
+    final public function getTimezone()
+    {
+        return $this->timezone;
+    }
+
+    /**
+     * Sets the 'station' for import.
+     * If 'station' not found by code => sets an error.
+     *
+     * @param Station|string $station may be an instance of 'Station' or a Station's code
+     */
+    final public function setStation($station)
+    {
+        if (is_string($station)) {
+            try {
+                $station = $this->getBdohRepo('Station')->findOneByCode($station);
+                $ok = true;
+            } catch (\Exception $e) {
+                $ok = false;
+            }
+        } else {
+            $ok = ($station instanceof Station);
+        }
+
+        if ($ok) {
+            $this->station = $station;
+        } else {
+            $this->errors->badStation($station);
+            $this->station = null;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * Gets the 'station' for import.
+     *
+     * @return Irstea\BdohDataBundle\Entity\Station
+     */
+    final public function getStation()
+    {
+        return $this->station;
+    }
+
+    /**
+     * Sets the 'chronique'.
+     *
+     * If 'chronique' not found by a 'station' and a code => sets an error.
+     *
+     * Note : at this point, a 'station' should be defined.
+     *
+     * @param Chronique|string $chronique May be an instance of 'Chronique'or a Chronique's code
+     */
+    final public function setChronique($chronique)
+    {
+        if (is_string($chronique)) {
+            try {
+                $chronique = $this->chroniqueRepo->findOneByStationAndCode($this->station, $chronique);
+                $ok = $chronique && !$chronique->isConvertie();
+            } catch (\Exception $e) {
+                $ok = false;
+            }
+        } else {
+            $ok = ($chronique instanceof ChroniqueContinue) && !$chronique->isConvertie();
+        }
+
+        if ($ok) {
+            $this->chronique = $chronique;
+        } else {
+            if (($chronique instanceof ChroniqueContinue) && $chronique->isConvertie()) {
+                $this->errors->noCheckpointOnConverted($chronique);
+            } else {
+                $this->errors->badChroniqueContinue($chronique, $this->station);
+            }
+            $this->chronique = null;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * Gets 'chronique'.
+     *
+     * @return Chronique
+     */
+    final public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * @return ChroniqueRepository
+     */
+    final public function getChroniqueRepo()
+    {
+        return $this->chroniqueRepo;
+    }
+
+    /**
+     * @return ChroniqueRepository
+     */
+    final public function getControleRepo()
+    {
+        return $this->controleRepo;
+    }
+
+    /**
+     * Process of a 'Controle' :.
+     *
+     *  2) Validates/transforms 'date' with the validateDateTimeMs() function...
+     *  3) and checks the result.
+     *  4) Do generic checks and treatments.
+     *  5) Writes 'Controle' in CSV file.
+     *
+     *  /!\ Are realized at the end of loadData(), directly in the temporary SQL table :
+     *      => detection of date redundancies ;
+     *      => transformation of date in UTC ;
+     *      => computing of first and last dates.
+     *
+     * @param mixed $date
+     * @param mixed $valeur
+     * @param mixed $qualite
+     * @param mixed $minimum
+     * @param mixed $maximum
+     * @param mixed $numLine
+     */
+    final protected function processControle($date, $valeur, $qualite, $minimum, $maximum, $numLine)
+    {
+        // Validates/transforms 'date' with the validateDateTimeMs() function, and checks the result
+        if (!($tmpDate = $this->validateDateTimeMs($date))) {
+            $this->errors->dateInvalidFormat($numLine, $date, $valeur);
+        } elseif ($tmpDate > $this->now) {
+            $this->errors->dateAfterNow($numLine, $date, $valeur);
+        } else {
+            $date = $tmpDate;
+        }
+
+        // Check value
+        if (!$valeur) {
+            $valeur = '';
+        }
+        if (!\is_numeric($valeur)) {
+            $this->errors->valeurNotNumeric($numLine, $date, $valeur);
+        }
+
+        // Check quality
+        if (!\in_array($qualite, $this->qualityCodes)) {
+            $this->errors->notInSourceJeu($numLine, $date, $valeur, $qualite);
+        } elseif (!\in_array($qualite, $this->allowedQualityCodes)) {
+            $this->errors->qualityNotForCheckpoint($numLine, $date, $valeur, $qualite);
+        }
+
+        // Check minimum
+        if ($minimum && !\is_numeric($minimum)) {
+            $this->errors->minimumNotNumeric($numLine, $date, $valeur, $minimum);
+        }
+
+        // Check maximum
+        if ($maximum && !\is_numeric($maximum)) {
+            $this->errors->maximumNotNumeric($numLine, $date, $valeur, $maximum);
+        }
+
+        if ($this->errors->count > static::MAX_ERRORS_IN_LOAD_DATA) {
+            $this->errors->tooManyErrors();
+            throw new StopImportException();
+        }
+
+        //processGeneric($date, $valeur, $minimum, $maximum, $numLine)
+
+        // Writes 'Controle' in CSV file
+        $fields = [
+            $numLine,
+            $this->chronique->getId(),
+            $date,
+            is_numeric($valeur) ? $valeur : '\\N',
+            isset($this->qualityMap[$qualite]) ? $this->qualityMap[$qualite] : '\\N',
+            is_numeric($minimum) ? $minimum : '\\N',
+            is_numeric($maximum) ? $maximum : '\\N',
+        ];
+        fputcsv($this->csv, $fields, ';');
+    }
+
+    /**
+     * Treatments to do when serializing.
+     */
+    public function __sleep()
+    {
+        /* Inlines 'chroniques' and 'station' */
+        if ($this->chronique instanceof Chronique) {
+            $this->chronique = $this->chronique->getId();
+        }
+
+        if ($this->station instanceof Station) {
+            $this->station = $this->station->getId();
+        }
+
+        /* Attributes to serialize */
+        return [
+            'errors',
+            'filePath',
+            'csvPath',
+            'tmpSqlTable',
+            'station',
+            'chronique',
+            'timezone',
+            'firstDate',
+            'lastDate',
+            'now',
+            'nowAsString',
+        ];
+    }
+
+    /**
+     * Treatments to do when unserializing.
+     * NOTE : run manually this function !
+     *
+     * @param Doctrine\ORM\EntityManager                        $em
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     */
+    public function wakeup(EntityManager $em, TranslatorInterface $translator)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+
+        $this->controleRepo = $this->getBdohRepo('PointControle');
+        $this->chroniqueRepo = $this->getBdohRepo('ChroniqueContinue');
+        $this->mesureRepo = $this->getBdohRepo('Mesure');
+
+        /* Gets 'chronique' and 'station' entities */
+
+        if ($this->chronique) {
+            $this->chronique = $this->chroniqueRepo->find($this->chronique);
+        }
+        if ($this->station) {
+            $this->station = $this->getBdohRepo('Station')->find($this->station);
+        }
+    }
+
+    /**
+     * Cleans the importer.
+     */
+    final public function clean()
+    {
+        // Closes file handlers
+        if ($this->file) {
+            fclose($this->file);
+            $this->file = null;
+        }
+        if ($this->csv) {
+            fclose($this->csv);
+            $this->csv = null;
+        }
+
+        // Deletes imported file and CSV file
+        if ($this->csvPath) {
+            unlink($this->csvPath);
+            $this->csvPath = null;
+        }
+
+        if ($this->filePath) {
+            unlink($this->filePath);
+            $this->filePath = null;
+        }
+
+        // Deletes temporary SQL table
+        if ($this->tmpSqlTable) {
+            $this->mesureRepo->dropTemporaryTable($this->tmpSqlTable);
+        }
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     */
+    protected function getRepository($entity)
+    {
+        return $this->em->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     */
+    protected function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    /**
+     * @return array
+     */
+    public function getUnite()
+    {
+        return $this->unite;
+    }
+
+    /**
+     * @param $unite
+     *
+     * @return bool
+     */
+    public function setUnite($unite)
+    {
+        if ($unite === $this->getChronique()->getUnite()->getLibelle()) {
+            $this->unite = $unite;
+
+            return true;
+        }
+        $this->errors->badHeaderUnit($unite, $this->getChronique()->getUnite()->getLibelle());
+        $this->unite = null;
+
+        return false;
+    }
+
+    /**
+     * @param $chroniqueId
+     * @param $defaultQualityCode
+     *
+     * @return string
+     */
+    public function run($chroniqueId, $defaultQualityCode)
+    {
+        // Retrieves the 'chronique' entity from its id.
+        try {
+            $this->chronique = $chronique = $this->getBdohRepo('Chronique')->findOneById($chroniqueId);
+            $chronRepo = $this->getChroniqueRepo();
+        } catch (\Doctrine\ORM\NoResultException $e) {
+            throw new StopExportException();
+        }
+
+        // Creates the file
+        $fileName = sprintf('%s_%s_%s.txt', 'Controle', $chronique->getStation()->getCode(), $chronique->getCode());
+        $this->filePath = $filePath = $this->dirPath . $fileName;
+
+        if (false === ($this->file = $file = fopen($filePath, 'w'))) {
+            throw new StopExportException();
+        }
+
+        // Writes the file header
+        $this->writeHeader();
+
+        /*
+         * Retrieves :
+         *      => a "Doctrine statement" on measures selected ;
+         *      => some interesting information about this selection .
+         */
+        list($stmt, $this->infoSelection) =
+            $chronRepo->getControlePointsForExport($chronique, $this->timezone, $defaultQualityCode);
+
+        while ($controlePoint = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+            $this->writeControlePoint($controlePoint);
+        }
+
+        // Saves the measures file path, and returns it
+        fclose($file);
+
+        return $filePath;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFilePath()
+    {
+        return $this->filePath;
+    }
+
+    public function writeHeader()
+    {
+        $line_1 = ['Station', 'Fuseau', 'Chronique', 'Unite'];
+
+        $line_2 = [
+            $this->chronique->getStation()->getCode(),
+            'UTC' . substr($this->timezone, 0, 3),
+            $this->chronique->getCode(),
+            $this->chronique->getUnite()->getLibelle(),
+        ];
+
+        $line_3 = ['DateHeure', 'Valeur', 'Qualite', 'Min (optionnel)', 'Max (optionnel)'];
+
+        $this->writeLine($line_1);
+        $this->writeLine($line_2);
+        $this->writeLine($line_3);
+    }
+
+    /**
+     * @param $controlePoint
+     */
+    public function writeControlePoint($controlePoint)
+    {
+        $line = [FromDateTimeMsTransformer::toFrenchDateTimeMs($controlePoint['date'])];
+
+        $line[] = (null === $controlePoint['valeur']) ? static::GAP_VALUE : $controlePoint['valeur'];
+        $line[] = $controlePoint['qualite'];
+        $line[] = $controlePoint['minimum'];
+        $line[] = $controlePoint['maximum'];
+
+        $this->writeLine($line);
+    }
+
+    /**
+     * Writes some data in one line of the current file.
+     *
+     * @param mixed $data
+     */
+    protected function writeLine($data)
+    {
+        fwrite($this->file, implode($data, $this->delimiter) . "\n");
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/BdohImporter.php b/src/Irstea/BdohAdminBundle/Importer/Measure/BdohImporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..da65bee2bfc733e3f616391b03b00378320afe02
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/BdohImporter.php
@@ -0,0 +1,276 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+
+/**
+ * https://forge.cemagref.fr/projects/bdoh/wiki/Formats_de_fichier_Import_du_stock#Biche.
+ */
+class BdohImporter extends Importer implements ImporterInterface
+{
+    const COMMENT = '#';
+
+    const GAP_QUALITY = 'gap';
+
+    const GAP_VALUE = '-9999';
+
+    /**
+     * @var int
+     */
+    protected $headerSize = 3;
+
+    /**
+     * @var int
+     */
+    protected $dateNumber = 1;
+
+    /**
+     * @var
+     */
+    protected $hasMinMax;
+
+    /**
+     * @var array
+     */
+    protected $columnInfoPerChronique = [];
+
+    /**
+     * @var
+     */
+    protected $expectedColumnNumber;
+
+    /**
+     * @throws Exception\StopImportException
+     */
+    protected function setMetadataFromHeader()
+    {
+        // Three-line header
+        for ($i = 0; $i < 3; ++$i) {
+            $headerData[$i] = explode(';', fgets($this->file));
+        }
+
+        // First and second line should have the same columns number
+        if (count($headerData[0]) !== count($headerData[1])) {
+            $this->errors->badHeaderFirstTwoLines();
+            throw new Exception\StopImportException();
+        }
+
+        // First line should be : Station ; Fuseau ; { Chronique ; Unite } (n fois).
+        $chroniqueNumber = 0;
+        $numColumn = count($headerData[0]);
+
+        if ($numColumn < 4 || ($numColumn - 2) % 2 !== 0) {
+            $this->errors->badHeaderSyntax();
+            throw new Exception\StopImportException();
+        }
+
+        for ($i = 2; $i < ($numColumn - 1); $i += 2) {
+            if (('chronique' === trim(strtolower($headerData[0][$i]))) &&
+                ('unite' === trim(strtolower($headerData[0][$i + 1])))) {
+                ++$chroniqueNumber;
+            } else {
+                $this->errors->badHeaderSyntax();
+                throw new Exception\StopImportException();
+            }
+        }
+
+        if ($chroniqueNumber > 0) {
+            $this->expectedChroniques = $chroniqueNumber;
+        } else {
+            $this->errors->badHeaderNoChronique();
+            throw new Exception\StopImportException();
+        }
+
+        // Second line should be : codeStation ; valeurFuseau ; { codeChronique ; libelleUnite } (n times)
+        $this->setStation(trim($headerData[1][0]));
+        $this->setTimezone($headerData[1][1]);
+
+        // If bad station, retrieving of 'chroniques' will fail => so stops
+        if ($this->errors->isDirty()) {
+            throw new Exception\StopImportException();
+        }
+
+        for ($i = 0; $i < $this->expectedChroniques; ++$i) {
+            $this->setChronique(trim($headerData[1][2 * $i + 2]), $i, trim($headerData[1][2 * $i + 3]));
+        }
+
+        $this->process3rdLine($headerData[2]);
+
+        $lineSize = count($headerData[2]);
+        $withoutMinMax = $this->dateNumber + 2 * $this->expectedChroniques;
+        $withMinMax = $this->dateNumber + 4 * $this->expectedChroniques;
+
+        $allowedCollumnNumber = range($withoutMinMax, $withMinMax, 2);
+
+        if ($lineSize === $withoutMinMax) {
+            $this->hasMinMax = false;
+        } elseif (in_array($lineSize, $allowedCollumnNumber)) {
+            $this->hasMinMax = true;
+        } else {
+            $this->errors->badLineSize(3, $lineSize, join('/', $allowedCollumnNumber));
+        }
+    }
+
+    /**
+     * @param $headerLineData
+     *
+     * @throws Exception\StopImportException
+     */
+    protected function process3rdLine($headerLineData)
+    {
+        $trimmedData = [];
+        foreach ($headerLineData as $hld) {
+            $trimmedData[] = trim(strtolower($hld));
+        }
+        $nHeaderData = \count($trimmedData);
+        if ($nHeaderData < 2 || $trimmedData[0] !== 'dateheure') {
+            $this->errors->badHeaderSyntax();
+            throw new Exception\StopImportException();
+        }
+
+        $this->processRestOf3rdLine($trimmedData, $nHeaderData);
+    }
+
+    /**
+     * @param $trimmedData
+     * @param $nHeaderData
+     *
+     * @throws Exception\StopImportException
+     */
+    protected function processRestOf3rdLine($trimmedData, $nHeaderData)
+    {
+        $iCell = $this->dateNumber;
+        for ($i = 0; $i < $this->expectedChroniques; ++$i) {
+            $iStart = $iCell;
+            if ($iCell > $nHeaderData - 2
+                || $trimmedData[$iCell++] !== 'valeur'
+                || $trimmedData[$iCell++] !== 'qualite') {
+                $this->errors->badHeaderSyntax();
+                throw new Exception\StopImportException();
+            }
+            if (($hasMin = ($iCell < $nHeaderData && $trimmedData[$iCell] === 'min'))) {
+                ++$iCell;
+            }
+            if (($hasMax = ($iCell < $nHeaderData && $trimmedData[$iCell] === 'max'))) {
+                ++$iCell;
+            }
+
+            $this->columnInfoPerChronique[] = ['hasMin' => $hasMin, 'hasMax' => $hasMax, 'iStart' => $iStart, 'iEnd' => $iCell - 1];
+        }
+        $this->expectedColumnNumber = $iCell;
+    }
+
+    /**
+     * @throws Exception\StopImportException
+     */
+    protected function read()
+    {
+        // Retrieves the real "gap quality" of the source 'JeuQualite'
+        $jeuToJeu = new JeuToJeu($this->em, $this->sourceJeuQualite, $this->sourceJeuQualite);
+        $srcGapQuality = $jeuToJeu->codeToCode(static::GAP_QUALITY);
+
+        // Computes correct expected line size
+        //        $expectedSize = $this->dateNumber + ($this->hasMinMax ? 4 : 2) * $this->expectedChroniques;;
+
+        $numLine = $this->headerSize + 1;
+
+        while (($line = fgets($this->file)) !== false) {
+            $this->processMeasureLine($line, $numLine, $srcGapQuality, $jeuToJeu);
+            ++$numLine;
+        }
+    }
+
+    /**
+     * @param $line
+     * @param $numLine
+     * @param $srcGapQuality
+     * @param $jeuToJeu
+     *
+     * @throws Exception\StopImportException
+     */
+    protected function processMeasureLine($line, $numLine, $srcGapQuality, $jeuToJeu)
+    {
+        $commentPos = \strpos($line, self::COMMENT);
+        $trimmedLine = trim($commentPos === false ? $line : substr($line, 0, $commentPos));
+        if (strlen($trimmedLine) === 0) {
+            return;
+        }
+
+        $lineData = explode(';', $trimmedLine);
+        if (($found = count($lineData)) !== $this->expectedColumnNumber) {
+            $this->errors->badLineSize($numLine, $found, $this->expectedColumnNumber);
+            throw new Exception\StopImportException();
+        }
+
+        for ($i = 0; $i < $this->expectedChroniques; ++$i) {
+            $this->processChroniqueInLine($lineData, $i, $srcGapQuality, $numLine, $jeuToJeu);
+        }
+    }
+
+    /**
+     * @param $lineData
+     * @param $iChronique
+     * @param $srcGapQuality
+     * @param $numLine
+     * @param $jeuToJeu
+     */
+    protected function processChroniqueInLine($lineData, $iChronique, $srcGapQuality, $numLine, $jeuToJeu)
+    {
+        $date = trim($lineData[0]);
+        $colInfo = $this->columnInfoPerChronique[$iChronique];
+        $colIndex = $colInfo['iStart'];
+        $value = trim($lineData[$colIndex++]);
+        $quality = trim($lineData[$colIndex++]);
+        $min = $colInfo['hasMin'] ? trim($lineData[$colIndex++]) : null;
+        $max = $colInfo['hasMax'] ? trim($lineData[$colIndex]) : null;
+
+        if (($quality === $srcGapQuality) && ($value === static::GAP_VALUE)) {
+            $value = null;
+        } elseif ($quality === $srcGapQuality) {
+            $this->errors->incoherentGap($numLine, $date, $value, $quality);
+        }
+        $isGapType = $jeuToJeu->isGapType($quality);
+        if ($isGapType) {//larger scope than just $srcGapQuality ; cans include other qualities as well.
+            $value = null;
+        }
+
+        $this->processMesure($iChronique, $date, $value, $quality, $min, $max, $numLine);
+    }
+
+    /**
+     * Treatments to do when serializing.
+     */
+    public function __sleep()
+    {
+        $attributesToSerialize = parent::__sleep();
+        foreach ([
+            'hasMinMax',
+            'expectedColumnNumber',
+            'columnInfoPerChronique',
+        ] as $attr) {
+            $attributesToSerialize[] = $attr;
+        }
+
+        return $attributesToSerialize;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/BdohPlageImporter.php b/src/Irstea/BdohAdminBundle/Importer/Measure/BdohPlageImporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3df4a3f1df2c57004e40ef36adee7e277c7485e
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/BdohPlageImporter.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+/**
+ * Standard BDOH Importer for ChroniqueDiscontinue.
+ */
+class BdohPlageImporter extends BdohImporter
+{
+    /**
+     * @var string
+     */
+    protected $typeOfMeasure = 'Plage';
+
+    /**
+     * @var int
+     */
+    protected $dateNumber = 2;
+
+    /**
+     * @param $headerLineData
+     *
+     * @throws Exception\StopImportException
+     */
+    protected function process3rdLine($headerLineData)
+    {
+        $trimmedData = [];
+        foreach ($headerLineData as $hld) {
+            $trimmedData[] = trim(strtolower($hld));
+        }
+        $nHeaderData = \count($trimmedData);
+        if ($nHeaderData < 3 || $trimmedData[0] !== 'debut' || $trimmedData[1] !== 'fin') {
+            $this->errors->badHeaderSyntax();
+            throw new Exception\StopImportException();
+        }
+
+        $this->processRestOf3rdLine($trimmedData, $nHeaderData);
+    }
+
+    /**
+     * @param $lineData
+     * @param $iChronique
+     * @param $srcGapQuality
+     * @param $numLine
+     * @param $jeuToJeu
+     */
+    protected function processChroniqueInLine($lineData, $iChronique, $srcGapQuality, $numLine, $jeuToJeu)
+    {
+        $debut = trim($lineData[0]);
+        $fin = trim($lineData[1]);
+        $colInfo = $this->columnInfoPerChronique[$iChronique];
+        $colIndex = $colInfo['iStart'];
+        $value = trim($lineData[$colIndex++]);
+        $quality = trim($lineData[$colIndex++]);
+        $min = $colInfo['hasMin'] ? trim($lineData[$colIndex++]) : null;
+        $max = $colInfo['hasMax'] ? trim($lineData[$colIndex]) : null;
+
+        if (($quality === $srcGapQuality) && ($value === static::GAP_VALUE)) {
+            $value = null;
+        } elseif ($quality === $srcGapQuality) {
+            $this->errors->incoherentGap($numLine, $debut, $value, $quality);
+        }
+        $isGapType = $jeuToJeu->isGapType($quality);
+        if ($isGapType) {//larger scope than just $srcGapQuality ; cans include other qualities as well.
+            $value = null;
+        }
+
+        $this->processPlage($iChronique, $debut, $fin, $value, $quality, $min, $max, $numLine);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/Exception/StopImportException.php b/src/Irstea/BdohAdminBundle/Importer/Measure/Exception/StopImportException.php
new file mode 100644
index 0000000000000000000000000000000000000000..33adec41ce1ec1d7d5d325c2bd14daec8606db98
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/Exception/StopImportException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure\Exception;
+
+class StopImportException extends \Exception
+{
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/Importer.php b/src/Irstea/BdohAdminBundle/Importer/Measure/Importer.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac52d9f3c263939d3083a16530274de08ae1f739
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/Importer.php
@@ -0,0 +1,1029 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohAdminBundle\Importer\Measure\Exception\StopImportException;
+use Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer;
+use Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Repository\MesureRepositoryInterface;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\EventListener\MeasuresUpdateEvent;
+use Irstea\BdohDataBundle\Events;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+abstract class Importer implements ImporterInterface
+{
+    const MAX_ERRORS_IN_LOAD_DATA = 10;
+
+    /***************************************************************************
+     * Some dependencies of this class, and their getter
+     **************************************************************************/
+
+    /**
+     * @var EntityManagerInterface
+     */
+    protected $em;
+
+    /**
+     * @var TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * @var string
+     */
+    public $format;
+
+    /**
+     * Errors manager.
+     *
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+
+    /**
+     * Manager of 'qualites' translation.
+     *
+     * @var JeuToJeu
+     */
+    protected $jeuTojeu;
+
+    /***************************************************************************
+     * Some format specific attributes, and their getter.
+     * Each attribute could be or should be (if no default value) set in the specific importers.
+     **************************************************************************/
+
+    /**
+     * Number of header lines.
+     *
+     * @var int
+     */
+    protected $headerSize = 1;
+
+    /**
+     * Type of measure : 'Mesure' or 'Plage'.
+     *
+     * @var string
+     */
+    protected $typeOfMeasure = 'Mesure';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChroniqueType()
+    {
+        if ('Plage' === $this->typeOfMeasure) {
+            return 'Discontinue';
+        }
+
+        return 'Continue';
+    }
+
+    /**
+     * Number of 'chroniques' expected for import : default = an infinity.
+     *
+     * @var int
+     */
+    protected $expectedChroniques = PHP_INT_MAX;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getExpectedChroniques()
+    {
+        return $this->expectedChroniques;
+    }
+
+    /**
+     * Name of source 'JeuQualite' : null === 'JeuQualite' of current 'observatoire'.
+     *
+     * @var string
+     */
+    protected $sourceJeuQualite = null;
+
+    /***************************************************************************
+     * Some format specific methods.
+     * Each method could be or should be (if "abstract" method) set in the specific importers.
+     **************************************************************************/
+
+    /** Function allowing to validate/transform a timezone */
+    protected function validateTimezone($timezone)
+    {
+        return ToUtcDiffTransformer::bdohTimezone($timezone);
+    }
+
+    /** Function allowing to validate/transform a datetime */
+    protected function validateDateTimeMs($dateTimeMs)
+    {
+        return ToDateTimeMsTransformer::varFrenchDateTimeMs($dateTimeMs);
+    }
+
+    /** Sets metadata of import by reading the file header. */
+    protected function setMetadataFromHeader()
+    {
+        // NOTE : Implement this method if specific importer has header.
+    }
+
+    /** Reads each file data. */
+    abstract protected function read();
+
+    /***************************************************************************
+     * Attributes containing useful data for validation of import, and their getter.
+     **************************************************************************/
+
+    // The dates of the first and last measures
+    public $firstDate = null;
+
+    public $lastDate = null;
+
+    /**
+     * For each 'chronique', [first date, last date, number of measures]
+     * where 'valeur' not in [chronique->minimumValide, chronique->maximumValide].
+     * See : Irstea\BdohDataBundle\Entity\Repository\Mesure::getValuesOut().
+     */
+    protected $valeurTooSmall = [];
+
+    protected $valeurTooLarge = [];
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getValeurTooSmall($chroniqueId)
+    {
+        return array_key_exists($chroniqueId, $this->valeurTooSmall) ?
+            $this->valeurTooSmall[$chroniqueId] :
+            ['count' => 0, 'first' => new \DateTime(), 'last' => new \DateTime()]; // arbitrary first and last
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getValeurTooLarge($chroniqueId)
+    {
+        return array_key_exists($chroniqueId, $this->valeurTooLarge) ?
+            $this->valeurTooLarge[$chroniqueId] :
+            ['count' => 0, 'first' => new \DateTime(), 'last' => new \DateTime()]; // arbitrary first and last
+    }
+
+    /***************************************************************************
+     * Other working attributes
+     **************************************************************************/
+
+    /**
+     * Path of file to import.
+     *
+     * @var string
+     */
+    protected $filePath;
+
+    /**
+     * Handler on file to import.
+     *
+     * @var resource
+     */
+    protected $file;
+
+    /**
+     * Path of CSV file.
+     *
+     * @var string
+     */
+    protected $csvPath;
+
+    /**
+     * Handler on CSV file.
+     *
+     * @var resource
+     */
+    protected $csv;
+
+    /**
+     * Name of the temporary SQL table.
+     *
+     * @var string
+     */
+    protected $tmpSqlTable;
+
+    /**
+     * 'Station' for import.
+     *
+     * @var Station
+     */
+    protected $station = null;
+
+    /**
+     * 'Chroniques' in which file data should be inserted.
+     * Array structure :
+     *    index === 'chronique' position in file ;
+     *    value === 'chronique' entity OR NULL if user want to skip it.
+     *
+     * @var array
+     */
+    protected $chroniques = [];
+
+    /**
+     * Timezone of file dates.
+     *
+     * @var string Format : +/-hhmm (+02:00, -10:00, -04:30, +00:30...)
+     */
+    protected $timezone = '';
+
+    protected $now;
+
+    protected $nowAsString;
+
+    /***************************************************************************
+     * Treatments / methods
+     **************************************************************************/
+
+    /**
+     * @param EntityManagerInterface $em
+     * @param TranslatorInterface    $translator
+     * @param string                 $file       Path of a readable file
+     * @param ImportErrors           $errors
+     *
+     * @throws \RuntimeException if $file isn't a real file
+     */
+    public function __construct(EntityManagerInterface $em, TranslatorInterface $translator, $file, ImportErrors $errors = null)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+        $this->filePath = $file;
+        $this->errors = (null === $errors) ? new ImportErrors() : $errors;
+
+        /* $file is really a file  ? */
+        if (false === is_file($file)) {
+            throw new \RuntimeException(
+                $this->translator->trans(
+                    'Errors.notFile(%file%)',
+                    ['%file%' => $file]
+                )
+            );
+        }
+
+        $this->now = new \DateTime();
+        $this->nowAsString = $this->now->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * Loads metadata from file header.
+     */
+    final public function loadHeader()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'measure.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Opens the file
+            if (!$this->file = fopen($this->filePath, 'rb')) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            $this->setMetadataFromHeader();
+
+            fclose($this->file);
+            $this->file = null;
+        } catch (\Exception $e) {
+            if (false === ($e instanceof Exception\StopImportException)) {
+                $this->errors->addError($e->getMessage());
+            }
+            $this->clean();
+        }
+    }
+
+    /**
+     * Loads file data.
+     */
+    final public function loadData()
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'measure.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Prepares the manager of 'qualites' translation
+            $this->jeuTojeu = new JeuToJeu($this->em, $this->sourceJeuQualite, null);
+
+            // Opens the file
+            if (!$this->file = fopen($this->filePath, 'rt')) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantRead(%file%)',
+                        ['%file%' => $this->filePath]
+                    )
+                );
+            }
+
+            // Creates a temporary CSV file
+            $this->csvPath = tempnam('/tmp', 'import_');
+
+            if (!$this->csv = fopen($this->csvPath, 'wt')) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.cantCreate(%file%)',
+                        ['%file%' => $this->csvPath]
+                    )
+                );
+            }
+            if (false === chmod($this->csvPath, 0755)) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'Error.file.chmodFailed(%file%,%mode%)',
+                        ['%file%' => $this->csvPath, '%mode%' => '0755']
+                    )
+                );
+            }
+
+            // Skips the file header
+            for ($i = 0; $i < $this->headerSize;
+                ++$i) {
+                fgets($this->file);
+            }
+
+            // Reads each line of the file, and writes the CSV file
+            $this->read();
+
+            if ($this->errors->isClean()) {
+                // Gets the correct measures repository
+                /** @var MesureRepositoryInterface $measureRepo */
+                $measureRepo = $this->getBdohRepo($this->typeOfMeasure);
+
+                // Creates a temporary SQL table
+                $this->tmpSqlTable = $measureRepo->createTemporaryTable();
+
+                // And inserts measures in it (from the CSV file)
+                $measureRepo->copyIntoTemporaryTable($this->tmpSqlTable, $this->csvPath);
+
+                // Detects date redundancies
+                if ([] !== $redundancies = $measureRepo->detectDateRedundancies($this->tmpSqlTable)) {
+                    // If there are some, creates corresponding errors
+                    foreach ($redundancies as $numSet => $redunByChronique) {
+                        foreach ($redunByChronique as $date => $redundancy) {
+                            $this->errors->dateRedundancy(
+                                $this->chroniques[$numSet]->getCode(),
+                                $date,
+                                $redundancy['count'],
+                                $redundancy['numLines']
+                            );
+                        }
+                    }
+                    throw new Exception\StopImportException();
+                }
+
+                // Detects overlaps
+                if ([] !== $overlaps = $measureRepo->detectRangeOverlaps($this->tmpSqlTable)) {
+                    // If there are some, creates corresponding errors
+                    foreach ($overlaps as $numSet => $overlapByChronique) {
+                        foreach ($overlapByChronique as $overlap) {
+                            $this->errors->rangeOverlap(
+                                $this->chroniques[$numSet]->getCode(),
+                                $overlap['plages'],
+                                $overlap['numLines']
+                            );
+                        }
+                    }
+                    throw new Exception\StopImportException();
+                }
+
+                // Adjusts the SQL table dates depending on timezone
+                $tmpTz = $this->timezone;
+                $tmpTz[0] = $tmpTz[0] === '+' ? '-' : '+';
+                $measureRepo->adjustDates($tmpTz, $this->tmpSqlTable);
+
+                // Gets the first and last dates from the SQL table
+                list($this->firstDate, $this->lastDate) =
+                    $measureRepo->getTemporaryFirstLastDates($this->tmpSqlTable);
+
+                $gapQuality = $this->jeuTojeu->codeToId('gap');
+
+                /*
+                 * By 'chronique', gets [first date, last date, number of measures] where
+                 * 'valeur' not in [chronique->minimumValide, chronique->maximumValide].
+                 */
+                $this->valeurTooSmall = $measureRepo->getValuesOut($this->tmpSqlTable, 'tooSmall', $gapQuality);
+                $this->valeurTooLarge = $measureRepo->getValuesOut($this->tmpSqlTable, 'tooLarge', $gapQuality);
+            }
+
+            fclose($this->file);
+            $this->file = null;
+            fclose($this->csv);
+            $this->csv = null;
+        } catch (StopImportException $e) {
+            $this->clean();
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+            $this->clean();
+        }
+    }
+
+    /**
+     * @var bool
+     */
+    private $propagate = true;
+
+    /** Set propagate.
+     * @param bool $propagate
+     */
+    public function setPropagate($propagate)
+    {
+        $this->propagate = (bool) $propagate;
+    }
+
+    /**
+     * Proceeds to the final measures import, depending on an array whose structure is :
+     *    => Key   == 'chronique' id.
+     *    => Value == how the measures must be imported :
+     *       -> 'doNotImport'       == do not import measures for this 'chronique'.
+     *       -> 'keepExisting'      == import only measures which doesn't overlap the existing.
+     *       -> 'overwriteExisting' == delete existing measures overlapped by the new ones, and import all.
+     * Computes, in background, the filling rates of each 'ChroniqueContinue' (depending on first and last dates).
+     * For that, runs a UNIX command using "at" !
+     *
+     * @param mixed                    $importTypes
+     * @param Utilisateur              $user
+     * @param EventDispatcherInterface $dispatcher
+     *
+     * @return array
+     */
+    final public function importData($importTypes, $user, EventDispatcherInterface $dispatcher)
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'measure.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+
+            // Gets the entity of each 'chronique'
+            $chroniques = [];
+            foreach ($this->chroniques as $chronique) {
+                if (null !== $chronique) {
+                    $chroniques[$chronique->getId()] = $chronique;
+                }
+            }
+
+            // Gets the correct measures repository
+            /** @var MesureRepositoryInterface $measureRepo */
+            $measureRepo = $this->getBdohRepo($this->typeOfMeasure);
+
+            // Some stats : for each 'chronique', number of INSERT and DELETE.
+            $numInsertDelete = [];
+
+            // For each 'chronique' and depending on its "import type", imports its measures
+            foreach ($importTypes as $chroniqueId => $importType) {
+                if (false === array_key_exists($chroniqueId, $chroniques)) {
+                    continue;
+                }
+
+                $delete = 0;
+                $insert = 0;
+                $effectiveBeginDate = $this->firstDate;
+                $effectiveEndDate = $this->lastDate;
+
+                if ('keepExisting' === $importType) {
+                    // Dates of first and last existing measures (for Historique purpose)
+                    list($firstExistingDate, $lastExistingDate) = $measureRepo->getFirstLastDates($chroniqueId);
+
+                    $insert = $measureRepo->keepExistingImport($this->tmpSqlTable, $chroniqueId);
+
+                    if ($firstExistingDate && $lastExistingDate) {
+                        if (($this->lastDate < $firstExistingDate || $this->firstDate > $lastExistingDate) ||
+                            ($this->firstDate < $firstExistingDate && $this->lastDate > $lastExistingDate)) {
+                            //entirely before or after, or both before and after : no change
+                        } elseif ($this->firstDate >= $firstExistingDate && $this->lastDate <= $lastExistingDate) {
+                            //entirely in : we do not import anything
+                            $effectiveBeginDate = null;
+                            $effectiveEndDate = null;
+                        } else { //two cases : we cross the begin or the end of existing measures
+                            if ($this->firstDate < $firstExistingDate) {
+                                //we are crossig the begin
+                                $effectiveEndDate = $firstExistingDate;
+                            } elseif ($this->lastDate > $lastExistingDate) {
+                                //we cross the end
+                                $effectiveBeginDate = $lastExistingDate;
+                            }
+                        }
+                    }
+                } elseif ('overwriteExisting' === $importType) {
+                    list($delete, $insert) = $measureRepo->overwriteExistingImport(
+                        $this->tmpSqlTable,
+                        $chroniqueId,
+                        $this->firstDate,
+                        $this->lastDate
+                    );
+                }
+
+                $numInsertDelete[(string) $chroniques[$chroniqueId]] = [
+                    'entity'    => $chroniques[$chroniqueId],
+                    'delete'    => $delete,
+                    'insert'    => $insert,
+                    'beginDate' => $effectiveBeginDate,
+                    'endDate'   => $effectiveEndDate,
+                ];
+
+                if ($chroniques[$chroniqueId] && $delete + $insert > 0) {
+                    $event = new MeasuresUpdateEvent(
+                        $chroniques[$chroniqueId],
+                        $user,
+                        null,
+                        null,
+                        $this->propagate
+                    );
+                    $dispatcher->dispatch(Events::MEASURES_UPDATE, $event);
+                }
+            }
+
+            // Measures import is now finished ! So, cleans the importer.
+            $this->clean();
+
+            return $numInsertDelete;
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+            $this->clean();
+        }
+    }
+
+    /**
+     * If validation/transformation of given timezone by the validateTimezone() function is OK :
+     *      => sets "timezone" attribute with the transformed/validated timezone.
+     * Else => sets an error.
+     *
+     * @param string $timezone
+     */
+    final public function setTimezone($timezone)
+    {
+        if ($tmpTz = $this->validateTimezone($timezone)) {
+            $this->timezone = $tmpTz;
+        } else {
+            $this->errors->invalidTimezone($timezone);
+        }
+    }
+
+    /**
+     * Gets the timezone.
+     *
+     * @return string
+     */
+    final public function getTimezone()
+    {
+        return $this->timezone;
+    }
+
+    /**
+     * Sets the 'station' for import.
+     * If 'station' not found by a code => sets an error.
+     *
+     * @param Station|string|null $station may be an instance of 'Station', a code of 'station' or null
+     */
+    final public function setStation($station)
+    {
+        if (is_string($station)) {
+            try {
+                $station = $this->getBdohRepo('Station')->findOneByCode($station);
+            } catch (\Doctrine\ORM\ORMException $e) {
+                $this->errors->badStation($station);
+                $station = null;
+            }
+        } elseif (false === ($station instanceof Station)) {
+            $station = null;
+        }
+        $this->station = $station;
+    }
+
+    /**
+     * Gets the 'station' for import.
+     *
+     * @return Station
+     */
+    final public function getStation()
+    {
+        return $this->station;
+    }
+
+    /**
+     * Sets the n-th 'chronique'.
+     * If 'chronique' not found by a 'station' and a code => sets an error.
+     * If 'chronique' is already used/set for import      => sets an error.
+     * Note : at this point, a 'station' should be defined.
+     *
+     * @param Chronique|string|null $chronique may be an instance of 'Chronique', a code of 'chronique' or null
+     * @param int                   $n         Position of 'chronique' to set, in range [0 ; expectedChroniques-1]
+     * @param mixed|null            $unite
+     */
+    final public function setChronique($chronique, $n, $unite = null)
+    {
+        // $n must be in range [0 ; expectedChroniques-1]. Corrects it if necessary.
+        $n = min($this->expectedChroniques - 1, max(0, $n));
+
+        if (is_string($chronique)) {
+            try {
+                $chronique = $this->getChroniqueRepo()->findOneByStationAndCode($this->station, $chronique);
+                if ($chronique && $chronique->isConvertie()) {
+                    $this->errors->noImportOnConverted($chronique);
+                    $chronique = null;
+                }
+            } catch (\Doctrine\ORM\ORMException $e) {
+                $func = 'badChronique' . $this->getChroniqueType();
+                $this->errors->$func($chronique, $this->station);
+                $chronique = null;
+            }
+        } elseif (false === ($chronique instanceof Chronique)) {
+            $func = 'badChronique' . $this->getChroniqueType();
+            $this->errors->$func($chronique, $this->station);
+            $chronique = null;
+        } elseif ($chronique->isConvertie()) {
+            $this->errors->noImportOnConverted($chronique);
+            $chronique = null;
+        }
+
+        // Already set / used ? If yes => sets and errors.
+        if (null !== $chronique) {
+            foreach ($this->chroniques as $numSet => $existingChronique) {
+                if ($n !== $numSet && null !== $existingChronique &&
+                    $existingChronique->getId() === $chronique->getId()) {
+                    $this->errors->chroniqueAlreadyExists($chronique);
+                    break;
+                }
+            }
+
+            //check if correct unit
+            if ($unite !== null) {
+                if ($chronique->getUnite()->getLibelle() !== $unite) {
+                    $this->errors->badUniteForThisChronique($chronique, $unite);
+                }
+            }
+            $this->chroniques[$n] = $chronique;
+        }
+    }
+
+    /**
+     * Gets all 'chroniques'.
+     *
+     * @return array
+     */
+    final public function getChroniques()
+    {
+        return $this->chroniques;
+    }
+
+    /**
+     * Determines if some 'chroniques' have been added.
+     *
+     * @return bool
+     */
+    final public function hasChroniques()
+    {
+        return (false === empty($this->chroniques)) &&
+            ([null] !== array_unique($this->chroniques));
+    }
+
+    /**
+     * Determines if the n-th 'chronique' has been selected by user.
+     *
+     * @param int $n
+     *
+     * @return bool
+     */
+    final public function isSelectedChronique($n)
+    {
+        return isset($this->chroniques[$n]);
+    }
+
+    /**
+     * Generic actions for processMesure() and processPlage() :
+     *  1) Checks that 'valeur', 'minimum' and 'maximum' are numeric.
+     *  2) Checks that 'qualite' exists in source 'JeuQualite'.
+     *  3) Checks that 'qualite' has a translation in 'JeuQualite' of current 'observatoire'...
+     *  4) and retrieves this translation.
+     *  5) Checks that if 'qualite' is neither a gap or invalid, then 'valeur' exists.
+     *
+     * @param mixed $numSet
+     * @param mixed $date
+     * @param mixed $minimum
+     * @param mixed $maximum
+     * @param mixed $numLine
+     * @param mixed $valeur
+     * @param mixed $qualite
+     */
+    private function processGeneric($numSet, $date, &$valeur, &$qualite, $minimum, $maximum, $numLine)
+    {
+        //Checks that 'valeur', 'minimum' and 'maximum' are numeric
+        if ($valeur !== null && $valeur !== '' && !\is_numeric($valeur)) {
+            $this->errors->valeurNotNumeric($numLine, $date, $valeur);
+        }
+        if ($minimum && (false === is_numeric($minimum))) {
+            $this->errors->minimumNotNumeric($numLine, $date, $valeur, $minimum);
+        }
+        if ($maximum && (false === is_numeric($maximum))) {
+            $this->errors->maximumNotNumeric($numLine, $date, $valeur, $maximum);
+        }
+
+        //changes $valeur if quality is gap type
+        if ($this->jeuTojeu->isGapType($qualite)) {
+            $valeur = null;
+        } // If $qualite is neither 'gap' nor 'invalid', then check that value exists
+        elseif ($valeur === null || $valeur === '') {
+            $this->errors->validButNoValue($numLine, $date, $qualite);
+        }
+
+        // Checks that $qualite exists in source 'JeuQualite'.
+        if (false === $this->jeuTojeu->isInSource($qualite)) {
+            $this->errors->notInSourceJeu($numLine, $date, $valeur, $qualite);
+        } elseif (!$this->chroniques[$numSet]->getAllowValueLimits() && $this->jeuTojeu->isLimitType($qualite)) {
+            $this->errors->forbiddenValueLimit($numLine, $date, $valeur, $qualite);
+        } // Replaces $qualite by its translation id. Stores an error if none !
+        elseif (null === ($idTrans = $this->jeuTojeu->codeToId($qualite))) {
+            $this->errors->noTransInObservatoireJeu($numLine, $date, $valeur, $qualite);
+        } else {
+            $qualite = $idTrans;
+        }
+
+        // If too many errors => stops the measures import process !
+        if ($this->errors->count > static::MAX_ERRORS_IN_LOAD_DATA) {
+            $this->errors->tooManyErrors();
+            throw new Exception\StopImportException();
+        }
+    }
+
+    /**
+     * Process of a 'Mesure' :
+     *  1) Do nothing if associated 'chronique' hasn't been selected by user.
+     *  2) Validates/transforms 'date' with the validateDateTimeMs() function...
+     *  3) and checks the result.
+     *  4) Do generic checks and treatments.
+     *  5) Writes 'Mesure' in CSV file.
+     *  /!\ Are realized at the end of loadData(), directly in the temporary SQL table :
+     *      => detection of date redundancies ;
+     *      => transformation of date in UTC ;
+     *      => computing of first and last dates ;
+     *      => check that 'valeur' is between "chronique->minimumValide" and "chronique->maximumValide" (included).
+     *
+     * @param mixed $numSet
+     * @param mixed $date
+     * @param mixed $valeur
+     * @param mixed $qualite
+     * @param mixed $minimum
+     * @param mixed $maximum
+     * @param mixed $numLine
+     */
+    final protected function processMesure($numSet, $date, $valeur, $qualite, $minimum, $maximum, $numLine)
+    {
+        if (false === $this->isSelectedChronique($numSet)) {
+            return;
+        }
+
+        // Validates/transforms 'date' with the validateDateTimeMs() function, and checks the result
+        if (false === ($tmpDate = $this->validateDateTimeMs($date))) {
+            $this->errors->dateInvalidFormat($numLine, $date, $valeur);
+        } elseif ($tmpDate > $this->nowAsString) {
+            $this->errors->dateAfterNow($numLine, $date, $valeur);
+        } else {
+            $date = $tmpDate;
+        }
+
+        $this->processGeneric($numSet, $date, $valeur, $qualite, $minimum, $maximum, $numLine);
+
+        // Writes 'Mesure' in CSV file
+        $fields = [
+            $numLine,
+            $numSet,
+            $this->chroniques[$numSet]->getId(),
+            $qualite,
+            $date,
+            is_numeric($valeur) ? $valeur : '\\N',
+            is_numeric($minimum) ? $minimum : '\\N',
+            is_numeric($maximum) ? $maximum : '\\N',
+        ];
+        fputcsv($this->csv, $fields, ';');
+    }
+
+    /**
+     * Process of a 'Plage' : same chekcs and treatments as in processMesure().
+     *
+     * @param mixed $numSet
+     * @param mixed $debut
+     * @param mixed $fin
+     * @param mixed $valeur
+     * @param mixed $qualite
+     * @param mixed $minimum
+     * @param mixed $maximum
+     * @param mixed $numLine
+     */
+    final protected function processPlage($numSet, $debut, $fin, $valeur, $qualite, $minimum, $maximum, $numLine)
+    {
+        if (false === $this->isSelectedChronique($numSet)) {
+            return;
+        }
+
+        // Validates/transforms 'debut' with the validateDateTimeMs() function, and checks the result
+        if (false === ($tmpDate = $this->validateDateTimeMs($debut))) {
+            $this->errors->dateInvalidFormat($numLine, $debut, $valeur);
+        } elseif ($tmpDate > $this->nowAsString) {
+            $this->errors->dateAfterNow($numLine, $debut, $valeur);
+        } else {
+            $debut = $tmpDate;
+        }
+
+        // Validates/transforms 'fin' with the validateDateTimeMs() function, and checks the result
+        if (false === ($tmpDate = $this->validateDateTimeMs($fin))) {
+            $this->errors->dateInvalidFormat($numLine, $fin, $valeur);
+        } elseif ($tmpDate > $this->nowAsString) {
+            $this->errors->dateAfterNow($numLine, $fin, $valeur);
+        } else {
+            $fin = $tmpDate;
+        }
+
+        // Testing of 'debut' and 'fin' coherence
+        if ($fin < $debut) {
+            $this->errors->incoherentDates($numLine, $valeur);
+        }
+
+        $this->processGeneric($numSet, $debut, $valeur, $qualite, $minimum, $maximum, $numLine);
+
+        // Writes 'Plage' in CSV file
+        $fields = [
+            $numLine,
+            $numSet,
+            $this->chroniques[$numSet]->getId(),
+            $qualite,
+            $debut,
+            $fin,
+            is_numeric($valeur) ? $valeur : '\\N',
+            is_numeric($minimum) ? $minimum : '\\N',
+            is_numeric($maximum) ? $maximum : '\\N',
+        ];
+        fputcsv($this->csv, $fields, ';');
+    }
+
+    /**
+     * Treatments to do when serializing.
+     */
+    public function __sleep()
+    {
+        /* Inlines 'chroniques' and 'station' */
+        foreach ($this->chroniques as $key => $chronique) {
+            if ($chronique instanceof Chronique) {
+                $this->chroniques[$key] = $chronique->getId();
+            }
+        }
+        if ($this->station instanceof Station) {
+            $this->station = $this->station->getId();
+        }
+
+        /* Attributes to serialize */
+        return [
+            'errors',
+            'jeuTojeu',
+            'expectedChroniques',
+            'headerSize',
+            'filePath',
+            'csvPath',
+            'tmpSqlTable',
+            'station',
+            'chroniques',
+            'timezone',
+            'firstDate',
+            'lastDate',
+            'valeurTooSmall',
+            'valeurTooLarge',
+            'format',
+            'now',
+            'nowAsString',
+        ];
+    }
+
+    /**
+     * Treatments to do when unserializing.
+     * NOTE : run manually this function !
+     *
+     * @param EntityManagerInterface $em
+     * @param TranslatorInterface    $translator
+     */
+    public function wakeup(EntityManagerInterface $em, TranslatorInterface $translator)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+
+        /* Gets 'chroniques' and 'station' entities */
+        foreach ($this->chroniques as $key => $chronique) {
+            if ($chronique) {
+                $this->chroniques[$key] = $this->getChroniqueRepo()->find($chronique);
+            }
+        }
+        if ($this->station) {
+            $this->station = $this->getBdohRepo('Station')->find($this->station);
+        }
+    }
+
+    /**
+     * Cleans the importer.
+     */
+    final public function clean()
+    {
+        // Closes file handlers
+        if ($this->file) {
+            @fclose($this->file);
+            $this->file = null;
+        }
+        if ($this->csv) {
+            @fclose($this->csv);
+            $this->csv = null;
+        }
+
+        // Deletes imported file and CSV file
+        if ($this->csvPath) {
+            @unlink($this->csvPath);
+            $this->csvPath = null;
+        }
+
+        if ($this->filePath) {
+            @unlink($this->filePath);
+            $this->filePath = null;
+        }
+
+        // Deletes temporary SQL table
+        if ($this->tmpSqlTable) {
+            $this->getBdohRepo($this->typeOfMeasure)->dropTemporaryTable($this->tmpSqlTable);
+        }
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     */
+    protected function getRepository($entity)
+    {
+        return $this->em->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     */
+    protected function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    /**
+     * Returns the good 'chronique' repository, depending on $typeOfMeasure.
+     */
+    public function getChroniqueRepo()
+    {
+        return $this->getBdohRepo('Chronique' . $this->getChroniqueType());
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/ImporterInterface.php b/src/Irstea/BdohAdminBundle/Importer/Measure/ImporterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..5284fc0d649abe899328616ae57a6bf3db6139ec
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/ImporterInterface.php
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueDiscontinueRepository;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * ImporterInterface is the interface implemented by all "Measure Importer" classes.
+ */
+interface ImporterInterface
+{
+    /**
+     * @return ImportErrors
+     */
+    public function getErrors();
+
+    /**
+     * @return string
+     */
+    public function getChroniqueType();
+
+    /**
+     * @return int
+     */
+    public function getExpectedChroniques();
+
+    /**
+     * @param $chroniqueId
+     *
+     * @return array
+     */
+    public function getValeurTooSmall($chroniqueId);
+
+    /**
+     * @param $chroniqueId
+     *
+     * @return array
+     */
+    public function getValeurTooLarge($chroniqueId);
+
+    /**
+     * Loads metadata from file header.
+     */
+    public function loadHeader();
+
+    /**
+     * Loads file data.
+     */
+    public function loadData();
+
+    /**
+     * Proceeds to the final measures import, depending on an array whose structure is :
+     *    => Key   == 'chronique' id.
+     *    => Value == how the measures must be imported :
+     *       -> 'doNotImport'       == do not import measures for this 'chronique'.
+     *       -> 'keepExisting'      == import only measures which doesn't overlap the existing.
+     *       -> 'overwriteExisting' == delete existing measures overlapped by the new ones, and import all.
+     * Computes, in background, the filling rates of each 'ChroniqueContinue' (depending on first and last dates).
+     * For that, runs a UNIX command using "at" !
+     *
+     * @param mixed                    $importTypes
+     * @param Utilisateur              $user
+     * @param EventDispatcherInterface $dispatcher
+     */
+    public function importData($importTypes, $user, EventDispatcherInterface $dispatcher);
+
+    /**
+     * If validation/transformation of given timezone by the validateTimezone() function is OK :
+     *      => sets "timezone" attribute with the transformed/validated timezone.
+     * Else => sets an error.
+     *
+     * @param string $timezone
+     */
+    public function setTimezone($timezone);
+
+    /**
+     * Gets the timezone.
+     *
+     * @return string
+     */
+    public function getTimezone();
+
+    /**
+     * Sets the 'station' for import.
+     * If 'station' not found by a code => sets an error.
+     *
+     * @param Station|string|null $station may be an instance of 'Station', a code of 'station' or null
+     */
+    public function setStation($station);
+
+    /**
+     * Gets the 'station' for import.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Station
+     */
+    public function getStation();
+
+    /**
+     * Sets the n-th 'chronique'.
+     * If 'chronique' not found by a 'station' and a code => sets an error.
+     * If 'chronique' is already used/set for import      => sets an error.
+     * Note : at this point, a 'station' should be defined.
+     *
+     * @param Chronique|string|null $chronique may be an instance of 'Chronique', a code of 'chronique' or null
+     * @param int                   $n         Position of 'chronique' to set, in range [0 ; expectedChroniques-1]
+     * @param mixed|null            $unite
+     */
+    public function setChronique($chronique, $n, $unite = null);
+
+    /**
+     * Gets all 'chroniques'.
+     *
+     * @return array
+     */
+    public function getChroniques();
+
+    /**
+     * Determines if some 'chroniques' have been added.
+     *
+     * @return bool
+     */
+    public function hasChroniques();
+
+    /**
+     * Determines if the n-th 'chronique' has been selected by user.
+     *
+     * @param int $n
+     *
+     * @return bool
+     */
+    public function isSelectedChronique($n);
+
+    /**
+     * Treatments to do when unserializing.
+     * NOTE : run manually this function !
+     *
+     * @param EntityManagerInterface $em
+     * @param TranslatorInterface    $translator
+     */
+    public function wakeup(EntityManagerInterface $em, TranslatorInterface $translator);
+
+    /**
+     * Cleans the importer.
+     */
+    public function clean();
+
+    /**
+     * Returns the good 'chronique' repository, depending on $typeOfMeasure.
+     *
+     * @return ChroniqueContinueRepository|ChroniqueDiscontinueRepository
+     */
+    public function getChroniqueRepo();
+
+    /**
+     * @param bool $propagate
+     */
+    public function setPropagate($propagate);
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/QjoImporter.php b/src/Irstea/BdohAdminBundle/Importer/Measure/QjoImporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b7e65ea059b88bd99a924dc36d2cdcee71b1491
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/QjoImporter.php
@@ -0,0 +1,193 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+/**
+ * https://forge.cemagref.fr/projects/bdoh/wiki/Formats_de_fichier_Import_du_stock#Débit journalier : QJ0 (banque HYDRO2).
+ */
+class QjoImporter extends Importer implements ImporterInterface
+{
+    const GAP_QUALITY = 'gap';
+
+    /**
+     * List of Hydro2 line headers.
+     * The lines beginning with those should be ignored but not trigger any Exception.
+     */
+    protected $correctBegins = [
+        'FTX',
+        '919',
+        '922',
+        'QME',
+        'QMM',
+        'CTH',
+        'COR',
+        'CQT',
+        'EVT',
+        'HMM',
+        'JGG',
+        'LOH',
+        'MJG',
+        'PAT',
+        'PIV',
+        'PST',
+        'SHY',
+        'TAR',
+        'ZCH',
+        'DEC',
+        'EMT',
+        'DES',
+        'DEB',
+        '950',
+    ];
+
+    /**
+     * We keep date of previous line for gap detection purpose.
+     */
+    protected $previousDate = null;
+
+    /**
+     * @var int
+     */
+    protected $expectedChroniques = 1;
+
+    /**
+     * @var string
+     */
+    protected $sourceJeuQualite = 'Hydro2';
+
+    /**
+     * @var int
+     */
+    protected $headerSize = 0;
+
+    /**
+     * @var int
+     */
+    protected $lineSize = 7;
+
+    /**
+     * @var string
+     */
+    protected $lineBegin = 'QJO';
+
+    // Date format : YYYYMMDD
+
+    /**
+     * @param $dateTimeMs
+     *
+     * @return string
+     */
+    protected function preValidateDateTimeMs($dateTimeMs)
+    {
+        $date = trim($dateTimeMs);
+
+        return substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
+    }
+
+    // When this function is called => $dateTimeMs already formated
+
+    /**
+     * @param $dateTimeMs
+     *
+     * @return bool|string
+     */
+    protected function validateDateTimeMs($dateTimeMs)
+    {
+        return $dateTimeMs;
+    }
+
+    /**
+     * @throws Exception\StopImportException
+     */
+    protected function read()
+    {
+        $numLine = $this->headerSize + 1;
+
+        while (($data = fgetcsv($this->file, 0, ';')) !== false) {
+            $beginWord = substr(trim(strtoupper($data[0])), 0, 3);
+            if ($beginWord === 'FIN') {
+                break;
+            }
+
+            if ($beginWord !== $this->lineBegin) {
+                /*
+                 * Two different cases :
+                 *  -> the line is a correct Hydro2 line, but not the expected : we just skip it
+                 *  -> the line is something else : Exception
+                 */
+                if (in_array($beginWord, $this->correctBegins)) {
+                    ++$numLine;
+                    continue;
+                }
+                $this->errors->badLineBegin($numLine, $this->lineBegin);
+                throw new Exception\StopImportException();
+            }
+
+            if ($this->lineSize !== ($found = count($data))) {
+                $this->errors->badLineSize($numLine, $found, $this->lineSize);
+                throw new Exception\StopImportException();
+            }
+
+            $this->treatLine($data, $numLine++);
+        }
+    }
+
+    /**
+     * @param $data
+     * @param $numLine
+     */
+    protected function treatLine($data, $numLine)
+    {
+        $value = trim($data[3]);
+        $quality = trim($data[5]);
+        $date = static::preValidateDateTimeMs($data[2]);
+        $currentDateTime = new \DateTime(
+            $date,
+            new \DateTimeZone('UTC')
+        );
+
+        // Gap can be a missing line for a given date.
+        if (isset($this->previousDate)) {
+            $days = date_diff($this->previousDate, $currentDateTime)->d;
+
+            // Gap(s) if this difference is not 1
+            if ($days > 1) {
+                $tempDate = clone $this->previousDate;
+
+                // Adds $days-1 gap lines
+                for ($i = 1; $i < $days; ++$i) {
+                    $tempDateString = $tempDate->add(\DateInterval::createFromDateString('1 day'))->format('Y-m-d');
+                    $this->processMesure(0, $tempDateString, null, self::GAP_QUALITY, null, null, $numLine);
+                }
+            }
+        }
+
+        // Gap line
+        if (empty($value) || empty($quality)) {
+            $value = null;
+            $quality = static::GAP_QUALITY;
+        }
+
+        $this->processMesure(0, $date, $value, $quality, null, null, $numLine);
+        $this->previousDate = $currentDateTime;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Measure/QtvarImporter.php b/src/Irstea/BdohAdminBundle/Importer/Measure/QtvarImporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..88ff412290b9ad92cb89ba6cac8bc940d98ab078
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Measure/QtvarImporter.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Measure;
+
+/**
+ * QTVAR (banque HYDRO2) : UNTESTED, DO NOT USE.
+ */
+class QtvarImporter extends QjoImporter
+{
+    /**
+     * @var int
+     */
+    protected $headerSize = 0;
+
+    /**
+     * @var int
+     */
+    protected $lineSize = 9;
+
+    /**
+     * @var string
+     */
+    protected $lineBegin = '920';
+
+    /**
+     * @var int
+     */
+    protected $secondsToAdd = 5;
+
+    /**
+     * @param $data
+     * @param $numLine
+     */
+    protected function treatLine($data, $numLine)
+    {
+        $value = trim($data[5]);
+        $quality = trim($data[6]);
+
+        $currentDateTime = new \DateTime(
+            static::preValidateDateTimeMs($data[3]) . ' ' . trim($data[4]),
+            new \DateTimeZone('UTC')
+        );
+
+        $dateToStore = clone $currentDateTime;
+
+        //Redundancy processing
+        //NB : $this->secondsToAdd is incremented 5 by 5 in order to work with gap processing (which use 1 second delay).
+        if (isset($this->previousDate)) {
+            if ($currentDateTime == $this->previousDate) {
+                //Add an arbitrary number of seconds in order to avoid redundancy
+                $currentDateTime->add(\DateInterval::createFromDateString($this->secondsToAdd . ' seconds'));
+                $this->secondsToAdd += 5;
+            } else {
+                //Reset the number of seconds in order to restart from a low amount
+                $this->secondsToAdd = 5;
+            }
+        }
+
+        //Gap processing
+        if (trim($data[7]) !== '2') {
+            //We add two gap values, at previousDate + 1 sec and currentDate - 1 sec
+            $tempCurrentDate = clone $currentDateTime;
+            $gapDateStrings[0] = $tempCurrentDate->sub(\DateInterval::createFromDateString('1 second'))->format('Y-m-d H:i:s');
+            if (isset($this->previousDate)) {
+                $tempPreviousDate = clone $this->previousDate;
+                $gapDateStrings[1] = $tempPreviousDate->add(\DateInterval::createFromDateString('1 second'))->format('Y-m-d H:i:s');
+            }
+
+            foreach ($gapDateStrings as $gapDate) {
+                $this->processMesure(0, $gapDate, null, QjoImporter::GAP_QUALITY, null, null, $numLine);
+            }
+        }
+
+        // Gap line ; maybe inexistant in QTVAR
+        if (empty($value) || empty($quality)) {
+            $value = null;
+            $quality = QjoImporter::GAP_QUALITY;
+        }
+
+        $this->processMesure(0, $currentDateTime->format('Y-m-d H:i:s'), $value, $quality, null, null, $numLine);
+        $this->previousDate = $dateToStore;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Importer/Shapefile/Manager.php b/src/Irstea/BdohAdminBundle/Importer/Shapefile/Manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..297fe5e8a9db32694ee65ff96e8fc8521092c1d9
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Importer/Shapefile/Manager.php
@@ -0,0 +1,215 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Importer\Shapefile;
+
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityRepository;
+use Irstea\BdohAdminBundle\Errors\ImportErrors;
+use Irstea\BdohDataBundle\Entity\Repository\BassinRepository;
+use Irstea\BdohDataBundle\Entity\Repository\CoursEauRepository;
+use Irstea\BdohDataBundle\Entity\Repository\StationRepository;
+use Irstea\BdohDataBundle\Entity\Station;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class Manager
+{
+    const TMP_TABLE = 'temp.shape';
+
+    protected $em;
+
+    protected $translator;
+
+    protected $tmpTable;
+
+    protected $targettedTable;
+
+    /**
+     * Errors manager.
+     *
+     * @var ImportErrors
+     */
+    protected $errors;
+
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+
+    /**
+     * Path of file to import.
+     *
+     * @var string
+     */
+    protected $filePath;
+
+    /**
+     * Handler on file to import.
+     *
+     * @var resource
+     */
+    protected $file;
+
+    public function getTmpTable()
+    {
+        return $this->tmpTable;
+    }
+
+    public function setTmpTable($tmpTable)
+    {
+        $this->tmpTable = $tmpTable;
+    }
+
+    public function getTargettedTable()
+    {
+        return $this->targettedTable;
+    }
+
+    public function setTargettedTable($targettedTable)
+    {
+        $this->targettedTable = $targettedTable;
+    }
+
+    /**
+     * Treatments to do when serializing.
+     */
+    public function __sleep()
+    {
+        /* Attributes to serialize */
+        return [
+            'errors',
+            'filePath',
+            'tmpTable',
+            'targettedTable',
+        ];
+    }
+
+    public function __construct(EntityManager $em, TranslatorInterface $translator, $file, $table, ImportErrors $errors = null)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+        $this->filePath = $file;
+        $this->errors = (null === $errors) ? new ImportErrors() : $errors;
+        $this->targettedTable = $table;
+        $this->tmpTable = static::TMP_TABLE . rand();
+    }
+
+    public function getShpToPgsqlCommand()
+    {
+        $c = $this->em->getConnection();
+        $host = $c->getHost();
+        $port = $c->getPort();
+        $port = $port ?: '5432';
+        $database = $c->getDatabase();
+        $username = $c->getUsername();
+        $password = $c->getPassword();
+
+        $pgpassfile = $this->filePath . '_tmp_psql';
+        \file_put_contents($pgpassfile, $host . ':' . $port . ':' . $database . ':' . $username . ':' . $password);
+
+        return 'shp2pgsql -s ' . Station::SRID . ' -ciD ' . $this->filePath .
+            ' ' . $this->tmpTable . ' 1> ' . $this->filePath . '_Success.log 2> ' . $this->filePath . '_Errors.log ; ' .
+            'chmod 600 ' . $pgpassfile . ' ; env PGPASSFILE=' . $pgpassfile . " psql -h '$host' -d '$database' -U '$username' -f " .
+            $this->filePath . '_Success.log 1> ' . $this->filePath . '_Psql.log  2>&1 ; ' .
+            'rm ' . $pgpassfile . ' ; ';
+    }
+
+    final public function importData($importType, $user)
+    {
+        try {
+            // Can't continue if there are errors
+            if ($this->errors->isDirty()) {
+                throw new \RuntimeException(
+                    $this->translator->trans(
+                        'shape.import.thereAreErrors.cantContinue'
+                    )
+                );
+            }
+            /** @var BassinRepository|StationRepository|CoursEauRepository $shapeRepo */
+            $shapeRepo = $this->getBdohRepo(ucfirst($this->targettedTable));
+            if ('keepExisting' === $importType) {
+                return $shapeRepo->shapeKeepExistingImport($this->tmpTable, $user);
+            } elseif ('overwriteExisting' === $importType) {
+                return $shapeRepo->shapeOverwriteExistingImport($this->tmpTable, $user);
+            }
+
+            return [0, 0];
+        } catch (\Exception $e) {
+            $this->errors->addError($e->getMessage());
+        }
+    }
+
+    /**
+     * Cleans the importer.
+     */
+    final public function clean()
+    {
+        if ($this->filePath) {
+            array_map('unlink', glob($this->filePath . '*'));
+            $this->filePath = null;
+        }
+
+        // Deletes temporary SQL table
+        if ($this->tmpTable) {
+            /** @var \Irstea\BdohDataBundle\Entity\Repository\EntityRepository $shapeRepo */
+            $shapeRepo = $this->getBdohRepo(ucfirst($this->targettedTable));
+            $shapeRepo->dropTemporaryShapeTable($this->tmpTable);
+        }
+    }
+
+    /**
+     * Treatments to do when unserializing.
+     * NOTE : run manually this function !
+     *
+     * @param EntityManagerInterface $em
+     * @param TranslatorInterface    $translator
+     */
+    public function wakeup(EntityManagerInterface $em, TranslatorInterface $translator)
+    {
+        $this->em = $em;
+        $this->translator = $translator;
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     *
+     * @return EntityRepository
+     */
+    protected function getRepository($entity)
+    {
+        return $this->em->getRepository($entity);
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     *
+     * @return EntityRepository
+     */
+    protected function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/IrsteaBdohAdminBundle.php b/src/Irstea/BdohAdminBundle/IrsteaBdohAdminBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..6458410cb78869a8bd53ca55ff54878375caf6db
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/IrsteaBdohAdminBundle.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohAdminBundle extends Bundle
+{
+    /**
+     * Extracts the first file of a zip archive in a destination directory.
+     *
+     * @param string $zipPath
+     * @param mixed  $destDir
+     *
+     * @parap string $destDir
+     *
+     * @return string|null Extracted file path OR null if an error occurred
+     */
+    public static function unzipFirst($zipPath, $destDir = '/tmp')
+    {
+        $zip = new \ZipArchive();
+        $firstFile = null;
+
+        // Opens the zip archive
+        if (true === $zip->open($zipPath)) {
+            // Gets the first file name
+            if ($firstFile = $zip->getNameIndex(0)) {
+                // Extracts this first file
+                $firstFile = $zip->extractTo($destDir, $firstFile) ?
+                    $destDir . DIRECTORY_SEPARATOR . $firstFile :
+                    null;
+            } else {
+                $firstFile = null;
+            }
+            $zip->close();
+        }
+
+        return $firstFile;
+    }
+
+    /**
+     * Extracts the file of a zip archive in a destination directory.
+     *
+     * @param string $zipPath
+     * @param mixed  $destDir
+     *
+     * @parap string $destDir
+     *
+     * @return string|null Extracted file path OR null if an error occurred
+     */
+    public static function unzipAll($zipPath, $destDir = '/tmp')
+    {
+        $zip = new \ZipArchive();
+
+        // Opens the zip archive
+        if (true === $zip->open($zipPath)) {
+            // Extracts this first file
+            $zip->extractTo($destDir);
+            $zip->close();
+
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Manager/BaremeImportManager.php b/src/Irstea/BdohAdminBundle/Manager/BaremeImportManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..83d691a1d441141734aa82cd534339cd2cb053b0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Manager/BaremeImportManager.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Manager;
+
+use Symfony\Component\HttpFoundation\ParameterBag;
+
+class BaremeImportManager
+{
+    /**
+     * @var string
+     */
+    protected $appAbsolutePath;
+
+    /**
+     * @var string
+     */
+    protected $directory;
+
+    /**
+     * @var array
+     */
+    protected $mimeTypes;
+
+    /**
+     * @var Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $importers;
+
+    /**
+     * Constructor.
+     *
+     * @param string $appAbsolutePath
+     * @param array  $baremeImportParams See src/Irstea//BdohAdminBundle/Resources/config/services.yml
+     */
+    public function __construct($appAbsolutePath, array $baremeImportParams)
+    {
+        $this->appAbsolutePath = $appAbsolutePath;
+        $this->directory = $baremeImportParams['directory'];
+        $this->mimeTypes = $baremeImportParams['mimeTypes'];
+        $this->importers = new ParameterBag($baremeImportParams['importers']);
+    }
+
+    /**
+     * Checks that given mime type is valid for given category.
+     * If no category given, checks that it is valid for ALL categories.
+     *
+     * @param string $mime
+     * @param string $category
+     *
+     * @return bool
+     */
+    public function isValidMimeType($mime, $category = '')
+    {
+        if ($category && array_key_exists($category, $this->mimeTypes)) {
+            return in_array($mime, $this->mimeTypes[$category]);
+        }
+        foreach ($this->mimeTypes as $mimeTypes) {
+            if (in_array($mime, $mimeTypes)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns directory containing measures files to import.
+     *
+     * @return string Absolute path
+     */
+    public function getDir()
+    {
+        return $this->appAbsolutePath . DIRECTORY_SEPARATOR . $this->directory;
+    }
+
+    /**
+     * Returns sorted array of measure files to import.
+     *
+     * @return array
+     */
+    public function getFiles()
+    {
+        $files = [];
+        $all = scandir($dirname = $this->getDir());
+
+        foreach ($all as $e) {
+            $e = $dirname . $e;
+            if (is_file($e)) {
+                $files[] = $e;
+            }
+        }
+
+        return $files;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Manager/ControleImportManager.php b/src/Irstea/BdohAdminBundle/Manager/ControleImportManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..7be90f9a27f377eb0784510fa393398f657ae5fa
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Manager/ControleImportManager.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Manager;
+
+use Symfony\Component\HttpFoundation\ParameterBag;
+
+class ControleImportManager
+{
+    /**
+     * @var string
+     */
+    protected $appAbsolutePath;
+
+    /**
+     * @var string
+     */
+    protected $directory;
+
+    /**
+     * @var array
+     */
+    protected $mimeTypes;
+
+    /**
+     * @var Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $importers;
+
+    /**
+     * Constructor.
+     *
+     * @param string $appAbsolutePath
+     * @param array  $controleImportParams See src/Irstea//BdohAdminBundle/Resources/config/services.yml
+     */
+    public function __construct($appAbsolutePath, array $controleImportParams)
+    {
+        $this->appAbsolutePath = $appAbsolutePath;
+        $this->directory = $controleImportParams['directory'];
+        $this->mimeTypes = $controleImportParams['mimeTypes'];
+        $this->importers = new ParameterBag($controleImportParams['importers']);
+    }
+
+    /**
+     * Checks that given mime type is valid for given category.
+     * If no category given, checks that it is valid for ALL categories.
+     *
+     * @param string $mime
+     * @param string $category
+     *
+     * @return bool
+     */
+    public function isValidMimeType($mime, $category = '')
+    {
+        if ($category && array_key_exists($category, $this->mimeTypes)) {
+            return in_array($mime, $this->mimeTypes[$category]);
+        }
+        foreach ($this->mimeTypes as $mimeTypes) {
+            if (in_array($mime, $mimeTypes)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns directory containing measures files to import.
+     *
+     * @return string Absolute path
+     */
+    public function getDir()
+    {
+        return $this->appAbsolutePath . DIRECTORY_SEPARATOR . $this->directory;
+    }
+
+    /**
+     * Returns sorted array of measure files to import.
+     *
+     * @return array
+     */
+    public function getFiles()
+    {
+        $files = [];
+        $all = scandir($dirname = $this->getDir());
+
+        foreach ($all as $e) {
+            $e = $dirname . $e;
+            if (is_file($e)) {
+                $files[] = $e;
+            }
+        }
+
+        return $files;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Manager/MeasureImportManager.php b/src/Irstea/BdohAdminBundle/Manager/MeasureImportManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a187053a21ee6eb13287ec7ee47528423364420
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Manager/MeasureImportManager.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Manager;
+
+use Symfony\Component\HttpFoundation\ParameterBag;
+
+/**
+ * Manages the import of measures.
+ */
+class MeasureImportManager
+{
+    /**
+     * @var string
+     */
+    protected $appAbsolutePath;
+
+    /**
+     * @var string
+     */
+    protected $directory;
+
+    /**
+     * @var array
+     */
+    protected $mimeTypes;
+
+    /**
+     * @var Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $importers;
+
+    /**
+     * Constructor.
+     *
+     * @param string $appAbsolutePath
+     * @param array  $measureImportParams See src/Irstea//BdohAdminBundle/Resources/config/services.yml
+     */
+    public function __construct($appAbsolutePath, array $measureImportParams)
+    {
+        $this->appAbsolutePath = $appAbsolutePath;
+        $this->directory = $measureImportParams['directory'];
+        $this->mimeTypes = $measureImportParams['mimeTypes'];
+        $this->importers = new ParameterBag($measureImportParams['importers']);
+    }
+
+    /**
+     * Checks that given mime type is valid for given category.
+     * If no category given, checks that it is valid for ALL categories.
+     *
+     * @param string $mime
+     * @param string $category
+     *
+     * @return bool
+     */
+    public function isValidMimeType($mime, $category = '')
+    {
+        if ($category && array_key_exists($category, $this->mimeTypes)) {
+            return in_array($mime, $this->mimeTypes[$category]);
+        }
+        foreach ($this->mimeTypes as $mimeTypes) {
+            if (in_array($mime, $mimeTypes)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns directory containing measures files to import.
+     *
+     * @return string Absolute path
+     */
+    public function getDir()
+    {
+        return $this->appAbsolutePath . DIRECTORY_SEPARATOR . $this->directory;
+    }
+
+    /**
+     * Returns sorted array of measure files to import.
+     *
+     * @return array
+     */
+    public function getFiles()
+    {
+        $files = [];
+        $all = scandir($dirname = $this->getDir());
+
+        foreach ($all as $e) {
+            $e = $dirname . $e;
+            if (is_file($e)) {
+                $files[] = $e;
+            }
+        }
+
+        return $files;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Manager/ShapeImportManager.php b/src/Irstea/BdohAdminBundle/Manager/ShapeImportManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a1b3dec18a3c8c726baabb62f03690d1b6ece21
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Manager/ShapeImportManager.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohAdminBundle\Manager;
+
+use Symfony\Component\HttpFoundation\ParameterBag;
+
+/**
+ * Manages the import of shape files.
+ */
+class ShapeImportManager
+{
+    /**
+     * @var string
+     */
+    protected $appAbsolutePath;
+
+    /**
+     * @var string
+     */
+    protected $directory;
+
+    /**
+     * @var array
+     */
+    protected $mimeTypes;
+
+    /**
+     * @var Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $importers;
+
+    /**
+     * Constructor.
+     *
+     * @param string $appAbsolutePath
+     * @param array  $shapeImportParams See src/Irstea//BdohAdminBundle/Resources/config/services.yml
+     */
+    public function __construct($appAbsolutePath, array $shapeImportParams)
+    {
+        $this->appAbsolutePath = $appAbsolutePath;
+        $this->directory = $shapeImportParams['directory'];
+        $this->mimeTypes = $shapeImportParams['mimeTypes'];
+        $this->importers = new ParameterBag($shapeImportParams['importers']);
+    }
+
+    /**
+     * Checks that given mime type is valid for given category.
+     * If no category given, checks that it is valid for ALL categories.
+     *
+     * @param string $mime
+     * @param string $category
+     *
+     * @return bool
+     */
+    public function isValidMimeType($mime, $category = '')
+    {
+        if ($category && array_key_exists($category, $this->mimeTypes)) {
+            return in_array($mime, $this->mimeTypes[$category]);
+        }
+        foreach ($this->mimeTypes as $mimeTypes) {
+            if (in_array($mime, $mimeTypes)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns directory containing shape files to import.
+     *
+     * @return string Absolute path
+     */
+    public function getDir()
+    {
+        return $this->appAbsolutePath . DIRECTORY_SEPARATOR . $this->directory;
+    }
+
+    /**
+     * Returns sorted array of shape files to import.
+     *
+     * @return array
+     */
+    public function getFiles()
+    {
+        $files = [];
+        $all = scandir($dirname = $this->getDir());
+
+        foreach ($all as $e) {
+            $e = $dirname . $e;
+            if (is_file($e)) {
+                $files[] = $e;
+            }
+        }
+
+        return $files;
+    }
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd595e6b06da2729170229341f3b73897e98391b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/index.js
@@ -0,0 +1,55 @@
+define([
+    'jquery',
+    'translator',
+    './style.css'
+], ($, Translator) => {
+
+    const $formColors = $('#formColorsId');
+    const $jeuQualite = $('#jeuQualiteId');
+    const $jeuQualiteChanged = $('#jeuQualiteChangedId');
+
+
+    // gestion du selecteur du jeu de qualités
+    $jeuQualite.on('change', () => {
+        $jeuQualiteChanged.val('jeuQualiteChanged');
+        $formColors.submit();
+    });
+    // force l'initialisation du selecteur en cas de navigation (back)
+    function pageReset() {
+        if (typeof $jeuQualite.data('id') !== 'undefined') {
+            $jeuQualite.val($jeuQualite.data('id'));
+        } else {
+            $jeuQualite.val('');
+        }
+        $jeuQualiteChanged.val('');
+    }
+    $(window).on('pageshow', pageReset);
+
+
+    // ajout des colorpicker
+    const colorpickerconfig = {
+        letterCase:'uppercase',
+        theme:'bootstrap'
+    };
+    const colorpickers = $('input.colorpicker');
+    if (colorpickers.length) {
+        require('@claviska/jquery-minicolors');
+        require('@claviska/jquery-minicolors/jquery.minicolors.css');
+        $(colorpickers).minicolors(colorpickerconfig);
+    }
+
+    // affichage du tooltip
+    $('sup.strokeHelp').tooltip();
+
+
+    // gestion du reset du formulaire
+    function resetColorpickers(){
+        for(const colorpicker of colorpickers) {
+            $(colorpicker).minicolors('value', [$(colorpicker).val()]);
+        }
+    }
+    $formColors.on('reset', () => {
+        window.setTimeout(resetColorpickers, 1);
+    });
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/style.css b/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..b9747bb806a1413e343ba9126035f24e3ef9da90
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/colors/style.css
@@ -0,0 +1,42 @@
+fieldset.box{
+    width:90%;
+    margin-left:auto;
+    margin-right:auto;
+}
+.box .form-control{
+    height:34px;
+}
+table.table{
+    width:90%;
+    margin-left:auto;
+    margin-right:auto;
+}
+.box table.table th{
+    border-top:0;
+    text-align:center;
+}
+.box table.table td.qualiteLabel{
+    font-weight:bold;
+    vertical-align:middle;
+}
+.box table.table td:not(.qualiteLabel){
+    text-align:center;
+}
+span.code{
+    color:grey;
+}
+span.gap{
+    font-weight:normal;
+    color:grey;
+}
+div.minicolors{
+    width:175px;
+    margin:0 auto;
+}
+.box select{
+    width:100px;
+    margin:0 auto;
+}
+sup.strokeHelp{
+    cursor:default;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba4a89e586a02d53fd0943b5b5ee20285389cfe7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/index.js
@@ -0,0 +1,4 @@
+require('./main.js');
+require('./step1.js');
+require('./step2.js');
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/main.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf14ba6fe02ff90ec7f2f0aafa2f39297dd42249
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/main.js
@@ -0,0 +1,166 @@
+define([
+    'jquery',
+    'jquery-form/jquery.form'
+], ($) => {
+
+    $.measureImport = {
+        id: '#measure-import',
+
+        // Data received from the server
+        data: {},
+
+        // Initializes a new step
+        init() {
+            this.main = $(this.id);
+            this.form = this.main.find('form[name = "import"]');
+            return this;
+        },
+
+        // Gets a field DOM element
+        field(value, attr) {
+            attr = attr || 'name';
+            return this.form.find(`[${attr}="${value}"]`);
+        },
+
+        // Initializes the submit button and returns its DOM element
+        submit() {
+            const submitButton = this.form.find('[type = "submit"]');
+
+            // Methods
+            submitButton.enable = function () {
+                return $(this).removeAttr('disabled')
+                    .addClass('btn-success');
+            };
+
+            submitButton.disable = function () {
+                return $(this).attr('disabled', true)
+                    .removeClass('btn-success');
+            };
+
+            // Events
+            this.form.submit(() => {
+                submitButton.button('loading');
+            });
+
+            return submitButton;
+        },
+
+        // Initializes the button "Cancel measures import" and returns its DOM element.
+        cancel() {
+            const cancelForm = this.main.find('form[name = "cancel"]');
+            const cancelButton = cancelForm.children('[type = "submit"]');
+            const submit = this.submit();
+
+            // Events
+            this.form.submit(() => {
+                cancelButton.attr('disabled', true);
+            });
+
+            cancelForm.submit(() => {
+                cancelButton.button('loading');
+                submit.disable();
+            });
+
+            return cancelButton;
+        },
+
+        /**
+         * Builds a closure which enables or disables the submit button.
+         * Runs once this closure and returns it.
+         * @param {Closure}  test  Must return true to enable, false to disable
+         */
+        stateOfSubmit(test) {
+            const submit = this.submit();
+            const stateOfSubmit = function () {
+                if (test()) {
+                    submit.enable();
+                } else {
+                    submit.disable();
+                }
+            };
+            stateOfSubmit();
+            return stateOfSubmit;
+        },
+
+        /**
+         * Depending of 'data.state' :
+         *  => displays errors and format help ;
+         *  => OR displays the next step and calls its function
+         *
+         * @param {Closure}  nextStep  Calls the next step function
+         */
+        nextStep(data, nextStep) {
+            if (data.action === 'errors') {
+                this.cancel().remove();
+                this.form.replaceWith(data.view);
+                $('#format-description').children(`ul[name  = "${data.idImporter}"]`)
+                    .show(0);
+            } else {
+                this.main.empty().append(data.view);
+                this.data = data;
+                nextStep();
+            }
+        }
+    };
+
+    $.measureExport = {
+        id: '#measure-import',
+
+        // Initializes a new step
+        init() {
+            this.main = $(this.id);
+            this.form = this.main.find('form[name = "export"]');
+            return this;
+        },
+
+        // Gets a field DOM element
+        field(value, attr) {
+            attr = attr || 'name';
+            return this.form.find(`[${attr}="${value}"]`);
+        },
+
+        // Initializes the submit button and returns its DOM element
+        submit() {
+            const submitButton = this.form.find('[type = "submit"]');
+
+            // Methods
+            submitButton.enable = function () {
+                submitButton.button('reset');
+                return $(this).removeAttr('disabled')
+                    .addClass('btn-success');
+            };
+
+            submitButton.disable = function () {
+                submitButton.button('reset');
+                return $(this).attr('disabled', true)
+                    .removeClass('btn-success');
+            };
+
+            return submitButton;
+        },
+
+        /**
+         * Builds a closure which enables or disables the submit button.
+         * Runs once this closure and returns it.
+         * @param {Closure}  test  Must return true to enable, false to disable
+         */
+        stateOfSubmit(test) {
+            const submit = this.submit();
+            const stateOfSubmit = function () {
+                if (test()) {
+                    submit.enable();
+                } else {
+                    submit.disable();
+                }
+            };
+            stateOfSubmit();
+            return stateOfSubmit;
+        }
+    };
+
+    $(() => {
+        $.measureImport.step1();
+        $.measureExport.step1();
+    });
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step1.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step1.js
new file mode 100644
index 0000000000000000000000000000000000000000..0dfaee3ae8b7da54488c8adcc4ad7ef3a9b0b5dd
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step1.js
@@ -0,0 +1,46 @@
+/**
+ * Step 1 : file and file format
+ */
+define([
+    'jquery',
+    './main',
+    './step2'
+], ($) => {
+
+    $.measureImport.step1 = function () {
+        const measureImport = $.measureImport.init();
+        const form = measureImport.form;
+        const file = measureImport.field('file');
+        const formatDescription = $('#format-description');
+        const stateOfSubmit = measureImport.stateOfSubmit(() => {
+            return (file.val() !== '');
+        });
+
+        // Enables or not the "submit button"
+        file.on('change', stateOfSubmit);
+
+        formatDescription.children('ul[name  = "controle"], h4').show(0);
+
+        // Sends file and file format to the server
+        form.ajaxForm({
+            dataType: 'json',
+            success(data) {
+                const nextStep = measureImport.step2;
+                measureImport.nextStep(data, nextStep);
+            }
+        });
+    };
+
+    $.measureExport.step1 = function () {
+        const measureExport = $.measureExport.init();
+        const chronique = measureExport.field('chronique');
+        const timezone = measureExport.field('timezone');
+        const stateOfSubmit = measureExport.stateOfSubmit(() => {
+            return (chronique.val() !== '');
+        });
+
+        // Enables or not the "submit button"
+        chronique.add(timezone).on('change', stateOfSubmit);
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step2.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step2.js
new file mode 100644
index 0000000000000000000000000000000000000000..a10e5a6a2c22944f9f7d9d1391536338801610b5
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/controle-import/step2.js
@@ -0,0 +1,35 @@
+/**
+ * Step 2 : validation of import
+ */
+define([
+    'jquery',
+    './main',
+    '@IrsteaBdohBundle/lib/switch-default-list-widget',
+    '@IrsteaBdohBundle/lib/finite-list-widget'
+], ($) => {
+
+    $.measureImport.step2 = function () {
+        const measureImport = $.measureImport.init();
+        const form = measureImport.form;
+        const importTypes = measureImport.form.find('input[type = "radio"]');
+        const stateOfSubmit = measureImport.stateOfSubmit(() => {
+            return importTypes.filter(':checked').length !== 0;
+        });
+
+        // Enables or not the "submit button"
+        importTypes.on('click', stateOfSubmit);
+
+        // Displays, in a bootstrap-popover, a help for the dates overlaps
+        $('.overlapHelp').popover({trigger: 'hover'});
+
+        // Send 'importType' to the server
+        form.ajaxForm({
+            dataType: 'json',
+            success(data) {
+                measureImport.nextStep(data, () => {
+                });
+            }
+        });
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6a828678336f3eae034dd0b1575503eda90f42d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/index.js
@@ -0,0 +1,235 @@
+define([
+    'jquery',
+    'translator',
+    './style.css'
+], ($, Translator) => {
+
+    const $formConversion = $('#formConversionId');
+    const $chroniqueConvertie = $('#chroniqueConvertieId');
+    const $chroniqueChanged = $('#chroniqueChangedId');
+    const $chroniqueMere = $('#chroniqueMereId');
+    const $paramConversion = $('#paramConversionId');
+    const $displayParamConversion = $('#displayParamConversionId');
+    const $errorsConversionClose = $('#errorsConversionCloseId');
+    const $errorsConversionAlert = $('#errorsConversionAlertId');
+    const $successConversionClose = $('#successConversionCloseId');
+    const $successConversionAlert = $('#successConversionAlertId');
+    const $btnDiv = $('#btnDivId');
+
+
+    // gestion du selecteur des chroniques converties
+    function checkChroniqueConvertie(){
+        const val = $chroniqueConvertie.val() ? parseInt($chroniqueConvertie.val().replace(/[^0-9]/gi, ''), 10) : null;
+        return !(isNaN(val) || val <= 0)
+    }
+    $chroniqueConvertie.on('change', () => {
+        $chroniqueChanged.val('chroniqueChanged');
+        $formConversion.submit();
+    });
+    // force l'initialisation du selecteur en cas de navigation (back)
+    function pageReset() {
+        if (typeof $chroniqueConvertie.data('id') !== 'undefined') {
+            $chroniqueConvertie.val($chroniqueConvertie.data('id'));
+        } else {
+            $chroniqueConvertie.val('');
+        }
+        $chroniqueChanged.val('');
+    }
+    $(window).on('pageshow', pageReset);
+
+
+    // gestion de la chronique mère
+    function checkChroniqueMere(){
+        // pas de chronique mère
+        if($chroniqueMere.length === 0 || typeof $chroniqueMere.data('noChroniqueMere') !== 'undefined'){
+            return false;
+        }
+        // chronique mère déjà définie
+        if(typeof $chroniqueMere.data('id') !== 'undefined'){
+            return true;
+        }
+        // selecteur de chronique mère
+        const val = $chroniqueMere.val() ? parseInt($chroniqueMere.val().replace(/[^0-9]/gi, ''), 10) : null;
+        if(isNaN(val) || val <= 0) {
+            $chroniqueMere.parent()
+            .addClass('has-error');
+            return false;
+        }
+        $chroniqueMere.parent()
+        .removeClass('has-error');
+        return true;
+    }
+    $chroniqueMere.on('change', checkChroniqueMere);
+    $chroniqueMere.on('focus', checkChroniqueMere);
+    $chroniqueMere.on('blur', checkChroniqueMere);
+
+
+    // gestion du paramètre de conversion
+    function minutesFormater(duration){
+        const times = {
+            'jour': 1440,
+            'heure': 60,
+            'minute': 1,
+        };
+        let text = '';
+        if(duration >= 60) {
+            for (const time in times) {
+                if (text !== '') {
+                    text += ' ';
+                }
+                if (duration >= times[time]) {
+                    const nb = Math.floor(duration / times[time]);
+                    duration %= times[time];
+                    text += `${nb} ${Translator.transChoice(time, nb, {}, 'messages')}`;
+                }
+            }
+            return text;
+        }
+        return Translator.transChoice('minute', duration, {}, 'messages');
+    }
+    function displayParamConversion(val){
+        if(val === '') {
+            $displayParamConversion.text(Translator.trans('conversion.paramConversionError', {}, 'messages'));
+            $displayParamConversion.addClass('paramConversionError');
+        }else{
+            $displayParamConversion.removeClass('paramConversionError');
+            $displayParamConversion.text(minutesFormater(val));
+        }
+    }
+    function checkParamConversion(){
+        const val = parseInt($paramConversion.val(), 10);
+        if(isNaN(val) || val <= 0) {
+            displayParamConversion('');
+            $paramConversion.parent()
+            .addClass('has-error');
+            return false;
+        }
+        displayParamConversion(val);
+        $paramConversion.parent()
+        .removeClass('has-error');
+        return true;
+    }
+    $paramConversion.on('input', () => {
+        const val = $paramConversion.val().replace(/[^0-9]/gi, '');
+        $paramConversion.val(val);
+        if(!isNaN(parseInt(val, 10))){
+            $paramConversion.val(Math.min(val, 9999999));
+        }
+        checkParamConversion();
+        stateOfSubmit();
+    });
+    $paramConversion.on('keydown', (e) => {
+        const val = parseInt($paramConversion.val().replace(/[^0-9]/gi, ''), 10);
+        if(e.which === 38){ // up arrow
+            if(isNaN(val) || val <= 0){
+                $paramConversion.val(1);
+            }else{
+                $paramConversion.val(Math.min(val + 1, 9999999));
+            }
+        }else if(e.which === 40) { // down arrow
+            if(isNaN(val) || val <= 1){
+                $paramConversion.val(1);
+            }else{
+                $paramConversion.val(val - 1);
+            }
+        }
+        checkParamConversion();
+        stateOfSubmit();
+    });
+    $paramConversion.on('change', checkParamConversion);
+    $paramConversion.on('focus', checkParamConversion);
+    $paramConversion.on('blur', checkParamConversion);
+
+
+    // gestion du bouton de validation
+    const $submitButton = $formConversion.find('[type = "submit"]');
+    $submitButton.enable = function () {
+        return $(this).removeAttr('disabled')
+            .addClass('btn-success');
+    };
+    $submitButton.disable = function () {
+        return $(this).attr('disabled', true)
+            .removeClass('btn-success');
+    };
+    $submitButton.disable();
+    function stateOfSubmit(){
+        // force chaque test pour afficher toutes les erreurs
+        const checkCC = checkChroniqueConvertie();
+        const checkCM = checkChroniqueMere();
+        const checkPC = checkParamConversion();
+        if (checkCC && checkCM && checkPC) {
+            $submitButton.enable();
+        } else {
+            $submitButton.disable();
+        }
+    }
+    $chroniqueConvertie.on('change', stateOfSubmit);
+    $chroniqueConvertie.on('focus', stateOfSubmit);
+    $chroniqueConvertie.on('blur', stateOfSubmit);
+    $chroniqueMere.on('change', stateOfSubmit);
+    $chroniqueMere.on('focus', stateOfSubmit);
+    $chroniqueMere.on('blur', stateOfSubmit);
+    $paramConversion.on('change', stateOfSubmit);
+    $paramConversion.on('focus', stateOfSubmit);
+    $paramConversion.on('blur', stateOfSubmit);
+    stateOfSubmit();
+
+
+    // gestion du reset du formulaire
+    $formConversion.on('reset', () => {
+        $displayParamConversion.text('');
+        $paramConversion.parent()
+        .removeClass('has-error');
+        $chroniqueMere.parent()
+        .removeClass('has-error');
+        setTimeout(stateOfSubmit, 1);
+    });
+
+
+    // gestion du submit du formulaire
+    $formConversion.on('submit', () => {
+        // ce n'est pas un changement de chronique
+        if($chroniqueChanged.val() !== 'chroniqueChanged'){
+            // le form est validé
+            if($submitButton.hasClass('btn-success')){
+                // la chronique mère déjà définie
+                if(typeof $chroniqueMere.data('id') !== 'undefined'){
+                    return true;
+                }
+                // la chronique mère n'est pas déjà définie on demande confirmation pour la figer
+                return confirm(Translator.trans('conversion.confirmConversion', {}, 'messages'));
+            }
+            return false;
+        }
+        return true;
+    });
+
+
+    // affichage des tooltip
+    // (afficher la station, afficher la chronique nmère et aides sur le paramètre de conversion)
+    $('a.viewStation, a.viewChroniqueMere, #paramConversionId').tooltip({trigger: 'hover'});
+    $('sup#paramConversionHelpId').tooltip({html:true});
+
+    // affichage du popover pour la liste des chroniques filles
+    $('#childrenHelpId').popover({trigger: 'hover', 'html': true});
+
+
+    // gestion des boutons de fermeture sur les boites de message (erreur et succès)
+    $errorsConversionClose.on('click', () => {
+        $errorsConversionAlert.hide();
+    });
+    $successConversionClose.on('click', () => {
+        $successConversionAlert.hide();
+    });
+
+
+    // affichage des boutons (après la maj du stateOfSubmit)
+    $btnDiv.show();
+
+
+    // focus sur le selecteur des chroniques converties si pas de message
+    if($errorsConversionAlert.length === 0 && $successConversionAlert.length === 0) {
+        $chroniqueConvertie.focus();
+    }
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/style.css b/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..8ac092fc34d43afae7daa20808442bf99fe62bf1
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/conversion/style.css
@@ -0,0 +1,13 @@
+#paramConversionId{
+    text-align:right;
+}
+#conversion .tooltip-inner {
+    max-width:400px;
+}
+p.noChroniqueMere, #displayParamConversionId.paramConversionError{
+    color:#a94442;
+    font-style:italic;
+}
+#displayParamConversionId{
+    color:grey;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique-continue.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique-continue.js
new file mode 100644
index 0000000000000000000000000000000000000000..8fad6a286e0d6408acba7ebc4173146c348aa467
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique-continue.js
@@ -0,0 +1,110 @@
+const $ = require('jquery');
+
+$(() => {
+
+    const paramEl = $('[data-oriented-samplings]');
+    const orientedSamplings = paramEl.data('oriented-samplings');
+    const cumulativeSamplings = paramEl.data('cumulative-samplings');
+    const samplingOrders = paramEl.data('sampling-orders');
+    const outputTimeSteps = paramEl.data('output-time-steps');
+
+    const samplingSelector = $('select[id$="_echantillonnage"]');
+    const outputSamplingBoxes = $('[id$="_echantillonnagesSortieLicites"] input[type="checkbox"]');
+    const directionRadios = $('[id$="_directionMesure"] input[type="radio"]');
+    const cumulativeUnitSelector = $('select[id$="_uniteCumul"]');
+    const outputTimeStepBoxes = $('[id$="_optionsEchantillonnageSortie"] input[type="checkbox"]');
+
+    function getInputSamplingId() {
+        return samplingSelector.val();
+    }
+
+    function updateCumulativeUnit() {
+        let isRequired = false;
+
+        outputSamplingBoxes
+            .filter(':checked:visible')
+            .each((_, box) => {
+                const $box = $(box);
+                const boxId = $box.val();
+                if (cumulativeSamplings[boxId]) {
+                    isRequired = true;
+                }
+            });
+
+        cumulativeUnitSelector
+            .attr({required: isRequired, disabled: !isRequired});
+
+        cumulativeUnitSelector
+            .closest('.form-group')
+            .toggle(isRequired);
+    }
+
+    function enableCheckbox(box, enable) {
+        $(box)
+            .attr({'disabled': !enable})
+            .closest('.checkbox')
+            .toggle(enable);
+    }
+
+    function requireOutputTimeSteps() {
+        let require = false;
+        outputSamplingBoxes
+            .filter(':checked:visible')
+            .each((_, box) => {
+                if (orientedSamplings[$(box).val()]) {
+                    require = true;
+                }
+            });
+        return require;
+    }
+
+    function updateAvailableOutputTimesteps() {
+        const showTimesteps = requireOutputTimeSteps();
+        const inputSamplingId = getInputSamplingId();
+
+        outputTimeStepBoxes.each((_, box) => {
+            const boxId = $(box).val();
+            const isAvailable = +outputTimeSteps[boxId] === +inputSamplingId;
+            enableCheckbox(box, isAvailable);
+        });
+
+        outputTimeStepBoxes
+            .closest('.form-group')
+            .toggle(showTimesteps);
+    }
+
+    function updateAvailableOutputSamplings() {
+        const selectedOrder = samplingOrders[getInputSamplingId()];
+
+        outputSamplingBoxes.each((_, box) => {
+            const boxOrder = samplingOrders[$(box).val()];
+            const isAvailable = boxOrder >= selectedOrder;
+            enableCheckbox(box, isAvailable);
+        });
+
+        updateCumulativeUnit();
+        updateAvailableOutputTimesteps();
+    }
+
+    function updateDirectionSelector() {
+        const isOriented = orientedSamplings[getInputSamplingId()] === true;
+        directionRadios
+            .attr({disabled: !isOriented})
+            .closest('.form-group')
+            .toggle(isOriented);
+    }
+
+    samplingSelector.on('change.bdoh', () => {
+        updateAvailableOutputSamplings();
+        updateDirectionSelector();
+    });
+
+    outputSamplingBoxes.on('ifChanged.bdoh', () => {
+        updateCumulativeUnit();
+        updateAvailableOutputTimesteps();
+    });
+
+    updateAvailableOutputSamplings();
+    updateDirectionSelector();
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique.js
new file mode 100644
index 0000000000000000000000000000000000000000..37abb7cd7f7e61f3881a12fab8ba042aad14d46d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-chronique.js
@@ -0,0 +1,22 @@
+const $ = require('jquery');
+
+$(() => {
+    const url = $('[data-code-generator-path]').data('code-generator-path');
+    const $code = $('form [name$="[code]"]');
+    const $station = $('form [name$="[station]"]');
+    const $parametre = $('form [name$="[parametre]"]');
+
+    function generateCode() {
+        $code.val('');
+        $.ajax({
+            url,
+            data: {station: $station.val(), parametre: $parametre.val()}
+        }).done((data) => $code.val(data));
+    }
+
+    if ('' === $code.val()) {
+        generateCode();
+    }
+
+    $station.add($parametre).on('change', generateCode);
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-partenaire.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-partenaire.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1383438970b74b0ec7611bbf6c27727dd0d5a8e
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/edit-partenaire.js
@@ -0,0 +1,31 @@
+const $ = require('jquery');
+
+$(() => {
+
+    console.log('patate');
+
+    const paramEl = $('[data-is-funding]');
+    const isFunding = paramEl.data('is-funding');
+
+   const typeFundingsSelector = $('select[id$="_typeFundings"]');
+    console.log(typeFundingsSelector)
+
+    const selectIsFunding = $('select[id$="_estFinanceur"] input[type="radio"]');
+    console.log(selectIsFunding)
+
+    function getInputIsFundingId() {
+        return selectIsFunding.val();
+    }
+
+    function updateDirectionSelector() {
+        const isFinanceur = isFunding[getInputIsFundingId()] === true;
+        typeFundingsSelector
+            .attr({disabled: isFinanceur})
+            .closest('.form-group')
+            .toggle(!isFinanceur);
+    }
+
+    updateDirectionSelector();
+
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.css b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.css
new file mode 100644
index 0000000000000000000000000000000000000000..1ec3211c8af9ee9ea8f871e0dc4e92ea17c0d181
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.css
@@ -0,0 +1,39 @@
+li.select2-result.hierarchy-level-0{
+    padding-left:calc(0 * 25px);
+}
+li.select2-result.hierarchy-level-1{
+    padding-left:calc(1 * 25px);
+}
+li.select2-result.hierarchy-level-2{
+    padding-left:calc(2 * 25px);
+}
+li.select2-result.hierarchy-level-3{
+    padding-left:calc(3 * 25px);
+}
+li.select2-result.hierarchy-level-4{
+    padding-left:calc(4 * 25px);
+}
+li.select2-result.hierarchy-level-5{
+    padding-left:calc(5 * 25px);
+}
+li.select2-result.hierarchy-level-6{
+    padding-left:calc(6 * 25px);
+}
+li.select2-result.hierarchy-level-7{
+    padding-left:calc(7 * 25px);
+}
+li.select2-result.hierarchy-level-8{
+    padding-left:calc(8 * 25px);
+}
+li.select2-result.hierarchy-level-9{
+    padding-left:calc(9 * 25px);
+}
+li.select2-result.hierarchy-level-10{
+    padding-left:calc(10 * 25px);
+}
+li.select2-result.hierarchy-level-11{
+    padding-left:calc(11 * 25px);
+}
+li.select2-result.hierarchy-level-12{
+    padding-left:calc(12 * 25px);
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.js
new file mode 100644
index 0000000000000000000000000000000000000000..671a0a63772976cb156e0b94b703a837920515ef
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/crud/familles-types.js
@@ -0,0 +1,15 @@
+require('./familles-types.css');
+const $ = require('jquery');
+
+$(() => {
+
+    // modificcation du rendu de la liste d'options du select2 pour
+    // injecter la class de hierarchie donnée à l'option
+    $.fn.select2.defaults.templateResult = function (data, container) {
+        if (data.element) {
+            $(container).addClass($(data.element).attr('class'));
+        }
+        return data.text;
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b090288fcb3d790368b46b77aaa990cfa08a9ac
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/index.js
@@ -0,0 +1,6 @@
+require('./main.js');
+require('./step1.js');
+require('./step2.js');
+require('./step3.js');
+
+$.measureImport.step1();
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/main.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..f62319f90205e042243394d69b210cf042a89862
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/main.js
@@ -0,0 +1,112 @@
+define([
+    'jquery',
+    'jquery-form/jquery.form'
+], ($) => {
+
+    $.measureImport = {
+        id: '#measure-import',
+
+        // Data received from the server
+        data: {},
+
+        // Initializes a new step
+        init() {
+            this.main = $(this.id);
+            this.form = this.main.find('form[name="main"]');
+            return this;
+        },
+
+        // Gets a field DOM element
+        field(value, attr = 'name') {
+            return this.form.find(`[${attr}="${value}"]`);
+        },
+
+        // Initializes the submit button and returns its DOM element
+        submit() {
+            const submitButton = this.form.find('[type = "submit"]');
+
+            // Methods
+            submitButton.enable = function () {
+                return $(this).removeAttr('disabled')
+                    .addClass('btn-success');
+            };
+
+            submitButton.disable = function () {
+                return $(this).attr('disabled', true)
+                    .removeClass('btn-success');
+            };
+
+            // Events
+            this.form.submit(() => {
+                submitButton.button('loading');
+            });
+
+            return submitButton;
+        },
+
+        // Initializes the button "Cancel measures import" and returns its DOM element.
+        cancel() {
+            const cancelForm = this.main.find('form[name = "cancel"]');
+            const cancelButton = cancelForm.children('[type = "submit"]');
+            const submit = this.submit();
+
+            // Events
+            this.form.submit(() => {
+                cancelButton.attr('disabled', true);
+            });
+
+            cancelForm.submit(() => {
+                cancelButton.button('loading');
+                submit.disable();
+            });
+
+            return cancelButton;
+        },
+
+        /**
+         * Builds a closure which enables or disables the submit button.
+         * Runs once this closure and returns it.
+         * @param {function}  test  Must return true to enable, false to disable
+         */
+        stateOfSubmit(test) {
+            const submit = this.submit();
+            const stateOfSubmit = function () {
+                if (test()) {
+                    submit.enable();
+                } else {
+                    submit.disable();
+                }
+            };
+            stateOfSubmit();
+            return stateOfSubmit;
+        },
+
+        /**
+         * Depending of 'data.state' :
+         *  => displays errors and format help ;
+         *  => OR displays the next step and calls its function
+         *
+         * @param {{}}  data
+         * @param {function}  nextStep  Calls the next step function
+         */
+        nextStep(data, nextStep) {
+            if (data.action === 'errors') {
+                this.cancel().remove();
+                this.form.replaceWith(data.view);
+                const $formatDescription = $('#format-description');
+                if(data.idImporter){
+                    $formatDescription.children(`ul[name="${data.idImporter}"]`)
+                        .show(0);
+                }else{
+                    $formatDescription.parent()
+                        .hide();
+                }
+            } else {
+                this.main.empty().append(data.view);
+                this.data = data;
+                nextStep();
+            }
+        }
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step1.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step1.js
new file mode 100644
index 0000000000000000000000000000000000000000..d157e2ab488694b54d8cc61b3effa09cdb36cd04
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step1.js
@@ -0,0 +1,68 @@
+/**
+ * Step 1 : file and file format
+ */
+define([
+    'jquery',
+    './main',
+    './step2'
+], ($) => {
+    'use strict';
+
+    $.measureImport.step1 = function () {
+        let formatDescription = $('#format-description'),
+            measureImport     = $.measureImport.init(),
+            form              = measureImport.form,
+            file              = measureImport.field('file'),
+            fileFormat        = measureImport.field('file-format'),
+            progressBar       = measureImport.main.find('.progress'),
+            progression       = progressBar.children('.bar'),
+
+            stateOfSubmit = measureImport.stateOfSubmit(() => {
+                return (file.val() !== '' && fileFormat.val() !== '');
+            });
+
+        // When a format is selected, displays its description
+        fileFormat.on('change', function () {
+            let id    = $(':selected', this).val(),
+                value = $(':selected', this).text();
+
+            if (id === '') {
+                // Hides description
+                formatDescription.children('h4, ul').hide(0);
+            } else {
+                // Shows the good description
+                formatDescription.find('h4 > i').html(value);
+                formatDescription.children(`ul[name != "${id}"]`).hide(0);
+                formatDescription.children(`ul[name  = "${id}"], h4`).show(0);
+            }
+        });
+
+        // Enables or not the "submit button"
+        file.add(fileFormat).on('change', stateOfSubmit);
+
+        // Sends file and file format to the server
+        form.ajaxForm({
+            dataType : 'json',
+            beforeSend () {
+                // Displays progress bar if file > 1 Mio
+                if (file[0].files[0] !== undefined && file[0].files[0].size > 1000000) {
+                    progressBar.show(0);
+                }
+            },
+            uploadProgress (event, position, total, percentComplete) {
+                progression.width(`${percentComplete}%`);
+            },
+            complete (xhr) {
+                progressBar.hide(0);
+                progression.width('0%');
+            },
+            success (data) {
+                const nextStep = (data.action === 'step2.askStation') ?
+                               measureImport.step2.askStation :
+                               measureImport.step2;
+                measureImport.nextStep(data, nextStep);
+            }
+        });
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step2.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step2.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d447061c52d249b41ed9fb75fb4ddcd26731703
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step2.js
@@ -0,0 +1,116 @@
+/**
+ * Step 2 : 'station', timezone and 'chroniques'
+ */
+define([
+    'jquery',
+    './main',
+    './step3',
+    '@IrsteaBdohBundle/lib/switch-default-list-widget',
+    '@IrsteaBdohBundle/lib/finite-list-widget'
+], ($) => {
+
+    $.measureImport.step2 = function () {
+        const measureImport = $.measureImport.init();
+        const data = measureImport.data;
+        const form = measureImport.form;
+        const timezone = measureImport.field('timezone');
+        const chroniques = measureImport.field('chroniques');
+        const defaultElementFiniteList = {
+            name: 'doNotSelect',
+            value: data.ignoreColumn,
+            titleDelete: data.titleDelete,
+            titleRedo: data.titleRedo,
+        };
+        /*
+        // la selection des chroniques à importer n'est plus gérée par le controller / importer
+        const defaultElementSwitchList = {
+            name: 'doNotSelect',
+            value: data.ignoredTimeSeries,
+            titleDelete: data.titleDelete,
+            titleRedo: data.titleRedo,
+        };
+        */
+        const stateOfSubmit = measureImport.stateOfSubmit(() => {
+            const selected = chroniques.find('ol > li[name != "doNotSelect"]').length;
+            return (selected > 0 && timezone.val() !== '');
+        });
+        let lists;
+
+        // No 'chronique' read => adds a 'chroniques' box
+        if (data.chroniquesAvailable) {
+            lists = $.finiteList(chroniques.selector, data.chroniquesAvailable, defaultElementFiniteList, data.expectedChroniques);
+            chroniques.find('[name = "in"]').append(lists.In);
+            chroniques.find('[name = "out"]').append(lists.Out)
+                .on('change.finiteList', stateOfSubmit);
+        } else {
+            // All 'chroniques' read => adds a 'delete' tool for each
+            /*
+            // la selection des chroniques à importer n'est plus gérée par le controller / importer
+            chroniques.find('ol').switchDefaultList(defaultElementSwitchList)
+                .on('change.switchDefaultList', stateOfSubmit);
+            */
+        }
+
+        // Enable or not the "submit button"
+        timezone.on('change', stateOfSubmit);
+
+        // Gets the code (attribute "name") of selected 'chroniques'
+        function getSelectedChroniques() {
+            const listChronDOM = chroniques.find('ol > li');
+            const listChron = {};
+
+            for (let i = 0; i < listChronDOM.length; ++i) {
+                const code = listChronDOM.eq(i).attr('name');
+                if (code !== 'doNotSelect') {
+                    listChron[i] = code;
+                }
+            }
+            return listChron;
+        }
+
+        // Send 'timezone' and 'chronqiues' to the server
+        form.ajaxForm({
+            dataType: 'json',
+            beforeSend() {
+                $('#modalStep2')
+                    .modal({backdrop: 'static'})
+                    .modal('show');
+            },
+            beforeSerialize($form, options) {
+                options.data = {chroniques: getSelectedChroniques()};
+            },
+            success(data) {
+                $('#modalStep2')
+                    .modal('hide')
+                    .one('hidden.bs.modal', () => {
+                        measureImport.nextStep(data, measureImport.step3);
+                    });
+            }
+        });
+    };
+
+
+    /**
+     * Pre-step 2 : ask a 'station'
+     */
+    $.measureImport.step2.askStation = function () {
+        let measureImport = $.measureImport.init(),
+            form = measureImport.form,
+            cancel = measureImport.cancel(),
+            station = measureImport.field('station');
+
+        // Enable or not the "submit button"
+        station.on('change', measureImport.stateOfSubmit(() => {
+            return station.val() !== '';
+        }));
+
+        // Send 'station' to the server
+        form.ajaxForm({
+            dataType: 'json',
+            success(data) {
+                measureImport.nextStep(data, measureImport.step2);
+            }
+        });
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step3.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step3.js
new file mode 100644
index 0000000000000000000000000000000000000000..956921b032501f986a6e0bdfef73558c5aeb8561
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/measure-import/step3.js
@@ -0,0 +1,46 @@
+/**
+ * Step 3 : validation of import
+ */
+define([
+    'jquery',
+    './main'
+], ($) => {
+
+    $.measureImport.step3 = function () {
+        const measureImport = $.measureImport.init();
+        const data = measureImport.data;
+        const form = measureImport.form;
+        const importTypes = measureImport.form.find('input[type = "radio"]');
+        const stateOfSubmit = measureImport.stateOfSubmit(() => {
+            return importTypes.filter(':checked').length === data.numChroniquesToValidate;
+        });
+
+        // Enables or not the "submit button"
+        importTypes.on('click', stateOfSubmit);
+
+        // Displays, in a bootstrap-popover, a help for the dates overlaps
+        $('.overlapHelp').popover({trigger: 'hover'});
+
+        // Displays, in a bootstrap-popover, the list of the descendant time series
+        $('.childrenHelp').popover({trigger: 'hover', 'html': true});
+
+        // Send 'importType' to the server
+        form.ajaxForm({
+            dataType: 'json',
+            beforeSend() {
+                $('#modalStep3')
+                    .modal({backdrop: 'static'})
+                    .modal('show');
+            },
+            success(data) {
+                $('#modalStep3')
+                    .modal('hide')
+                    .one('hidden.bs.modal', () => {
+                        measureImport.nextStep(data, () => {
+                        });
+                    });
+            }
+        });
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a883f0f6423b65898d5fbdc144292f284aa6991
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/index.js
@@ -0,0 +1,5 @@
+require('./main.js');
+require('./step1.js');
+require('./step2.js');
+require('./style.css');
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/main.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..63d98ccbd6039151b29d5f581e74fc10da96a941
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/main.js
@@ -0,0 +1,118 @@
+const $ = require('jquery');
+require('jquery-form/jquery.form');
+
+$.shapeImport = {
+  id: '#shape-import',
+
+  // Data received from the server
+  data: {},
+
+  // Initializes a new step
+  init() {
+    this.main = $(this.id);
+    this.form = this.main.find('form[name = "import"]');
+    return this;
+  },
+
+  // Gets a field DOM element
+  field(value, attr) {
+    attr = attr || 'name';
+    return this.form.find(`[${attr}="${value}"]`);
+  },
+
+  // Initializes the submit button and returns its DOM element
+  submit() {
+    const submitButton = this.form.find('[type = "submit"]');
+
+    // Methods
+    submitButton.enable = function () {
+      return $(this)
+        .removeAttr('disabled')
+        .addClass('btn-success');
+    };
+
+    submitButton.disable = function () {
+      return $(this)
+        .attr('disabled', true)
+        .removeClass('btn-success');
+    };
+
+    // Events
+    this.form.submit(() => {
+      submitButton.button('loading');
+    });
+
+    return submitButton;
+  },
+
+  // Initializes the button "Cancel measures import" and returns its DOM element.
+  cancel() {
+    const cancelForm = this.main.find('form[name = "cancel"]');
+    const cancelButton = cancelForm.children('[type = "submit"]');
+    const submit = this.submit();
+
+    // Events
+    this.form.submit(() => {
+      cancelButton.attr('disabled', true);
+    });
+
+    cancelForm.submit(() => {
+      cancelButton.button('loading');
+      submit.disable();
+    });
+
+    return cancelButton;
+  },
+
+  /**
+   * Builds a closure which enables or disables the submit button.
+   * Runs once this closure and returns it.
+   * @param {function}  test  Must return true to enable, false to disable
+   */
+  stateOfSubmit(test) {
+    const submit = this.submit();
+    const stateOfSubmit = function () {
+      if (test()) {
+        submit.enable();
+      } else {
+        submit.disable();
+      }
+    };
+    stateOfSubmit();
+    return stateOfSubmit;
+  },
+
+  /**
+   * Depending of 'data.state' :
+   *  => displays errors and format help ;
+   *  => OR displays the next step and calls its function
+   *
+   * @param {object}  data
+   * @param {function}  nextStep  Calls the next step function
+   */
+  nextStep(data, nextStep) {
+    if (data.action === 'errors') {
+      this.cancel()
+        .remove();
+      this.form.replaceWith(data.view);
+        const $formatDescription = $('#format-description');
+        if(data.idImporter){
+            $formatDescription.children(`ul[name="${data.idImporter}"]`)
+                .show(0);
+        }else{
+            $formatDescription.parent()
+                .hide();
+        }
+    } else {
+      this.main.empty().append(data.view);
+      this.data = data;
+      nextStep();
+    }
+  }
+};
+
+
+$(document)
+  .ready(() => {
+    $.shapeImport.step1();
+  });
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step1.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step1.js
new file mode 100644
index 0000000000000000000000000000000000000000..4362e29e2bba5e775f481a31f58db2500d5099f0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step1.js
@@ -0,0 +1,42 @@
+const $ = require('jquery');
+
+$.shapeImport.step1 = function () {
+  const shapeImport = $.shapeImport.init();
+  const formatDescription = $('#format-description');
+  const form = shapeImport.form;
+  const file = shapeImport.field('file');
+  const fileShape = shapeImport.field('file-shape');
+  const stateOfSubmit = shapeImport.stateOfSubmit(() => {
+    return (file.val() !== '' && fileShape.val() !== '');
+  });
+
+  // When a format is selected, displays its description
+  fileShape.on('change', function () {
+    const id = $(':selected', this).val();
+    const value = $(':selected', this).text();
+
+
+    if (id === '') {
+      // Hides description
+      formatDescription.children('h4, ul').hide(0);
+    }
+    else {
+      // Shows the good description
+      formatDescription.find('h4 > i').html(value);
+      formatDescription.children(`ul[name != "${id}"]`).hide(0);
+      formatDescription.children(`ul[name  = "${id}"], h4`).show(0);
+    }
+  });
+  // Enables or not the "submit button"
+  file.add(fileShape).on('change', stateOfSubmit);
+
+  // Sends file and file format to the server
+  form.ajaxForm({
+    dataType: 'json',
+    success(data) {
+      const nextStep = shapeImport.step2;
+      shapeImport.nextStep(data, nextStep);
+    }
+  });
+};
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step2.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step2.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ac421620bb523b6c7a22da78b6a2fdf3a58407c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/step2.js
@@ -0,0 +1,21 @@
+const $ = require('jquery');
+
+$.shapeImport.step2 = function () {
+  const shapeImport = $.shapeImport.init();
+  const form = shapeImport.form;
+  const importTypes = shapeImport.form.find('input[type = "radio"]');
+  const stateOfSubmit = shapeImport.stateOfSubmit(() => {
+    return importTypes.filter(':checked').length !== 0;
+  });
+
+    // Enables or not the "submit button"
+    importTypes.on('click', stateOfSubmit);
+
+    // Send 'importType' to the server
+    form.ajaxForm({
+        dataType : 'json',
+        success (data) {
+            shapeImport.nextStep(data, () => {});
+        }
+    });
+};
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/style.css b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..3e01a7f11d3d9158d105424da3876d0effc9e584
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/shape-import/style.css
@@ -0,0 +1,26 @@
+form > div.panel > div.panel-body > div.panel{
+    margin:0;
+}
+form > div.panel > div.panel-body > div.panel:not(:first-child){
+    margin-top:15px;
+}
+form > div.panel > div.panel-body > div.alert.alert-warning,
+form > div.panel > div.panel-body > div.alert.alert-danger{
+    margin:15px 0 0;
+}
+a.collapse-title,
+a.collapse-title:hover,
+a.collapse-title:focus{
+    cursor:pointer;
+    text-decoration:none;
+    color:#444444;
+}
+a.collapse-title b.caret{
+    margin:0;
+    padding:0;
+    vertical-align:3px;
+    transition:transform 0.3s ease-in-out;
+}
+a.collapse-title.collapsed b.caret{
+    transform:rotate(-90deg);
+}
\ No newline at end of file
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.less b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.less
new file mode 100644
index 0000000000000000000000000000000000000000..0e7c7d0602442723b84cf94be37e018233d26de0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.less
@@ -0,0 +1,4004 @@
+[class^="fam-"],
+[class*=" fam-"] {
+    display:        inline-block;
+    width:          16px;
+    height:         16px;
+    vertical-align: top;
+    background:     transparent url("./fam-icons.png") no-repeat;
+}
+
+.fam-add {
+    background-position: -0px -0px;
+}
+
+.fam-anchor {
+    background-position: -18px -0px;
+}
+
+.fam-application {
+    background-position: -36px -0px;
+}
+
+.fam-application-add {
+    background-position: -54px -0px;
+}
+
+.fam-application-cascade {
+    background-position: -72px -0px;
+}
+
+.fam-application-delete {
+    background-position: -90px -0px;
+}
+
+.fam-application-double {
+    background-position: -108px -0px;
+}
+
+.fam-application-edit {
+    background-position: -126px -0px;
+}
+
+.fam-application-error {
+    background-position: -144px -0px;
+}
+
+.fam-application-form {
+    background-position: -162px -0px;
+}
+
+.fam-application-form-add {
+    background-position: -180px -0px;
+}
+
+.fam-application-form-delete {
+    background-position: -198px -0px;
+}
+
+.fam-application-form-edit {
+    background-position: -216px -0px;
+}
+
+.fam-application-form-magnify {
+    background-position: -234px -0px;
+}
+
+.fam-application-get {
+    background-position: -252px -0px;
+}
+
+.fam-application-go {
+    background-position: -270px -0px;
+}
+
+.fam-application-home {
+    background-position: -288px -0px;
+}
+
+.fam-application-key {
+    background-position: -306px -0px;
+}
+
+.fam-application-lightning {
+    background-position: -324px -0px;
+}
+
+.fam-application-link {
+    background-position: -342px -0px;
+}
+
+.fam-application-osx {
+    background-position: -360px -0px;
+}
+
+.fam-application-osx-terminal {
+    background-position: -378px -0px;
+}
+
+.fam-application-put {
+    background-position: -396px -0px;
+}
+
+.fam-application-side-boxes {
+    background-position: -414px -0px;
+}
+
+.fam-application-side-contract {
+    background-position: -432px -0px;
+}
+
+.fam-application-side-expand {
+    background-position: -450px -0px;
+}
+
+.fam-application-side-list {
+    background-position: -468px -0px;
+}
+
+.fam-application-side-tree {
+    background-position: -486px -0px;
+}
+
+.fam-application-split {
+    background-position: -504px -0px;
+}
+
+.fam-application-tile-horizontal {
+    background-position: -522px -0px;
+}
+
+.fam-application-tile-vertical {
+    background-position: -540px -0px;
+}
+
+.fam-application-view-columns {
+    background-position: -558px -0px;
+}
+
+.fam-application-view-detail {
+    background-position: -576px -0px;
+}
+
+.fam-application-view-gallery {
+    background-position: -0px -18px;
+}
+
+.fam-application-view.fam- {
+    background-position: -18px -18px;
+}
+
+.fam-application-view-list {
+    background-position: -36px -18px;
+}
+
+.fam-application-view-tile {
+    background-position: -54px -18px;
+}
+
+.fam-application-xp {
+    background-position: -72px -18px;
+}
+
+.fam-application-xp-terminal {
+    background-position: -90px -18px;
+}
+
+.fam-arrow-branch {
+    background-position: -108px -18px;
+}
+
+.fam-arrow-divide {
+    background-position: -126px -18px;
+}
+
+.fam-arrow-down {
+    background-position: -144px -18px;
+}
+
+.fam-arrow-in {
+    background-position: -162px -18px;
+}
+
+.fam-arrow-inout {
+    background-position: -180px -18px;
+}
+
+.fam-arrow-join {
+    background-position: -198px -18px;
+}
+
+.fam-arrow-left {
+    background-position: -216px -18px;
+}
+
+.fam-arrow-merge {
+    background-position: -234px -18px;
+}
+
+.fam-arrow-out {
+    background-position: -252px -18px;
+}
+
+.fam-arrow-redo {
+    background-position: -270px -18px;
+}
+
+.fam-arrow-refresh {
+    background-position: -288px -18px;
+}
+
+.fam-arrow-refresh-small {
+    background-position: -306px -18px;
+}
+
+.fam-arrow-right {
+    background-position: -324px -18px;
+}
+
+.fam-arrow-rotate-anticlockwise {
+    background-position: -342px -18px;
+}
+
+.fam-arrow-rotate-clockwise {
+    background-position: -360px -18px;
+}
+
+.fam-arrow-switch {
+    background-position: -378px -18px;
+}
+
+.fam-arrow-turn-left {
+    background-position: -396px -18px;
+}
+
+.fam-arrow-turn-right {
+    background-position: -414px -18px;
+}
+
+.fam-arrow-undo {
+    background-position: -432px -18px;
+}
+
+.fam-arrow-up {
+    background-position: -450px -18px;
+}
+
+.fam-asterisk-orange {
+    background-position: -468px -18px;
+}
+
+.fam-asterisk-yellow {
+    background-position: -486px -18px;
+}
+
+.fam-attach {
+    background-position: -504px -18px;
+}
+
+.fam-award-star-add {
+    background-position: -522px -18px;
+}
+
+.fam-award-star-bronze-1 {
+    background-position: -540px -18px;
+}
+
+.fam-award-star-bronze-2 {
+    background-position: -558px -18px;
+}
+
+.fam-award-star-bronze-3 {
+    background-position: -576px -18px;
+}
+
+.fam-award-star-delete {
+    background-position: -0px -36px;
+}
+
+.fam-award-star-gold-1 {
+    background-position: -18px -36px;
+}
+
+.fam-award-star-gold-2 {
+    background-position: -36px -36px;
+}
+
+.fam-award-star-gold-3 {
+    background-position: -54px -36px;
+}
+
+.fam-award-star-silver-1 {
+    background-position: -72px -36px;
+}
+
+.fam-award-star-silver-2 {
+    background-position: -90px -36px;
+}
+
+.fam-award-star-silver-3 {
+    background-position: -108px -36px;
+}
+
+.fam-basket {
+    background-position: -126px -36px;
+}
+
+.fam-basket-add {
+    background-position: -144px -36px;
+}
+
+.fam-basket-delete {
+    background-position: -162px -36px;
+}
+
+.fam-basket-edit {
+    background-position: -180px -36px;
+}
+
+.fam-basket-error {
+    background-position: -198px -36px;
+}
+
+.fam-basket-go {
+    background-position: -216px -36px;
+}
+
+.fam-basket-put {
+    background-position: -234px -36px;
+}
+
+.fam-basket-remove {
+    background-position: -252px -36px;
+}
+
+.fam-bell {
+    background-position: -270px -36px;
+}
+
+.fam-bell-add {
+    background-position: -288px -36px;
+}
+
+.fam-bell-delete {
+    background-position: -306px -36px;
+}
+
+.fam-bell-error {
+    background-position: -324px -36px;
+}
+
+.fam-bell-go {
+    background-position: -342px -36px;
+}
+
+.fam-bell-link {
+    background-position: -360px -36px;
+}
+
+.fam-bin {
+    background-position: -378px -36px;
+}
+
+.fam-bin-closed {
+    background-position: -396px -36px;
+}
+
+.fam-bin-empty {
+    background-position: -414px -36px;
+}
+
+.fam-bomb {
+    background-position: -432px -36px;
+}
+
+.fam-book {
+    background-position: -450px -36px;
+}
+
+.fam-book-add {
+    background-position: -468px -36px;
+}
+
+.fam-book-addresses {
+    background-position: -486px -36px;
+}
+
+.fam-book-delete {
+    background-position: -504px -36px;
+}
+
+.fam-book-edit {
+    background-position: -522px -36px;
+}
+
+.fam-book-error {
+    background-position: -540px -36px;
+}
+
+.fam-book-go {
+    background-position: -558px -36px;
+}
+
+.fam-book-key {
+    background-position: -576px -36px;
+}
+
+.fam-book-link {
+    background-position: -0px -54px;
+}
+
+.fam-book-next {
+    background-position: -18px -54px;
+}
+
+.fam-book-open {
+    background-position: -36px -54px;
+}
+
+.fam-book-previous {
+    background-position: -54px -54px;
+}
+
+.fam-box {
+    background-position: -72px -54px;
+}
+
+.fam-brick {
+    background-position: -90px -54px;
+}
+
+.fam-brick-add {
+    background-position: -108px -54px;
+}
+
+.fam-brick-delete {
+    background-position: -126px -54px;
+}
+
+.fam-brick-edit {
+    background-position: -144px -54px;
+}
+
+.fam-brick-error {
+    background-position: -162px -54px;
+}
+
+.fam-brick-go {
+    background-position: -180px -54px;
+}
+
+.fam-brick-link {
+    background-position: -198px -54px;
+}
+
+.fam-bricks {
+    background-position: -216px -54px;
+}
+
+.fam-briefcase {
+    background-position: -234px -54px;
+}
+
+.fam-bug {
+    background-position: -252px -54px;
+}
+
+.fam-bug-add {
+    background-position: -270px -54px;
+}
+
+.fam-bug-delete {
+    background-position: -288px -54px;
+}
+
+.fam-bug-edit {
+    background-position: -306px -54px;
+}
+
+.fam-bug-error {
+    background-position: -324px -54px;
+}
+
+.fam-bug-go {
+    background-position: -342px -54px;
+}
+
+.fam-bug-link {
+    background-position: -360px -54px;
+}
+
+.fam-building {
+    background-position: -378px -54px;
+}
+
+.fam-building-add {
+    background-position: -396px -54px;
+}
+
+.fam-building-delete {
+    background-position: -414px -54px;
+}
+
+.fam-building-edit {
+    background-position: -432px -54px;
+}
+
+.fam-building-error {
+    background-position: -450px -54px;
+}
+
+.fam-building-go {
+    background-position: -468px -54px;
+}
+
+.fam-building-key {
+    background-position: -486px -54px;
+}
+
+.fam-building-link {
+    background-position: -504px -54px;
+}
+
+.fam-bullet-add {
+    background-position: -522px -54px;
+}
+
+.fam-bullet-arrow-bottom {
+    background-position: -540px -54px;
+}
+
+.fam-bullet-arrow-down {
+    background-position: -558px -54px;
+}
+
+.fam-bullet-arrow-top {
+    background-position: -576px -54px;
+}
+
+.fam-bullet-arrow-up {
+    background-position: -0px -72px;
+}
+
+.fam-bullet-black {
+    background-position: -18px -72px;
+}
+
+.fam-bullet-blue {
+    background-position: -36px -72px;
+}
+
+.fam-bullet-delete {
+    background-position: -54px -72px;
+}
+
+.fam-bullet-disk {
+    background-position: -72px -72px;
+}
+
+.fam-bullet-error {
+    background-position: -90px -72px;
+}
+
+.fam-bullet-feed {
+    background-position: -108px -72px;
+}
+
+.fam-bullet-go {
+    background-position: -126px -72px;
+}
+
+.fam-bullet-green {
+    background-position: -144px -72px;
+}
+
+.fam-bullet-key {
+    background-position: -162px -72px;
+}
+
+.fam-bullet-orange {
+    background-position: -180px -72px;
+}
+
+.fam-bullet-picture {
+    background-position: -198px -72px;
+}
+
+.fam-bullet-pink {
+    background-position: -216px -72px;
+}
+
+.fam-bullet-purple {
+    background-position: -234px -72px;
+}
+
+.fam-bullet-red {
+    background-position: -252px -72px;
+}
+
+.fam-bullet-star {
+    background-position: -270px -72px;
+}
+
+.fam-bullet-toggle-minus {
+    background-position: -288px -72px;
+}
+
+.fam-bullet-toggle-plus {
+    background-position: -306px -72px;
+}
+
+.fam-bullet-white {
+    background-position: -324px -72px;
+}
+
+.fam-bullet-wrench {
+    background-position: -342px -72px;
+}
+
+.fam-bullet-yellow {
+    background-position: -360px -72px;
+}
+
+.fam-cake {
+    background-position: -378px -72px;
+}
+
+.fam-calculator {
+    background-position: -396px -72px;
+}
+
+.fam-calculator-add {
+    background-position: -414px -72px;
+}
+
+.fam-calculator-delete {
+    background-position: -432px -72px;
+}
+
+.fam-calculator-edit {
+    background-position: -450px -72px;
+}
+
+.fam-calculator-error {
+    background-position: -468px -72px;
+}
+
+.fam-calculator-link {
+    background-position: -486px -72px;
+}
+
+.fam-calendar {
+    background-position: -504px -72px;
+}
+
+.fam-calendar-add {
+    background-position: -522px -72px;
+}
+
+.fam-calendar-delete {
+    background-position: -540px -72px;
+}
+
+.fam-calendar-edit {
+    background-position: -558px -72px;
+}
+
+.fam-calendar-link {
+    background-position: -576px -72px;
+}
+
+.fam-calendar-view-day {
+    background-position: -0px -90px;
+}
+
+.fam-calendar-view-month {
+    background-position: -18px -90px;
+}
+
+.fam-calendar-view-week {
+    background-position: -36px -90px;
+}
+
+.fam-camera {
+    background-position: -54px -90px;
+}
+
+.fam-camera-add {
+    background-position: -72px -90px;
+}
+
+.fam-camera-delete {
+    background-position: -90px -90px;
+}
+
+.fam-camera-edit {
+    background-position: -108px -90px;
+}
+
+.fam-camera-error {
+    background-position: -126px -90px;
+}
+
+.fam-camera-go {
+    background-position: -144px -90px;
+}
+
+.fam-camera-link {
+    background-position: -162px -90px;
+}
+
+.fam-camera-small {
+    background-position: -180px -90px;
+}
+
+.fam-cancel {
+    background-position: -198px -90px;
+}
+
+.fam-car {
+    background-position: -216px -90px;
+}
+
+.fam-car-add {
+    background-position: -234px -90px;
+}
+
+.fam-car-delete {
+    background-position: -252px -90px;
+}
+
+.fam-cart {
+    background-position: -270px -90px;
+}
+
+.fam-cart-add {
+    background-position: -288px -90px;
+}
+
+.fam-cart-delete {
+    background-position: -306px -90px;
+}
+
+.fam-cart-edit {
+    background-position: -324px -90px;
+}
+
+.fam-cart-error {
+    background-position: -342px -90px;
+}
+
+.fam-cart-go {
+    background-position: -360px -90px;
+}
+
+.fam-cart-put {
+    background-position: -378px -90px;
+}
+
+.fam-cart-remove {
+    background-position: -396px -90px;
+}
+
+.fam-cd {
+    background-position: -414px -90px;
+}
+
+.fam-cd-add {
+    background-position: -432px -90px;
+}
+
+.fam-cd-burn {
+    background-position: -450px -90px;
+}
+
+.fam-cd-delete {
+    background-position: -468px -90px;
+}
+
+.fam-cd-edit {
+    background-position: -486px -90px;
+}
+
+.fam-cd-eject {
+    background-position: -504px -90px;
+}
+
+.fam-cd-go {
+    background-position: -522px -90px;
+}
+
+.fam-chart-bar {
+    background-position: -540px -90px;
+}
+
+.fam-chart-bar-add {
+    background-position: -558px -90px;
+}
+
+.fam-chart-bar-delete {
+    background-position: -576px -90px;
+}
+
+.fam-chart-bar-edit {
+    background-position: -0px -108px;
+}
+
+.fam-chart-bar-error {
+    background-position: -18px -108px;
+}
+
+.fam-chart-bar-link {
+    background-position: -36px -108px;
+}
+
+.fam-chart-curve {
+    background-position: -54px -108px;
+}
+
+.fam-chart-curve-add {
+    background-position: -72px -108px;
+}
+
+.fam-chart-curve-delete {
+    background-position: -90px -108px;
+}
+
+.fam-chart-curve-edit {
+    background-position: -108px -108px;
+}
+
+.fam-chart-curve-error {
+    background-position: -126px -108px;
+}
+
+.fam-chart-curve-go {
+    background-position: -144px -108px;
+}
+
+.fam-chart-curve-link {
+    background-position: -162px -108px;
+}
+
+.fam-chart-line {
+    background-position: -180px -108px;
+}
+
+.fam-chart-line-add {
+    background-position: -198px -108px;
+}
+
+.fam-chart-line-delete {
+    background-position: -216px -108px;
+}
+
+.fam-chart-line-edit {
+    background-position: -234px -108px;
+}
+
+.fam-chart-line-error {
+    background-position: -252px -108px;
+}
+
+.fam-chart-line-link {
+    background-position: -270px -108px;
+}
+
+.fam-chart-organisation {
+    background-position: -288px -108px;
+}
+
+.fam-chart-organisation-add {
+    background-position: -306px -108px;
+}
+
+.fam-chart-organisation-delete {
+    background-position: -324px -108px;
+}
+
+.fam-chart-pie {
+    background-position: -342px -108px;
+}
+
+.fam-chart-pie-add {
+    background-position: -360px -108px;
+}
+
+.fam-chart-pie-delete {
+    background-position: -378px -108px;
+}
+
+.fam-chart-pie-edit {
+    background-position: -396px -108px;
+}
+
+.fam-chart-pie-error {
+    background-position: -414px -108px;
+}
+
+.fam-chart-pie-link {
+    background-position: -432px -108px;
+}
+
+.fam-clock {
+    background-position: -450px -108px;
+}
+
+.fam-clock-add {
+    background-position: -468px -108px;
+}
+
+.fam-clock-delete {
+    background-position: -486px -108px;
+}
+
+.fam-clock-edit {
+    background-position: -504px -108px;
+}
+
+.fam-clock-error {
+    background-position: -522px -108px;
+}
+
+.fam-clock-go {
+    background-position: -540px -108px;
+}
+
+.fam-clock-link {
+    background-position: -558px -108px;
+}
+
+.fam-clock-pause {
+    background-position: -576px -108px;
+}
+
+.fam-clock-play {
+    background-position: -0px -126px;
+}
+
+.fam-clock-red {
+    background-position: -18px -126px;
+}
+
+.fam-clock-stop {
+    background-position: -36px -126px;
+}
+
+.fam-cog {
+    background-position: -54px -126px;
+}
+
+.fam-cog-add {
+    background-position: -72px -126px;
+}
+
+.fam-cog-delete {
+    background-position: -90px -126px;
+}
+
+.fam-cog-edit {
+    background-position: -108px -126px;
+}
+
+.fam-cog-error {
+    background-position: -126px -126px;
+}
+
+.fam-cog-go {
+    background-position: -144px -126px;
+}
+
+.fam-coins {
+    background-position: -162px -126px;
+}
+
+.fam-coins-add {
+    background-position: -180px -126px;
+}
+
+.fam-coins-delete {
+    background-position: -198px -126px;
+}
+
+.fam-color-swatch {
+    background-position: -216px -126px;
+}
+
+.fam-color-wheel {
+    background-position: -234px -126px;
+}
+
+.fam-comment {
+    background-position: -252px -126px;
+}
+
+.fam-comment-add {
+    background-position: -270px -126px;
+}
+
+.fam-comment-delete {
+    background-position: -288px -126px;
+}
+
+.fam-comment-edit {
+    background-position: -306px -126px;
+}
+
+.fam-comments {
+    background-position: -324px -126px;
+}
+
+.fam-comments-add {
+    background-position: -342px -126px;
+}
+
+.fam-comments-delete {
+    background-position: -360px -126px;
+}
+
+.fam-compress {
+    background-position: -378px -126px;
+}
+
+.fam-computer {
+    background-position: -396px -126px;
+}
+
+.fam-computer-add {
+    background-position: -414px -126px;
+}
+
+.fam-computer-delete {
+    background-position: -432px -126px;
+}
+
+.fam-computer-edit {
+    background-position: -450px -126px;
+}
+
+.fam-computer-error {
+    background-position: -468px -126px;
+}
+
+.fam-computer-go {
+    background-position: -486px -126px;
+}
+
+.fam-computer-key {
+    background-position: -504px -126px;
+}
+
+.fam-computer-link {
+    background-position: -522px -126px;
+}
+
+.fam-connect {
+    background-position: -540px -126px;
+}
+
+.fam-contrast {
+    background-position: -558px -126px;
+}
+
+.fam-contrast-decrease {
+    background-position: -576px -126px;
+}
+
+.fam-contrast-high {
+    background-position: -0px -144px;
+}
+
+.fam-contrast-increase {
+    background-position: -18px -144px;
+}
+
+.fam-contrast-low {
+    background-position: -36px -144px;
+}
+
+.fam-control-eject {
+    background-position: -54px -144px;
+}
+
+.fam-control-eject-blue {
+    background-position: -72px -144px;
+}
+
+.fam-control-end {
+    background-position: -90px -144px;
+}
+
+.fam-control-end-blue {
+    background-position: -108px -144px;
+}
+
+.fam-control-equalizer {
+    background-position: -126px -144px;
+}
+
+.fam-control-equalizer-blue {
+    background-position: -144px -144px;
+}
+
+.fam-control-fastforward {
+    background-position: -162px -144px;
+}
+
+.fam-control-fastforward-blue {
+    background-position: -180px -144px;
+}
+
+.fam-control-pause {
+    background-position: -198px -144px;
+}
+
+.fam-control-pause-blue {
+    background-position: -216px -144px;
+}
+
+.fam-control-play {
+    background-position: -234px -144px;
+}
+
+.fam-control-play-blue {
+    background-position: -252px -144px;
+}
+
+.fam-control-repeat {
+    background-position: -270px -144px;
+}
+
+.fam-control-repeat-blue {
+    background-position: -288px -144px;
+}
+
+.fam-control-rewind {
+    background-position: -306px -144px;
+}
+
+.fam-control-rewind-blue {
+    background-position: -324px -144px;
+}
+
+.fam-control-start {
+    background-position: -342px -144px;
+}
+
+.fam-control-start-blue {
+    background-position: -360px -144px;
+}
+
+.fam-control-stop {
+    background-position: -378px -144px;
+}
+
+.fam-control-stop-blue {
+    background-position: -396px -144px;
+}
+
+.fam-controller {
+    background-position: -414px -144px;
+}
+
+.fam-controller-add {
+    background-position: -432px -144px;
+}
+
+.fam-controller-delete {
+    background-position: -450px -144px;
+}
+
+.fam-controller-error {
+    background-position: -468px -144px;
+}
+
+.fam-creditcards {
+    background-position: -486px -144px;
+}
+
+.fam-cross {
+    background-position: -504px -144px;
+}
+
+.fam-css {
+    background-position: -522px -144px;
+}
+
+.fam-css-add {
+    background-position: -540px -144px;
+}
+
+.fam-css-delete {
+    background-position: -558px -144px;
+}
+
+.fam-css-go {
+    background-position: -576px -144px;
+}
+
+.fam-css-valid {
+    background-position: -0px -162px;
+}
+
+.fam-cup {
+    background-position: -18px -162px;
+}
+
+.fam-cup-add {
+    background-position: -36px -162px;
+}
+
+.fam-cup-delete {
+    background-position: -54px -162px;
+}
+
+.fam-cup-edit {
+    background-position: -72px -162px;
+}
+
+.fam-cup-error {
+    background-position: -90px -162px;
+}
+
+.fam-cup-go {
+    background-position: -108px -162px;
+}
+
+.fam-cup-key {
+    background-position: -126px -162px;
+}
+
+.fam-cup-link {
+    background-position: -144px -162px;
+}
+
+.fam-cursor {
+    background-position: -162px -162px;
+}
+
+.fam-cut {
+    background-position: -180px -162px;
+}
+
+.fam-cut-red {
+    background-position: -198px -162px;
+}
+
+.fam-database {
+    background-position: -216px -162px;
+}
+
+.fam-database-add {
+    background-position: -234px -162px;
+}
+
+.fam-database-connect {
+    background-position: -252px -162px;
+}
+
+.fam-database-delete {
+    background-position: -270px -162px;
+}
+
+.fam-database-edit {
+    background-position: -288px -162px;
+}
+
+.fam-database-error {
+    background-position: -306px -162px;
+}
+
+.fam-database-gear {
+    background-position: -324px -162px;
+}
+
+.fam-database-go {
+    background-position: -342px -162px;
+}
+
+.fam-database-key {
+    background-position: -360px -162px;
+}
+
+.fam-database-lightning {
+    background-position: -378px -162px;
+}
+
+.fam-database-link {
+    background-position: -396px -162px;
+}
+
+.fam-database-refresh {
+    background-position: -414px -162px;
+}
+
+.fam-database-save {
+    background-position: -432px -162px;
+}
+
+.fam-database-table {
+    background-position: -450px -162px;
+}
+
+.fam-date {
+    background-position: -468px -162px;
+}
+
+.fam-date-add {
+    background-position: -486px -162px;
+}
+
+.fam-date-delete {
+    background-position: -504px -162px;
+}
+
+.fam-date-edit {
+    background-position: -522px -162px;
+}
+
+.fam-date-error {
+    background-position: -540px -162px;
+}
+
+.fam-date-go {
+    background-position: -558px -162px;
+}
+
+.fam-date-link {
+    background-position: -576px -162px;
+}
+
+.fam-date-magnify {
+    background-position: -0px -180px;
+}
+
+.fam-date-next {
+    background-position: -18px -180px;
+}
+
+.fam-date-previous {
+    background-position: -36px -180px;
+}
+
+.fam-delete {
+    background-position: -54px -180px;
+}
+
+.fam-disconnect {
+    background-position: -72px -180px;
+}
+
+.fam-disk {
+    background-position: -90px -180px;
+}
+
+.fam-disk-multiple {
+    background-position: -108px -180px;
+}
+
+.fam-door {
+    background-position: -126px -180px;
+}
+
+.fam-door-in {
+    background-position: -144px -180px;
+}
+
+.fam-door-open {
+    background-position: -162px -180px;
+}
+
+.fam-door-out {
+    background-position: -180px -180px;
+}
+
+.fam-drink {
+    background-position: -198px -180px;
+}
+
+.fam-drink-empty {
+    background-position: -216px -180px;
+}
+
+.fam-drive {
+    background-position: -234px -180px;
+}
+
+.fam-drive-add {
+    background-position: -252px -180px;
+}
+
+.fam-drive-burn {
+    background-position: -270px -180px;
+}
+
+.fam-drive-cd {
+    background-position: -288px -180px;
+}
+
+.fam-drive-cd-empty {
+    background-position: -306px -180px;
+}
+
+.fam-drive-delete {
+    background-position: -324px -180px;
+}
+
+.fam-drive-disk {
+    background-position: -342px -180px;
+}
+
+.fam-drive-edit {
+    background-position: -360px -180px;
+}
+
+.fam-drive-error {
+    background-position: -378px -180px;
+}
+
+.fam-drive-go {
+    background-position: -396px -180px;
+}
+
+.fam-drive-key {
+    background-position: -414px -180px;
+}
+
+.fam-drive-link {
+    background-position: -432px -180px;
+}
+
+.fam-drive-magnify {
+    background-position: -450px -180px;
+}
+
+.fam-drive-network {
+    background-position: -468px -180px;
+}
+
+.fam-drive-rename {
+    background-position: -486px -180px;
+}
+
+.fam-drive-user {
+    background-position: -504px -180px;
+}
+
+.fam-drive-web {
+    background-position: -522px -180px;
+}
+
+.fam-dvd {
+    background-position: -540px -180px;
+}
+
+.fam-dvd-add {
+    background-position: -558px -180px;
+}
+
+.fam-dvd-delete {
+    background-position: -576px -180px;
+}
+
+.fam-dvd-edit {
+    background-position: -0px -198px;
+}
+
+.fam-dvd-error {
+    background-position: -18px -198px;
+}
+
+.fam-dvd-go {
+    background-position: -36px -198px;
+}
+
+.fam-dvd-key {
+    background-position: -54px -198px;
+}
+
+.fam-dvd-link {
+    background-position: -72px -198px;
+}
+
+.fam-email {
+    background-position: -90px -198px;
+}
+
+.fam-email-add {
+    background-position: -108px -198px;
+}
+
+.fam-email-attach {
+    background-position: -126px -198px;
+}
+
+.fam-email-delete {
+    background-position: -144px -198px;
+}
+
+.fam-email-edit {
+    background-position: -162px -198px;
+}
+
+.fam-email-error {
+    background-position: -180px -198px;
+}
+
+.fam-email-go {
+    background-position: -198px -198px;
+}
+
+.fam-email-link {
+    background-position: -216px -198px;
+}
+
+.fam-email-open {
+    background-position: -234px -198px;
+}
+
+.fam-email-open-image {
+    background-position: -252px -198px;
+}
+
+.fam-emo.fam-evilgrin {
+    background-position: -270px -198px;
+}
+
+.fam-emo.fam-grin {
+    background-position: -288px -198px;
+}
+
+.fam-emo.fam-happy {
+    background-position: -306px -198px;
+}
+
+.fam-emo.fam-smile {
+    background-position: -324px -198px;
+}
+
+.fam-emo.fam-surprised {
+    background-position: -342px -198px;
+}
+
+.fam-emo.fam-tongue {
+    background-position: -360px -198px;
+}
+
+.fam-emo.fam-unhappy {
+    background-position: -378px -198px;
+}
+
+.fam-emo.fam-waii {
+    background-position: -396px -198px;
+}
+
+.fam-emo.fam-wink {
+    background-position: -414px -198px;
+}
+
+.fam-error {
+    background-position: -432px -198px;
+}
+
+.fam-error-add {
+    background-position: -450px -198px;
+}
+
+.fam-error-delete {
+    background-position: -468px -198px;
+}
+
+.fam-error-go {
+    background-position: -486px -198px;
+}
+
+.fam-exclamation {
+    background-position: -504px -198px;
+}
+
+.fam-eye {
+    background-position: -522px -198px;
+}
+
+.fam-feed {
+    background-position: -540px -198px;
+}
+
+.fam-feed-add {
+    background-position: -558px -198px;
+}
+
+.fam-feed-delete {
+    background-position: -576px -198px;
+}
+
+.fam-feed-disk {
+    background-position: -0px -216px;
+}
+
+.fam-feed-edit {
+    background-position: -18px -216px;
+}
+
+.fam-feed-error {
+    background-position: -36px -216px;
+}
+
+.fam-feed-go {
+    background-position: -54px -216px;
+}
+
+.fam-feed-key {
+    background-position: -72px -216px;
+}
+
+.fam-feed-link {
+    background-position: -90px -216px;
+}
+
+.fam-feed-magnify {
+    background-position: -108px -216px;
+}
+
+.fam-female {
+    background-position: -126px -216px;
+}
+
+.fam-film {
+    background-position: -144px -216px;
+}
+
+.fam-film-add {
+    background-position: -162px -216px;
+}
+
+.fam-film-delete {
+    background-position: -180px -216px;
+}
+
+.fam-film-edit {
+    background-position: -198px -216px;
+}
+
+.fam-film-error {
+    background-position: -216px -216px;
+}
+
+.fam-film-go {
+    background-position: -234px -216px;
+}
+
+.fam-film-key {
+    background-position: -252px -216px;
+}
+
+.fam-film-link {
+    background-position: -270px -216px;
+}
+
+.fam-film-save {
+    background-position: -288px -216px;
+}
+
+.fam-find {
+    background-position: -306px -216px;
+}
+
+.fam-flag-blue {
+    background-position: -324px -216px;
+}
+
+.fam-flag-green {
+    background-position: -342px -216px;
+}
+
+.fam-flag-orange {
+    background-position: -360px -216px;
+}
+
+.fam-flag-pink {
+    background-position: -378px -216px;
+}
+
+.fam-flag-purple {
+    background-position: -396px -216px;
+}
+
+.fam-flag-red {
+    background-position: -414px -216px;
+}
+
+.fam-flag-yellow {
+    background-position: -432px -216px;
+}
+
+.fam-folder {
+    background-position: -450px -216px;
+}
+
+.fam-folder-add {
+    background-position: -468px -216px;
+}
+
+.fam-folder-bell {
+    background-position: -486px -216px;
+}
+
+.fam-folder-brick {
+    background-position: -504px -216px;
+}
+
+.fam-folder-bug {
+    background-position: -522px -216px;
+}
+
+.fam-folder-camera {
+    background-position: -540px -216px;
+}
+
+.fam-folder-database {
+    background-position: -558px -216px;
+}
+
+.fam-folder-delete {
+    background-position: -576px -216px;
+}
+
+.fam-folder-edit {
+    background-position: -0px -234px;
+}
+
+.fam-folder-error {
+    background-position: -18px -234px;
+}
+
+.fam-folder-explore {
+    background-position: -36px -234px;
+}
+
+.fam-folder-feed {
+    background-position: -54px -234px;
+}
+
+.fam-folder-find {
+    background-position: -72px -234px;
+}
+
+.fam-folder-go {
+    background-position: -90px -234px;
+}
+
+.fam-folder-heart {
+    background-position: -108px -234px;
+}
+
+.fam-folder-image {
+    background-position: -126px -234px;
+}
+
+.fam-folder-key {
+    background-position: -144px -234px;
+}
+
+.fam-folder-lightbulb {
+    background-position: -162px -234px;
+}
+
+.fam-folder-link {
+    background-position: -180px -234px;
+}
+
+.fam-folder-magnify {
+    background-position: -198px -234px;
+}
+
+.fam-folder-page {
+    background-position: -216px -234px;
+}
+
+.fam-folder-page-white {
+    background-position: -234px -234px;
+}
+
+.fam-folder-palette {
+    background-position: -252px -234px;
+}
+
+.fam-folder-picture {
+    background-position: -270px -234px;
+}
+
+.fam-folder-star {
+    background-position: -288px -234px;
+}
+
+.fam-folder-table {
+    background-position: -306px -234px;
+}
+
+.fam-folder-user {
+    background-position: -324px -234px;
+}
+
+.fam-folder-wrench {
+    background-position: -342px -234px;
+}
+
+.fam-font {
+    background-position: -360px -234px;
+}
+
+.fam-font-add {
+    background-position: -378px -234px;
+}
+
+.fam-font-delete {
+    background-position: -396px -234px;
+}
+
+.fam-font-go {
+    background-position: -414px -234px;
+}
+
+.fam-group {
+    background-position: -432px -234px;
+}
+
+.fam-group-add {
+    background-position: -450px -234px;
+}
+
+.fam-group-delete {
+    background-position: -468px -234px;
+}
+
+.fam-group-edit {
+    background-position: -486px -234px;
+}
+
+.fam-group-error {
+    background-position: -504px -234px;
+}
+
+.fam-group-gear {
+    background-position: -522px -234px;
+}
+
+.fam-group-go {
+    background-position: -540px -234px;
+}
+
+.fam-group-key {
+    background-position: -558px -234px;
+}
+
+.fam-group-link {
+    background-position: -576px -234px;
+}
+
+.fam-heart {
+    background-position: -0px -252px;
+}
+
+.fam-heart-add {
+    background-position: -18px -252px;
+}
+
+.fam-heart-delete {
+    background-position: -36px -252px;
+}
+
+.fam-help {
+    background-position: -54px -252px;
+}
+
+.fam-hourglass {
+    background-position: -72px -252px;
+}
+
+.fam-hourglass-add {
+    background-position: -90px -252px;
+}
+
+.fam-hourglass-delete {
+    background-position: -108px -252px;
+}
+
+.fam-hourglass-go {
+    background-position: -126px -252px;
+}
+
+.fam-hourglass-link {
+    background-position: -144px -252px;
+}
+
+.fam-house {
+    background-position: -162px -252px;
+}
+
+.fam-house-go {
+    background-position: -180px -252px;
+}
+
+.fam-house-link {
+    background-position: -198px -252px;
+}
+
+.fam-html {
+    background-position: -216px -252px;
+}
+
+.fam-html-add {
+    background-position: -234px -252px;
+}
+
+.fam-html-delete {
+    background-position: -252px -252px;
+}
+
+.fam-html-go {
+    background-position: -270px -252px;
+}
+
+.fam-html-valid {
+    background-position: -288px -252px;
+}
+
+.fam-image {
+    background-position: -306px -252px;
+}
+
+.fam-image-add {
+    background-position: -324px -252px;
+}
+
+.fam-image-delete {
+    background-position: -342px -252px;
+}
+
+.fam-image-edit {
+    background-position: -360px -252px;
+}
+
+.fam-image-link {
+    background-position: -378px -252px;
+}
+
+.fam-images {
+    background-position: -396px -252px;
+}
+
+.fam-information {
+    background-position: -414px -252px;
+}
+
+.fam-ipod {
+    background-position: -432px -252px;
+}
+
+.fam-ipod-cast {
+    background-position: -450px -252px;
+}
+
+.fam-ipod-cast-add {
+    background-position: -468px -252px;
+}
+
+.fam-ipod-cast-delete {
+    background-position: -486px -252px;
+}
+
+.fam-ipod-sound {
+    background-position: -504px -252px;
+}
+
+.fam-joystick {
+    background-position: -522px -252px;
+}
+
+.fam-joystick-add {
+    background-position: -540px -252px;
+}
+
+.fam-joystick-delete {
+    background-position: -558px -252px;
+}
+
+.fam-joystick-error {
+    background-position: -576px -252px;
+}
+
+.fam-key {
+    background-position: -0px -270px;
+}
+
+.fam-key-add {
+    background-position: -18px -270px;
+}
+
+.fam-key-delete {
+    background-position: -36px -270px;
+}
+
+.fam-key-go {
+    background-position: -54px -270px;
+}
+
+.fam-keyboard {
+    background-position: -72px -270px;
+}
+
+.fam-keyboard-add {
+    background-position: -90px -270px;
+}
+
+.fam-keyboard-delete {
+    background-position: -108px -270px;
+}
+
+.fam-keyboard-magnify {
+    background-position: -126px -270px;
+}
+
+.fam-layers {
+    background-position: -144px -270px;
+}
+
+.fam-layout {
+    background-position: -162px -270px;
+}
+
+.fam-layout-add {
+    background-position: -180px -270px;
+}
+
+.fam-layout-content {
+    background-position: -198px -270px;
+}
+
+.fam-layout-delete {
+    background-position: -216px -270px;
+}
+
+.fam-layout-edit {
+    background-position: -234px -270px;
+}
+
+.fam-layout-error {
+    background-position: -252px -270px;
+}
+
+.fam-layout-header {
+    background-position: -270px -270px;
+}
+
+.fam-layout-link {
+    background-position: -288px -270px;
+}
+
+.fam-layout-sidebar {
+    background-position: -306px -270px;
+}
+
+.fam-lightbulb {
+    background-position: -324px -270px;
+}
+
+.fam-lightbulb-add {
+    background-position: -342px -270px;
+}
+
+.fam-lightbulb-delete {
+    background-position: -360px -270px;
+}
+
+.fam-lightbulb-off {
+    background-position: -378px -270px;
+}
+
+.fam-lightning {
+    background-position: -396px -270px;
+}
+
+.fam-lightning-add {
+    background-position: -414px -270px;
+}
+
+.fam-lightning-delete {
+    background-position: -432px -270px;
+}
+
+.fam-lightning-go {
+    background-position: -450px -270px;
+}
+
+.fam-link {
+    background-position: -468px -270px;
+}
+
+.fam-link-add {
+    background-position: -486px -270px;
+}
+
+.fam-link-break {
+    background-position: -504px -270px;
+}
+
+.fam-link-delete {
+    background-position: -522px -270px;
+}
+
+.fam-link-edit {
+    background-position: -540px -270px;
+}
+
+.fam-link-error {
+    background-position: -558px -270px;
+}
+
+.fam-link-go {
+    background-position: -576px -270px;
+}
+
+.fam-lock {
+    background-position: -0px -288px;
+}
+
+.fam-lock-add {
+    background-position: -18px -288px;
+}
+
+.fam-lock-break {
+    background-position: -36px -288px;
+}
+
+.fam-lock-delete {
+    background-position: -54px -288px;
+}
+
+.fam-lock-edit {
+    background-position: -72px -288px;
+}
+
+.fam-lock-go {
+    background-position: -90px -288px;
+}
+
+.fam-lock-open {
+    background-position: -108px -288px;
+}
+
+.fam-lorry {
+    background-position: -126px -288px;
+}
+
+.fam-lorry-add {
+    background-position: -144px -288px;
+}
+
+.fam-lorry-delete {
+    background-position: -162px -288px;
+}
+
+.fam-lorry-error {
+    background-position: -180px -288px;
+}
+
+.fam-lorry-flatbed {
+    background-position: -198px -288px;
+}
+
+.fam-lorry-go {
+    background-position: -216px -288px;
+}
+
+.fam-lorry-link {
+    background-position: -234px -288px;
+}
+
+.fam-magifier-zoom-out {
+    background-position: -252px -288px;
+}
+
+.fam-magnifier {
+    background-position: -270px -288px;
+}
+
+.fam-magnifier-zoom-in {
+    background-position: -288px -288px;
+}
+
+.fam-male {
+    background-position: -306px -288px;
+}
+
+.fam-map {
+    background-position: -324px -288px;
+}
+
+.fam-map-add {
+    background-position: -342px -288px;
+}
+
+.fam-map-delete {
+    background-position: -360px -288px;
+}
+
+.fam-map-edit {
+    background-position: -378px -288px;
+}
+
+.fam-map-go {
+    background-position: -396px -288px;
+}
+
+.fam-map-magnify {
+    background-position: -414px -288px;
+}
+
+.fam-medal-bronze-1 {
+    background-position: -432px -288px;
+}
+
+.fam-medal-bronze-2 {
+    background-position: -450px -288px;
+}
+
+.fam-medal-bronze-3 {
+    background-position: -468px -288px;
+}
+
+.fam-medal-bronze-add {
+    background-position: -486px -288px;
+}
+
+.fam-medal-bronze-delete {
+    background-position: -504px -288px;
+}
+
+.fam-medal-gold-1 {
+    background-position: -522px -288px;
+}
+
+.fam-medal-gold-2 {
+    background-position: -540px -288px;
+}
+
+.fam-medal-gold-3 {
+    background-position: -558px -288px;
+}
+
+.fam-medal-gold-add {
+    background-position: -576px -288px;
+}
+
+.fam-medal-gold-delete {
+    background-position: -0px -306px;
+}
+
+.fam-medal-silver-1 {
+    background-position: -18px -306px;
+}
+
+.fam-medal-silver-2 {
+    background-position: -36px -306px;
+}
+
+.fam-medal-silver-3 {
+    background-position: -54px -306px;
+}
+
+.fam-medal-silver-add {
+    background-position: -72px -306px;
+}
+
+.fam-medal-silver-delete {
+    background-position: -90px -306px;
+}
+
+.fam-money {
+    background-position: -108px -306px;
+}
+
+.fam-money-add {
+    background-position: -126px -306px;
+}
+
+.fam-money-delete {
+    background-position: -144px -306px;
+}
+
+.fam-money-dollar {
+    background-position: -162px -306px;
+}
+
+.fam-money-euro {
+    background-position: -180px -306px;
+}
+
+.fam-money-pound {
+    background-position: -198px -306px;
+}
+
+.fam-money-yen {
+    background-position: -216px -306px;
+}
+
+.fam-monitor {
+    background-position: -234px -306px;
+}
+
+.fam-monitor-add {
+    background-position: -252px -306px;
+}
+
+.fam-monitor-delete {
+    background-position: -270px -306px;
+}
+
+.fam-monitor-edit {
+    background-position: -288px -306px;
+}
+
+.fam-monitor-error {
+    background-position: -306px -306px;
+}
+
+.fam-monitor-go {
+    background-position: -324px -306px;
+}
+
+.fam-monitor-lightning {
+    background-position: -342px -306px;
+}
+
+.fam-monitor-link {
+    background-position: -360px -306px;
+}
+
+.fam-mouse {
+    background-position: -378px -306px;
+}
+
+.fam-mouse-add {
+    background-position: -396px -306px;
+}
+
+.fam-mouse-delete {
+    background-position: -414px -306px;
+}
+
+.fam-mouse-error {
+    background-position: -432px -306px;
+}
+
+.fam-music {
+    background-position: -450px -306px;
+}
+
+.fam-new {
+    background-position: -468px -306px;
+}
+
+.fam-newspaper {
+    background-position: -486px -306px;
+}
+
+.fam-newspaper-add {
+    background-position: -504px -306px;
+}
+
+.fam-newspaper-delete {
+    background-position: -522px -306px;
+}
+
+.fam-newspaper-go {
+    background-position: -540px -306px;
+}
+
+.fam-newspaper-link {
+    background-position: -558px -306px;
+}
+
+.fam-note {
+    background-position: -576px -306px;
+}
+
+.fam-note-add {
+    background-position: -0px -324px;
+}
+
+.fam-note-delete {
+    background-position: -18px -324px;
+}
+
+.fam-note-edit {
+    background-position: -36px -324px;
+}
+
+.fam-note-error {
+    background-position: -54px -324px;
+}
+
+.fam-note-go {
+    background-position: -72px -324px;
+}
+
+.fam-overlays {
+    background-position: -90px -324px;
+}
+
+.fam-package {
+    background-position: -108px -324px;
+}
+
+.fam-package-add {
+    background-position: -126px -324px;
+}
+
+.fam-package-delete {
+    background-position: -144px -324px;
+}
+
+.fam-package-go {
+    background-position: -162px -324px;
+}
+
+.fam-package-green {
+    background-position: -180px -324px;
+}
+
+.fam-package-link {
+    background-position: -198px -324px;
+}
+
+.fam-page {
+    background-position: -216px -324px;
+}
+
+.fam-page-add {
+    background-position: -234px -324px;
+}
+
+.fam-page-attach {
+    background-position: -252px -324px;
+}
+
+.fam-page-code {
+    background-position: -270px -324px;
+}
+
+.fam-page-copy {
+    background-position: -288px -324px;
+}
+
+.fam-page-delete {
+    background-position: -306px -324px;
+}
+
+.fam-page-edit {
+    background-position: -324px -324px;
+}
+
+.fam-page-error {
+    background-position: -342px -324px;
+}
+
+.fam-page-excel {
+    background-position: -360px -324px;
+}
+
+.fam-page-find {
+    background-position: -378px -324px;
+}
+
+.fam-page-gear {
+    background-position: -396px -324px;
+}
+
+.fam-page-go {
+    background-position: -414px -324px;
+}
+
+.fam-page-green {
+    background-position: -432px -324px;
+}
+
+.fam-page-key {
+    background-position: -450px -324px;
+}
+
+.fam-page-lightning {
+    background-position: -468px -324px;
+}
+
+.fam-page-link {
+    background-position: -486px -324px;
+}
+
+.fam-page-paintbrush {
+    background-position: -504px -324px;
+}
+
+.fam-page-paste {
+    background-position: -522px -324px;
+}
+
+.fam-page-red {
+    background-position: -540px -324px;
+}
+
+.fam-page-refresh {
+    background-position: -558px -324px;
+}
+
+.fam-page-save {
+    background-position: -576px -324px;
+}
+
+.fam-page-white {
+    background-position: -0px -342px;
+}
+
+.fam-page-white-acrobat {
+    background-position: -18px -342px;
+}
+
+.fam-page-white-actionscript {
+    background-position: -36px -342px;
+}
+
+.fam-page-white-add {
+    background-position: -54px -342px;
+}
+
+.fam-page-white-c {
+    background-position: -72px -342px;
+}
+
+.fam-page-white-camera {
+    background-position: -90px -342px;
+}
+
+.fam-page-white-cd {
+    background-position: -108px -342px;
+}
+
+.fam-page-white-code {
+    background-position: -126px -342px;
+}
+
+.fam-page-white-code-red {
+    background-position: -144px -342px;
+}
+
+.fam-page-white-coldfusion {
+    background-position: -162px -342px;
+}
+
+.fam-page-white-compressed {
+    background-position: -180px -342px;
+}
+
+.fam-page-white-copy {
+    background-position: -198px -342px;
+}
+
+.fam-page-white-cplusplus {
+    background-position: -216px -342px;
+}
+
+.fam-page-white-csharp {
+    background-position: -234px -342px;
+}
+
+.fam-page-white-cup {
+    background-position: -252px -342px;
+}
+
+.fam-page-white-database {
+    background-position: -270px -342px;
+}
+
+.fam-page-white-delete {
+    background-position: -288px -342px;
+}
+
+.fam-page-white-dvd {
+    background-position: -306px -342px;
+}
+
+.fam-page-white-edit {
+    background-position: -324px -342px;
+}
+
+.fam-page-white-error {
+    background-position: -342px -342px;
+}
+
+.fam-page-white-excel {
+    background-position: -360px -342px;
+}
+
+.fam-page-white-find {
+    background-position: -378px -342px;
+}
+
+.fam-page-white-flash {
+    background-position: -396px -342px;
+}
+
+.fam-page-white-freehand {
+    background-position: -414px -342px;
+}
+
+.fam-page-white-gear {
+    background-position: -432px -342px;
+}
+
+.fam-page-white-get {
+    background-position: -450px -342px;
+}
+
+.fam-page-white-go {
+    background-position: -468px -342px;
+}
+
+.fam-page-white-h {
+    background-position: -486px -342px;
+}
+
+.fam-page-white-horizontal {
+    background-position: -504px -342px;
+}
+
+.fam-page-white-key {
+    background-position: -522px -342px;
+}
+
+.fam-page-white-lightning {
+    background-position: -540px -342px;
+}
+
+.fam-page-white-link {
+    background-position: -558px -342px;
+}
+
+.fam-page-white-magnify {
+    background-position: -576px -342px;
+}
+
+.fam-page-white-medal {
+    background-position: -0px -360px;
+}
+
+.fam-page-white-office {
+    background-position: -18px -360px;
+}
+
+.fam-page-white-paint {
+    background-position: -36px -360px;
+}
+
+.fam-page-white-paintbrush {
+    background-position: -54px -360px;
+}
+
+.fam-page-white-paste {
+    background-position: -72px -360px;
+}
+
+.fam-page-white-php {
+    background-position: -90px -360px;
+}
+
+.fam-page-white-picture {
+    background-position: -108px -360px;
+}
+
+.fam-page-white-powerpoint {
+    background-position: -126px -360px;
+}
+
+.fam-page-white-put {
+    background-position: -144px -360px;
+}
+
+.fam-page-white-ruby {
+    background-position: -162px -360px;
+}
+
+.fam-page-white-stack {
+    background-position: -180px -360px;
+}
+
+.fam-page-white-star {
+    background-position: -198px -360px;
+}
+
+.fam-page-white-swoosh {
+    background-position: -216px -360px;
+}
+
+.fam-page-white-text {
+    background-position: -234px -360px;
+}
+
+.fam-page-white-text-width {
+    background-position: -252px -360px;
+}
+
+.fam-page-white-tux {
+    background-position: -270px -360px;
+}
+
+.fam-page-white-vector {
+    background-position: -288px -360px;
+}
+
+.fam-page-white-visualstudio {
+    background-position: -306px -360px;
+}
+
+.fam-page-white-width {
+    background-position: -324px -360px;
+}
+
+.fam-page-white-word {
+    background-position: -342px -360px;
+}
+
+.fam-page-white-world {
+    background-position: -360px -360px;
+}
+
+.fam-page-white-wrench {
+    background-position: -378px -360px;
+}
+
+.fam-page-white-zip {
+    background-position: -396px -360px;
+}
+
+.fam-page-word {
+    background-position: -414px -360px;
+}
+
+.fam-page-world {
+    background-position: -432px -360px;
+}
+
+.fam-paintbrush {
+    background-position: -450px -360px;
+}
+
+.fam-paintcan {
+    background-position: -468px -360px;
+}
+
+.fam-palette {
+    background-position: -486px -360px;
+}
+
+.fam-paste-plain {
+    background-position: -504px -360px;
+}
+
+.fam-paste-word {
+    background-position: -522px -360px;
+}
+
+.fam-pencil {
+    background-position: -540px -360px;
+}
+
+.fam-pencil-add {
+    background-position: -558px -360px;
+}
+
+.fam-pencil-delete {
+    background-position: -576px -360px;
+}
+
+.fam-pencil-go {
+    background-position: -0px -378px;
+}
+
+.fam-phone {
+    background-position: -18px -378px;
+}
+
+.fam-phone-add {
+    background-position: -36px -378px;
+}
+
+.fam-phone-delete {
+    background-position: -54px -378px;
+}
+
+.fam-phone-sound {
+    background-position: -72px -378px;
+}
+
+.fam-photo {
+    background-position: -90px -378px;
+}
+
+.fam-photo-add {
+    background-position: -108px -378px;
+}
+
+.fam-photo-delete {
+    background-position: -126px -378px;
+}
+
+.fam-photo-link {
+    background-position: -144px -378px;
+}
+
+.fam-photos {
+    background-position: -162px -378px;
+}
+
+.fam-picture {
+    background-position: -180px -378px;
+}
+
+.fam-picture-add {
+    background-position: -198px -378px;
+}
+
+.fam-picture-delete {
+    background-position: -216px -378px;
+}
+
+.fam-picture-edit {
+    background-position: -234px -378px;
+}
+
+.fam-picture-empty {
+    background-position: -252px -378px;
+}
+
+.fam-picture-error {
+    background-position: -270px -378px;
+}
+
+.fam-picture-go {
+    background-position: -288px -378px;
+}
+
+.fam-picture-key {
+    background-position: -306px -378px;
+}
+
+.fam-picture-link {
+    background-position: -324px -378px;
+}
+
+.fam-picture-save {
+    background-position: -342px -378px;
+}
+
+.fam-pictures {
+    background-position: -360px -378px;
+}
+
+.fam-pilcrow {
+    background-position: -378px -378px;
+}
+
+.fam-pill {
+    background-position: -396px -378px;
+}
+
+.fam-pill-add {
+    background-position: -414px -378px;
+}
+
+.fam-pill-delete {
+    background-position: -432px -378px;
+}
+
+.fam-pill-go {
+    background-position: -450px -378px;
+}
+
+.fam-plugin {
+    background-position: -468px -378px;
+}
+
+.fam-plugin-add {
+    background-position: -486px -378px;
+}
+
+.fam-plugin-delete {
+    background-position: -504px -378px;
+}
+
+.fam-plugin-disabled {
+    background-position: -522px -378px;
+}
+
+.fam-plugin-edit {
+    background-position: -540px -378px;
+}
+
+.fam-plugin-error {
+    background-position: -558px -378px;
+}
+
+.fam-plugin-go {
+    background-position: -576px -378px;
+}
+
+.fam-plugin-link {
+    background-position: -0px -396px;
+}
+
+.fam-printer {
+    background-position: -18px -396px;
+}
+
+.fam-printer-add {
+    background-position: -36px -396px;
+}
+
+.fam-printer-delete {
+    background-position: -54px -396px;
+}
+
+.fam-printer-empty {
+    background-position: -72px -396px;
+}
+
+.fam-printer-error {
+    background-position: -90px -396px;
+}
+
+.fam-rainbow {
+    background-position: -108px -396px;
+}
+
+.fam-report {
+    background-position: -126px -396px;
+}
+
+.fam-report-add {
+    background-position: -144px -396px;
+}
+
+.fam-report-delete {
+    background-position: -162px -396px;
+}
+
+.fam-report-disk {
+    background-position: -180px -396px;
+}
+
+.fam-report-edit {
+    background-position: -198px -396px;
+}
+
+.fam-report-go {
+    background-position: -216px -396px;
+}
+
+.fam-report-key {
+    background-position: -234px -396px;
+}
+
+.fam-report-link {
+    background-position: -252px -396px;
+}
+
+.fam-report-magnify {
+    background-position: -270px -396px;
+}
+
+.fam-report-picture {
+    background-position: -288px -396px;
+}
+
+.fam-report-user {
+    background-position: -306px -396px;
+}
+
+.fam-report-word {
+    background-position: -324px -396px;
+}
+
+.fam-resultset-first {
+    background-position: -342px -396px;
+}
+
+.fam-resultset-last {
+    background-position: -360px -396px;
+}
+
+.fam-resultset-next {
+    background-position: -378px -396px;
+}
+
+.fam-resultset-previous {
+    background-position: -396px -396px;
+}
+
+.fam-rosette {
+    background-position: -414px -396px;
+}
+
+.fam-rss {
+    background-position: -432px -396px;
+}
+
+.fam-rss-add {
+    background-position: -450px -396px;
+}
+
+.fam-rss-delete {
+    background-position: -468px -396px;
+}
+
+.fam-rss-go {
+    background-position: -486px -396px;
+}
+
+.fam-rss-valid {
+    background-position: -504px -396px;
+}
+
+.fam-ruby {
+    background-position: -522px -396px;
+}
+
+.fam-ruby-add {
+    background-position: -540px -396px;
+}
+
+.fam-ruby-delete {
+    background-position: -558px -396px;
+}
+
+.fam-ruby-gear {
+    background-position: -576px -396px;
+}
+
+.fam-ruby-get {
+    background-position: -0px -414px;
+}
+
+.fam-ruby-go {
+    background-position: -18px -414px;
+}
+
+.fam-ruby-key {
+    background-position: -36px -414px;
+}
+
+.fam-ruby-link {
+    background-position: -54px -414px;
+}
+
+.fam-ruby-put {
+    background-position: -72px -414px;
+}
+
+.fam-script {
+    background-position: -90px -414px;
+}
+
+.fam-script-add {
+    background-position: -108px -414px;
+}
+
+.fam-script-code {
+    background-position: -126px -414px;
+}
+
+.fam-script-code-red {
+    background-position: -144px -414px;
+}
+
+.fam-script-delete {
+    background-position: -162px -414px;
+}
+
+.fam-script-edit {
+    background-position: -180px -414px;
+}
+
+.fam-script-error {
+    background-position: -198px -414px;
+}
+
+.fam-script-gear {
+    background-position: -216px -414px;
+}
+
+.fam-script-go {
+    background-position: -234px -414px;
+}
+
+.fam-script-key {
+    background-position: -252px -414px;
+}
+
+.fam-script-lightning {
+    background-position: -270px -414px;
+}
+
+.fam-script-link {
+    background-position: -288px -414px;
+}
+
+.fam-script-palette {
+    background-position: -306px -414px;
+}
+
+.fam-script-save {
+    background-position: -324px -414px;
+}
+
+.fam-server {
+    background-position: -342px -414px;
+}
+
+.fam-server-add {
+    background-position: -360px -414px;
+}
+
+.fam-server-chart {
+    background-position: -378px -414px;
+}
+
+.fam-server-compressed {
+    background-position: -396px -414px;
+}
+
+.fam-server-connect {
+    background-position: -414px -414px;
+}
+
+.fam-server-database {
+    background-position: -432px -414px;
+}
+
+.fam-server-delete {
+    background-position: -450px -414px;
+}
+
+.fam-server-edit {
+    background-position: -468px -414px;
+}
+
+.fam-server-error {
+    background-position: -486px -414px;
+}
+
+.fam-server-go {
+    background-position: -504px -414px;
+}
+
+.fam-server-key {
+    background-position: -522px -414px;
+}
+
+.fam-server-lightning {
+    background-position: -540px -414px;
+}
+
+.fam-server-link {
+    background-position: -558px -414px;
+}
+
+.fam-server-uncompressed {
+    background-position: -576px -414px;
+}
+
+.fam-shading {
+    background-position: -0px -432px;
+}
+
+.fam-shape-align-bottom {
+    background-position: -18px -432px;
+}
+
+.fam-shape-align-center {
+    background-position: -36px -432px;
+}
+
+.fam-shape-align-left {
+    background-position: -54px -432px;
+}
+
+.fam-shape-align-middle {
+    background-position: -72px -432px;
+}
+
+.fam-shape-align-right {
+    background-position: -90px -432px;
+}
+
+.fam-shape-align-top {
+    background-position: -108px -432px;
+}
+
+.fam-shape-flip-horizontal {
+    background-position: -126px -432px;
+}
+
+.fam-shape-flip-vertical {
+    background-position: -144px -432px;
+}
+
+.fam-shape-group {
+    background-position: -162px -432px;
+}
+
+.fam-shape-handles {
+    background-position: -180px -432px;
+}
+
+.fam-shape-move-back {
+    background-position: -198px -432px;
+}
+
+.fam-shape-move-backwards {
+    background-position: -216px -432px;
+}
+
+.fam-shape-move-forwards {
+    background-position: -234px -432px;
+}
+
+.fam-shape-move-front {
+    background-position: -252px -432px;
+}
+
+.fam-shape-rotate-anticlockwise {
+    background-position: -270px -432px;
+}
+
+.fam-shape-rotate-clockwise {
+    background-position: -288px -432px;
+}
+
+.fam-shape-square {
+    background-position: -306px -432px;
+}
+
+.fam-shape-square-add {
+    background-position: -324px -432px;
+}
+
+.fam-shape-square-delete {
+    background-position: -342px -432px;
+}
+
+.fam-shape-square-edit {
+    background-position: -360px -432px;
+}
+
+.fam-shape-square-error {
+    background-position: -378px -432px;
+}
+
+.fam-shape-square-go {
+    background-position: -396px -432px;
+}
+
+.fam-shape-square-key {
+    background-position: -414px -432px;
+}
+
+.fam-shape-square-link {
+    background-position: -432px -432px;
+}
+
+.fam-shape-ungroup {
+    background-position: -450px -432px;
+}
+
+.fam-shield {
+    background-position: -468px -432px;
+}
+
+.fam-shield-add {
+    background-position: -486px -432px;
+}
+
+.fam-shield-delete {
+    background-position: -504px -432px;
+}
+
+.fam-shield-go {
+    background-position: -522px -432px;
+}
+
+.fam-sitemap {
+    background-position: -540px -432px;
+}
+
+.fam-sitemap-color {
+    background-position: -558px -432px;
+}
+
+.fam-sound {
+    background-position: -576px -432px;
+}
+
+.fam-sound-add {
+    background-position: -0px -450px;
+}
+
+.fam-sound-delete {
+    background-position: -18px -450px;
+}
+
+.fam-sound-low {
+    background-position: -36px -450px;
+}
+
+.fam-sound-mute {
+    background-position: -54px -450px;
+}
+
+.fam-sound-none {
+    background-position: -72px -450px;
+}
+
+.fam-spellcheck {
+    background-position: -90px -450px;
+}
+
+.fam-sport-8ball {
+    background-position: -108px -450px;
+}
+
+.fam-sport-basketball {
+    background-position: -126px -450px;
+}
+
+.fam-sport-football {
+    background-position: -144px -450px;
+}
+
+.fam-sport-golf {
+    background-position: -162px -450px;
+}
+
+.fam-sport-raquet {
+    background-position: -180px -450px;
+}
+
+.fam-sport-shuttlecock {
+    background-position: -198px -450px;
+}
+
+.fam-sport-soccer {
+    background-position: -216px -450px;
+}
+
+.fam-sport-tennis {
+    background-position: -234px -450px;
+}
+
+.fam-star {
+    background-position: -252px -450px;
+}
+
+.fam-status-away {
+    background-position: -270px -450px;
+}
+
+.fam-status-busy {
+    background-position: -288px -450px;
+}
+
+.fam-status-offline {
+    background-position: -306px -450px;
+}
+
+.fam-status-online {
+    background-position: -324px -450px;
+}
+
+.fam-stop {
+    background-position: -342px -450px;
+}
+
+.fam-style {
+    background-position: -360px -450px;
+}
+
+.fam-style-add {
+    background-position: -378px -450px;
+}
+
+.fam-style-delete {
+    background-position: -396px -450px;
+}
+
+.fam-style-edit {
+    background-position: -414px -450px;
+}
+
+.fam-style-go {
+    background-position: -432px -450px;
+}
+
+.fam-sum {
+    background-position: -450px -450px;
+}
+
+.fam-tab {
+    background-position: -468px -450px;
+}
+
+.fam-tab-add {
+    background-position: -486px -450px;
+}
+
+.fam-tab-delete {
+    background-position: -504px -450px;
+}
+
+.fam-tab-edit {
+    background-position: -522px -450px;
+}
+
+.fam-tab-go {
+    background-position: -540px -450px;
+}
+
+.fam-table {
+    background-position: -558px -450px;
+}
+
+.fam-table-add {
+    background-position: -576px -450px;
+}
+
+.fam-table-delete {
+    background-position: -0px -468px;
+}
+
+.fam-table-edit {
+    background-position: -18px -468px;
+}
+
+.fam-table-error {
+    background-position: -36px -468px;
+}
+
+.fam-table-gear {
+    background-position: -54px -468px;
+}
+
+.fam-table-go {
+    background-position: -72px -468px;
+}
+
+.fam-table-key {
+    background-position: -90px -468px;
+}
+
+.fam-table-lightning {
+    background-position: -108px -468px;
+}
+
+.fam-table-link {
+    background-position: -126px -468px;
+}
+
+.fam-table-multiple {
+    background-position: -144px -468px;
+}
+
+.fam-table-refresh {
+    background-position: -162px -468px;
+}
+
+.fam-table-relationship {
+    background-position: -180px -468px;
+}
+
+.fam-table-row-delete {
+    background-position: -198px -468px;
+}
+
+.fam-table-row-insert {
+    background-position: -216px -468px;
+}
+
+.fam-table-save {
+    background-position: -234px -468px;
+}
+
+.fam-table-sort {
+    background-position: -252px -468px;
+}
+
+.fam-tag {
+    background-position: -270px -468px;
+}
+
+.fam-tag-blue {
+    background-position: -288px -468px;
+}
+
+.fam-tag-blue-add {
+    background-position: -306px -468px;
+}
+
+.fam-tag-blue-delete {
+    background-position: -324px -468px;
+}
+
+.fam-tag-blue-edit {
+    background-position: -342px -468px;
+}
+
+.fam-tag-green {
+    background-position: -360px -468px;
+}
+
+.fam-tag-orange {
+    background-position: -378px -468px;
+}
+
+.fam-tag-pink {
+    background-position: -396px -468px;
+}
+
+.fam-tag-purple {
+    background-position: -414px -468px;
+}
+
+.fam-tag-red {
+    background-position: -432px -468px;
+}
+
+.fam-tag-yellow {
+    background-position: -450px -468px;
+}
+
+.fam-telephone {
+    background-position: -468px -468px;
+}
+
+.fam-telephone-add {
+    background-position: -486px -468px;
+}
+
+.fam-telephone-delete {
+    background-position: -504px -468px;
+}
+
+.fam-telephone-edit {
+    background-position: -522px -468px;
+}
+
+.fam-telephone-error {
+    background-position: -540px -468px;
+}
+
+.fam-telephone-go {
+    background-position: -558px -468px;
+}
+
+.fam-telephone-key {
+    background-position: -576px -468px;
+}
+
+.fam-telephone-link {
+    background-position: -0px -486px;
+}
+
+.fam-television {
+    background-position: -18px -486px;
+}
+
+.fam-television-add {
+    background-position: -36px -486px;
+}
+
+.fam-television-delete {
+    background-position: -54px -486px;
+}
+
+.fam-text-align-center {
+    background-position: -72px -486px;
+}
+
+.fam-text-align-justify {
+    background-position: -90px -486px;
+}
+
+.fam-text-align-left {
+    background-position: -108px -486px;
+}
+
+.fam-text-align-right {
+    background-position: -126px -486px;
+}
+
+.fam-text-allcaps {
+    background-position: -144px -486px;
+}
+
+.fam-text-bold {
+    background-position: -162px -486px;
+}
+
+.fam-text-columns {
+    background-position: -180px -486px;
+}
+
+.fam-text-dropcaps {
+    background-position: -198px -486px;
+}
+
+.fam-text-heading-1 {
+    background-position: -216px -486px;
+}
+
+.fam-text-heading-2 {
+    background-position: -234px -486px;
+}
+
+.fam-text-heading-3 {
+    background-position: -252px -486px;
+}
+
+.fam-text-heading-4 {
+    background-position: -270px -486px;
+}
+
+.fam-text-heading-5 {
+    background-position: -288px -486px;
+}
+
+.fam-text-heading-6 {
+    background-position: -306px -486px;
+}
+
+.fam-text-horizontalrule {
+    background-position: -324px -486px;
+}
+
+.fam-text-indent {
+    background-position: -342px -486px;
+}
+
+.fam-text-indent-remove {
+    background-position: -360px -486px;
+}
+
+.fam-text-italic {
+    background-position: -378px -486px;
+}
+
+.fam-text-kerning {
+    background-position: -396px -486px;
+}
+
+.fam-text-letter-omega {
+    background-position: -414px -486px;
+}
+
+.fam-text-letterspacing {
+    background-position: -432px -486px;
+}
+
+.fam-text-linespacing {
+    background-position: -450px -486px;
+}
+
+.fam-text-list-bullets {
+    background-position: -468px -486px;
+}
+
+.fam-text-list-numbers {
+    background-position: -486px -486px;
+}
+
+.fam-text-lowercase {
+    background-position: -504px -486px;
+}
+
+.fam-text-padding-bottom {
+    background-position: -522px -486px;
+}
+
+.fam-text-padding-left {
+    background-position: -540px -486px;
+}
+
+.fam-text-padding-right {
+    background-position: -558px -486px;
+}
+
+.fam-text-padding-top {
+    background-position: -576px -486px;
+}
+
+.fam-text-replace {
+    background-position: -0px -504px;
+}
+
+.fam-text-signature {
+    background-position: -18px -504px;
+}
+
+.fam-text-smallcaps {
+    background-position: -36px -504px;
+}
+
+.fam-text-strikethrough {
+    background-position: -54px -504px;
+}
+
+.fam-text-subscript {
+    background-position: -72px -504px;
+}
+
+.fam-text-superscript {
+    background-position: -90px -504px;
+}
+
+.fam-text-underline {
+    background-position: -108px -504px;
+}
+
+.fam-text-uppercase {
+    background-position: -126px -504px;
+}
+
+.fam-textfield {
+    background-position: -144px -504px;
+}
+
+.fam-textfield-add {
+    background-position: -162px -504px;
+}
+
+.fam-textfield-delete {
+    background-position: -180px -504px;
+}
+
+.fam-textfield-key {
+    background-position: -198px -504px;
+}
+
+.fam-textfield-rename {
+    background-position: -216px -504px;
+}
+
+.fam-thumb-down {
+    background-position: -234px -504px;
+}
+
+.fam-thumb-up {
+    background-position: -252px -504px;
+}
+
+.fam-tick {
+    background-position: -270px -504px;
+}
+
+.fam-time {
+    background-position: -288px -504px;
+}
+
+.fam-time-add {
+    background-position: -306px -504px;
+}
+
+.fam-time-delete {
+    background-position: -324px -504px;
+}
+
+.fam-time-go {
+    background-position: -342px -504px;
+}
+
+.fam-timeline-marker {
+    background-position: -360px -504px;
+}
+
+.fam-transmit {
+    background-position: -378px -504px;
+}
+
+.fam-transmit-add {
+    background-position: -396px -504px;
+}
+
+.fam-transmit-blue {
+    background-position: -414px -504px;
+}
+
+.fam-transmit-delete {
+    background-position: -432px -504px;
+}
+
+.fam-transmit-edit {
+    background-position: -450px -504px;
+}
+
+.fam-transmit-error {
+    background-position: -468px -504px;
+}
+
+.fam-transmit-go {
+    background-position: -486px -504px;
+}
+
+.fam-tux {
+    background-position: -504px -504px;
+}
+
+.fam-user {
+    background-position: -522px -504px;
+}
+
+.fam-user-add {
+    background-position: -540px -504px;
+}
+
+.fam-user-comment {
+    background-position: -558px -504px;
+}
+
+.fam-user-delete {
+    background-position: -576px -504px;
+}
+
+.fam-user-edit {
+    background-position: -0px -522px;
+}
+
+.fam-user-female {
+    background-position: -18px -522px;
+}
+
+.fam-user-go {
+    background-position: -36px -522px;
+}
+
+.fam-user-gray {
+    background-position: -54px -522px;
+}
+
+.fam-user-green {
+    background-position: -72px -522px;
+}
+
+.fam-user-orange {
+    background-position: -90px -522px;
+}
+
+.fam-user-red {
+    background-position: -108px -522px;
+}
+
+.fam-user-suit {
+    background-position: -126px -522px;
+}
+
+.fam-vcard {
+    background-position: -144px -522px;
+}
+
+.fam-vcard-add {
+    background-position: -162px -522px;
+}
+
+.fam-vcard-delete {
+    background-position: -180px -522px;
+}
+
+.fam-vcard-edit {
+    background-position: -198px -522px;
+}
+
+.fam-vector {
+    background-position: -216px -522px;
+}
+
+.fam-vector-add {
+    background-position: -234px -522px;
+}
+
+.fam-vector-delete {
+    background-position: -252px -522px;
+}
+
+.fam-wand {
+    background-position: -270px -522px;
+}
+
+.fam-weather-clouds {
+    background-position: -288px -522px;
+}
+
+.fam-weather-cloudy {
+    background-position: -306px -522px;
+}
+
+.fam-weather-lightning {
+    background-position: -324px -522px;
+}
+
+.fam-weather-rain {
+    background-position: -342px -522px;
+}
+
+.fam-weather-snow {
+    background-position: -360px -522px;
+}
+
+.fam-weather-sun {
+    background-position: -378px -522px;
+}
+
+.fam-webcam {
+    background-position: -396px -522px;
+}
+
+.fam-webcam-add {
+    background-position: -414px -522px;
+}
+
+.fam-webcam-delete {
+    background-position: -432px -522px;
+}
+
+.fam-webcam-error {
+    background-position: -450px -522px;
+}
+
+.fam-world {
+    background-position: -468px -522px;
+}
+
+.fam-world-add {
+    background-position: -486px -522px;
+}
+
+.fam-world-delete {
+    background-position: -504px -522px;
+}
+
+.fam-world-edit {
+    background-position: -522px -522px;
+}
+
+.fam-world-go {
+    background-position: -540px -522px;
+}
+
+.fam-world-link {
+    background-position: -558px -522px;
+}
+
+.fam-wrench {
+    background-position: -576px -522px;
+}
+
+.fam-wrench-orange {
+    background-position: -0px -540px;
+}
+
+.fam-xhtml {
+    background-position: -18px -540px;
+}
+
+.fam-xhtml-add {
+    background-position: -36px -540px;
+}
+
+.fam-xhtml-delete {
+    background-position: -54px -540px;
+}
+
+.fam-xhtml-go {
+    background-position: -72px -540px;
+}
+
+.fam-xhtml-valid {
+    background-position: -90px -540px;
+}
+
+.fam-zoom {
+    background-position: -108px -540px;
+}
+
+.fam-zoom-in {
+    background-position: -126px -540px;
+}
+
+.fam-zoom-out {
+    background-position: -144px -540px;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.png b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.png
new file mode 100644
index 0000000000000000000000000000000000000000..8de5ff21097300ac0539a23ba2072168d1d536a4
Binary files /dev/null and b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/fam-icons.png differ
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..048ff5046626c5f297f9440673056260fe3a0e74
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/index.js
@@ -0,0 +1,45 @@
+// Inclus dans vendor
+global.jQuery = require('jquery');
+require('moment');
+
+// Livrés avec Sonata
+require('sonataadmin/vendor/jqueryui/ui/minified/jquery-ui.min.js');
+require('sonataadmin/vendor/jqueryui/ui/minified/i18n/jquery-ui-i18n.min.js');
+require('sonatacore/vendor/bootstrap/dist/js/bootstrap.min.js');
+require('sonatacore/vendor/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js');
+require('sonataadmin/vendor/jquery-form/jquery.form.js');
+require('sonataadmin/jquery/jquery.confirmExit.js');
+require('sonataadmin/vendor/x-editable/dist/bootstrap3-editable/js/bootstrap-editable.min.js');
+require('sonatacore/vendor/select2/select2.min.js');
+require('sonataadmin/vendor/admin-lte/dist/js/app.min.js');
+require('sonataadmin/vendor/iCheck/icheck.min.js');
+require('sonataadmin/vendor/slimScroll/jquery.slimscroll.min.js');
+require('sonataadmin/vendor/waypoints/lib/jquery.waypoints.min.js');
+require('sonataadmin/vendor/waypoints/lib/shortcuts/sticky.min.js');
+require('sonataadmin/vendor/readmore-js/readmore.min.js');
+require('sonataadmin/vendor/masonry/dist/masonry.pkgd.min.js');
+require('script-loader!sonataadmin/Admin.js');
+require('sonataadmin/treeview.js');
+
+require('sonatacore/vendor/bootstrap/dist/css/bootstrap.min.css');
+require('sonatacore/vendor/components-font-awesome/css/font-awesome.min.css');
+require('sonatacore/vendor/ionicons/css/ionicons.min.css');
+require('sonataadmin/vendor/admin-lte/dist/css/AdminLTE.min.css');
+require('sonataadmin/vendor/admin-lte/dist/css/skins/skin-black.min.css');
+require('sonataadmin/vendor/iCheck/skins/square/blue.css');
+require('sonatacore/vendor/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css');
+require('sonataadmin/vendor/jqueryui/themes/base/jquery-ui.css');
+require('sonatacore/vendor/select2/select2.css');
+require('sonatacore/vendor/select2-bootstrap-css/select2-bootstrap.min.css');
+require('sonataadmin/vendor/x-editable/dist/bootstrap3-editable/css/bootstrap-editable.css');
+require('sonataadmin/css/styles.css');
+require('sonataadmin/css/layout.css');
+require('sonataadmin/css/tree.css');
+
+// Nos widgets et extensions
+require('@IrsteaBdohAdminBundle/lib/file-widget');
+require('@IrsteaBdohAdminBundle/lib/colorpicker');
+require('@IrsteaBdohAdminBundle/lib/htmleditor');
+
+// Style spécifique
+require('./style.less');
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/style.less b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/style.less
new file mode 100644
index 0000000000000000000000000000000000000000..0d72446e89e054f619355f86f73890bc2cd0248c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/sonata/style.less
@@ -0,0 +1,33 @@
+@import "./fam-icons";
+
+label.required {
+    &::after {
+         content: none;
+     }
+    &.control-label::after {
+        content: "*";
+     }
+}
+aside.main-sidebar ul.sidebar-menu > li.last a{
+    color:white;
+    text-align:center;
+    padding:12px 3px 12px 0;
+}
+ol.nav.navbar-top-links.breadcrumb li span{
+    display:inline-block;
+}
+span.toolbox-btns {
+    vertical-align:5px;
+    display:inline-block;
+    margin:-5px 0 -5px 5px;
+}
+span.toolbox-btns a {
+    display:inline-block;
+    border-radius:3px;
+    border:1px solid #ccc;
+    padding:5px;
+    -webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+    box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+    line-height:1;
+    font-size:11px;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/export.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/export.js
new file mode 100644
index 0000000000000000000000000000000000000000..f70d8e869213b7ef7d4d44988e1397680edbb4cc
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/export.js
@@ -0,0 +1,127 @@
+define([
+    'jquery'
+], ($) => {
+
+    $(() => {
+
+        const pathToGetBaremesForExport = $('[data-baremes-export]').data('baremes-export');
+
+        let $exportDataTable;
+        const blocks = ['Principale', 'Secondaire'];
+        for (const i in blocks) {
+            const block = blocks[i];
+            $(`#exportBareme${block}`).on('click', {block}, (ev) => {
+                $.ajax({
+                    url: pathToGetBaremesForExport,
+                    success(data) {
+                        $('#table-export-bareme-container')
+                            .css('visibility', 'hidden')
+                            .html(data);
+                        checkBaremesForExport(ev.data.block);
+                        $exportDataTable = $('#table-export-bareme').dataTable({
+                            'searching': false,
+                            'paging': false,
+                            'info': false,
+                            'ordering': true,
+                            'processing': false,
+                            'order': [[2, 'desc']],
+                            'columnDefs': [{
+                                'orderable': false,
+                                'targets': 0,
+                            },],
+                            'destroy': true,
+                            'scrollY': '240px',
+                            'scrollCollapse': true,
+                        });
+                        $('#bareme-export').modal();
+                    }
+                });
+            });
+        }
+
+        function checkBaremesForExport(block) {
+            $("#table-export-bareme input[type='checkbox']").selected(false);
+            $(`.listeBaremes${block} select`).each(function () {
+                const $cb = $(`#check-bareme-${$(this).val()}`);
+                if ($cb.length) {
+                    setTimeout(() => {
+                        $cb.selected();
+                    }, 0);
+                }
+            });
+        }
+
+        $('#bareme-export').on('shown.bs.modal', () => {
+            $exportDataTable.fnDraw();
+            $('#table-export-bareme-container').css('visibility', '');
+        });
+
+        $('#form-bareme-export').submit(() => {
+            const $checkedBaremes = $("#table-export-bareme input[type='checkbox']:checked");
+            if (!$checkedBaremes.length) {
+                $('#no-bareme-to-export').show();
+                return false;
+            }
+
+            // Create & fill object to bear information on the selected baremes
+            const baremesInfo = {};
+            $checkedBaremes.each(function () {
+                const baremeId = $(this).attr('name');
+                const $baremeLine = getLineForBareme(baremeId);
+                if ($baremeLine) {
+                    const block = $baremeLine.parent().attr('block');
+                    baremesInfo[baremeId] = {
+                        chroniqueMere: $(`#selectChroniqueMere${block}`).val(),
+                        dateBegin: $baremeLine.find('.beginDate').val(),
+                        dateEnd: $baremeLine.find('.endDate').val()
+                    }
+                }
+                else {
+                    baremesInfo[baremeId] = null;
+                }
+            });
+
+            // Fill a hidden input with the content of baremesInfo
+            const inputLines = [];
+            for (const baremeId in baremesInfo) {
+                let inputLine = baremeId;
+                const oneBaremeInfo = baremesInfo[baremeId];
+                if (oneBaremeInfo) {
+                    inputLine +=
+                        `_${oneBaremeInfo.chroniqueMere
+                            }_${oneBaremeInfo.dateBegin
+                            }_${oneBaremeInfo.dateEnd}`
+                }
+
+                inputLines.push(inputLine);
+            }
+            $("[name='baremes-export-info']").val(inputLines.join('|'));
+
+            // Copy the child chronicle name/code into a hidden input
+            //chroniqueCalculee
+            $("[name='child-chronicle-name']").val($(`#chroniqueCalculee option[value=${
+                $('#chroniqueCalculee').val()}]`).text()
+                .trim());
+
+            // Remove "No chronicle to export" error message and close the modal window
+            $('#no-bareme-to-export').hide();
+            $('#bareme-export').modal('hide');
+
+            // Finally, allow the form to be submitted
+            return true;
+
+        });
+
+        function getLineForBareme(baremeId) {
+            const $select = $('select.bareme').filter(function () {
+                return $(this).val() == baremeId;
+            });
+            if ($select.length) {
+                return $($select.get(0)).parent()
+                    .parent();
+            }
+            return null;
+        }
+
+    });
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/import.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/import.js
new file mode 100644
index 0000000000000000000000000000000000000000..10dda37a0c6b84fa10f987c998d104be695b96c7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/import.js
@@ -0,0 +1,111 @@
+define([
+    'jquery',
+    './import'
+], ($) => {
+
+    $.baremeImport = {
+        id: '#bareme-import',
+
+        // Data received from the server
+        data: {},
+
+        // Initializes a new step
+        init() {
+            this.main = $(this.id);
+            this.form = this.main.find('form[name = "form-bareme-import"]');
+            return this;
+        },
+
+        // Gets a field DOM element
+        field(value, attr) {
+            attr = attr || 'name';
+            return this.form.find(`[${attr}="${value}"]`);
+        },
+
+        // Initializes the submit button and returns its DOM element
+        submit() {
+            const submitButton = this.form.find('[type = "submit"]');
+
+            // Methods
+            submitButton.enable = function () {
+                return $(this).removeAttr('disabled')
+                    .addClass('btn-success');
+            };
+
+            submitButton.disable = function () {
+                return $(this).attr('disabled', true)
+                    .removeClass('btn-success');
+            };
+
+            // Events
+            this.form.submit(() => {
+                submitButton.button('loading');
+            });
+
+            return submitButton;
+        },
+
+        // Initializes the button "Cancel scale import" and returns its DOM element.
+        cancel() {
+            const cancelButton = this.main.find('a.btn-danger');
+
+            cancelButton.on('click', (e) => {
+                e.preventDefault();
+                this.form.attr('action', $(e.target).attr('href'));
+                this.form.ajaxSubmit();
+                this.main.modal('hide');
+            });
+
+            return cancelButton;
+        },
+
+        // Initializes the button "Reinitiate the import" and returns its DOM element.
+        reInit() {
+            const reInitButton = this.main.find('a.btn-default');
+
+            reInitButton.on('click', () => {
+              this.main.modal('show');
+            });
+
+          return reInitButton;
+        },
+
+        /**
+         * Builds a closure which enables or disables the submit button.
+         * Runs once this closure and returns it.
+         * @param {Closure}  test  Must return true to enable, false to disable
+         */
+        stateOfSubmit(test) {
+            const submit = this.submit();
+            const stateOfSubmit = function () {
+                if (test()) {
+                    submit.enable();
+                } else {
+                    submit.disable();
+                }
+            };
+            stateOfSubmit();
+            return stateOfSubmit;
+        },
+
+        /**
+         * Depending of 'data.state' :
+         *  => displays errors and format help ;
+         *  => OR displays the next step and calls its function
+         *
+         * @param {Closure}  nextStep  Calls the next step function
+         */
+        nextStep(data, nextStep) {
+            if (data.action === 'errors') {
+                this.cancel().remove();
+                this.form.replaceWith(data.view);
+                this.reInit();
+            } else {
+                this.main.empty().append(data.view);
+                this.data = data;
+                nextStep();
+            }
+        }
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..2502b9b45685cdfbe6ca4c328ef81a5af4e81a53
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/index.js
@@ -0,0 +1,582 @@
+define([
+    'jquery',
+    // --
+    'jquery-form/jquery.form',
+    '@IrsteaBdohBundle/lib/date-time/picker',
+    '@IrsteaBdohBundle/lib/datatables',
+    './import',
+    './export',
+    './step1',
+    './step2',
+    './style.css'
+], ($) => {
+
+    $(() => {
+
+        const Translator = require('translator');
+        const pathToGetChroniqueCalculee = $('[data-chroniques-list]').data('chroniques-list');
+        const pathToViewChroniqueCalculee = $('[data-chroniques-get]').data('chroniques-get');
+
+        //First the big divs from the page
+        const blocks = ['Principale', 'Secondaire'];
+        const $principale = $('#chroniqueMerePrincipale');
+        const $secondaire = $('#chroniqueMereSecondaire');
+        //then the smaller divs
+        const $uniteDiv = $('#uniteDiv');
+        const $majDiv = $('#majDiv');
+        const $coefficientDiv = $('#coefficientDiv');
+        const $genealogieDiv = $('#genealogieDiv');
+        const $genealogieEnDiv = $('#genealogieEnDiv');
+        const $btnDiv = $('#btnDiv');
+        //then the value fields
+        const $chroniqueCalculee = $('#chroniqueCalculee');
+        const $unite = $('#uniteChroniqueFille');
+        const $maj = $('#majChroniqueFille');
+        const $coefficient = $('#coefficient');
+        const $genealogie = $('#genealogie');
+        const $genealogieEn = $('#genealogieEn');
+        const $propagateGroup = $('#propagateGroup');
+        const $divsDelaiPropagation = $('.div-delai-propagation');
+        const $stationMerePrincipale = $('#selectStationPrincipale');
+        const $stationMereSecondaire = $('#selectStationSecondaire');
+        const $chroniqueMerePrincipale = $('#selectChroniqueMerePrincipale');
+        const $chroniqueMereSecondaire = $('#selectChroniqueMereSecondaire');
+
+        const $formTransformation = $('#formTransformation');
+        const $formButton = $formTransformation.find("[type='submit']");
+        const $transformationErrors = $('#errors-transformation');
+        const $transformationSubmitted = $('#submitted-transformation');
+        const $lineSubmitted = $('#submitted-info');
+        const $lineSubmittedHtml = $lineSubmitted.html();
+        const $closeSubmitted = $('#submitted-close');
+
+        let isFirstEdition = false;
+
+        //On opening, we hide almost everything
+        function hideData() {
+            let $elementsToHide = $principale
+                .add($secondaire)
+                .add($uniteDiv)
+                .add($coefficientDiv)
+                .add($genealogieDiv)
+                .add($genealogieEnDiv)
+                .add($majDiv)
+                .add($btnDiv)
+                .add($propagateGroup)
+                .add($divsDelaiPropagation);
+
+            blocks.forEach((block) => {
+                $elementsToHide = $elementsToHide.add($(`#div-value-limits-${block}`));
+            });
+
+            // Réinitialisation des stations et des chroniques mères
+            $chroniqueMerePrincipale.find('option').show();
+            $chroniqueMereSecondaire.find('option').show();
+            $stationMerePrincipale.find('option[value="-1"]').selected();
+            $stationMereSecondaire.find('option[value="-1"]').selected();
+            $chroniqueMerePrincipale.find('option[value="-1"]').selected();
+            $chroniqueMereSecondaire.find('option[value="-1"]').selected();
+            filterChroniquesMeresByStation();
+
+            // Réinitialisation des barèmes
+            initBaremes('Principale');
+
+            $elementsToHide.hide();
+            $transformationErrors.hide();
+            $transformationSubmitted.hide();
+        }
+
+        //What to do when ChroniqueCalculee is chosen
+        function getChroniqueCalculee() {
+
+            // Reinitialize everything
+            hideData();
+
+            //A ChroniqueCalculee is selected
+            if ($chroniqueCalculee.val() !== '-1') {
+
+                //Then we get the info for that ChroniqueCalculee
+                $.ajax({
+                    url: pathToGetChroniqueCalculee,
+                    data: {id: $chroniqueCalculee.val()}
+                }).done((data) => {
+                    // Is this the 1st time we edit this chronicle?
+                    isFirstEdition = data['isFirstEdition'];
+
+                    //Assign the right values
+                    $unite.text(data.unite);
+                    $coefficient.val(data.coefficient);
+                    $genealogie.val(data.genealogie);
+                    $genealogieEn.val(data.genealogieEn)
+                    //Show the result
+                    $principale.add($uniteDiv)
+                        .add($genealogieDiv)
+                        .add($genealogieEnDiv)
+                        .add($coefficientDiv)
+                        .show();
+
+                    if (!isFirstEdition) {
+                        $maj.text(data.maj);
+                        $majDiv.show();
+                    }
+
+                    for (const b in blocks) {
+                        const block = blocks[b];
+                        let chroniqueMereId = data[`chroniqueMere${block}`];
+                        if (typeof chroniqueMereId === 'undefined'){
+                            chroniqueMereId = -1;
+                        }
+                        const valueToSelect = isFirstEdition ? -1 : chroniqueMereId;
+                        const $selectParent = $(`#selectChroniqueMere${block}`);
+
+                        $selectParent.children(`option[value=${valueToSelect}]`).selected();
+                        initBaremes(block, data[`baremes${block}`]);
+
+                        // Propagation delays
+                        const $propagationDelay = $(`input[name=delaiPropagation${block}]`);
+                        $propagationDelay.val(data[`delaiPropagation${block}`] || 0);
+
+                        // If the parent chronicle select is disabled, then put its value in the appropriate hidden input
+                        // Copy propagation delays as well
+                        const $hiddenParent = $(`#hiddenChroniqueMere${block}`);
+                        const $visibleDelay = $(`#delaiPropagation${block}`);
+                        const $hiddenDelay = $(`#hiddenDelaiPropagation${block}`);
+                        $hiddenParent.val($selectParent.val());
+                        $hiddenDelay.val($visibleDelay.val());
+                        toggleControl($hiddenParent.add($hiddenDelay), !isFirstEdition);
+
+                        // Value limit policies
+                        const $valueLimitPolicy = $(`select[name=valueLimits${block}]`);
+                        $valueLimitPolicy.val(data[`valueLimitPolicy${block}`] || 'chronique.lq_ld.options.true_value');
+                        const $valueLimitPlaceholder = $(`#limitPlaceholder${block}`);
+                        $valueLimitPlaceholder.val(data[`valueLimitPlaceholder${block}`] || 0.0);
+                    }
+
+                    setLockedChroniquesMeres(!isFirstEdition);
+                    updateValueLimitVisibilities();
+
+                    if (data['chroniqueMereSecondaire']) {
+                        $secondaire.show();
+                    }
+
+                    if (data['hasChildren']) {
+                        $('#propagateSpanId').text(Translator.transChoice('measure.import.question.computeChildren', data['childrenCount'], {}, 'messages'));
+                        $('#propagateHelpId').attr('data-content', data['childrenList'])
+                            .attr('data-original-title', Translator.transChoice('measure.import.help.children', data['childrenCount']), {}, 'messages');
+                        // Displays, in a bootstrap-popover, the list of the descendant time series
+                        $('.childrenHelp').popover({trigger: 'hover', 'html': true});
+                        $propagateGroup.show();
+                    }
+
+                    setUseCoefficient();
+                });
+            }
+        }
+
+        function filterChroniquesMeresByStation(block) {
+            if (!block) {
+                for (const b in blocks) {
+                    filterChroniquesMeresByStation(blocks[b]);
+                }
+            } else {
+                const stationId = $(`#selectStation${block}`).val();
+                const options = $(`#selectChroniqueMere${block}`).children();
+                const blankOption = options.filter(':not([station-id])');
+                options.hide();
+                const selectedTSId = $chroniqueCalculee.val();
+                options.filter(`[station-id=${stationId}]:not([value=${selectedTSId}])`)
+                    .add(blankOption)
+                    .show();
+                if (!options.filter('[selected]').is(':visible')) {
+                    blankOption.selected();
+                }
+            }
+        }
+
+        function setLockedChroniquesMeres(locked) {
+            for (const b in blocks) {
+                const $selectChronique = $(`#selectChroniqueMere${blocks[b]}`);
+                const $selectStation = $(`#selectStation${blocks[b]}`);
+                const $delayInput = $(`input[type="text"][name="delaiPropagation${blocks[b]}"]`);
+                toggleControl($selectChronique.add($selectStation).add($delayInput), !locked);
+                if (locked) {
+                    const stationId = $selectChronique.children('option:selected').attr('station-id');
+                    if ($.isNumeric(stationId)) {
+                        $selectStation.children(`option[value=${stationId}]`).selected();
+                    }
+                }
+            }
+        }
+
+        //What to do when a ChroniqueMere is chosen
+        function initBaremes(block, baremeData) {
+            $(`.listeBaremes${block}`).empty();
+            if($(`#selectChroniqueMere${block}`).val() === '-1'){
+                if(block === 'Principale'){
+                    $('.baremePrincipale').add($secondaire)
+                        .add($btnDiv)
+                        .add($divsDelaiPropagation)
+                        .hide();
+                    $('.listeBaremesSecondaire').empty();
+                    $stationMereSecondaire.find('option[value="-1"]').selected();
+                    filterChroniquesMeresByStation('Secondaire');
+                }else{
+                    $('.baremeSecondaire')
+                      .add($divsDelaiPropagation)
+                      .hide();
+                }
+            }
+            //A ChroniqueMere is selected
+            else {
+                if (baremeData && baremeData.length) {
+                    let dataLine;
+                    for (const i in baremeData) {
+                        dataLine = baremeData[i];
+                        createLineBareme(block, null, dataLine.id, dataLine.begin, dataLine.end || null);
+                    }
+                } else {
+                    createLineBareme(block);
+                }
+
+                $('.baremePrincipale').add($btnDiv)
+                    .show();
+                if (isFirstEdition) {
+                    $secondaire.show();
+                }
+
+                if ($chroniqueMereSecondaire.val() === '-1') {
+                    $('.baremeSecondaire').add($divsDelaiPropagation)
+                        .hide();
+                }
+                //A ChroniqueMereSecondaire is selected
+                else {
+                    $('.baremeSecondaire').add($divsDelaiPropagation)
+                        .show();
+                }
+            }
+
+            $.filterBaremesByUnit();
+            updateValueLimitVisibilities();
+        }
+
+        function updateValueLimitVisibilities() {
+            blocks.forEach((block) => {
+                const allowValueLimits = !!$(`#selectChroniqueMere${block} option:selected`).attr('allow-limits');
+                const $limitPolicy = $(`#div-value-limits-${block}`);
+                if (allowValueLimits) {
+                    $limitPolicy.show();
+                    const valueLimitPolicy = $limitPolicy.find(`select[name=valueLimits${block}]`).val();
+                    const usePlaceholder = valueLimitPolicy === 'chronique.lq_ld.options.placeholder';
+                    const $placeholder = $(`#div-limit-placeholder-${block}`);
+                    if (usePlaceholder) {
+                        $placeholder.show();
+                    } else {
+                        $placeholder.hide();
+                    }
+                } else {
+                    $limitPolicy.hide();
+                }
+            });
+        }
+
+        blocks.forEach((block) => {
+            $(`select[name=valueLimits${block}]`).on('change', updateValueLimitVisibilities);
+        });
+
+        function setUseCoefficient() {
+            ($chroniqueMerePrincipale.val() === '-1' || $chroniqueMereSecondaire.val() === '-1') ?
+                $coefficientDiv.hide() : $coefficientDiv.show();
+            setTimeout($.filterBaremesByUnit, 0);
+        }
+
+        $.filterBaremesByUnit = function () {
+            let block;
+            for (const i in blocks) {
+                block = blocks[i];
+
+                // filter available baremes: their input unit must be the same as that of their parent chronicle
+                const $select = (block === 'Principale') ? $chroniqueMerePrincipale : $chroniqueMereSecondaire;
+                let $selectedOption = $select.find(`option[value='${$select.val()}']`);
+                const chroniqueUnitId = $selectedOption.attr('unit-id');
+
+                // If there is only one parent chronicle, the bareme output unit must also match that of the child chronicle
+                // Else, we must ensure that the output units for the different baremes of a given parent chronicle are the same
+                let optProperties = (chroniqueUnitId) ? `[input-unit-id='${chroniqueUnitId}']` : '';
+                if ($chroniqueMereSecondaire.val() === '-1') {
+                    $selectedOption = $chroniqueCalculee.find(`option[value='${$chroniqueCalculee.val()}']`);
+                    optProperties += `[output-unit-id='${$selectedOption.attr('unit-id')}']`;
+                } else {
+                    // Strategy: (i) find 1st "bareme" select for the parent chronicle, (ii) retrieve its selected option,
+                    // (iii) get the output unit for the selected "bareme", (iv) if that unit exists, then use it to filter the "baremes"
+                    const $baremeSelects = $(`.listeBaremes${block} select`);
+                    if ($baremeSelects.length > 1) {
+                        $selectedOption = $($(`.listeBaremes${block} option[value='${$($baremeSelects.get(0)).val()}']`).get(0));
+                        const outputUnit = $selectedOption.attr('output-unit-id');
+                        if (outputUnit) {
+                            optProperties += `[output-unit-id='${outputUnit}']`;
+                        }
+                    }
+                }
+
+                const opt = `.listeBaremes${block} option`;
+                $(`${opt}[input-unit-id]`).hide();
+                $(opt + optProperties).show();
+
+                if ($chroniqueMereSecondaire.val() === '-1') {
+                    break;
+                }
+            }
+        };
+
+        //Links to the right events
+        $chroniqueCalculee.on('change', () => {
+            getChroniqueCalculee();
+            $('#errors-transformation').hide();
+        });
+        $chroniqueMerePrincipale.on('change', () => {
+            initBaremes('Principale');
+            setUseCoefficient();
+        });
+        $chroniqueMereSecondaire.on('change', () => {
+            initBaremes('Secondaire');
+            setUseCoefficient();
+        });
+        for (const i in blocks) {
+            $(`.listeBaremes${blocks[i]} select`).on('change', $.filterBaremesByUnit);
+        }
+        $stationMerePrincipale.on('change', () => {
+            filterChroniquesMeresByStation('Principale');
+            initBaremes('Principale');
+            setUseCoefficient();
+        });
+        $stationMereSecondaire.on('change', () => {
+            filterChroniquesMeresByStation('Secondaire');
+            initBaremes('Secondaire');
+            setUseCoefficient();
+        });
+
+        function createLineBareme(block, baremeLine, idBareme, dateBegin, dateEnd) {
+            const $line = $($('#templateLineBareme').html());
+
+            if (idBareme) {
+                $line.find(`option[value='${idBareme}']`).selected();
+            } else {
+                $line.find("option[value='-1']").selected();
+            }
+
+            const $beginDate = $line.find('.beginDate');
+            const $endDate = $line.find('.endDate');
+            const $addBareme = $line.find('.addBareme');
+
+            $beginDate.dateTimePicker({
+                initialDateTime: dateBegin || undefined,
+                setButtons: false,
+                resetButton: false
+            });
+
+            $endDate.dateTimePicker({
+                initialDateTime: dateEnd || undefined,
+                setButtons: false,
+                resetButton: true
+            });
+
+            $beginDate.dateTimePicker('observeStatus')
+                .subscribe((status) => {
+                    const endStatus = $endDate.dateTimePicker('getStatus').value;
+                    toggleControl($addBareme, status.value.isValid() && endStatus.isValid());
+                });
+
+            $endDate.dateTimePicker('observeStatus')
+                .subscribe((status) => {
+                    const beginStatus = $beginDate.dateTimePicker('getStatus').value;
+                    toggleControl($addBareme, status.value.isValid() && beginStatus.isValid());
+                });
+
+            $endDate.dateTimePicker('observeStatus')
+                .subscribe(() => {
+                    updateBeginDates(block);
+                });
+
+            $line.on('change', 'select', $.filterBaremesByUnit);
+
+            $line.on('click', '.addBareme', (event) => {
+                const status = $endDate.dateTimePicker('getStatus');
+                if (!status.isValid) {
+                    return;
+                }
+                createLineBareme(block, $line, null, status.value.clone());
+                event.target.blur();
+                event.target.parentElement.blur();
+            });
+
+            $line.on('click', '.removeBareme', () => {
+                const nLines = $line.siblings().length;
+                $line.off();
+                $line.remove();
+                if (nLines === 0) {
+                    createLineBareme(block);
+                }
+                if (nLines === 1) {
+                    $.filterBaremesByUnit();
+                }
+                setRemoveLastDateButton(block);
+                updateBeginDates(block);
+            });
+
+            // Patch: force 1st option of bareme select to be selected when no bareme ID is provided
+            if (!idBareme) {
+                $line.find('.bareme option').first()
+                    .selected();
+            }
+
+            if (baremeLine) {
+                baremeLine.after($line);
+            } else {
+                $(`.listeBaremes${block}`).append($line);
+            }
+
+            $line.show();
+            $.filterBaremesByUnit();
+
+            setRemoveLastDateButton(block);
+            updateBeginDates(block);
+        }
+
+        function setRemoveLastDateButton(block) {
+            const $baremeBlock = $(`.listeBaremes${block}`);
+            const $endDates = $baremeBlock.find('.endDate');
+            const lastI = $endDates.length - 1;
+            $endDates.each((i, picker) => {
+                $(picker).attr('required', i < lastI ? true : null);
+            });
+        }
+
+        function updateBeginDates(block) {
+            const $baremeBlock = $(`.listeBaremes${block}`);
+            const $baremes = $baremeBlock.find('div.bareme');
+            let $previousEndDate = null;
+            $baremes.each((i, bareme) => {
+                const $beginDate = $(bareme).find('input.beginDate');
+                const $endDate = $(bareme).find('input.endDate');
+                if ($previousEndDate){
+                    toggleControl($beginDate, false);
+                    if ($previousEndDate.dateTimePicker('getStatus').isValid){
+                        $beginDate.dateTimePicker('setDateTime', $previousEndDate.dateTimePicker('getStatus').value.clone());
+                    } else {
+                        $beginDate.dateTimePicker('setDateTime', '');
+                    }
+                } else {
+                    toggleControl($beginDate, true);
+                }
+                $previousEndDate=$endDate;
+            });
+        }
+
+        $formTransformation.on('submit', () => {
+            for (const i in blocks) {
+                const  block = blocks[i];
+                const values = [];
+                const baremeLines = $(`.listeBaremes${block} > .bareme`);
+                baremeLines.each(function () {
+                    const line = $(this);
+                    const baremeId = line.find('select[name="bareme"]').val();
+                    const beginDate = line.find('.beginDate').dateTimePicker('getDateTime');
+                    const endDate = line.find('.endDate').dateTimePicker('getDateTime');
+                    const beginDateStr = beginDate.isValid() ? beginDate.toISOString() : '';
+                    const endDateStr = endDate.isValid() ? endDate.toISOString() : '';
+
+                    values.push(`${baremeId}_${beginDateStr}_${endDateStr}`);
+                });
+
+                $(`#jeuBareme${block}`).val(values.join('|'));
+            }
+        });
+
+        $('#bareme-import').on('show.bs.modal', function () {
+            const $baremeModalClone = $('#bareme-modal-step1-template').clone(true)
+                .attr('id', 'bareme-modal-step1');
+            $baremeModalClone.children('#format-description-template').attr('id', 'format-description');
+            $(this).empty()
+                .append($baremeModalClone.show());
+
+            setTimeout($.baremeImport.step1, 0);
+        });
+
+        $btnDiv.find('input[type=reset]').on('click', () => {
+            const val = $chroniqueCalculee.val();
+            setTimeout(() => {
+                $chroniqueCalculee.val(val);
+                getChroniqueCalculee();
+            }, 0);
+        });
+
+        $formTransformation.ajaxForm({
+            dataType: 'json',
+            global: false, // prevent ajaxError from firing on cancel (on xhr.abort() just beloow)
+            beforeSend (xhr) {
+                $transformationErrors.hide();
+                $transformationSubmitted.hide();
+                toggleControl($formButton, false);
+                toggleControl($chroniqueCalculee, false);
+                if (isFirstEdition && !confirm($('#div-confirm-computation').text())) {
+                    xhr.abort();
+                    toggleControl($formButton, true);
+                    toggleControl($chroniqueCalculee, true);
+                }
+            },
+            success (data) {
+                toggleControl($chroniqueCalculee, true);
+                if ('errors' in data) {
+                    $transformationErrors.find('#errors-transformation-details').html(data.errors);
+                    $transformationErrors.show();
+                }
+                if ('submitted' in data) {
+                    // First of all, given that the transformation parameters were successfully saved,
+                    // copy the IDs of parent time series into hidden inputs and block the parent TS selects
+                    // Copy propagation delays as well
+                    isFirstEdition = false;
+                    for (const b in blocks) {
+                        const block = blocks[b];
+                        const $selectParent = $(`#selectChroniqueMere${block}`);
+                        const $hiddenParent = $(`#hiddenChroniqueMere${block}`);
+                        const $visibleDelay = $(`#delaiPropagation${block}`);
+                        const $hiddenDelay = $(`#hiddenDelaiPropagation${block}`);
+                        $hiddenParent.val($selectParent.val());
+                        $hiddenDelay.val($visibleDelay.val());
+                        toggleControl($hiddenParent.add($hiddenDelay), !isFirstEdition);
+                    }
+
+                    setLockedChroniquesMeres(!isFirstEdition);
+
+                    const link = pathToViewChroniqueCalculee
+                        .replace('_codeStation_', data.submitted.stationCode)
+                        .replace('_codeChronique_', data.submitted.chroniqueCode);
+
+                    $lineSubmitted.html($lineSubmittedHtml
+                        .replace('_chroniqueName_', data.submitted.chroniqueName)
+                        .replace('_jobId_', data.submitted.jobId)
+                        .replace('_linkToJobPage_', data.submitted.jobPage)
+                        .replace('_linkToChronique_', link));
+                    $transformationSubmitted.show();
+                }
+                toggleControl($formButton, true);
+            }
+        });
+
+        $closeSubmitted.on('click', () => {
+            $transformationSubmitted.hide();
+        });
+
+        $('#coefficient-help').add('.help-delay')
+            .tooltip();
+        setTimeout(getChroniqueCalculee, 0);
+
+    });
+
+    function toggleControl(button, enable) {
+        $(button)
+            .toggleClass('disabled', !enable)
+            .attr('disabled', !enable);
+    }
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step1.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step1.js
new file mode 100644
index 0000000000000000000000000000000000000000..195c89e9601c6dec59c09a6c51985d2bb7755ac2
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step1.js
@@ -0,0 +1,32 @@
+/**
+ * Step 1 : file and file format
+ */
+define([
+    'jquery',
+    './import'
+], ($) => {
+    'use strict';
+
+    $.baremeImport.step1 = function () {
+        let baremeImport     = $.baremeImport.init(),
+            form              = baremeImport.form,
+            file              = baremeImport.field('file'),
+
+            stateOfSubmit = baremeImport.stateOfSubmit(() => {
+                return (file.val() !== '');
+            });
+
+            // Enables or not the "submit button"
+            file.on('change', stateOfSubmit);
+
+        // Sends file and file format to the server
+        form.ajaxForm({
+            dataType : 'json',
+            success (data) {
+                const nextStep = baremeImport.step2;
+                baremeImport.nextStep(data, nextStep);
+            }
+        });
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step2.js b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step2.js
new file mode 100644
index 0000000000000000000000000000000000000000..8dd9563a34b2b54da82999d228b87420918feb7d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/step2.js
@@ -0,0 +1,52 @@
+/**
+ * Step 2 : validation of import
+ */
+define([
+    'jquery',
+    './import'
+], ($) => {
+    'use strict';
+
+    $.baremeImport.step2 = function () {
+        let baremeImport   = $.baremeImport.init(),
+            data           = baremeImport.data,
+            form           = baremeImport.form,
+            cancel         = baremeImport.cancel(),
+            stateOfSubmit  = baremeImport.stateOfSubmit(() => {
+                return true;
+            });
+
+        // Send 'importType' to the server
+        form.ajaxForm({
+            dataType : 'json',
+            success (data) {
+                baremeImport.nextStep(data, () => {
+                    insertNewBareme(data.newBaremeData);
+                    $.filterBaremesByUnit();
+                });
+            }
+        });
+    };
+
+    const insertNewBareme = function(baremeData){
+        const $option = `${'<option'
+            + " value='"}${baremeData.id}'`
+            + ` input-unit-id='${baremeData.uniteEntreeId}'`
+            + ` output-unit-id='${baremeData.uniteSortieId}'>${
+             baremeData.nom} [${baremeData.dateCreation}]`;
+
+        const $select = $('select[name="bareme"]');
+        $select.find('option:first-of-type').after($option);
+
+        // ajout du nouveau barème dans le template
+        const optionDom = document.createElement('option');
+        optionDom.setAttribute('value', baremeData.id);
+        optionDom.setAttribute('input-unit-id', baremeData.uniteEntreeId);
+        optionDom.setAttribute('output-unit-id', baremeData.uniteSortieId);
+        optionDom.textContent = `${baremeData.nom}  [${baremeData.dateCreation}]`;
+        const selectTemplate = document.querySelector('#templateLineBareme')
+            .content.querySelector('select[name="bareme"]');
+        selectTemplate.insertBefore(optionDom, selectTemplate.querySelector('option:nth-of-type(2)'));
+    };
+
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/style.css b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..2dc8004548246e7f8b422f1e5bb86bd52f565a15
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/entries/transformation/style.css
@@ -0,0 +1,38 @@
+div.bareme{
+    margin-bottom:2px;
+}
+div.bareme > div.input-group.listeBareme > select.form-control.bareme{
+    border-radius:4px 0 0 4px;
+    width:211px;
+}
+div.bareme > div.input-group{
+    margin-left:-1px;
+}
+div.bareme > div.input-group > input[type="text"]{
+    width:145px;
+    padding-left:2px;
+    padding-right:2px;
+}
+div.bareme > div.input-group.divEndDate > input.endDate{
+    border-top-right-radius:4px;
+    border-bottom-right-radius:4px;
+}
+div.bareme > div.input-group.divEndDate > span.input-group-btn:last-of-type{
+    left:-17px;
+    display:block;
+}
+div.bareme > div.input-group.divEndDate > span.input-group-btn:last-of-type > a{
+    padding-left:2px;
+    padding-right:2px;
+    opacity:0.25;
+}
+div.bareme > div.input-group.divEndDate > span.input-group-btn:last-of-type > a.disabled{
+    opacity:0;
+}
+div.bareme > div.input-group.divEndDate > span.input-group-btn:last-of-type > a:hover{
+    opacity:0.65;
+}
+/* import de barèmes */
+div#bareme-import div.alert-info:last-child{
+    margin-bottom:0;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/colorpicker.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/colorpicker.js
new file mode 100644
index 0000000000000000000000000000000000000000..347911a2c2f50e38a0ea26f54dab8ec7225976f7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/colorpicker.js
@@ -0,0 +1,16 @@
+const $ = require('jquery');
+
+const config = {
+    letterCase: 'uppercase',
+    theme: 'bootstrap'
+};
+
+$(() => {
+    const inputs = $('input.colorpicker');
+    if (!inputs.length) {
+        return;
+    }
+    require('@claviska/jquery-minicolors');
+    require('@claviska/jquery-minicolors/jquery.minicolors.css');
+    $(inputs).minicolors(config);
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/base.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..4687ab2e023bbda1a8a5510314ded1d3a216c6d8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/base.js
@@ -0,0 +1,73 @@
+const $ = require('jquery');
+
+class BaseWidget {
+
+    constructor(el) {
+
+        this.element = $(el);
+        this.basePath = this.element.data('base-path');
+
+        this.fileInput = this.element.find('[name$="[new]"]');
+        this.currentInput = this.element.find('[name$="[current]"]');
+
+        this.preview = this.element.find('.preview');
+        this.placeholder = this.element.find('.placeholder');
+        this.deleteBtn = this.element.find('.delete');
+        this.undoBtn = this.element.find('.undo');
+
+        this.initialValue = this.currentInput.val() || '';
+
+        this.undoBtn.on('click.bdoh-file-widget', (ev) => {
+            ev.preventDefault();
+            this.undo();
+        });
+
+        this.deleteBtn.on('click.bdoh-file-widget', (ev) => {
+            ev.preventDefault();
+            this.delete();
+        });
+
+        this.fileInput.on('change.bdoh-file-widget', () => this.update());
+    }
+
+    undo() {
+        this.fileInput.val('');
+        this.currentInput.val(this.initialValue);
+        this.update();
+    }
+
+    delete() {
+        this.fileInput.val('');
+        this.currentInput.val('');
+        this.update();
+    }
+
+    update() {
+        const currentValue = this.currentInput.val() || '';
+        const newValue = this.fileInput.val() || '';
+        const anyValue = newValue || currentValue;
+        const hasValue = anyValue !== '';
+
+        this.undoBtn.toggle(anyValue !== this.initialValue && this.initialValue !== '');
+
+        this.deleteBtn.toggle(hasValue);
+        this.preview.toggle(hasValue);
+        this.placeholder.toggle(!hasValue);
+
+        if (newValue) {
+            this.showNewPreview(this.fileInput[0].files[0]);
+        } else if (currentValue) {
+            this.showCurrentPreview(this.basePath + currentValue);
+        }
+    }
+
+    showNewPreview() {
+        throw new Error('Abstract method AbstractFileWidget.showNewPreview');
+    }
+
+    showCurrentPreview() {
+        throw new Error('Abstract method AbstractFileWidget.showNewPreview');
+    }
+}
+
+module.exports = BaseWidget;
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/file.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/file.js
new file mode 100644
index 0000000000000000000000000000000000000000..79e02e4b45ffae918a28fe50ee48e6695fb0139f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/file.js
@@ -0,0 +1,24 @@
+const BaseWidget = require('./base.js');
+
+class FileWidget extends BaseWidget {
+
+    constructor(el) {
+        super(el);
+
+        this.link = this.preview.find('a');
+        this.linkText = this.link.find('span');
+    }
+
+    showNewPreview() {
+        this.preview.hide();
+    }
+
+    showCurrentPreview(url) {
+        const lastSlash = url.lastIndexOf('/');
+        const name = lastSlash >= 0 ? url.substr(lastSlash + 1) : url;
+        this.link.attr('href', url);
+        this.linkText.text(name);
+    }
+}
+
+module.exports = FileWidget;
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/image.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/image.js
new file mode 100644
index 0000000000000000000000000000000000000000..3cb8262642eb61cd87844d5f477f3de1ea0264d4
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/image.js
@@ -0,0 +1,16 @@
+const BaseWidget = require('./base.js');
+
+class ImageWidget extends BaseWidget {
+
+    showNewPreview(file) {
+        const reader = new FileReader();
+        reader.onloadend = () => this.preview.attr('src', reader.result);
+        reader.readAsDataURL(file);
+    }
+
+    showCurrentPreview(url) {
+        this.preview.attr('src', url);
+    }
+}
+
+module.exports = ImageWidget;
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..47542d41358068ed151916ba7fd1c562ea2756e6
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/file-widget/index.js
@@ -0,0 +1,20 @@
+const $ = require('jquery');
+const classes = {
+    file: require('./file'),
+    image: require('./image'),
+}
+
+function enableFileWidget(el) {
+    const type = $(el).data('file-widget');
+        const clazz = classes[type];
+        if (clazz) {
+            const widget = new clazz(el);
+            widget.update();
+        }
+}
+
+global.enableFileWidget = function(selector) {
+  $(() => {
+    enableFileWidget($(selector));
+  });
+};
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/htmleditor.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/htmleditor.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d89a89a8e2c56fbe8cc7b2e877b7bb45231add9
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/htmleditor.js
@@ -0,0 +1,30 @@
+const $ = require('jquery');
+
+$(() => {
+    const editors = $('textarea.htmleditor');
+    if (!editors.length) {
+        return;
+    }
+
+    require('trumbowyg');
+    require('trumbowyg/dist/langs/fr.min');
+    require('trumbowyg/dist/ui/trumbowyg.css');
+
+    editors.trumbowyg({
+        lang: $('html').attr('lang') || 'fr',
+        autogrowOnEnter: true,
+        svgPath: require('trumbowyg/dist/ui/icons.svg'),
+        btns: [
+            ['undo', 'redo'], // Only supported in Blink browsers
+            ['formatting'],
+            ['strong', 'em', 'del'],
+            ['superscript', 'subscript'],
+            ['link'],
+            ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
+            ['unorderedList', 'orderedList'],
+            ['horizontalRule'],
+            ['removeformat'],
+            ['fullscreen']
+        ]
+    });
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/index.js b/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..7856ebe03844f9e5fe2c394ce11ebad2846930e8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/index.js
@@ -0,0 +1,11 @@
+const $ = require('jquery');
+
+$(() => {
+    const inputs = $('input.minicolors');
+    if (!inputs.length) {
+        return;
+    }
+    require('@claviska/jquery-minicolors/jquery.minicolors');
+    require('@claviska/jquery-minicolors/jquery.minicolors.css');
+    require('./style.css');
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/style.css b/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..3858fb27cffd8315268dec3fb094c53f1bc1ba9f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/assets/lib/minicolors/style.css
@@ -0,0 +1,3 @@
+.form-control.minicolors-input {
+    height: 2em;
+}
diff --git a/src/Irstea/BdohAdminBundle/Resources/config/routing.yml b/src/Irstea/BdohAdminBundle/Resources/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..667f0b408374dcca01f20328102b6a4b08f32ae3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/config/routing.yml
@@ -0,0 +1,123 @@
+admin:
+    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
+    prefix: /
+
+
+_sonata_admin:
+    resource: .
+    type: sonata_admin
+    prefix: /
+
+##########
+# Measures import
+##########
+
+bdoh_admin_measure_import_stop:
+    path: /mesure/import/stop
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:stop }
+
+bdoh_admin_controle_import_stop:
+    path: /controle/import/stop
+    defaults: { _controller: IrsteaBdohAdminBundle:PointControle:stop }
+
+bdoh_admin_measure_import:
+    path: /mesure/import
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:step1 }
+
+bdoh_admin_measure_import_step2:
+    path: /mesure/import/step2
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:step2 }
+
+bdoh_admin_measure_import_step2_next:
+    path: /mesure/import/step2/next
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:step2Next }
+
+bdoh_admin_measure_import_step3:
+    path: /mesure/import/step3
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:step3 }
+
+bdoh_admin_measure_import_step4:
+    path: /mesure/import/step4
+    defaults: { _controller: IrsteaBdohAdminBundle:MeasureImport:step4 }
+
+bdoh_admin_controle_import:
+    path: /controle/import
+    defaults: { _controller: IrsteaBdohAdminBundle:PointControle:step1 }
+
+bdoh_admin_controle_export:
+    path: /controle/export
+    defaults: { _controller: IrsteaBdohAdminBundle:PointControle:export }
+
+bdoh_admin_controle_import_step2:
+    path: /controle/import/step2
+    defaults: { _controller: IrsteaBdohAdminBundle:PointControle:step2 }
+
+bdoh_admin_controle_import_step3:
+    path: /controle/import/step3
+    defaults: { _controller: IrsteaBdohAdminBundle:PointControle:step3 }
+
+bdoh_admin_transformation:
+    path: /transformation
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:display }
+
+bdoh_admin_save_transformation:
+    path: /transformation/save
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:saveTransformation }
+    methods: [POST]
+
+bdoh_admin_bareme_import_step2:
+    path: /transformation/import/bareme/step2
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:importBaremeStep2 }
+
+bdoh_admin_bareme_import_step3:
+    path: /transformation/import/bareme/step3
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:importBaremeStep3 }
+
+bdoh_admin_bareme_import_stop:
+    path: /transformation/import/bareme/stop
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:importBaremeStop }
+
+bdoh_admin_bareme_export:
+    path: /transformation/export/bareme
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:exportBareme }
+
+bdoh_admin_jeu_bareme_export:
+    path: /transformation/export/jeu-bareme
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:exportJeuBareme }
+    methods: [POST]
+
+bdoh_admin_get_baremes_export:
+    path: /transformation/export/bareme/list
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:getBaremesForExport }
+
+bdoh_admin_shape_import:
+    path: /shape/import
+    defaults: { _controller: IrsteaBdohAdminBundle:ShapeImport:step1 }
+
+bdoh_admin_shape_import_step2:
+    path: /shape/import/step2
+    defaults: { _controller: IrsteaBdohAdminBundle:ShapeImport:step2 }
+
+bdoh_admin_shape_import_step3:
+    path: /shape/import/step3
+    defaults: { _controller: IrsteaBdohAdminBundle:ShapeImport:step3 }
+
+bdoh_admin_shape_import_stop:
+    path: /shape/import/stop
+    defaults: { _controller: IrsteaBdohAdminBundle:ShapeImport:stop }
+
+bdoh_admin_get_chronique_calculee:
+    path: /get-chronique-calculee
+    defaults: { _controller: IrsteaBdohAdminBundle:Transformation:getChroniqueCalculee }
+
+bdoh_admin_generate_chronique_code:
+    path: /generate-chronique-code
+    defaults: { _controller: IrsteaBdohAdminBundle:Info:generateChroniqueCode }
+
+bdoh_admin_get_filtered_chroniques:
+    path: /get-filtered-chroniques
+    defaults: { _controller: IrsteaBdohAdminBundle:Info:getFilteredChroniques }
+
+_annotated_controllers:
+    resource: "@IrsteaBdohAdminBundle/Controller"
+    type:     annotation
diff --git a/src/Irstea/BdohAdminBundle/Resources/config/services.yml b/src/Irstea/BdohAdminBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..522a8ee3fc8c67ac86c7d9bf23d554bc8d63582c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/config/services.yml
@@ -0,0 +1,495 @@
+parameters:
+    irstea_bdoh_admin.measure_import:
+
+        # Path of directory containing measure files to import (relative to the app dir).
+        directory: imports/measure/
+
+        # Authorized mime types (by category) for measures files
+        mimeTypes:
+            txt:
+                - 'text/plain'
+                - 'text/csv'
+            zip:
+                - 'application/zip'
+                - 'application/x-zip-compressed'
+
+        # A map of formats and their specific importers
+        importers:
+            # General
+            Bdoh                  : Irstea\BdohAdminBundle\Importer\Measure\BdohImporter
+            BdohPlage             : Irstea\BdohAdminBundle\Importer\Measure\BdohPlageImporter
+            Qjo                   : Irstea\BdohAdminBundle\Importer\Measure\QjoImporter
+            Qtvar                 : Irstea\BdohAdminBundle\Importer\Measure\QtvarImporter
+
+
+    irstea_bdoh_admin.controle_import:
+
+        # Path of directory containing measure files to import (relative to the app dir).
+        directory: imports/controle/
+
+        # Authorized mime types (by category) for measures files
+        mimeTypes:
+            txt:
+                - 'text/plain'
+                - 'text/csv'
+
+        # A map of formats and their specific importers
+        importers:
+            # General
+            controle                  : Irstea\BdohAdminBundle\Importer\Controle\Manager
+
+    irstea_bdoh_admin.shape_import:
+
+        # Path of directory containing measure files to import (relative to the app dir).
+        directory: imports/shape
+
+        # Authorized mime types (by category) for measures files
+        mimeTypes:
+            zip:
+                - 'application/zip'
+                - 'application/x-zip-compressed'
+
+        # A map of formats and their specific importers
+        importers:
+            shape: Irstea\BdohAdminBundle\Importer\Shapefile\Manager
+
+    irstea_bdoh_admin.bareme_import:
+
+        # Path of directory containing measure files to import (relative to the app dir).
+        directory: imports/bareme/
+
+        # Authorized mime types (by category) for measures files
+        mimeTypes:
+            txt:
+                - 'text/plain'
+                - 'text/csv'
+
+        # A map of formats and their specific importers
+        importers:
+            # General
+            bareme                  : Irstea\BdohAdminBundle\Importer\Bareme\Manager
+
+    ############################################################################
+    # The description file of bareme export formats (relative to the web dir)
+    irstea_bdoh_admin.bareme_export.formats_export_file: documents/FormatsExport.pdf
+
+services:
+    # Manager of "measure import"
+    irstea_bdoh_admin.manager.measure_import:
+        class: Irstea\BdohAdminBundle\Manager\MeasureImportManager
+        arguments: [ "%kernel.root_dir%", "%irstea_bdoh_admin.measure_import%" ]
+
+    # Manager of "controle import"
+    irstea_bdoh_admin.manager.controle_import:
+        class: Irstea\BdohAdminBundle\Manager\ControleImportManager
+        arguments: [ "%kernel.root_dir%", "%irstea_bdoh_admin.controle_import%" ]
+
+    # Manager of "shape import"
+    irstea_bdoh_admin.manager.shape_import:
+        class: Irstea\BdohAdminBundle\Manager\ShapeImportManager
+        arguments: [ "%kernel.root_dir%", "%irstea_bdoh_admin.shape_import%" ]
+
+    # Manager of "bareme import"
+    irstea_bdoh_admin.manager.bareme_import:
+        class: Irstea\BdohAdminBundle\Manager\BaremeImportManager
+        arguments: [ "%kernel.root_dir%", "%irstea_bdoh_admin.bareme_import%" ]
+
+    # Form type
+    irstea_bdoh_admin.form.type.theiathesaurus:
+        class: Irstea\BdohAdminBundle\Form\Type\TheiaThesaurusType
+        arguments:
+            $thesaurusUrl: "%uri_theia_ozcar%"
+        tags:
+            - { name: form.type }
+
+    ############################################################################
+    # Administration by SonataAdminBundle
+    ############################################################################
+
+    app.menu_listener:
+        class: Irstea\BdohAdminBundle\EventListener\MenuBuilderListener
+        tags:
+            - { name: kernel.event_listener, event: sonata.admin.event.configure.menu.sidebar, method: addMenuItems }
+
+    irstea_bdoh_admin.admin.template:
+        abstract: true
+        calls:
+            - [setLogger, ["@irstea_bdoh_logger.logger"]]
+            - [setRequest, ["@=service('request_stack').getCurrentRequest()"]]
+
+    ############################################################################
+    irstea_bdoh_admin.admin.observatoire:
+        class: Irstea\BdohAdminBundle\Admin\Data\Observatoire
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Observatoire
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.site_experimental:
+        class: Irstea\BdohAdminBundle\Admin\Data\SiteExperimental
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\SiteExperimental
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.station:
+        class: Irstea\BdohAdminBundle\Admin\Data\Station
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Station
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.chronique:
+        class: Irstea\BdohAdminBundle\Admin\Data\Chronique
+        tags:
+            - { name: sonata.admin, manager_type: orm, persist_filters: true, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Chronique
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.chronique_continue:
+        class: Irstea\BdohAdminBundle\Admin\Data\ChroniqueContinue
+        tags:
+            - { name: sonata.admin, manager_type: orm, persist_filters: true, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\ChroniqueContinue
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.chronique_discontinue:
+        class: Irstea\BdohAdminBundle\Admin\Data\ChroniqueDiscontinue
+        tags:
+            - { name: sonata.admin, manager_type: orm, persist_filters: true, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.chronique_calculee:
+        class: Irstea\BdohAdminBundle\Admin\Data\ChroniqueCalculee
+        tags:
+            - { name: sonata.admin, manager_type: orm, persist_filters: true, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\ChroniqueCalculee
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.chronique_convertie:
+        class: Irstea\BdohAdminBundle\Admin\Data\ChroniqueConvertie
+        tags:
+            - { name: sonata.admin, manager_type: orm, persist_filters: true, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\ChroniqueConvertie
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.dataset:
+        class: Irstea\BdohAdminBundle\Admin\Data\DataSet
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\DataSet
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.bareme:
+        class: Irstea\BdohAdminBundle\Admin\Data\Bareme
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminCenter }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Bareme
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.jeu_qualite:
+        class: Irstea\BdohAdminBundle\Admin\Data\JeuQualite
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\JeuQualite
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.echantillonnage:
+        class: Irstea\BdohAdminBundle\Admin\Data\Echantillonnage
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Echantillonnage
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.pas_echantillonnage:
+        class: Irstea\BdohAdminBundle\Admin\SimpleEntity
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\PasEchantillonnage
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.famille_parametres:
+        class: Irstea\BdohAdminBundle\Admin\Data\FamilleParametres
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\FamilleParametres
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.type_parametre:
+        class: Irstea\BdohAdminBundle\Admin\Data\TypeParametre
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\TypeParametre
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+        ############################################################################
+    irstea_bdoh_admin.admin.unite:
+        class: Irstea\BdohAdminBundle\Admin\Data\Unite
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTechnical }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Unite
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.bassin:
+        class: Irstea\BdohAdminBundle\Admin\Data\Bassin
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminGeographic }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Bassin
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.courseau:
+        class: Irstea\BdohAdminBundle\Admin\Data\CoursEau
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminGeographic }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\CoursEau
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.commune:
+        class: Irstea\BdohAdminBundle\Admin\Data\Commune
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminGeographic }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Commune
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.doi:
+        class: Irstea\BdohAdminBundle\Admin\Data\Doi
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminPeripheral }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Doi
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.partenaire:
+        class: Irstea\BdohAdminBundle\Admin\Data\Partenaire
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminPeripheral }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Partenaire
+            - null
+        parent: irstea_bdoh_admin.admin.template
+    ############################################################################
+    irstea_bdoh_admin.admin.milieu:
+        class: Irstea\BdohAdminBundle\Admin\Data\Milieu
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminPeripheral }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\Milieu
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ########################THEIA#############################################
+    irstea_bdoh_admin.admin.type_funding:
+        class: Irstea\BdohAdminBundle\Admin\Data\TypeFunding
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\TypeFunding
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ########################THEIA#############################################
+    irstea_bdoh_admin.admin.dataconstraint:
+        class: Irstea\BdohAdminBundle\Admin\Data\DataConstraint
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\DataConstraint
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ########################THEIA#############################################
+    irstea_bdoh_admin.admin.inspire_theme:
+        class: Irstea\BdohAdminBundle\Admin\Data\InspireTheme
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\InspireTheme
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ########################THEIA#############################################
+    irstea_bdoh_admin.admin.topic_category:
+        class: Irstea\BdohAdminBundle\Admin\Data\TopicCategory
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\TopicCategory
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.theia_categories:
+        class: Irstea\BdohAdminBundle\Admin\Data\TheiaCategories
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\TheiaCategories
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ########################THEIA#############################################
+    irstea_bdoh_admin.admin.criteria_climat:
+        class: Irstea\BdohAdminBundle\Admin\Data\CriteriaClimat
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\CriteriaClimat
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.criteria_geology:
+        class: Irstea\BdohAdminBundle\Admin\Data\CriteriaGeology
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminTheia }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\CriteriaGeology
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.utilisateur:
+        class: Irstea\BdohAdminBundle\Admin\Security\Utilisateur
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminUser }
+        arguments:
+            - null
+            - Irstea\BdohSecurityBundle\Entity\Utilisateur
+            - null
+        parent: irstea_bdoh_admin.admin.template
+        calls:
+            - [setEncoder, ["@security.encoder_factory"]]
+
+    ############################################################################
+    irstea_bdoh_admin.admin.personnetheia:
+        class: Irstea\BdohAdminBundle\Admin\Data\PersonneTheia
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminUser }
+        arguments:
+            - null
+            - Irstea\BdohDataBundle\Entity\PersonneTheia
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.categorie:
+        class: Irstea\BdohAdminBundle\Admin\SimpleEntity
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminUser }
+        arguments:
+            - null
+            - Irstea\BdohSecurityBundle\Entity\Categorie
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.objectifrecherche:
+        class: Irstea\BdohAdminBundle\Admin\SimpleEntity
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminUser }
+        arguments:
+            - null
+            - Irstea\BdohSecurityBundle\Entity\ObjectifRecherche
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+    ############################################################################
+    irstea_bdoh_admin.admin.typetravaux:
+        class: Irstea\BdohAdminBundle\Admin\SimpleEntity
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: AdminUser }
+        arguments:
+            - null
+            - Irstea\BdohSecurityBundle\Entity\TypeTravaux
+            - null
+        parent: irstea_bdoh_admin.admin.template
+
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/doc/index.rst b/src/Irstea/BdohAdminBundle/Resources/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohAdminBundle/Resources/doc/measureImport.ep b/src/Irstea/BdohAdminBundle/Resources/doc/measureImport.ep
new file mode 100644
index 0000000000000000000000000000000000000000..93e6d386071a6facbb54d8ff20d37ff2f2eb8ae2
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/doc/measureImport.ep
@@ -0,0 +1,476 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Étape 1</Property><Property name="id">1343721517471_3779</Property><Property name="width">908</Property><Property name="height">833</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="2d5d1a41d30a4ca899e31e9c1a9be623" transform="matrix(1,0,0,1,25,6)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<span style="font-weight: bold;">URL :<br /></span><ul><li><span style="font-style: italic;">bdoh.irstea.fr/real-collobrier/admin/mesure/import</span></li><li><span style="font-style: italic;">bdoh.irstea.fr/real-collobrier/admin/import</span></li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="325" height="57" p:name="htmlObject" id="6d125507cd514e46ae4bceaa64b1edcd" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="fc7c63fb33d54d8dbb288eaeeb5902df" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-weight: bold;">URL :<br /></span><ul><li><span style="font-style: italic;">bdoh.irstea.fr/real-collobrier/admin/mesure/import</span></li><li><span style="font-style: italic;">bdoh.irstea.fr/real-collobrier/admin/import</span></li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="c3d22fef63964a1180645041ec08319b" transform="matrix(1,0,0,1,19,241)"><p:metadata><p:property name="box"><![CDATA[875,449]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[43.74999999999999,0]]></p:property><p:property name="textPadding"><![CDATA[0,14.966666666666667]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="881" height="455" p:name="htmlObject" id="8687b9b9c3a84e5d83c47acc493d8bfb" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 875px; height: 449px; padding: 14.9667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="b24ffc07553f4c11b9dbe278e3f427a9"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="247fb0a744194d689e5b9a7636960ae4" transform="matrix(1,0,0,1,19,183)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="395" height="28" p:name="htmlObject" id="9259edfaa9d346bd806774ffc938d353" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="24986cd4c7394c6593f21324a8179581" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="ebbcd49c4fb54a83bc7d91bfdade1e81" transform="matrix(1,0,0,1,34,292)"><p:metadata><p:property name="box"><![CDATA[846,213]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[42.3,0]]></p:property><p:property name="textPadding"><![CDATA[0,7.1000000000000005]]></p:property><p:property name="fillColor"><![CDATA[#3399995E]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="852" height="219" p:name="htmlObject" id="cdb2c155807641d4a70ccfbe87213f56" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 846px; height: 213px; padding: 7.1px; background-color: rgba(51, 153, 153, 0.37); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="e0d7d38ba1584d7fac2ef134a11de203"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ea02dd0aea344660b4de3eeaf603a9e7" transform="matrix(1,0,0,1,37,299)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Information :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="81547e3580d740c795b44bc1afc8b568" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="b8a741b8526d4bafa3394e602d9a0059"><tspan x="0" y="0">Information :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="88489e4ed81d421a81fdda9f42825d43" transform="matrix(1,0,0,1,37,374)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Format attendu :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e9d11561b173443a8c565e8646de2374" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="13121ac2f60345d2a545feca13d1644d"><tspan x="0" y="0">Format attendu :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="fe46c62c589e4d3ba51cecbb24e6b85f" transform="matrix(1,0,0,1,29,394)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>Entête : 3 lignes : 
+	<ul><li>"Station ; Fuseau ; Chronique (n fois)</li><li> valeur code ; valeur fuseau (format : +/-HH:MM) ; valeur code (n fois)</li><li> DateHeure ; valeur (n fois) ; qualité (n fois) ; min (0 ou n fois) ; max (0 ou n fois)" </li></ul>
+	</li><li>Puis : "AAAA-MM-JJ HH:MM:SS ; valeur (n fois) ; code VALID (n fois) ; valeur (0 ou n fois) ; valeur (0 ou n fois)" </li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="681" height="98" p:name="htmlObject" id="7d36ac5fda3d4583a6997043d39b60c9" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="9690d90d72b646dcbfdf9eb6dbb43def" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>Entête : 3 lignes : 
+	<ul><li>"Station ; Fuseau ; Chronique (n fois)</li><li> valeur code ; valeur fuseau (format : +/-HH:MM) ; valeur code (n fois)</li><li> DateHeure ; valeur (n fois) ; qualité (n fois) ; min (0 ou n fois) ; max (0 ou n fois)" </li></ul>
+	</li><li>Puis : "AAAA-MM-JJ HH:MM:SS ; valeur (n fois) ; code VALID (n fois) ; valeur (0 ou n fois) ; valeur (0 ou n fois)" </li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="c24c39bf7ea04bb594aa8cc14bd42e1b" transform="matrix(1,0,0,1,25,323)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>Un fichier contient des données d'une seule station.</li><li>Vous pouvez envoyer vos <span style="text-decoration: underline;">gros fichiers de mesures</span> sous format <span style="font-weight: bold;">zip</span> <span style="font-style: italic;">(un fichier par zip)</span>.<br /><br /></li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="537" height="57" p:name="htmlObject" id="3a57f5235633472e86406347a6d5d90d" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="dd3e667784384b8689f12d8324170067" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>Un fichier contient des données d'une seule station.</li><li>Vous pouvez envoyer vos <span style="text-decoration: underline;">gros fichiers de mesures</span> sous format <span style="font-weight: bold;">zip</span> <span style="font-style: italic;">(un fichier par zip)</span>.<br /><br /></li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7e7567e7121d49e2959410f4777e12c4" transform="matrix(1,0,0,1,669,391)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(s'affiche à la sélection d'un format)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="bda74e4e488d43c89b12636ba374d8fc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="cd33649ce2e54cb292aa8c4bfd81e6a1"><tspan x="0" y="0">(s'affiche à la sélection d'un format)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e8da035b8d2d4e25ac236d537c0f31bf" transform="matrix(1,0,0,1,29,533)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fichier]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="bc695861766347e9951345fc66f0c1e6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4ddf17b4375847648d970135e1682bdb"><tspan x="0" y="0">Fichier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="1852378275ac49f8b170af7c8951dd27" transform="matrix(1,0,0,1,80,528)"><p:metadata><p:property name="box"><![CDATA[127,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="58eb495c6b77437d9dc040b9ef78a05e" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="4a99b69b7a7c4a4695c094866de9cdc2" transform="translate(0.5,0.5)" d="M 0 0 L 21.083524287919676 0.07484538199963553 L 38.34776562397955 -0.4524228405388929 L 57.299697839092936 -0.38976125411262785 L 80.44420530406845 -0.21104652037974037 L 100.08774599545511 -0.04258909763841012 L 127 0 L 127.46397798496582 12.072745970819206 L 127 25 L 110.25001999239598 25.044799833545312 L 91.10339633987384 25.076142031216747 L 73.15602185084843 25.083730195213768 L 55.38222907609878 25.454295902449527 L 33.83231091300109 25.319700328028187 L 0 25 L -0.058713340501414635 12.853451618644723 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="e4dccd7fabcb4801bda15bff2004282e" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="43"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c81cc545e43c4559beed6fab598f2a27" transform="matrix(1,0,0,1,212,530)"><p:metadata><p:property name="box"><![CDATA[90,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Parcourir...]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f3339f5eba2c44fdba20173d37e1e898" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="18c298503a6f469d986adbdeb0596e02" d="M 0 0 L 21.987663756149846 0.40229954783273925 L 41.28309513077035 0.355723992555687 L 57.50710415221332 0.4329940373257126 L 90 0 L 90.02887016791395 14.385744517394636 L 90 25 L 67.12876934579629 24.862316268657693 L 46.63626473249074 24.59806211335336 L 25.722405931084303 24.56105617335793 L 0 25 L -0.3400899595108301 12.252571607623148 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="1e671a0e3f07457e87cc86128e32d189" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="11" y="17">Parcourir...</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1ea2657653504aa6b42c25a3ab0b4f44" transform="matrix(1,0,0,1,336,535)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Format]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e5a518ee76a848069e6ddeecb12f8994" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f6a6a3f6a5f4475c944fe9e4e36451b6"><tspan x="0" y="0">Format</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="93879c98aa2c422287c3df09361ae36a" transform="matrix(1,0,0,1,391,531)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="7fbb6ff0887e4dff8bb5743752c47418" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="352b2774a99d432a82a2ed3848597adb" d="M 0 0 L 22.404303455673315 0.3029507925832283 L 44.0321652020412 0.09752334757668002 L 67.13763742804944 -0.13821150742594712 L 89.63816869675468 0.20333966661041225 L 111.86555900697023 -0.05827385268221519 L 131.51345644110106 -0.11463289741057947 L 151.92687893694895 0.14399764754419908 L 175 0 L 175.48912639336012 10.716266557036018 L 175 25 L 154.69556766403494 25.489042795615738 L 135.17206180507029 25.45617197300911 L 117.48057513685006 25.4304686011757 L 93.93436049632453 24.922556440827638 L 76.48499442714338 24.73890824273573 L 55.6866068485091 24.77011431141578 L 34.19608028481661 24.833181133059913 L 0 25 L 0.0233731489518042 10.73014132329109 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="3403ec6d3604436ebff61283602dda24" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="e7bb47470dac4f5a898a47a835e0e4d9" d="M 175 0 L 187.55403370144018 0.3852484215133788 L 200 0 L 200.4686503213327 10.746885206641956 L 200 25 L 187.76519818944035 25.472894015742927 L 175 25 L 174.76623917203776 14.337700280168933 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.89540052887918 4.674356158733391 L 196.16 5 L 191.52246055655493 13.391005995580919 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="a4771922b9f04b438d5962f479208c1c"/>
+            <text p:name="text" id="6acb71814790409ba8806f571f057fed" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="2598fd609cf8485f98ec6eb8805fff07" transform="matrix(1,0,0,1,604,531)"><p:metadata><p:property name="box"><![CDATA[90,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Envoyer]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="c54c91a371014e6487978d31d714df36" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="ac728e73de384d5280cf3097d79918db" d="M 0 0 L 18.893106615526737 0.3231209467849403 L 42.16629722991127 -0.22372770731365543 L 60.86497607698142 0.2446674879737587 L 90 0 L 89.61978917528621 12.42576096585902 L 90 25 L 68.0220583655431 24.60042529950692 L 47.70044903499764 25.188740703651362 L 27.6819228118688 24.66247878102705 L 0 25 L -0.09081065154568335 13.363187312502543 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="8ea9546f71524b3b84f1b3a97569cf12" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="21" y="17">Envoyer</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ae1e1cf02e1d458b90b4d763726259bd" transform="matrix(1,0,0,1,584,566)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(ne s'active que lorsque les 2 champs ont été saisis)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a1e48dc5817f4ce4868afa33de89686a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="f59c01267f87445fa0505a7548515b45"><tspan x="0" y="0">(ne s'active que lorsque les 2 champs ont été saisis)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:ProgressBar" id="001a3d7b6a0e4ce89706736ab4e5cd5a" transform="matrix(1,0,0,1,37,578)"><p:metadata><p:property name="box"><![CDATA[265,20]]></p:property><p:property name="valueHandle"><![CDATA[70,0]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <path style="fill: white; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="rect" id="0f086f89069b4c1ea56dfc8e99953afc" d="M 0 0 L 18.33752639925647 -0.17121220952797078 L 38.510337723730494 -0.029593569470922065 L 57.01686387476098 -0.44959690123370954 L 77.78269618687442 0.05383050515941934 L 99.60520109407216 -0.45496194920605615 L 117.92150334073989 0.3767801499232373 L 135.7323876159551 -0.2263946598290616 L 157.16968302609953 -0.16064241728312623 L 178.09944507245288 0.16724547438542992 L 197.9013256185209 -0.4267244448525642 L 215.5711823214637 0.1910180433505081 L 236.85749672604007 0.1630766594941182 L 265 0 L 264.73907174712707 10.37204745210955 L 265 20 L 245.89493660752336 19.689689740081427 L 224.57336486150413 19.869190798084176 L 207.16626719683202 20.2106554984963 L 186.97387414261615 19.707244360709424 L 168.3874948653629 19.852529387515617 L 145.37646274081422 19.69078289016538 L 125.8606099634646 19.704233597150388 L 105.37100793440736 19.615193178951145 L 88.1483197921593 19.61567708610384 L 66.93976185253386 20.053950196944935 L 44.92117147504827 19.88336072906303 L 23.195313965946262 20.30470126510678 L 0 20 z"/>
+            <path style="fill: white; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line" id="bfcddad7d6964df18d365f6e10f14b3a" d="M 0 3 L 0.4898044201528897 8.977300680871663 L 0 17 M 5 3 L 4.659284610299383 9.60591251658352 L 5 17 M 10 3 L 10.241744602048152 9.210341114713883 L 10 17 M 15 3 L 15.171594365732954 9.960726053908108 L 15 17 M 20 3 L 20.188973629465078 10.698901381721821 L 20 17 M 25 3 L 25.14449322852765 8.718777574006447 L 25 17 M 30 3 L 29.91513562800869 10.252479340930071 L 30 17 M 35 3 L 34.875764157847776 8.889442080244372 L 35 17 M 40 3 L 39.58378327680603 9.392101050124804 L 40 17 M 45 3 L 44.68552352948514 9.964019802578042 L 45 17 M 50 3 L 50.2594323915124 10.712751057691737 L 50 17 M 55 3 L 55.2820116296698 10.483519301786078 L 55 17 M 60 3 L 60.2540400536731 11.093291203218369 L 60 17 M 65 3 L 64.59263719701772 9.852640182296112 L 65 17"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:htmlText" id="5d37bff56c3d4d9dbeb6143111f1859e" transform="matrix(1,0,0,1,31,604)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<span style="font-style: italic;">(Progress bar de téléchargement.</span><br style="font-style: italic;" /><span style="font-style: italic;">Ne s'affiche que pour des fichiers &gt; à 1Mio,<br />lorsque le bouton «Envoyer» est appuyé)</span><br style="font-style: italic;" />]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+            <foreignObject x="0" y="0" width="270" height="45" p:name="htmlObject1" id="80e6a407c68f42138d483580063bfc00" style="color: rgb(0, 0, 0); opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv1" id="053df3c017a84b559947e6398fc7ab36" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-style: italic;">(Progress bar de téléchargement.</span><br style="font-style: italic;" /><span style="font-style: italic;">Ne s'affiche que pour des fichiers &gt; à 1Mio,<br />lorsque le bouton «Envoyer» est appuyé)</span><br style="font-style: italic;" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,81)" id="940ad0e35ed54b8e80bafdc37f10df4e"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="ebc3af50141e42fabdedb4aeca5411cf" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="378c910ee85d4829ba2bf77f903c9d1b" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="73d2edfab2fc45548cc5b0003d77019d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#378c910ee85d4829ba2bf77f903c9d1b" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#73d2edfab2fc45548cc5b0003d77019d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="062b51f5a3864b648696ab7adcf91301"/>
+            <use xlink:href="#378c910ee85d4829ba2bf77f903c9d1b" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="bffacfed1eca47959e7b4bfb7ac8e215" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="ca701ec9a677470091c3916db72c55ca" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="c5f82b93e1bd49018abcd332f1b46192" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="eb8023d734a242059b2ce98cb0533542">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#c5f82b93e1bd49018abcd332f1b46192" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#eb8023d734a242059b2ce98cb0533542)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="a54128c960a54f49802e64c73c51db25"/>
+            <use xlink:href="#c5f82b93e1bd49018abcd332f1b46192" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="29c6a62fd62143e5b2c4bd24a46cd15f" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="6d61e5d9418b4429bcd92cb3301dafe1" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="c315c8a3a7484ea6b3a5c1607f1cda97">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="5748f7375a404682893c29e48329e732">
+                    <ellipse p:name="ellipse" id="4c80d27e28524fd89fc701c17ab6ef14" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#5748f7375a404682893c29e48329e732" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#c315c8a3a7484ea6b3a5c1607f1cda97)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="a9152aedb65c423d90d21e886e1adbe1"/>
+            <use xlink:href="#5748f7375a404682893c29e48329e732" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="47dddb313d004a4ea35a0fda212df07e" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c42b703b05f54042bae28e5e69b766c1" transform="matrix(1,0,0,1,127.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a0f36279afae4d18aefcd8bcdcd7939b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5bbba32e14aa48e8be06131b22acd562"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,709)" id="a83fd705565049a7b24717ba8adfb410"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="040e7408a8424fb1882111bd001b658d" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="2e52d7bc20be41e8b1a4f01035d13b0b" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="4fbec00791a5451ab113ec22a75bf8fc">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#2e52d7bc20be41e8b1a4f01035d13b0b" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#4fbec00791a5451ab113ec22a75bf8fc)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="df62328d41604c0eb54e79de6640ae7b"/>
+            <use xlink:href="#2e52d7bc20be41e8b1a4f01035d13b0b" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="6b4aed31ee174d24b6d856bdb22ea8ae" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="ba9677e8b6a24eb29399471fdbb373b2" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="983bef27c68b47e1990f416d3c7cd716" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="43743f1a963c4e65a73514665628b90c"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="6e36d999e7ad44ec97562cf44d727f27" transform="matrix(1,0,0,1,25,258)"><p:metadata><p:property name="textContent"><![CDATA[Étape 1 : fichier de mesures et format<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="357" height="24" p:name="htmlObject" id="0e7fcae9d5474c1d844f0967435b3b73" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="7446a35b063a4f5798479e67b3b58689" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Étape 1 : fichier de mesures et format<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="b5f9d6fcb83e4c8281ebf07fedfed0e3" transform="matrix(1,0,0,1,19,212)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="d3c16627e9774251b2cbc65625654d0d" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="0072dd2343c64763bde9a076c75b1110" transform="translate(0,0)"/>
+        </g></Content></Page><Page><Properties><Property name="name">Étape 3</Property><Property name="id">1343391343896_9534</Property><Property name="width">908</Property><Property name="height">750</Property><Property name="dimBackground"/><Property name="transparentBackground">false</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="fid">untitled_page</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="746bdb5fc9d04387bca43a44cb50d2a6" transform="matrix(1,0,0,1,18,120)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="395" height="28" p:name="htmlObject" id="44a016f199ee4f6980876b0f86d14b84" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="558e0b03eafa4bcd923870dbe2287143" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,18)" id="a3c277a1b8d044b5a66865cff0bb2b48"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="95857a087d7d49618bab3f85f29c0d91" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="5156061d79784205b0a5e912f5b2bdd0" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="e62b5f4b5dc941159db43eec6e356d9b">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#5156061d79784205b0a5e912f5b2bdd0" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#e62b5f4b5dc941159db43eec6e356d9b)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="71345939fb404cf09306e5c6a9b0d6d2"/>
+            <use xlink:href="#5156061d79784205b0a5e912f5b2bdd0" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="4a7d364999284675bdfe3a23b28d6866" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="ba430646ee074ffba7a7af4e654773ed" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="83f5c138c94d453eae3ea3662837dc34" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="73a9d60e0796421a8923f78627d5f388">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#83f5c138c94d453eae3ea3662837dc34" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#73a9d60e0796421a8923f78627d5f388)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="60afe9be282e47f9b2aed6c36613efa2"/>
+            <use xlink:href="#83f5c138c94d453eae3ea3662837dc34" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="af48ec806c4940eda2f6d286ad848f9f" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="f4f0755cd28a465ab85795d79b3a21bf" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="d4cc524516fb4b42b583873a129f7d6a">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="20666fb7277548dd98d221f0446cae05">
+                    <ellipse p:name="ellipse" id="02e7095a5e564c65b45431d9b12c22cc" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#20666fb7277548dd98d221f0446cae05" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#d4cc524516fb4b42b583873a129f7d6a)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="31a209f66b19497b90e30a0427ecf129"/>
+            <use xlink:href="#20666fb7277548dd98d221f0446cae05" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="83ce9983e261491db2dd2f87dbf6b9b8" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="20b30d9c86494f8caadf38a8a3d0c09e" transform="matrix(1,0,0,1,127.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5b799b49274043bf8f2794522d621703" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="871f622cfe6b46059c915e14db9cd7b6"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="d2f86e5d79a64be8a9d9c748b5b17d0f" transform="matrix(1,0,0,1,18,149)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="3828a6024c4b4993be1f0fdb157bd36e" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="b2aeb2d78688498ebe64529991c12e31" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,651)" id="1c2a7d8027204bee8d683954f5e76fa4"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="f76fe178988d48dc970beb6d169d73f2" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ee25eb79224f4ca4b107356452a2bb35" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="54634f38bd334b0f88c5a98916784e11">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ee25eb79224f4ca4b107356452a2bb35" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#54634f38bd334b0f88c5a98916784e11)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="dac7667e1ddc4f3e9dbf8e03a4b789fd"/>
+            <use xlink:href="#ee25eb79224f4ca4b107356452a2bb35" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="251753dcb435411ab3cabfa48d6e080f" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="05afdd6e78504707bc4b4607103be61d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="89322a3d0c26440b92e196e3905b705d" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="c9c3c516d3aa49b28a25504c8e545dc8"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="812a44c10bda4a3083d50c2404a3827c" transform="matrix(1,0,0,1,24.08108139038086,171)"><p:metadata><p:property name="textContent"><![CDATA[Étape 3 : validation des données<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="373" height="28" p:name="htmlObject" id="d9cc36531abb48ca987836f5191a48c3" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="ee46e77ba91b4799ab3be1299a4c3a9c" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Étape 3 : validation des données<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5735ca3e89da4ae49205fcec73339624" transform="matrix(1,0,0,1,624.4729614257812,165)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[NB : autant de boîtes que de chroniques.]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2a59df35a52542979ddbc62c33cb8548" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0af4293cf5e84563ac53927076a2034e"><tspan x="0" y="0">NB : autant de boîtes que de chroniques.</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="383dccd65c4d4064a23d179f3d9a3c7c" transform="matrix(1,0,0,1,30.597972869873047,600.374755859375)"><p:metadata><p:property name="box"><![CDATA[112.16554054054053,32.99558124215658]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Importer]]></p:property><p:property name="textFont"><![CDATA[Bitstream Charter|bold|normal|18px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="bc4b88d77919422ea4c1700795589752" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="2a7268f7622c4f6f8564d2ae1f95f7a4" d="M 0 0 L 18.90965820242582 0.30909283133907495 L 35.7157162183496 -0.1877541931390604 L 54.353698188191174 -0.4491439727197134 L 73.61336230462143 0.06673241198388913 L 112.16554054054053 0 L 111.95258535828808 15.272135532109525 L 112.16554054054053 32.99558124215658 L 92.96666416677884 33.28022686619146 L 71.33092944983981 33.23086955270499 L 50.12137458313553 33.37764424359552 L 27.44207789455884 33.31725286004525 L 0 32.99558124215658 L 0.20577203508537634 17.41296581296127 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="8a45c0cf1fd44b5f80ec6c3a1d36dca6" style="font-family: Bitstream Charter; font-size: 18px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="19" y="23">Importer</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="7e4cd5b1f1864da1953e914c37a64a08" transform="matrix(1,0,0,1,170.0664825439453,600.1286010742188)"><p:metadata><p:property name="box"><![CDATA[164.94932432432432,32.99558124215658]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Annuler l'import]]></p:property><p:property name="textFont"><![CDATA[Bitstream Charter|bold|normal|18px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b4b8566e7d104908b00c9b3d114220cc" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7e75d331535a4eeda8320fb078c1ffaa" d="M 0 0 L 18.605102160632978 0.012067035638646306 L 41.41782244521182 -0.4587663354456225 L 63.90393673361683 0.23097999538510205 L 82.83556593200319 0.2529413144865139 L 104.61949973206055 -0.03559111484507105 L 124.35514386556395 -0.39934923903269937 L 142.79989288519212 0.2775403239312988 L 164.94932432432432 0 L 164.49299613322518 19.281894036186266 L 164.94932432432432 32.99558124215658 L 147.2571852547352 32.86754166386302 L 123.58670053748122 32.63147734790238 L 107.25659341356533 33.45163125861858 L 86.21641927106468 32.740876614949215 L 65.35474625516949 32.522585328901684 L 45.90857461147143 33.01087007917581 L 27.31435600504094 33.35739224513046 L 0 32.99558124215658 L -0.27391011662747256 14.991603922655624 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="8710f33e78584d8dbecd65d1634dbbab" style="font-family: Bitstream Charter; font-size: 18px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="14" y="23">Annuler l'import</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="0ce4518af5c946a3a1dc3ec01a4c23cf" transform="matrix(1,0,0,1,24,217)"><p:metadata><p:property name="box"><![CDATA[834,354]]></p:property><p:property name="textPadding"><![CDATA[41.7,23.599999999999998]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="4358e4b69e2c48eb876fa094e2c1ffd3" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="b7f8d0f928f74e1daf878f7a435aa6b2" transform="translate(0.5,0.5)" d="M 0 0 L 21.632530366242875 -0.1438913017149528 L 43.580226385134104 0.4771444156822532 L 66.20667821470245 0.3918042596525084 L 84.63686637093085 -0.27771393635884223 L 106.37877194811799 -0.198150059857374 L 125.09503626251858 0.2673507325861283 L 144.4653820097082 0.1972157175253666 L 161.61280161614144 -0.46968942274320535 L 179.44847098085899 -0.0015970273002181568 L 195.71839368034446 0.39477610371382377 L 213.88894423273766 -0.05981840884297285 L 233.13837630855045 0.02661172717589355 L 250.11130663467642 0.41857245887040484 L 267.3314921754835 -0.08001355824216227 L 287.2870950580767 0.41821603625471204 L 309.92386036314593 -0.3618018784744581 L 330.92189535131666 -0.16351155664671713 L 350.89027900276295 0.018629674233890614 L 374.18374025516516 0.4316489263799732 L 396.95953927816964 -0.038702855585681206 L 416.9301832283414 -0.414344577408825 L 436.82422981589855 0.27854656321302873 L 459.29989135718205 -0.14533255655312782 L 479.5897326457582 -0.4166618160158555 L 498.35661441904256 -0.054854256199037166 L 519.3320817506167 0.3908874607925321 L 536.7051528218755 0.4112080462307487 L 556.2760532725168 -0.2692499861851343 L 577.8586318615572 0.42673378512714066 L 595.626130032362 -0.23684174823990667 L 617.7140297867626 0.3977333623901007 L 639.4535625472919 0.48582815012385994 L 662.000418502377 -0.3023180939474831 L 678.7792325345398 0.3487209092410105 L 700.3855465350903 0.2287183508484858 L 718.4078925704226 -0.12059584873738816 L 737.8668884196663 -0.07044744239758916 L 760.5249554538085 -0.4023747055877255 L 782.61064195256 0.40820836606893585 L 806.2195687328436 0.07327575191720082 L 834 0 L 833.9357889385927 19.012835723898075 L 834.1513326237157 37.887750229911 L 834.2415353194955 61.352101667925155 L 833.5336813318439 82.09733306126309 L 834.3383763383773 104.32034418412977 L 833.5125000330793 123.09308424321806 L 833.5307319905204 143.4008470928693 L 834.2187181101104 160.20104272597848 L 834.4994795409434 179.5392440662737 L 834.1600058658635 199.08757664142166 L 834.3045653093329 220.37103762509543 L 833.8777844053242 237.8174283992409 L 833.8518672901831 254.52225108557982 L 833.6668857140498 277.9683426001391 L 833.7971474318317 299.09691848688885 L 833.6686010380348 318.41991272126904 L 834 354 L 816.86768640322 354.13293808804855 L 797.3826319977205 353.6111062284682 L 774.915328525436 353.6091187843012 L 757.975584351154 354.17836206883135 L 739.0413397783594 353.6782626112501 L 722.1159745820316 353.8436179962358 L 702.8937401818846 353.88795367600386 L 680.1579771703576 354.29040240326395 L 662.6935247966339 353.7333379168117 L 644.5949301769849 354.0393841267464 L 622.8312257042527 353.51243368178166 L 601.8724130166646 354.1775508805926 L 578.5452540797488 353.9691346734012 L 558.9998657549615 354.29439698331976 L 536.4759360143191 354.00365665393605 L 516.3364602202219 354.3929342432855 L 495.93353201188097 353.99321453207364 L 473.40536118298223 353.5536575730793 L 454.8460972406759 354.2325470386521 L 434.36160683828075 354.08834225525607 L 414.30696256241237 354.2067611331143 L 391.60044521863307 354.1021320748595 L 372.8369316108919 353.92694608692085 L 353.03981078506223 354.23308993246974 L 333.2499146900393 354.2680878103408 L 311.4843172883841 353.72638672016456 L 289.8714409718044 354.07184562099815 L 266.61715434832684 354.46564005440473 L 247.73797393111468 353.93346568182386 L 225.0559579305384 353.5884960640816 L 204.90373774949126 353.8490974186714 L 187.33130574889103 354.49116312513905 L 163.62525977082538 353.8205294152245 L 141.93106848021208 354.43292205948273 L 119.67833551758291 353.7092186642714 L 100.82640469613439 354.31418892483964 L 78.50579032986275 354.0076827281857 L 59.328570417927985 354.16991217409515 L 42.08728748477125 354.2079537656029 L 25.189653170248175 354.3152302647813 L 0 354 L 0.07642731129009228 334.3448389174486 L -0.4285661985146738 313.14556700160824 L -0.2507121020048728 295.3740413036612 L -0.32169395857489325 273.24373614266705 L -0.04196425729102837 254.90649632520777 L 0.34289290408289586 235.5190788072132 L -0.4391720539162012 215.60217421721785 L -0.17607874511838317 198.60695805584794 L -0.3956556145648338 180.16756260622694 L 0.22914652899783472 159.12174452451714 L -0.060775730581355214 140.38643024560184 L -0.18735770575995547 117.68528969354317 L 0.44459489770955263 101.22550565475375 L 0.4634297024969185 78.97020775377283 L -0.20918532086399333 60.62448886063238 L -0.15404967112387147 43.49936686356352 L 0 0 z"/>
+    		</g>
+            <foreignObject x="41.7" y="177" width="750.6" height="0" p:name="text" id="853a4d86572c44f9b6f177b6f3bb90aa" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="966901452ac347daada44189b2034f4a" transform="matrix(1,0,0,1,44,225)"><p:metadata><p:property name="textContent"><![CDATA[P123 [Pluie]]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|17px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="93" height="20" p:name="htmlObject" id="538633eef6ff4abc93e24bc328d160e9" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 17px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="5e03831a0edf44ff99f1639d847c845f" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">P123 [Pluie]</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b194f9dcebed47009ed95bbcc6595cd0" transform="matrix(1,0,0,1,44.31080627441406,244.79486083984375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluie à l'amont de Trifouillis-les-Oies (barrage n° 4)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8ef33bcc723f42ed94a4cdbf5a9e2413" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="54e55d43d447412c81c36d67da199037"><tspan x="0" y="0">Pluie à l'amont de Trifouillis-les-Oies (barrage n° 4)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="807700706df94bbca270975559552a82" transform="matrix(1,0,0,1,368.6689147949219,244.79486083984375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[mm]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="25c573401d914510b12da699ca5edd6b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="0db91d40c2bc4abfaa6d4ebad1292a9a"><tspan x="0" y="0">[mm]</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:line" id="e857152b9ab74a76a0eb1f8155065547" transform="matrix(1,0,0,1,41,264)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[804,8]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <g p:name="rect" id="cbaebb712ce94920b82d47113b818279" transform="translate(0.5,0.5)" style="stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7bd02cb047f44f9f80c05101a89ae169" transform="translate(0.5,0.5)" d="M 0 0 L 16.50156192579678 0.20720655354423845 L 36.11281409424704 0.7601462333321936 L 53.707542753959274 0.7020849388823085 L 75.49161892616681 0.7930157906146569 L 92.57664049058664 0.6741485940827192 L 114.15630926375432 1.4661903472226405 L 137.25052155471423 1.1733768125273893 L 154.7917830670883 1.5600783981915383 L 174.4446017190799 1.5783895639448353 L 194.5186272450186 2.105794936865931 L 215.3151171569711 2.1240610198629035 L 238.12467746126538 2.446344883645716 L 257.175126186056 3.033463177944113 L 274.8913076953491 2.8068870378032496 L 296.55074696616737 2.957618791723317 L 318.11675334996426 2.713406759554516 L 337.70914017940413 3.3242159910710694 L 360.32110235076647 3.652803722710284 L 378.6616143625786 3.9624528661639076 L 402.1475823041329 4.4603931380988415 L 422.19160733243956 4.277629081568822 L 445.18702926988135 4.11503198645521 L 462.7855182960448 4.59745679126204 L 482.5849706841686 4.936435103514497 L 503.4668702672285 4.57364308846101 L 524.1988273804632 4.915936054311068 L 544.6609185916479 5.08121834400517 L 567.8794438787816 5.875595254300531 L 586.9532354048577 5.838865124952305 L 604.8134538915015 5.684451855369515 L 625.2496469722458 6.397979442386925 L 646.7711488610915 6.056995398688108 L 665.6070125941171 6.186240730956016 L 687.0696468054681 6.3651842598891974 L 710.2689392028789 6.65138337816269 L 731.3746594204225 7.264193563969075 L 751.0054232003436 7.909389506553271 L 768.531271416072 8.076016918432037 L 789.2120443723238 7.504177396416349 L 804 8"/>
+    		</g>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="6a7239072479420695a2b277b090e3ed" transform="matrix(1,0,0,1,645,238)"><p:metadata><p:property name="box"><![CDATA[92,21]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Information]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="35a62e80f08b4277b21ffea6f6dcf11f" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="21852c8848f24507affe16260c12ca5d" d="M 0 0 L 21.16746003269675 -0.252917921762998 L 37.708697161263565 -0.2277519907830602 L 59.33318464972631 0.08946304541401495 L 92 0 L 91.96980432331576 10.899550774152837 L 92 21 L 74.11058725884675 21.492554076227336 L 50.57027071647787 20.955232977094898 L 33.347304605665485 21.458560566370075 L 0 21 L -0.3595843709506499 11.591633635609952 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="91f12b4605564656a674ccc92152d786" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="15">Information</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c3cd4feb82e04e1790f264fcc2f7a824" transform="matrix(1,0,0,1,756,238)"><p:metadata><p:property name="box"><![CDATA[90,21]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Visualisateur]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="0880804f9a2346b59fa6b6a67cef63d7" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="8353ba2cd62842419b33fc2825db4df1" d="M 0 0 L 17.81685146705235 -0.2248257299703148 L 39.03665812546051 0.2831839741461485 L 58.37506290384905 -0.23447090436428653 L 90 0 L 90.44074183080153 8.550172329244507 L 90 21 L 70.0233159354739 21.12073762375475 L 50.72952796435389 21.325991101105213 L 28.432454583239853 20.56652036607069 L 0 21 L -0.48761111911990773 10.118195737568477 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="bd5e9a2080f04a87ac654fa316539c24" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="15">Visualisateur</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="6f00de70c83e452f8db3114887f38a93" transform="matrix(1,0,0,1,196.25,278)"><p:metadata><p:property name="box"><![CDATA[639.75,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Existant]]></p:property><p:property name="textFont"><![CDATA[Bitstream Charter|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="d7529ae0ed204a368dec5d725acec474" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="24bc29845d9d44d1871a4d8c00eceb4e" d="M 0 0 L 17.582091083773346 0.1725841164517521 L 36.68308370962879 0.30268216140887283 L 55.180528692205264 -0.24348639772806402 L 77.52766473177904 0.25190052207776015 L 96.85885162653294 0.002824823924040598 L 115.424823331458 0.1860181808770156 L 132.44762052557203 -0.1602431331425218 L 153.42655419049643 -0.14089125451255702 L 175.49609619548426 -0.3174591984815077 L 193.44163070332823 0.03523420744042305 L 209.56327124857253 -0.2315697546420903 L 230.21379453203915 0.20946608432214053 L 249.86814506337873 0.2201172940568632 L 268.04833105557987 0.37050084002786976 L 289.92215500241986 0.39846226663644324 L 310.68006302067494 -0.2627468659184674 L 330.11860815964206 0.0056474610567907035 L 347.3763303547224 0.32710671788894363 L 365.201777140834 0.3368495934938689 L 383.7728550712318 -0.2438293472959503 L 405.4345673926584 -0.43108302202521454 L 421.580743726777 0.21571530998357213 L 439.4027472480253 0.33180978802226113 L 461.25835967023545 -0.08038650039793005 L 479.18194282609915 0.39306922941602795 L 500.88837597365796 -0.04737452983270729 L 522.9191054377851 -0.2454507526383818 L 542.7608532452497 -0.23184260447711547 L 566.2829939933807 0.01817278439751213 L 587.7573972233517 0.15797873730576162 L 639.75 0 L 639.9302969184314 8.524543774887722 L 639.75 20 L 622.0759442160523 20.338470700148847 L 599.9991338692008 19.552703408779983 L 579.9439714863781 19.533333133085737 L 559.7354926318264 20.1358944590277 L 536.3502886393314 19.668215656450823 L 513.4082092738496 19.68849054744737 L 496.3892597095864 20.287249737588677 L 478.82380367705184 20.341734946737713 L 457.5104371343176 19.73560487857214 L 435.33512858419545 20.385968199215302 L 415.5521328966272 19.878514767569992 L 398.4905403051892 19.546830712010017 L 379.207262027583 19.920130321428033 L 358.3081937320496 19.5616087153048 L 340.1185954047807 20.19134663227196 L 319.17001696285166 20.045424460343185 L 301.01995267752693 20.462583654665224 L 281.7707204784741 20.368207244476654 L 258.4183317526711 20.445413617322995 L 240.85950662573916 19.922046523676418 L 222.23485600932852 19.637838543312093 L 204.77850690946497 20.011223788144555 L 183.87195519278643 19.675715117770274 L 166.0567992478289 19.70742263247355 L 148.17947873718862 20.432966842164188 L 129.75843744809583 20.490678431517285 L 110.3794498768168 20.493355113754706 L 92.52542083999961 19.74977556078108 L 73.85075612710492 20.44611220029741 L 52.591985380822074 20.19813490628878 L 0 20 L -0.00903745183061766 10.057963732690935 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="5dccca02278042c99f31f276bab2274f" style="font-family: Bitstream Charter; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Existant</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="f68815ed8de4440a9109db44e828ef3a" transform="matrix(1,0,0,1,197,373)"><p:metadata><p:property name="box"><![CDATA[636,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Import]]></p:property><p:property name="textFont"><![CDATA[Bitstream Charter|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="6622923f6d18466f9d8270ab9ebd2cdc" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7a53626bfa0d46a782e130f6c02d505e" d="M 0 0 L 22.413352583831987 -0.3924415996207061 L 44.44447964655137 -0.42265618668614613 L 65.24426224816062 0.28954758420512194 L 83.42565954028177 0.15092707284022833 L 103.73320553579005 0.15903656904484964 L 120.62832919773444 -0.03694529672011193 L 143.86624596763835 0.1274450734086614 L 162.425187957291 -0.2801911541269366 L 182.17469032088744 0.09407214809760145 L 205.12096792408292 0.3436202366857578 L 227.03994229574528 -0.22650543837373227 L 247.64108877687963 0.490238466712135 L 264.6574782641165 -0.07282320471966619 L 282.49113176153537 -0.1073744626917339 L 300.9748699612361 -0.22570199828245174 L 323.37201366401405 -0.2609450899245144 L 343.7842006838354 -0.29544569308734825 L 366.06685496228584 0.20999887216668478 L 387.50798949095787 -0.46635210264372473 L 407.86821969093126 -0.3007301416608146 L 424.5005177147347 0.15005850955502342 L 446.8740090930272 0.0912600403859225 L 469.9957825677348 -0.23389315254705134 L 492.2290437303713 -0.10821401120535157 L 509.1935960129711 0.1707410052507532 L 528.6563709359093 -0.4293427369530949 L 549.5828960540117 0.4962575746981358 L 571.0335625967504 0.39718736018519885 L 589.0743016025494 0.46353486616726036 L 606.9975740509265 0.48486632233922833 L 636 0 L 636.14236474299 9.814408365105702 L 636 20 L 616.5768449464658 20.029607450414954 L 594.1737662120845 20.42653549268494 L 575.1678386878498 19.570526904090944 L 553.9646522062609 20.233327886820216 L 537.1086151102859 19.93815701821994 L 516.6140859611367 19.634002876855266 L 496.0146631485643 19.719243107707175 L 474.39872680537076 20.218122475603426 L 450.5893127115033 20.068620544769605 L 429.9857641192938 19.78362447398315 L 410.00669907034404 20.4677761582673 L 390.1181156732302 20.28265797761564 L 369.19044671766164 20.169106705638242 L 346.6811103342161 20.26774153042888 L 330.42382217551403 20.099009275148944 L 311.49835649822444 19.960967216766086 L 291.07180562016305 19.61806439919328 L 268.8931602617062 20.357155386676496 L 247.66394887269942 19.870866093862865 L 225.74949320296605 19.970873402045157 L 207.8675005794359 20.29155310233037 L 189.69378200601662 20.416795491196964 L 172.70843856372716 19.875715554138505 L 154.94823851644117 19.989598847934694 L 134.80598164988112 19.968882399161334 L 118.1524860777275 19.596943465221724 L 99.9529600435908 19.861897802399717 L 80.95915257723834 19.657417009801776 L 62.47608140993135 20.40171222086975 L 43.84905800604228 20.06187281134524 L 0 20 L -0.13051021823218845 12.021857142392212 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="bfada883c57b41329e4b30d94f51ed45" style="font-family: Bitstream Charter; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Import</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ae97c950c46e4c97a5bf4fb531df6f35" transform="matrix(1,0,0,1,199.2196044921875,311.3768310546875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9cffb39bc34147af8c424a827e72b96f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="01504ea0671b412fa2d34fae4c4b407e"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="59a4281897e74f6998019339e4fc64e2" transform="matrix(1,0,0,1,199.2196044921875,328.8155517578125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f07539528b694c488a9ac43e069b83b7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="56f778cb1b644766b162451d15b4d097"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b06fcf97d0674833a44767bcf2b152b1" transform="matrix(1,0,0,1,256.1182556152344,311.3768310546875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[13/06/2006 15:00:00]]></p:property><p:property name="textColor"><![CDATA[#FF0000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="93592cb6a30045b284e56dbb665051fe" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7e0b0064f57848579ccddfa37f0b2f3c"><tspan x="0" y="0">13/06/2006 15:00:00</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d211aab0a4444f2c8df876dc6c09e333" transform="matrix(1,0,0,1,256.1182556152344,329.8155517578125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[13/06/2011 15:00:00]]></p:property><p:property name="textColor"><![CDATA[#FF0000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="37491fb0da824e89ac16377a99c7f79f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="311b2dad67974a4f8de0657f78fe2342"><tspan x="0" y="0">13/06/2011 15:00:00</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2e9d10927d2b4cd58344d6211499383b" transform="matrix(1,0,0,1,462.1959533691406,312.3472900390625)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Valeur minimum :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="78e6e743439945b9899adf434579e739" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f505d4d6f923460b9d033453ee9ad577"><tspan x="0" y="0">Valeur minimum :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9e242e361eba41af9abf8c10b4f19848" transform="matrix(1,0,0,1,462.1959533691406,328.8450927734375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Valeur maximum :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="61cd9f5eb41f4079baae195b418533f1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d33b45f0d0954a209bc572be186cf234"><tspan x="0" y="0">Valeur maximum :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5b92f000d9534cac97b9e55cf5321df1" transform="matrix(1,0,0,1,595.8446044921875,311.3472900390625)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[10.0]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="cc55e6f2230749e7b8fd2cf3cf3b76d5" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="05737c759a6a4f73ac244ecec4f6aa27"><tspan x="0" y="0">10.0</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2320e76c78964088b9e617dbd1afd3c9" transform="matrix(1,0,0,1,595.6723022460938,328.8450927734375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[500.0]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c1b946d70ef54b9dbdf7a0148668cdb5" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="86a8942b60584b1089d720803f3ebd05"><tspan x="0" y="0">500.0</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f29dac70fd624e1fa00d589bea0312a5" transform="matrix(1,0,0,1,196.04730224609375,401.48614501953125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="158b6fc2ba984f2b8ed2da54edb83a6a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="b63b78d879df429c9ea91e45663071cc"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ebc5004af64543709eef4bdfe3da2739" transform="matrix(1,0,0,1,196.04730224609375,419.92486572265625)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="02a48e599ee1446e8fe666e2a9770f89" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="19f3ef44ad24437b91636d14277c4865"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e9025408d3eb4f7b9d339350bcc62868" transform="matrix(1,0,0,1,257.9459533691406,401.48614501953125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[13/06/2007 15:00:00]]></p:property><p:property name="textColor"><![CDATA[#33CC00FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="945c109e643f481e923ab37a3d5ea984" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(51, 204, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="879fa8066e5e4e6fba776b3e77aa4d52"><tspan x="0" y="0">13/06/2007 15:00:00</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d0254bb0f2384a54801e3075b79fd4fd" transform="matrix(1,0,0,1,256.9459533691406,419.92486572265625)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[13/06/2012 15:00:00]]></p:property><p:property name="textColor"><![CDATA[#33CC00FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="fb0930a7c88e4616bd22949a5ffcdc3d" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(51, 204, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="673dfb88df504e279903fb9b9be32fe3"><tspan x="0" y="0">13/06/2012 15:00:00</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3934b36b8bf44477a6894b4773a706b4" transform="matrix(1,0,0,1,255.9898681640625,438.36358642578125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[après passage en UTC]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|11px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7acb140da64f413cbe7c2245f1bae4b3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a1e70bce0a064483be22d627bf367f3a"><tspan x="0" y="0">après passage en UTC</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="140ecaa844054ebe80e45bcd902789af" transform="matrix(1,0,0,1,462.1385192871094,401.89532470703125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Du 15/06/2007 18:50:00 au 31/08/2008 15:20:15 inclus :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5ed9979770334050af1b0cd88009980f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9fab205510214e75b78bc346d59f85fd"><tspan x="0" y="0">Du 15/06/2007 18:50:00 au 31/08/2008 15:20:15 inclus :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="48bf63204100410ebb1d5317e22e1621" transform="matrix(1,0,0,1,462.89862060546875,419.89532470703125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12 mesures supérieures au maximum]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5f9f26b42df248a0a985eeb2538aeca7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fbcd5dc9fb544ebca6871c8ee0b0c84c"><tspan x="0" y="0">12 mesures supérieures au maximum</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="65161a37e215462992d7c27fea03957c" transform="matrix(1,0,0,1,256.9898681640625,345.36358642578125)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[en UTC]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|11px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b3625c7e62614577ba3afb883a7ef057" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 11px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="7038c18724144ecfa532bb58f62a0761"><tspan x="0" y="0">en UTC</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(30.65540313720703,453.65460205078125)" id="0c4097d0e3674e97a4638e81e2d47d78"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="e263fd32573644cf873d352e5939db45" transform="matrix(1,0,0,1,3,3)"><p:metadata><p:property name="box"><![CDATA[813.4358108108108,108.6913264447511]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[40.671790540540535,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.6230442148250366]]></p:property><p:property name="fillColor"><![CDATA[#FFCC005E]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="819.4358108108108" height="114.6913264447511" p:name="htmlObject" id="b857f5bbf95146358e329f186c0621e3" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 813.436px; height: 108.691px; padding: 3.62304px; background-color: rgba(255, 204, 0, 0.37); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="6fd8336b202b43a2af0d896022983a6f"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f62b00e41ef14d879baef2eb55f59b22" transform="matrix(1,0,0,1,7.5405426025390625,7.763671875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Comment souhaitez-vous importer les données ?]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a0b0a561aa01496da938d09cbd570047" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f0397674645446298d44eb002d8a9282"><tspan x="0" y="0">Comment souhaitez-vous importer les données ?</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:radio" id="e8147889ea7f413ba2bf7ee21a1f03a7" transform="matrix(1,0,0,1,11.263252258300781,32.02508544921875)"><p:metadata><p:property name="selected"><![CDATA[true]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Ne pas importer.]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+            <g p:name="rect" id="86e150a2db524316a344241193db3b38">
+                <path d="m 14.854643,7.698003 c 0,3.85476 -2.200949,6.63069 -7.000875,6.97968 C 3.997527,14.958043 0.50284396,11.669103 0.85288796,7.698003 1.191377,3.858033 4.003037,0.37077296 7.853768,0.71833296 11.720246,1.067323 14.854643,3.843233 14.854643,7.698003 z" p:name="rdCircle" id="782942b466dc4d2ebc3b508426cf5284" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;"/>
+                <path style="stroke: none; visibility: visible; fill: rgb(0, 0, 0); fill-opacity: 1;" d="m 11.354207,7.349023 c 0,1.79888 -0.295905,3.60616 -3.500439,3.60616 -1.804357,0 -3.500439,-1.57462 -3.500439,-3.37351 0,-1.79889 1.696082,-3.14085 3.500439,-3.14085 1.804357,0 3.500439,1.10931 3.500439,2.9082 z" p:name="rdTick" id="88a0ac5d0374442482ca250ac044a0e1"/>
+            </g>
+            <text p:name="text" id="35007512d9bb40d1a73bfb4d79a6dafe" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Ne pas importer.</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:radio" id="0276babeef1f4ae7a4f9cb98c19dd101" transform="matrix(1,0,0,1,11.263252258300781,59.19793701171875)"><p:metadata><p:property name="selected"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Conserver l'existant en cas de chevauchement.]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+            <g p:name="rect" id="64dbe3a0b2ee4c8782b7263fa812c41b">
+                <path d="m 14.854643,7.698003 c 0,3.85476 -2.200949,6.63069 -7.000875,6.97968 C 3.997527,14.958043 0.50284396,11.669103 0.85288796,7.698003 1.191377,3.858033 4.003037,0.37077296 7.853768,0.71833296 11.720246,1.067323 14.854643,3.843233 14.854643,7.698003 z" p:name="rdCircle" id="5cdd01efed554493a51ecf9998a571b9" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;"/>
+                <path style="stroke: none; visibility: hidden; fill: rgb(0, 0, 0); fill-opacity: 1;" d="m 11.354207,7.349023 c 0,1.79888 -0.295905,3.60616 -3.500439,3.60616 -1.804357,0 -3.500439,-1.57462 -3.500439,-3.37351 0,-1.79889 1.696082,-3.14085 3.500439,-3.14085 1.804357,0 3.500439,1.10931 3.500439,2.9082 z" p:name="rdTick" id="f5f291a212514841bbc655f5c0771c02"/>
+            </g>
+            <text p:name="text" id="d2f871a71cec4837b579e25f0de86ab0" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Conserver l'existant en cas de chevauchement.</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:radio" id="cb59dd77e1a24db2bf5e583ec46e7a74" transform="matrix(1,0,0,1,11.263252258300781,86.37078857421875)"><p:metadata><p:property name="selected"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Écraser l'existant au profit des nouvelles données en cas de chevauchement.]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+            <g p:name="rect" id="6525f260565249d884e7dee81c799580">
+                <path d="m 14.854643,7.698003 c 0,3.85476 -2.200949,6.63069 -7.000875,6.97968 C 3.997527,14.958043 0.50284396,11.669103 0.85288796,7.698003 1.191377,3.858033 4.003037,0.37077296 7.853768,0.71833296 11.720246,1.067323 14.854643,3.843233 14.854643,7.698003 z" p:name="rdCircle" id="0be7a702727b41ddb5954b4d294a0c75" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;"/>
+                <path style="stroke: none; visibility: hidden; fill: rgb(0, 0, 0); fill-opacity: 1;" d="m 11.354207,7.349023 c 0,1.79888 -0.295905,3.60616 -3.500439,3.60616 -1.804357,0 -3.500439,-1.57462 -3.500439,-3.37351 0,-1.79889 1.696082,-3.14085 3.500439,-3.14085 1.804357,0 3.500439,1.10931 3.500439,2.9082 z" p:name="rdTick" id="cb05bf4ffedb496ab990a7c19131f42a"/>
+            </g>
+            <text p:name="text" id="391dd492eca34dfcb2c9bc53b2854c0a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Écraser l'existant au profit des nouvelles données en cas de chevauchement.</text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,390.04998779296875,606)" id="6037e03ff9c44fcd8c89045cf44b8a45"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="754aebdf91ad48e9bfc7f8fc85f2a282" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[21.7,21.5]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[?]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="a641fe17ef6e461cb14ae86b9bfff162">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="52343e75064e46968be1e8ed6275270a">
+                    <ellipse p:name="ellipse" id="22f48f1d281c4e81a31bac1bd7c2cdb3" cx="10.85" cy="10.75" rx="10.85" ry="10.75" style="fill: rgb(255, 255, 255); fill-opacity: 0; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#52343e75064e46968be1e8ed6275270a" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#a641fe17ef6e461cb14ae86b9bfff162)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c8bd3fc9ea164971bac1a1b5191c86bd"/>
+            <use xlink:href="#52343e75064e46968be1e8ed6275270a" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="3" width="21.7" height="15" p:name="text" id="f89bcb13d107453299fc831bbf00ceb7" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">?</div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="4e185700bcf643808232ccb14a7ad83f" transform="matrix(1,0,0,1,28.95001220703125,3)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Une aide explicitant le symbole]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="95f4379e929d45cfb31f2698b049aea6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="795595d26b894f6eab438f103a2b2187"><tspan x="0" y="0">Une aide explicitant le symbole</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,30,277)" id="da2b6c2402d34f1d9627ab02f32f8be4"><g p:type="Shape" p:def="Evolus.BasicWebElements:pane" id="fdf4fb8f774c4588afd84fc99483f48b" transform="matrix(1,0,0,1,3,3)"><p:metadata><p:property name="box"><![CDATA[158.66666666666666,168.8586956521739]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[7.933333333333334,0]]></p:property><p:property name="textPadding"><![CDATA[0,5.628623188405796]]></p:property><p:property name="fillColor"><![CDATA[#FFCC005C]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="164.66666666666666" height="174.8586956521739" p:name="htmlObject" id="0d963c2c74034022ac4cd34f9a756c46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 158.667px; height: 168.859px; padding: 5.62862px; background-color: rgba(255, 204, 0, 0.36); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="2bd0442773424d1db523d915dfbf412d"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.BasicWebElements:heading" id="03e5d2a63e3b4b59ba93d3d7ab5dab47" transform="matrix(1,0,0,1,7.1944427490234375,8.086944580078125)"><p:metadata><p:property name="textContent"><![CDATA[Chevauchement]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|14px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="115" height="16" p:name="htmlObject" id="c7a09c161f7c47ca847c5b73703c2259" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 14px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="b8a6e886a0ce482098ff625d6bdd384c" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Chevauchement</div></div>
+            </foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="06355b3ffdc54b51a92cd386d9aeee12" transform="matrix(1,0,0,1,50.00798797607422,35.4202880859375)"><p:metadata><p:property name="box"><![CDATA[18.25,80.07246376811594]]></p:property><p:property name="textPadding"><![CDATA[0.9124999999999999,5.33816425120773]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="07922ef9310a46f0aac47cb36ba988ec" transform="translate(0.5,0.5)" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(255, 255, 255); stroke-opacity: 0; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="5e91d59d40d042119854c476252d53a8" transform="translate(0.5,0.5)" d="M 0 0 L 11.388021704926164 0.1596745999672382 L 18.25 0 L 17.99644547656724 17.96316866960396 L 18.599778295477652 34.60751464596475 L 18.740238405305842 56.46933892618829 L 18.25 80.07246376811594 L 8.050642074871252 80.22596081495556 L 0 80.07246376811594 L 0.34096515874160394 58.336253859677846 L -0.485156879024232 41.482959343177214 L -0.4522841892568733 21.919009316941 L 0 0 z"/>
+    		</g>
+            <foreignObject x="0.9125" y="40" width="16.425" height="0" p:name="text" id="16d1fa6932ea4606932bb6afa58a6eea" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; color: rgb(255, 255, 255); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="bd02b7fa28314243b8803f056c4ff999" transform="matrix(1,0,0,1,88.00408172607422,77.14883422851562)"><p:metadata><p:property name="box"><![CDATA[18.25,80.07246376811594]]></p:property><p:property name="textPadding"><![CDATA[0.9124999999999999,5.33816425120773]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="66ebd77688a342b99f262d7d09e27c89" transform="translate(0.5,0.5)" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(255, 255, 255); stroke-opacity: 0; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="9a1a39450e7146088f1866eb96673cfc" transform="translate(0.5,0.5)" d="M 0 0 L 10.609365225519763 -0.0046743775909054985 L 18.25 0 L 18.030447313565926 16.748245602201724 L 18.745231567549176 33.89975016748251 L 18.06242532862362 53.62313583796306 L 18.25 80.07246376811594 L 9.232306443358402 80.04128017531102 L 0 80.07246376811594 L -0.10639639995071581 62.43666362133956 L 0.42040065133028837 41.863238161154136 L 0.46460755778357243 21.92868827103999 L 0 0 z"/>
+    		</g>
+            <foreignObject x="0.9125" y="40" width="16.425" height="0" p:name="text" id="cfe23f9461a043fa8ac4ae358c36d469" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; color: rgb(255, 255, 255); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:Bullet" id="9df938200a51480a84f2c7ffe5471f29" transform="matrix(1,0,0,1,133.04998779296875,8)"><p:metadata><p:property name="box"><![CDATA[21.7,21.5]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[?]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="09176f0ab6324fd28648f6141f4d3f01">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a85fa9baf5f34d4bbe2392d105a8888e">
+                    <ellipse p:name="ellipse" id="ecad4dd4117c45798737442e7354c5ac" cx="10.85" cy="10.75" rx="10.85" ry="10.75" style="fill: rgb(255, 255, 255); fill-opacity: 0; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a85fa9baf5f34d4bbe2392d105a8888e" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#09176f0ab6324fd28648f6141f4d3f01)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3176b287e87e495db999a83afc371a18"/>
+            <use xlink:href="#a85fa9baf5f34d4bbe2392d105a8888e" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="3" width="21.7" height="15" p:name="text" id="b691ca2c9c104cdca24edea193e2f201" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">?</div></foreignObject>
+        </g></g></Content></Page><Page><Properties><Property name="name">Erreurs</Property><Property name="id">1343725609099_1360</Property><Property name="width">908</Property><Property name="height">833</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="acc73131aa7a4ebc8293de65c68495df" transform="matrix(1,0,0,1,18,120)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="395" height="28" p:name="htmlObject" id="a6d07053282043418ba6f3673a13c8e7" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="d4727531ed5a4019ba61d550c17c2b93" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Ajout de mesures à une chronique</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,18)" id="678b369f7a12450897fdf531d65711a7"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="31c24d94af474fe9816c754f88eb9752" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ba5dd5755f1c4dfe883224204dfbc4c4" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="a07fd311956b436b865296cb475ffda5">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ba5dd5755f1c4dfe883224204dfbc4c4" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#a07fd311956b436b865296cb475ffda5)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="78320a396fd44179bb52ba2cd9a9c03a"/>
+            <use xlink:href="#ba5dd5755f1c4dfe883224204dfbc4c4" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="78ba30e54be040a1a1ede51176d67d78" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="0ab4799540244fa9a17e297676998f32" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ec145cd0ed6e47ec98cf0a5d1e930d39" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="2f3b3d938d664edab3fe904181fc5821">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ec145cd0ed6e47ec98cf0a5d1e930d39" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#2f3b3d938d664edab3fe904181fc5821)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="ba0ff7a38b064299a01db9cb0cc1b773"/>
+            <use xlink:href="#ec145cd0ed6e47ec98cf0a5d1e930d39" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="f1b2f75771f14cebadf94714ded78361" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="7386f0713851476cab1ae0a8f27aaee2" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="c262bb4cc2d74fcea838b37b91e21fec">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="2559a6725b20491b834c05cd23b19c9c">
+                    <ellipse p:name="ellipse" id="c73dc36daca84c56a706561ee4617862" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#2559a6725b20491b834c05cd23b19c9c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#c262bb4cc2d74fcea838b37b91e21fec)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3bbf92792b594f539065afac34a13f32"/>
+            <use xlink:href="#2559a6725b20491b834c05cd23b19c9c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="a517a2c6c69148a58c32bac2c0716f97" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0cfd6b15d22d4b5abee38a2545e04deb" transform="matrix(1,0,0,1,127.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b75b3dd0a7864e10b9eb561e038c7434" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="703a6c88b24f47fb82de88e176a5d0df"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="f04066419037431aa694351155e73c4f" transform="matrix(1,0,0,1,18,149)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="1b65dcc6548a45f4ac6cd5f24e4417b4" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="632e490314af44c1ae5d942c463a3a06" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,441)" id="a9d7c167102a4496ab82243e3e6021eb"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="04e428d1873d4607bcc5be5070127a55" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="742cc67aa85b49b8a83bfbdad1efd4fe" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="1ad710411fb24c15b8feab7a74c2e317">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#742cc67aa85b49b8a83bfbdad1efd4fe" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#1ad710411fb24c15b8feab7a74c2e317)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="0192d3bebdd246a19aee4a5d8a895a09"/>
+            <use xlink:href="#742cc67aa85b49b8a83bfbdad1efd4fe" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="f1f86794324a45b3ba2bbc23736f70f1" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="448bf816549842f5a31dbe480a57a566" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="841cc872d21d40da852a8205bf18adab" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="00287629842942c6ba3ee2e0fed4fe3a"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="8067faa3970f436fad99fd4a9dcddf79" transform="matrix(1,0,0,1,18,176)"><p:metadata><p:property name="box"><![CDATA[875,211]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[43.74999999999999,0]]></p:property><p:property name="textPadding"><![CDATA[0,7.033333333333332]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="881" height="217" p:name="htmlObject" id="10a812fffc9647fda4d983ad3a1802bc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 875px; height: 211px; padding: 7.03333px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="6387e4842a8e49bc964af781a1700bba"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="42b30b6746204d489fd68ea0db1d91e5" transform="matrix(1,0,0,1,24,195)"><p:metadata><p:property name="textContent"><![CDATA[Étape XX : nom de l'étape<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="243" height="24" p:name="htmlObject" id="da33694f393040f5bb4c6198b3b4e630" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="37aa72086e994793a8c4ab408290f035" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Étape XX : nom de l'étape<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="14356968de994d998c5dfab060fa764c" transform="matrix(1,0,0,1,38.77027130126953,232.34869384765625)"><p:metadata><p:property name="box"><![CDATA[833.4358108108108,95.6913264447511]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[41.67179054054054,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.189710881491703]]></p:property><p:property name="fillColor"><![CDATA[#FF99665E]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="839.4358108108108" height="101.6913264447511" p:name="htmlObject" id="682ea38d216c4b84a221dbd62c186206" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 833.436px; height: 95.6913px; padding: 3.18971px; background-color: rgba(255, 153, 102, 0.37); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="aa8a835637d2490ca381b9969e4434d3"><div xmlns="http://www.w3.org/1999/xhtml"></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0bf784eb30d24b3abbf22cac23304acc" transform="matrix(1,0,0,1,49,239)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Erreurs :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8bf029c4f4e9448ea1868da6d59ce0ab" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="86d4c931eb064445a4a1a471a6b2179a"><tspan x="0" y="0">Erreurs :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="ccc09386815747a6a44bfd59edf5c847" transform="matrix(1,0,0,1,38,261)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>Erreur 1</li><li>Erreur 2</li><li>...</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="86" height="61" p:name="htmlObject" id="48dce042fef3480abffe8c6b1e7e2e8e" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="c04469dc559b48d789463012f13d9ea6" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>Erreur 1</li><li>Erreur 2</li><li>...</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="0225fd9f4f164188ad11d4a3f547a3dc" transform="matrix(1,0,0,1,38,351)"><p:metadata><p:property name="box"><![CDATA[158,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recommencer l'import]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="ca969a4ec122475d93c678ccb95a2488" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="8aa9a58af4594466a3c8130a40cd9fc7" d="M 0 0 L 21.532564145041917 -0.4161497961708581 L 44.973272077409455 0.15201019981314068 L 63.51645618744348 0.03791652920769206 L 86.55458045785663 -0.24455476836692935 L 109.8682638028354 0.19320493445164122 L 130.36321342446124 0.24182521990651673 L 158 0 L 157.66516838054636 11.543606095453818 L 158 25 L 139.6603268530559 25.28165750258783 L 119.67153700701336 24.99958709844967 L 96.99982583128512 25.004788271945532 L 75.03569060267264 25.480435722384907 L 52.63376152371713 25.447326447354545 L 30.89067723521689 24.524072222902326 L 0 25 L 0.3112797995074723 11.90797487280254 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c84dd01400504b2c89e9a7945b1ba264" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="8" y="17">Recommencer l'import</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="fdfa892fc6ce403f80e53fcdabf77f69" transform="matrix(1,0,0,1,207,351)"><p:metadata><p:property name="box"><![CDATA[129,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Retour à l'accueil]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="83a4b6d918234e69908c2ec0a7d09849" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="ac169fc0cb0844fc8a78c0d91a7f594f" d="M 0 0 L 22.82344222313675 0.11333858056922264 L 40.02553330022296 -0.4521617326649605 L 56.998016488649526 0.24686247015399232 L 79.55179971565687 0.47536367926733036 L 100.20422308145983 -0.33484916297208545 L 129 0 L 129.03149461771517 14.251825020209388 L 129 25 L 109.70768074073645 24.541739643657777 L 91.17324892240802 25.29749653830323 L 72.22859405489305 24.68043337989309 L 49.17053552719419 24.773109295252922 L 31.617301759994348 24.986308064092864 L 0 25 L -0.2106958537161241 12.183395259363467 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="fc8baabe03d444429cabf929e6925c41" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="11" y="17">Retour à l'accueil</text>
+        </g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohAdminBundle/Resources/packages/claviska-jquery-miniColors-v1.0.5-0-g9dc9162.zip b/src/Irstea/BdohAdminBundle/Resources/packages/claviska-jquery-miniColors-v1.0.5-0-g9dc9162.zip
new file mode 100644
index 0000000000000000000000000000000000000000..0ef13999e39dd2f1b096f0e8228ac2f97a477995
Binary files /dev/null and b/src/Irstea/BdohAdminBundle/Resources/packages/claviska-jquery-miniColors-v1.0.5-0-g9dc9162.zip differ
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.en.yml b/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4dca7ae41131b40681a28b73ccf32020328feee6
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.en.yml
@@ -0,0 +1,7 @@
+dashboard       : Dashboard
+AdminCenter     : Main data
+AdminGeographic : Geographic data
+AdminPeripheral : Peripheral data
+AdminTechnical  : Technical data
+AdminTheia      : Theia data
+AdminUser       : Users
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.fr.yml b/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..02b895e0f5ee12edb3037351d1c8e9e14cdd7a60
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/SonataAdminBundle.fr.yml
@@ -0,0 +1,7 @@
+dashboard       : Tableau de bord
+AdminCenter     : Données principales
+AdminGeographic : Données géographiques
+AdminPeripheral : Données périphériques
+AdminTechnical  : Données techniques
+AdminTheia      : Données Theia/OZCAR
+AdminUser       : Utilisateurs
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/commands.en.php b/src/Irstea/BdohAdminBundle/Resources/translations/commands.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..03ebc859444e7051b5f7ceb1b17f1c2bec614412
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/commands.en.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$errors = [
+    'no_chronique_selected' => 'No time series has been selected!',
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'select_chroniques'    => 'Selection of time series',
+    'select_timezone'      => 'Selection of time zone: ',
+    'configuration_import' => 'Upload configuration',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($errors, $various);
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/commands.fr.php b/src/Irstea/BdohAdminBundle/Resources/translations/commands.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..c57057a9bf1c6b45f2fa89de74aef839a1963d8a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/commands.fr.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$errors = [
+    'no_chronique_selected' => "Aucune chronique n'a été sélectionnée !",
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'select_chroniques'    => 'Sélection des chroniques',
+    'select_timezone'      => 'Sélection du fuseau horaire : ',
+    'configuration_import' => "Configuration de l'import",
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($errors, $various);
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.en.yml b/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..30c27855213c91cae60a18bd846592dab831c20c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.en.yml
@@ -0,0 +1,3 @@
+instantaneous: Instantaneous
+mean: Mean
+cumulative: Cumulative
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.fr.yml b/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ff63c2ee1cfbdec6b53ecbe4860dcc12f67cca1b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/echantillonnage.fr.yml
@@ -0,0 +1,3 @@
+instantaneous: Instantané
+mean: Moyennes
+cumulative: Cumuls
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.en.php b/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdb9a50296eb70a25c3481f5ab99342c4d6f2612
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.en.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors as Errors;
+
+/*************************************************
+ * ERRORS OF MEASURES IMPORT
+ ************************************************/
+
+$lineError = "Line %numLine% (date = “\u{a0}%date%\u{a0}”, value = “\u{a0}%valeur%\u{a0}”):";
+
+return [
+    Errors::TOO_MANY_ERRORS                    => '<b>Too many errors; File analysis canceled</b>',
+    Errors::NO_FILE                            => 'The file could not be read',
+    Errors::BAD_MIME_TYPE                      => "File mime type (“\u{a0}%mimeType%\u{a0}”) is not valid",
+    Errors::BAD_ZIP                            => 'No File could be extracted from the provided zip file.',
+    Errors::BAD_SHAPE                          => 'No file from the provided zip file could be exploited for the following reasons:<br/>%errors%',
+    Errors::ZIP_FIRST_BAD_MIME_TYPE            => "File mime type from the zip file (“\u{a0}%mimeType%\u{a0}”) is not valid",
+    Errors::BAD_FORMAT                         => "File format “\u{a0}%format%\u{a0}” does not exists",
+    Errors::BAD_STATION                        => "Station code “\u{a0}%station%\u{a0}” does not match any station in this observatory",
+    Errors::BAD_CHRONIQUE_CONTINUE             => "Time series code “\u{a0}%chronique%\u{a0}” does not match any <b>continuous time series</b> in station “\u{a0}%station%\u{a0}”",
+    Errors::BAD_CHRONIQUE_DISCONTINUE          => "Time series code “\u{a0}%chronique%\u{a0}” does not match any <b>discontinuous time series</b> in station “\u{a0}%station%\u{a0}”",
+    Errors::BAD_UNIT_CHRONIQUE                 => "Unit “\u{a0}%unite%\u{a0}” does not match that of time series “\u{a0}%chronique%\u{a0}”",
+    Errors::CHRONIQUE_ALREADY_EXISTS           => "Time Series “\u{a0}%chronique%\u{a0}” should only be used in one column",
+    Errors::NO_CHRONIQUE_CONTINUE_AVAILABLE    => "No <b>continuous time series</b> available on station “\u{a0}%station%\u{a0}”",
+    Errors::NO_CHRONIQUE_DISCONTINUE_AVAILABLE => "No <b>discontinuous time series</b> available on station “\u{a0}%station%\u{a0}”",
+    Errors::INVALID_TIMEZONE                   => "“\u{a0}%timezone%\u{a0}” is not a valid time zone",
+    Errors::BAD_LINE_SIZE                      => 'Line %numLine%: %expected% column(s) expected; %found% column(s) found',
+    Errors::BAD_MIN_LINE_SIZE                  => 'Line %numLine%: at least %expected% column(s) expected; %found% column(s) found',
+    Errors::BAD_CHAR_NUMBER                    => 'Line %numLine%: %expected% caracter(s) expected; %found% caracter(s) read',
+    Errors::BAD_LINE_BEGIN                     => "Line %numLine% must begin with “\u{a0}%expected%\u{a0}”",
+    Errors::BAD_HEADER_NO_CHRONIQUE            => 'No time series code found in header',
+    Errors::BAD_HEADER_FIRST_TWO_LINES         => "The first 2 header's lines do not match the number of columns",
+    Errors::BAD_HEADER_SYNTAX                  => 'The header does not fulfil the expected syntax',
+    Errors::BAD_HEADER_UNIT                    => "The unit declared in the header (“\u{a0}%present%\u{a0}”) does not match the expected one (“\u{a0}%expected%\u{a0}”)",
+    Errors::DATE_REDUNDANCY                    => "Time Series “\u{a0}%chronique%\u{a0}” contains %count% values for the date “\u{a0}%date%\u{a0}”, at lines [%numLines%], please leave only one.",
+    Errors::RANGE_OVERLAP                      => "Time Series “\u{a0}%chronique%\u{a0}” contains overlapping ranges for the date [%plages%], at lines [%numLines%]",
+    Errors::NOT_IN_SOURCE_JEU                  => "$lineError “\u{a0}%qualite%\u{a0}” is not a valid quality for this format",
+    Errors::FORBIDDEN_VALUE_LIMIT              => "$lineError detection/quantification limit “\u{a0}%qualite%\u{a0}” not allowed in this time series",
+    Errors::VALUE_LIMIT_IN_BAREME              => "Line %numLine%: detection/quantification limit “\u{a0}%qualite%\u{a0}” not allowed in scales",
+    Errors::QUALITY_NOT_FOR_CHECKPOINT         => "$lineError quality “\u{a0}%qualite%\u{a0}” not allowed for checkpoints",
+    Errors::NO_RIGHT_ON_STATION                => "You do not have the required rights to upload data in station “\u{a0}%station%\u{a0}”",
+    Errors::NO_TRANS_IN_OBSERVATOIRE_JEU       => "$lineError quality “\u{a0}%qualite%\u{a0}” does not match the observatory's quality set",
+    Errors::BAD_CODE_QUALITE                   => "Line %numLine%: quality “\u{a0}%qualite%\u{a0}” does not exist in the observatory's quality set",
+    Errors::VALEUR_NOT_NUMERIC                 => "$lineError value must be numeric",
+    Errors::VALID_NO_VALUE                     => "Line %numLine% (date “\u{a0}%date%\u{a0}”): value is absent in contradiction with the quality code (“\u{a0}%qualite%\u{a0}”)",
+    Errors::MINIMUM_NOT_NUMERIC                => "$lineError minimum (“\u{a0}%minimum%\u{a0}”) must be numeric",
+    Errors::MAXIMUM_NOT_NUMERIC                => "$lineError maximum (“\u{a0}%maximum%\u{a0}”) must be numeric",
+    Errors::DATE_INVALID_FORMAT                => "$lineError date format is not valid",
+    Errors::DATE_AFTER_NOW                     => "$lineError date later than the current upload date",
+    Errors::INCOHERENT_GAP                     => "$lineError value and quality (“\u{a0}%qualite%\u{a0}”) do not match",
+    Errors::INCOHERENT_DATES                   => "Line %numLine% (value = “\u{a0}%valeur%\u{a0}”): beginning date is greater than end date",
+    Errors::BAD_UNIT_INPUT_BAREME              => "Unknown input unit “\u{a0}%unite%\u{a0}”",
+    Errors::BAD_UNIT_OUTPUT_BAREME             => "Unknown output unit “\u{a0}%unite%\u{a0}”",
+    Errors::VARIABLE_NOT_NUMERIC               => "Line %numLine%: value “\u{a0}%valeur%\u{a0}” from field “\u{a0}%nomValeur%\u{a0}” must be numeric",
+    Errors::NOT_ENOUGH_DATA                    => 'File has to contain at last %minDataLines% data lines',
+    Errors::NOT_STRICTLY_ASCENDING             => "Line %numLine%: value “\u{a0}%valeur%\u{a0}” is less than or equal to previous value “\u{a0}%valeurPrec%\u{a0}”",
+    Errors::INCOHERENT_SHAPE                   => "Shape does not match expected format: “\u{a0}%format%\u{a0}”
+    <li><b>Check : </b></li>
+        <ul>
+            <li>The <b>column names</b> of your file must be with the same spelling that <b>the format : «\u{a0}%format%\u{a0}»</b>;</li>
+            <li>Provide a full shapefile containing the geographic data (at least <b>shx</b>, <b>shp</b> and <b>dbf</b> files).;</li>
+            <li>The <b>column values</b> are the same that the <b>format : «\u{a0}%format%\u{a0}»</b>;</li>
+        </ul>
+    ",
+    Errors::PHP_UPLOAD_ERROR                   => 'A system error (%errorCode%) prevented the file from being uploaded.<br/><u>Please verify that the uploaded file is less than 2MB.</u>',
+    Errors::NO_IMPORT_ON_CONVERTED             => "Upload data is forbidden for converted time series (“\u{a0}%chronique%\u{a0}”).",
+    Errors::NO_CHECKPOINT_ON_CONVERTED         => "Upload checkpoint is forbidden for converted time series (“\u{a0}%chronique%\u{a0}”).",
+    Errors::UNDEFINED_PARAM_CONVERSION         => 'The interval for the gaps is undefiend.',
+    Errors::BAD_PARAM_CONVERSION               => "The interval for the gaps (“\u{a0}%param%\u{a0}”) must be an integer greater than or equal to 1.",
+    Errors::BAD_PARENT_TIME_SERIES             => 'The parent time series is undefined or does not match a discontinuous time series of the same station and with the same unit.',
+];
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.fr.php b/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae8283a66d19be9ff553d7de87e9c5300dd7e8dc
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/importErrors.fr.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use Irstea\BdohAdminBundle\Errors\ImportErrors as Errors;
+
+/*************************************************
+ * ERRORS OF MEASURES IMPORT
+ ************************************************/
+
+$lineError = "Ligne %numLine% (date = «\u{a0}%date%\u{a0}», valeur = «\u{a0}%valeur%\u{a0}») :";
+
+return [
+    Errors::TOO_MANY_ERRORS                    => "<b>Trop d'erreurs ; arrêt de lecture du fichier</b>",
+    Errors::NO_FILE                            => "Le fichier n'a pu être chargé",
+    Errors::BAD_MIME_TYPE                      => "Le type MIME du fichier («\u{a0}%mimeType%\u{a0}») est invalide",
+    Errors::BAD_ZIP                            => "Aucun fichier n'a pu être extrait de l'archive zip envoyée",
+    Errors::BAD_SHAPE                          => "Aucun fichier de l'archive zip envoyée n'a pu être exploité pour les raisons suivantes :<br/>%errors%",
+    Errors::ZIP_FIRST_BAD_MIME_TYPE            => "Le type MIME du fichier de l'archive zip («\u{a0}%mimeType%\u{a0}») est invalide",
+    Errors::BAD_FORMAT                         => "Le format de fichier «\u{a0}%format%\u{a0}» n'existe pas",
+    Errors::BAD_STATION                        => "Le code «\u{a0}%station%\u{a0}» ne correspond à aucune station de cet observatoire",
+    Errors::BAD_CHRONIQUE_CONTINUE             => "Le code «\u{a0}%chronique%\u{a0}» ne correspond à aucune <b>chronique continue</b> de la station «\u{a0}%station%\u{a0}»",
+    Errors::BAD_CHRONIQUE_DISCONTINUE          => "Le code «\u{a0}%chronique%\u{a0}» ne correspond à aucune <b>chronique discontinue</b> de la station «\u{a0}%station%\u{a0}»",
+    Errors::BAD_UNIT_CHRONIQUE                 => "L'unité «\u{a0}%unite%\u{a0}» ne correspond pas à la chronique «\u{a0}%chronique%\u{a0}»",
+    Errors::CHRONIQUE_ALREADY_EXISTS           => "La chronique «\u{a0}%chronique%\u{a0}» ne doit être utilisée que pour une seule colonne",
+    Errors::NO_CHRONIQUE_CONTINUE_AVAILABLE    => "Aucune <b>chronique continue</b> disponible pour la station «\u{a0}%station%\u{a0}»",
+    Errors::NO_CHRONIQUE_DISCONTINUE_AVAILABLE => "Aucune <b>chronique discontinue</b> disponible pour la station «\u{a0}%station%\u{a0}»",
+    Errors::INVALID_TIMEZONE                   => "«\u{a0}%timezone%\u{a0}» n'est pas un fuseau horaire valide",
+    Errors::BAD_LINE_SIZE                      => 'Ligne %numLine% : %expected% colonne(s) attendue(s) ; %found% colonne(s) trouvée(s)',
+    Errors::BAD_MIN_LINE_SIZE                  => 'Ligne %numLine% : au moins %expected% colonne(s) attendue(s) ; %found% colonne(s) trouvée(s)',
+    Errors::BAD_CHAR_NUMBER                    => 'Ligne %numLine% : %expected% caractère(s) attendu(s) ; %found% caractère(s) lu(s)',
+    Errors::BAD_LINE_BEGIN                     => "La ligne %numLine% doit commencée par «\u{a0}%expected%\u{a0}»",
+    Errors::BAD_HEADER_NO_CHRONIQUE            => "L'entête ne contient aucun code chronique",
+    Errors::BAD_HEADER_FIRST_TWO_LINES         => "Les 2 premières lignes d'entête n'ont pas le même nombre de colonnes",
+    Errors::BAD_HEADER_SYNTAX                  => "L'entête du fichier ne respecte pas la syntaxe attendue",
+    Errors::BAD_HEADER_UNIT                    => "L'unité présente dans l'entête du fichier («\u{a0}%present%\u{a0}») ne correspond pas à celle attendue («\u{a0}%expected%\u{a0}»)",
+    Errors::DATE_REDUNDANCY                    => "La chronique «\u{a0}%chronique%\u{a0}» a %count% valeurs pour la date «\u{a0}%date%\u{a0}», aux lignes [%numLines%], veuillez n'en laisser qu'une.",
+    Errors::RANGE_OVERLAP                      => "La chronique «\u{a0}%chronique%\u{a0}» a un chevauchement de plages aux dates [%plages%], aux lignes [%numLines%]",
+    Errors::NOT_IN_SOURCE_JEU                  => "$lineError «\u{a0}%qualite%\u{a0}» n'est pas une qualité valide pour ce format",
+    Errors::FORBIDDEN_VALUE_LIMIT              => "$lineError limite de détection/quantification «\u{a0}%qualite%\u{a0}» interdite dans cette chronique",
+    Errors::VALUE_LIMIT_IN_BAREME              => "Ligne %numLine% : limite de détection/quantification «\u{a0}%qualite%\u{a0}» interdite dans les barèmes",
+    Errors::QUALITY_NOT_FOR_CHECKPOINT         => "$lineError qualité «\u{a0}%qualite%\u{a0}» non autorisée pour les points de contrôle",
+    Errors::NO_RIGHT_ON_STATION                => "Vous n'avez pas les droits nécessaires pour importer des données pour la station «\u{a0}%station%\u{a0}»",
+    Errors::NO_TRANS_IN_OBSERVATOIRE_JEU       => "$lineError la qualité «\u{a0}%qualite%\u{a0}» n'a pas de correspondance dans le jeu de qualités de l'observatoire",
+    Errors::BAD_CODE_QUALITE                   => "Ligne %numLine% : la qualité «\u{a0}%qualite%\u{a0}» n'existe pas dans le jeu de qualités de l'observatoire",
+    Errors::VALEUR_NOT_NUMERIC                 => "$lineError la valeur n'est pas de type numérique",
+    Errors::VALID_NO_VALUE                     => "Ligne %numLine% (date «\u{a0}%date%\u{a0}») : le code qualité «\u{a0}%qualite%\u{a0}» exige la présence d'une valeur",
+    Errors::MINIMUM_NOT_NUMERIC                => "$lineError le minimum («\u{a0}%minimum%\u{a0}») n'est pas de type numérique",
+    Errors::MAXIMUM_NOT_NUMERIC                => "$lineError le maximum («\u{a0}%maximum%\u{a0}») n'est pas de type numérique",
+    Errors::DATE_INVALID_FORMAT                => "$lineError la date n'a pas un format valide",
+    Errors::DATE_AFTER_NOW                     => "$lineError date postérieure à la date de l'import en cours",
+    Errors::INCOHERENT_GAP                     => "$lineError valeur et qualité («\u{a0}%qualite%\u{a0}») contradictoires",
+    Errors::INCOHERENT_DATES                   => "Ligne %numLine% (valeur = «\u{a0}%valeur%\u{a0}») : la date de début est postérieure à la date de fin",
+    Errors::BAD_UNIT_INPUT_BAREME              => "Unité d'entrée «\u{a0}%unite%\u{a0}» non reconnue",
+    Errors::BAD_UNIT_OUTPUT_BAREME             => "Unité de sortie «\u{a0}%unite%\u{a0}» non reconnue",
+    Errors::VARIABLE_NOT_NUMERIC               => "Ligne %numLine% : la valeur «\u{a0}%valeur%\u{a0}» du champ «\u{a0}%nomValeur%\u{a0}» n'est pas de type numérique",
+    Errors::NOT_ENOUGH_DATA                    => 'Le fichier doit contenir au moins %minDataLines% lignes de données',
+    Errors::NOT_STRICTLY_ASCENDING             => "Ligne %numLine% : la valeur «\u{a0}%valeur%\u{a0}» est inférieure ou égale à la valeur précédente «\u{a0}%valeurPrec%\u{a0}»",
+    Errors::INCOHERENT_SHAPE                   => "Le shape ne correspond pas au format attendu : «\u{a0}%format%\u{a0}»
+    <li><b>Vérifiez que : </b></li>
+        <ul>
+            <li>Le <b>nom des colonnes</b> de votre fichier correspond à la même orthographe que <b>le format : «\u{a0}%format%\u{a0}»</b>;</li>
+            <li>Le zip contient au moins les fichiers <b>shx</b>, <b>shp</b> et <b>dbf</b>;</li>
+            <li>Les valeurs dans les colonnes correspondent au format : «\u{a0}%format%\u{a0}»;</li>
+        </ul>",
+    Errors::PHP_UPLOAD_ERROR                   => "Une erreur système (%errorCode%) a empeché l'envoi du fichier.<br/><u>Veuillez vérifier que le fichier envoyé fait moins de 2Mo.</u>",
+    Errors::NO_IMPORT_ON_CONVERTED             => "L'import de mesures est interdit sur une chronique convertie («\u{a0}%chronique%\u{a0}»).",
+    Errors::NO_CHECKPOINT_ON_CONVERTED         => "L'import de points de contrôle est interdit sur une chronique convertie («\u{a0}%chronique%\u{a0}»).",
+    Errors::UNDEFINED_PARAM_CONVERSION         => "L'intervalle pour les lacunes n'est pas renseigné.",
+    Errors::BAD_PARAM_CONVERSION               => "L'intervalle pour les lacunes («\u{a0}%param%\u{a0}») doit être un entier supérieur ou égale à 1.",
+    Errors::BAD_PARENT_TIME_SERIES             => "La chronique mère n'est pas définie ou ne correspond pas à une chronique discontinue de la même station et ayant la même unité.",
+];
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/messages.en.php b/src/Irstea/BdohAdminBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd8bcb6eb4fa7a1f7539ca11a320e85e4c540254
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/messages.en.php
@@ -0,0 +1,817 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+define('IrsteaBdohDataBundle_transDir_en', __DIR__ . '/../../../BdohDataBundle/Resources/translations/');
+define('IrsteaBdohSecurityBundle_transDir_en', __DIR__ . '/../../../BdohSecurityBundle/Resources/translations/');
+
+$entitiesSingulars_Data = require IrsteaBdohDataBundle_transDir_en . 'entitiesSingulars.en.php';
+$entitiesSingularsArticles_Data = require IrsteaBdohDataBundle_transDir_en . 'entitiesSingularsArticles.en.php';
+$entitiesSingularsDefinedArticles_Data = require IrsteaBdohDataBundle_transDir_en . 'entitiesSingularsDefinedArticles.en.php';
+$entitiesPlurals_Data = require IrsteaBdohDataBundle_transDir_en . 'entitiesPlurals.en.php';
+
+$entitiesSingulars_Security = require IrsteaBdohSecurityBundle_transDir_en . 'entitiesSingulars.en.php';
+$entitiesSingularsArticles_Security = require IrsteaBdohSecurityBundle_transDir_en . 'entitiesSingularsArticles.en.php';
+$entitiesSingularsDefinedArticles_Security = require IrsteaBdohSecurityBundle_transDir_en . 'entitiesSingularsDefinedArticles.en.php';
+$entitiesPlurals_Security = require IrsteaBdohSecurityBundle_transDir_en . 'entitiesPlurals.en.php';
+
+/*************************************************
+ * ENTITIES ACTIONS (for SonataAdminBundle)
+ ************************************************/
+
+$entitiesActions = [];
+
+// For BdohDataBundle
+$entitiesKeys = array_keys($entitiesSingulars_Data);
+
+foreach ($entitiesKeys as $key) {
+    $entitiesActions[$key . '_list'] =
+        'List of the ' .
+        ($entitiesPlurals_Data[$key] === 'DOI' ? $entitiesPlurals_Data[$key] : lcfirst($entitiesPlurals_Data[$key]));
+    $entitiesActions[$key . '_create'] =
+        'Create ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_create_undefined'] =
+        'Creation of ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_edit'] =
+        'Edit ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_edit_defined'] =
+        'Editing ' . $entitiesSingularsDefinedArticles_Data[$key] .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_delete'] =
+        'Delete ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_delete_defined'] =
+        'Deletion ' . $entitiesSingularsDefinedArticles_Data[$key] .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+}
+
+// For BdohSecurityBundle
+$entitiesKeys = array_keys($entitiesSingulars_Security);
+
+foreach ($entitiesKeys as $key) {
+    $entitiesActions[$key . '_list'] =
+        'List of the ' . lcfirst($entitiesPlurals_Security[$key]);
+    $entitiesActions[$key . '_create'] =
+        'Create ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_create_undefined'] =
+        'Creation of ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_edit'] =
+        'Edit ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_edit_defined'] =
+        'Editing ' . $entitiesSingularsDefinedArticles_Security[$key] . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_delete'] =
+        'Delete ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_delete_defined'] =
+        'Deletion ' . $entitiesSingularsDefinedArticles_Security[$key] . lcfirst($entitiesSingulars_Security[$key]);
+}
+
+/*************************************************
+ * FIELDSETS
+ ************************************************/
+
+$fieldSets = [
+    'fieldset.text'    => 'Descriptions and others',
+    'fieldset.graphic' => 'Display options and pictures',
+];
+
+/*************************************************
+ * FILE FORMATS
+ ************************************************/
+
+$fileFormats = [
+    'import' => [
+        'Qjo'                   => 'Hydro2 - QJO',
+        'Qtvar'                 => 'Hydro2 - QTVAR',
+        'AixPluie'              => 'Aix - pluie',
+        'AixDebitHauteur'       => 'Aix - débit/hauteur',
+        'AntonyChimie'          => 'Antony - chimie',
+        'AntonyHuml2x'          => 'Antony - HUML2X',
+        'AntonyHutdr'           => 'Antony - HUTDR',
+        'AntonyMeteoJournalier' => 'Antony - météo J',
+        'AntonyMeteoHoraire'    => 'Antony - météo H',
+        'AntonyPiezo'           => 'Antony - piezo',
+        'AntonyPluie'           => 'Antony - pluie',
+        'GrenobleDom'           => 'Grenoble - DOM',
+        'LyonBiche'             => 'Lyon - Biche',
+        'Bdoh'                  => 'BDOH - continuous',
+        'BdohPlage'             => 'BDOH - discontinuous',
+        'controle'              => 'Checkpoints',
+    ],
+];
+
+/*************************************************
+ * IMPORT OF MEASURES
+ ************************************************/
+
+$measureImport = [
+    'measure.import' => [
+        'title'                                  => 'Data upload',
+        'step'                                   => [
+            '1' => 'Step 1: data file and format',
+            '2' => 'Step 2: station, time zone and time series',
+            '3' => 'Step 3: file and format validation',
+            '4' => 'Step 4: end of the upload',
+        ],
+        'question'                               => [
+            'importType'      => 'How do you wish to upload these data?',
+            'computeChildren' => 'Update the child time series',
+        ],
+        'action'                                 => [
+            'doImport'          => 'Upload data.',
+            'doNotImport'       => 'Do not upload data.',
+            'keepExisting'      => 'Preserve previous data in case of overlap.',
+            'overwriteExisting' => 'Overwrite with new data in case of overlap.',
+            'newImport'         => 'New upload',
+        ],
+        'help'                                   => [
+            'quitWarning'         => 'While uploading <b>please use the dedicated button to cancel</b>.',
+            'file.onlyOneStation' => 'Only one station per file.',
+            'file.bigInZip'       => '<u>Large data files</u> must be compressed <i>(one <b>zipped</b> file per station)</i>.',
+            'file.sizeLimit'      => 'The upload file size must not exceed 2 MB.',
+            'chroniquesBox'       => '<b>Instructions:</b> Make each column match with a time series by sliding it to the left.',
+            'timezoneToUTC'       => 'after conversion to UTC',
+            'overlap'             => [
+                'new'         => "Time series' first upload.",
+                'before'      => 'All the data to be uploaded are prior to the existing data.',
+                'after'       => 'All the data to be uploaded are posterior to the existing data.',
+                'boundsEqual' => 'Bounds of the existing data match those of the data to bo uploaded.',
+                'newInOld'    => 'All the data to be uploaded lie within the existing data bounds.',
+                'oldInNew'    => 'All the existing data lie within the bounds of the data to be uploaded.',
+                'firstIn'     => 'The beginning of the data to be uploaded overlaps the end of the existing data.',
+                'lastIn'      => 'The end of the data to be uploaded overlaps the beginning of the existing data.',
+            ],
+            'children'            => 'Child time series',
+        ],
+        'info'                                   => [
+            'wasCanceled'             => 'The data upload has been canceled.',
+            'noMeasuresImported'      => 'No data were uploaded.',
+            'measuresInsert'          => 'Data point(s) added',
+            'measuresDelete'          => 'Data point(s) deleted',
+            'computingOfFillingRates' => '<b>Warning:</b> The data completeness is being updated, ' .
+                'this operation may take up to a few minutes during which its display is outdated.',
+            'jobPage(%jobPageLink%)'  => 'You may check the end of this operation from <a href="%jobPageLink%">the job page</a>.',
+            'children(%count%)'       => 'This time series is used for one child time series|This time series is used for %count% child time series',
+        ],
+        'fileColumns'                            => "File's column(s)",
+        'thereAreErrors.cantContinue'            => 'The upload process cannot continue because of errors.',
+        'valeurTooLarge(%first%,%last%,%count%)' => '{0}|' .
+            '{1}There is one data point greater than the maximum, at <i>%first%</i>|' .
+            ']1,Inf]From <i>%first%</i> to <i>%last%</i> inclusive: there are <b>%count%</b> data points greater than maximum',
+        'valeurTooSmall(%first%,%last%,%count%)' => '{0}|' .
+            '{1}There is one data point less than the minimum, at <i>%first%</i>|' .
+            ']1,Inf]From <i>%first%</i> to <i>%last%</i> inclusive: there are <b>%count%</b> data points less than minimum',
+        'analysisInProgress'                     => 'Analysis in progress',
+        'processingInProgress'                   => 'Processing in progress',
+        'canTakeAWhile'                          => 'This operation may take some time',
+        'pleaseWait'                             => 'Please wait...',
+        'timeSeries'                             => 'Time series',
+        'ignoredTimeSeries'                      => 'Ignored time series',
+        'removeTimeSeries'                       => 'Do not include this time series',
+        'restoreTimeSeries'                      => 'Restore this time series',
+        'formats'                                => [
+            'Bdoh'=> <<<FORMAT
+  <li>
+      <b>Header (3 lines):</b>
+      <ul>
+          <li>"Station ; Fuseau ; Followed by, for N time series: Chronique ; Unite ; Chronique ; Unite ... (N times)"</li>
+          <li>
+              "station code ; timezone value <i>(<u>format</u>: UTC +/-HH)</i> ; time series code 1 ; time series unit 1 ;
+              time series code 2 ; time series unit 2 ... (N times)"
+          </li>
+          <li>
+              "DateHeure ; Valeur ; Qualite ; Min (optional) ; Max (optional) ; Valeur ; Qualite ; Min (optional) ;
+              Max (optional) ... (N times)"
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Data:</b> "DD/MM/YYYY HH:MM:SS ; value ; quality code ; value (optional) ; value (optional) ;
+      value ; quality code ; value (optional) ; value (optional) ... (N times)"
+  </li>
+  <li>
+      <b>Special values and missing values:</b>
+      <ul>
+          <li>-9999 for gap values;</li>
+          <li>The quality code must match the quality set used by the observatory.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Comments:</b>
+      <ul>
+          <li>
+              The character '#' indicates a comment line and can also be found inside the line,
+              in which case the rest of the line is ignored;
+          </li>
+          <li>
+              Comments are not allowed in the first three lines of the file,
+              which must always be the header as described here.
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Min and max columns go compulsorily together but they may be
+      present or not depending of each time series.</b>
+  </li>
+FORMAT
+            ,
+            'BdohPlage'=> <<<FORMAT
+  <li>
+      <b>Header (3 lines):</b>
+      <ul>
+          <li>"Station ; Fuseau ; Followed by, for N time series: Chronique ; Unite ; Chronique ; Unite ... (N times)"</li>
+          <li>
+              "station code ; timezone value <i>(<u>format</u>: UTC +/-HH)</i> ; time series code 1 ; time series unit 1 ;
+              time series code 2 ; time series unit 2 ... (N times)"
+          </li>
+          <li>
+              "Debut ; Fin ; Valeur ; Qualite ; Min (optional) ; Max (optional) ; Valeur ; Qualite ; Min (optional) ;
+              Max (optional) ... (N times)"
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Data:</b> "DD/MM/YYYY HH:MM:SS ; DD/MM/YYYY HH:MM:SS ; value ; quality code ; value (optional) ; value (optional) ;
+      value ; quality code ; value (optional) ; value (optional) ... (N times)"
+  </li>
+  <li>
+      <b>Special values and missing values:</b>
+      <ul>
+          <li>-9999 for gap values;</li>
+          <li>The quality code must match the quality set used by the observatory.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Comments:</b>
+      <ul>
+          <li>
+              The character '#' indicates a comment line and can also be found inside the line,
+              in which case the rest of the line is ignored;
+          </li>
+          <li>
+              Comments are not allowed in the first three lines of the file,
+              which must always be the header as described here.
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Min and max columns go compulsorily together but they may be
+      present or not depending of each time series.</b>
+  </li>
+FORMAT
+            ,
+            'Qjo'=> <<<FORMAT
+  <li><b>Header (3 lines):</b> Not used</li>
+  <li><b>Data:</b> "QJ0 ; HYDRO2 staion code (not used) ; YYYYMMDD ; value (in l/s) ; C or S ; validity code ;"</li>
+  <li><b>Warning:</b> Do not forget the last line which should look like "FIN;EXP-HYDRO;8007;"</li>
+FORMAT
+            ,
+            'Qtvar'=> <<<FORMAT
+  <li><b>Header (4 lines):</b> Not used</li>
+  <li>
+      <b>Data:</b> "920 ; index (not used) ; HYDRO2 staion code (not used) ; YYYYMMDD ; HH:MM ; value (in m3/s) ;
+      validity code ; continuity code ;"
+  </li>
+  <li><b>Warning:</b> Do not forget the last line which should look like "FIN;EXP-HYDRO;8007;"</li>
+FORMAT
+            ,
+            'GrenobleDom'=> <<<FORMAT
+  <li>
+      <b>Header (1 line):</b>
+      <ul>
+          <li>At least four fields separated by “\u{a0};\u{a0}”;</li>
+          <li>The station code is expected to be in the fourth field, the rest of the line is not used.</li>
+      </ul>
+  <li>
+      <b>Data:</b>
+      <ul>
+          <li>"DD/MM/YYYY HH:MM:SS ; value ; quality ; comment";</li>
+          <li>The line mays also have extra “\u{a0};\u{a0}” after the comment.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Special values and missing values:</b>
+      <ul>
+          <li>-999 for gap values;</li>
+          <li>The comment mays be empty or be “\u{a0}ras\u{a0}”, it is not used;</li>
+          <li>The quality code must match the quality set Draix which must also be the one used by the observatory.</li>
+      </ul>
+  </li>
+FORMAT
+            ,
+        ],
+    ],
+];
+
+/*************************************************
+ * IMPORT OF CONTROLES
+ ************************************************/
+
+$controleImport = [
+    'controle.import'     => [
+        'title'                       => 'Checkpoints upload',
+        'step'                        => [
+            '1' => 'Step 1: checkpoints file',
+            '2' => 'Step 2: file validation',
+            '3' => 'Step 3: end of the upload',
+        ],
+        'question'                    => [
+            'importType' => 'Do you wish to upload these checkpoints?',
+        ],
+        'action'                      => [
+            'newImport'         => 'New upload',
+            'doNotImport'       => 'Do not upload',
+            'overwriteExisting' => 'Upload the checkpoints: this will delete all the previous checkpoints.',
+        ],
+        'help'                        => [
+            'quitWarning'            => 'While uploading <b>please use the dedicated button to cancel</b>.',
+            'file.onlyOneTimeSeries' => 'Only one time series per file.',
+            'timezoneToUTC'          => 'after conversion to UTC',
+            'overlap'                => [
+                'new'         => 'First upload of checkpoints for this time series.',
+                'before'      => 'All the checkpoints to be uploaded are prior to the existing checkpoints.',
+                'after'       => 'All the checkpoints to be uploaded are posterior to the existing checkpoints.',
+                'boundsEqual' => 'Bounds of the existing checkpoints match those of the checkpoints to be uploaded.',
+                'newInOld'    => 'All the checkpoints to be uploaded lie within the existing checkpoints bounds.',
+                'oldInNew'    => 'All the existing checkpoints lie within the bounds of the checkpoints to be uploaded.',
+                'firstIn'     => 'The beginning of the checkpoints to be uploaded overlaps the end of the existing checkpoints.',
+                'lastIn'      => 'The end of the checkpoints to be uploaded overlaps the beginning of the existing checkpoints.',
+            ],
+        ],
+        'info'                        => [
+            'wasCanceled'        => 'The checkpoint upload has been canceled',
+            'noControleImported' => 'No checkpoints have been uploaded.',
+            'timeSeries'         => 'Time series',
+            'controlesInsert'    => 'Checkpoint(s) added',
+            'controlesDelete'    => 'Checkpoint(s) deleted',
+            'nbControles'        => 'Checkpoint(s)',
+        ],
+        'fileColumns'                 => 'Time series',
+        'thereAreErrors.cantContinue' => 'The upload process cannot continue because of errors.',
+        'formats.bdoh'                => <<<FORMAT
+    <li>
+        <b>Header (3 lines):</b>
+        <ul>
+            <li>"Station ; Fuseau ; Chronique ; Unite"</li>
+            <li>"station code ; timezone value <i>(<u>format</u>: UTC +/-HH)</i> ; time series code ; unit"</li>
+            <li>"DateHeure ; Valeur ; Qualite ; Min (optional) ; Max (optional)"</li>
+        </ul>
+    </li>
+    <li>
+        <b>Data:</b> "DD/MM/YYYY HH:MM:SS ; value ; quality code ; value (optional) ; value (optional)"
+    </li>
+    <li>
+        <b>Comments:</b>
+        <ul>
+            <li>
+                The character '#' indicates a comment line and can also be found inside the line,
+                in which case the rest of the line is ignored;
+            </li>
+            <li>
+                Comments are not allowed in the first three lines of the file,
+                which must always be the header as described here.
+            </li>
+        </ul>
+    </li>
+FORMAT
+        ,
+    ],
+    'controle.management' => [
+        'title' => 'Time series checkpoints management',
+    ],
+    'controle.export'     => [
+        'title' => 'Checkpoints download',
+        'error' => [
+            'noChronique' => 'No time seires selected.',
+            'cantFinish'  => 'An error prevented the download to succeed.',
+            'noRight'     => "You don't have enough right to download those checkpoints.",
+        ],
+    ],
+];
+
+/*************************************************
+ * TRANSFORMATION
+ ************************************************/
+
+$transformation = [
+    'transformation' => [
+        'management' => 'Time series calculation',
+        'help'       => [
+            'selectionner-chronique-mere' => 'Choose a parent time series',
+            'meaning-coefficient'         => 'Multiplying coefficient used to create calculated values in the physical ' .
+                'unit of the one of the calculated time series. This unit will be the product of this coefficient with ' .
+                'the output units of both of the scales of the parent time series.',
+        ],
+        'bareme'     => [
+            'new'             => 'Add a new scale',
+            'import'          => [
+                'title'                => 'Scale upload',
+                'step'                 => [
+                    '1' => 'Step 1: scale file and format',
+                    '2' => 'Step 2: file and format validation',
+                    '3' => 'Step 3: end of the upload',
+                ],
+                'help'                 => [
+                    'quitWarning' => 'While uploading <b>please use the dedicated button to cancel</b>.',
+                ],
+                'entete'               => 'Header (3 lines):',
+                'detail'               => '<li>"Nom ; Unite entree ; Unite sortie ; Commentaire"</li>
+                                           <li>"scale name ; unit label ; unit label ; text (optional)"</li>
+                                           <li>"X ; Y ; Qualite ; Min (optional) ; Max (optional)"</li>',
+                'donnees'              => '<li><b>Data:</b> "value ; value ; quality code ; value (optional) ; value (optional)"</li>',
+                'valid'                => '<li><b>The quality codes must be in the VALIDE format for this observatory.</b></li>',
+                'draix'                => '<li><b>The quality codes must be in the Draix format for this observatory.</b></li>',
+                'commentaires'         => "<li>
+                                               <b>Comments:</b>
+                                               <ul>
+                                                   <li>The character '#' indicates a comment line and can also be found inside the line in which case the rest of the line is ignored;</li>
+                                                   <li>Comments are not allowed in the first three lines of the file which must always be the header as described here.</li>
+                                               </ul>
+                                           </li>",
+                'format'               => 'Scale',
+                'stats(%nbDataLines%)' => 'The file contains %nbDataLines% rows of data.',
+                'success'              => 'Scale uploaded successfully.',
+                'nom'                  => 'Scale name: ',
+                'uniteEntree'          => 'Input unit: ',
+                'uniteSortie'          => 'Output unit: ',
+                'commentaire'          => 'Comment: ',
+                'newImport'            => 'New upload',
+            ],
+            'baremeTechnique' => [
+                'identite' => 'Identity',
+                'lacune'   => 'Gap',
+                'manuel'   => 'Manual',
+            ],
+            'export'          => [
+                'doExport'    => 'Download scales',
+                'title'       => 'Scale download',
+                'help'        => 'Please select the scale(s) to download from the following list.',
+                'noSelection' => 'Please select at least one scale',
+            ],
+            'dateBareme' => 'd-m-Y H:i:s',
+        ],
+
+        'delaiPropagation'       => 'Travel time (minutes)',
+        'helpDelaiPropagation'   => 'A positive travel time delays the time series (downstream shifting) while a negative one moves it forward (upstream shifting).',
+        'jeu-baremes'            => 'Scale set',
+        'jeu-baremes-du(%date%)' => 'Scale set as of %date%',
+        'saveAndCompute'         => 'Save and calculate',
+        'erreur'                 => [
+            'coefficientNonNumerique'        => "Multiplying coefficient “\u{a0}%coeff%\u{a0}” not numeric",
+            'delaiNonNumerique'              => "Travel time “\u{a0}%delai%\u{a0}” not numeric",
+            'limitPlaceholderNonNumerique'   => "Limit placeholder “\u{a0}%placeholder%\u{a0}” not numeric",
+            'chroniqueFilleIntrouvable'      => 'Unknown calculated time series',
+            'chroniqueMere.principale'       => 'First parent time series:',
+            'chroniqueMere.secondaire'       => 'Second parent time series:',
+            'chroniqueMereIntrouvable'       => 'Parent time series not specified or unknown',
+            'aucunBareme'                    => 'no defined scale',
+            'baremeIntrouvable'              => 'Line %numLigne%: scale not specified or unknown',
+            'dateDebutIndefinie'             => 'Line %numLigne%: beginning date of scale application not specified',
+            'dateFinIndefinie'               => 'Line %numLigne%: end date of scale application not specified',
+            'finAvantDebut'                  => 'Line %numLigne%: end date of scale application (%dateFin%) earlier or equal to the beginning date (%dateDebut%)',
+            'conflitDebutFinPrecedent'       => 'Line %numLigne%: beginning date of scale application (%dateDebut%) different from the end date of the previous scale (%dateFin%)',
+            'uniteEntreeBaremeIncorrecte'    => "Line %numLigne%: input unit of scale (“\u{a0}%uniteEntreeBareme%\u{a0}”) different from unit of parent time series (“\u{a0}%uniteChroniqueMere%\u{a0}”)",
+            'uniteSortieBaremeIncorrecte'    => "Line %numLigne%: output unit of scale (“\u{a0}%uniteSortieBareme\u{a0}”) different from unit of calculated time series (“\u{a0}%uniteChroniqueFille%\u{a0}”)",
+            'unitesSortieBaremesDifferentes' => 'Scales have different output units, listed below in the order:',
+            'jeuBaremeIntrouvable'           => 'Scale set not found',
+        ],
+        'submitted'              => [
+            'submitted'  => "The calculation of the time series “\u{a0}<a href='_linkToChronique_'>_chroniqueName_</a>\u{a0}” has been submitted and should take a few moments.",
+            'seeJobPage' => "You may check the end of the calculation from <a href='_linkToJobPage_'>the job page</a> (job #_jobId_).",
+        ],
+        'confirmComputation'     => 'If you submit the calculation you will no longer be able to change the parent time series or travel times. Do you wish to continue?',
+        'cancelModifications'    => 'Cancel modifications',
+    ],
+];
+
+/*************************************************
+ * IMPORT OF SHAPE
+ ************************************************/
+
+$shapeImport = [
+    'shape.import'     => [
+        'title'                       => 'Geographic data upload',
+        'step'                        => [
+            '1' => 'Step 1: geographic data file',
+            '2' => 'Step 2: file validation',
+            '3' => 'Step 3: end of the upload',
+        ],
+        'question'                    => [
+            'importType' => 'What do you wish to upload?',
+        ],
+        'action'                      => [
+            'newImport'         => 'New upload',
+            'doNotImport'       => 'Do not upload anything',
+            'doImport'          => 'Upload the new data',
+            'replace'           => 'Replace the existing data',
+            'keepExisting'      => 'Upload only the new data',
+            'overwriteExisting' => 'Upload the new data and replace the existing data',
+        ],
+        'help'                        => [
+            'quitWarning'        => 'While uploading <b>please use the dedicated button to cancel</b>.',
+            'file.shape'         => 'Provide a full shapefile containing the geographic data (at least <strong>shx</strong>, <strong>shp</strong> and <strong>dbf</strong> files).',
+            'requiredProjection' => '<b>Data projection should be Lambert93 - EPSG:2154.</b>',
+            'sizeLimit'          => 'The upload file size must not exceed 2 MB.',
+            'station'            => [
+                'existingWithData'    => 'Existing station with geographic data|Existing stations with geographic data',
+                'existingWithoutData' => 'Existing station without geographic data|Existing stations without geographic data',
+                'nonExisting'         => 'Unknown station|Unknown stations',
+            ],
+            'courseau'           => [
+                'new'       => 'New river|New rivers',
+                'existing'  => 'Existing river|Existing rivers',
+                'nom'       => '(according to the name of the river)',
+            ],
+            'bassin'             => [
+                'new'         => 'New basin|New basins',
+                'existing'    => 'Existing basin|Existing basins',
+                'nopeStation' => 'Basin with unknown outlet station|Basins with unknown outlet station',
+            ],
+        ],
+        'info'                   => [
+            'title'               => 'Upload geographic data of type',
+            'wasCanceled'         => 'The geographic data upload has been canceled.',
+            'noShapeImported'     => 'No geographic data have been added.',
+            'noPossibleImport'    => 'No geographic data can be added.',
+            'shapeInsert'         => 'Geographic data added',
+            'shapeUpdate'         => 'Geographic data updated',
+            'noData'              => 'No geographic data',
+            'nom'                 => 'Name',
+            'wontupload'          => '(<u>these data cannot be uploaded</u>)',
+            'codeStationExutoire' => 'Outlet station code',
+            'codeStation'         => 'Code',
+        ],
+        'fileColumns'                 => '????',
+        'thereAreErrors.cantContinue' => 'The upload process cannot continue because of errors.',
+        'format'                      => [
+            'bassin'   => <<<FORMAT
+        <li><b>One zipped file with the same name as all the files inside, without folders.</b></li>
+        <li><b>Expected attribute columns, without specific order:</b></li>
+        <ul>
+            <li><b>nom</b>, for the name of the basin;</li>
+            <li><b>code_exu</b>, for the code of the outlet station of the basin, can be empty, the code must be a string.</b></li>
+        </ul>
+FORMAT
+            ,
+            'coursEau' => <<<FORMAT
+        <li><b>One zipped file with the same name as all the files inside, without folders.</b></li>
+        <li><b>Expected attribute columns, without specific order (based on the Carthage format):</b></li>
+        <ul>
+            <li><b>toponyme</b>, for the name of the river;</li>
+            <li><b>code_hydro</b>, for the hydro code of the river, can be empty, the code must be a string;</li>
+            <li><b>classifica</b>, for the Strahler number of the river, can be empty, must be a number.</b></li>
+        </ul>
+
+FORMAT
+            ,
+            'station'  => <<<FORMAT
+        <li><b>One zipped file with the same name as all the files inside, without folders.</b></li>
+        <li><b>Expected attribute column:</b></li>
+        <ul>
+            <li>code</b>, for the code of the station, the code must be a string.</li>
+        </ul>
+FORMAT
+            ,
+        ],
+    ],
+];
+
+/*************************************************
+ * CONVERSION
+ ************************************************/
+
+$conversion = [
+    'conversion' => [
+        'chroniqueMere'                  => 'Parent time series',
+        'paramConversion'                => 'Gap threshold',
+        'paramConversionHelp'            => 'Time interval <b><u>in minutes</u></b> between two successive data ranges that, if exceeded, results in the insertion of gaps.<br>' .
+            'Gaps are inserted at + and − 1 seconde from the surrounding data ranges.',
+        'paramConversionTitle'           => 'Number of minutes, minimum 1 minute.',
+        'paramConversionError'           => 'minimum 1 minute.',
+        'saveAndConvert'                 => 'Save and convert',
+        'cancelModifications'            => 'Cancel modifications',
+        'confirmConversion'              => 'If you submit the conversion you will no longer be able to change the parent time series. Do you wish to continue?',
+        'noChroniqueMere'                => 'No discontinuous time series with this unit on this station.',
+        'success(%link%, %chronique%)'   => "The conversion of the time series “\u{a0}<a href=\"%link%\">%chronique%</a>\u{a0}” has been submitted and should take a few moments.",
+        'seeJobPage(%jobPage%, %jobId%)' => 'You may check the end of the conversion from <a href="%jobPage%">the job page</a> (job #%jobId%).',
+        'CSRFerror'                      => 'The form validity expired and has been reset, please send the form again.',
+    ],
+];
+
+/*************************************************
+ * COLORS
+ ************************************************/
+
+$colors = [
+    'colors' => [
+        'titles'=> [
+            'qualite'       => 'Qualities styles',
+            'discontinuous' => 'Discontinuous time series markers',
+            'checkpoint'    => 'Checkpoints',
+        ],
+        'default'=> [
+            'qualite'       => 'For the simple-viewer, the initial values are: ' .
+                'color #FF0000 (red) and thickness 5 for the qualities processed as a gap and ' .
+                'color #0000FF (blue) and thickness 1 for the other qualities.<br>' .
+                'For information: For the multi-viewer, one color is generated automatically and used ' .
+                'for the whole time series (including gap qualities that are displayed with a transparency effect). ' .
+                'Line thickness is 5 for the gap qualities and 1 for the others. ' .
+                'These styles cannot be changed.',
+            'discontinuous' => 'For the simple-viewer, the initial values are: shape ●, thickness 2 and size 5.<br>' .
+                'For information: For the multi-viewer the following values are used: ' .
+                'shape ●, thickness 2 and size 5. ' .
+                'This style cannot be changed.',
+            'checkpoint'    => 'For the simple-viewer, the initial values are: ' .
+                'shape â—‹, thickness 2, color #008000 (green) and size 5.<br>' .
+                'For information: Checkpoints are not displayed on the multi-viewer.',
+        ],
+        'title'          => 'Viewer styles',
+        'longTitle'      => 'Styles for the simple viewer',
+        'success(%jeu%)' => "The qualities colors for the set “\u{a0}%jeu%\u{a0}” have been saved.",
+        'color'          => 'Color',
+        'thickness'      => 'Line thickness',
+        'gap'            => 'This quality is processed as a gap.',
+        'shape'          => 'Shape',
+        'stroke'         => 'Stroke thickness',
+        'strokeHelp'     => 'Stroke thickness of the non-filled shapes only.',
+        'size'           => 'Size',
+        'save'           => 'Save',
+        'cancel'         => 'Cancel modifications',
+        'CSRFerror'      => 'The form validity expired and has been reset, please send the form again.',
+    ],
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'data'        => [
+        'management' => 'Data management',
+    ],
+    'button' => [
+        'add' => 'Create',
+    ],
+
+    'admin'       => [
+        'measuresImport' => 'Data upload',
+        'controleImport' => 'Checkpoint upload and download',
+        'sendJson'       => [
+            'save'              => 'Save',
+            'saveMessage'       => 'Check this to enable automatic updates',
+            'send'              => 'Send your JSON',
+            'result'            => 'Result',
+            'resultMessage'     => 'Your JSON valided',
+            'resultMessageFail' => 'Your JSON failed!',
+            'schema'            => 'Validation schema',
+        ],
+        'shapeImport'    => 'Geographic data upload',
+        'help'           => [
+            'astuce'                              => '<strong style="color:#0e90d2; font-size: 10px">Tip: Click on the line to display the existing drop-down list. Write the first letters of the search word to filter.</strong>',
+            'from_the_observatory'                => 'from the observatory',
+            'inspireTheme'                        => [
+                'nom' => "Offcial list of INSPIRE theme<strong> in english</strong> at this link : <a href='https://inspire.ec.europa.eu/theme' target='_blank>Here</a> ",
+            ],
+            'topicCategory' => [
+                'nom' => "Official list of INSPIRE topicCategory<strong> in english</strong> at this link : <a href='https://inspire.ec.europa.eu/metadata-codelist/TopicCategory' target='_blank>Here</a> ",
+            ],
+            'theia'                => [
+                'theia-message'        => '<strong style="color:red; font-size: 10px">[Theia/Ozcar fields]</strong><br> ',
+                'warning-update-theia' => '<strong>Attention :</strong> Veuillez compléter les nouveaux champs pour Theia/Ozcar',
+                'uriOzcarTheia'        => "This field is the corresponding variable category (or variables categories) on the Theia / Ozcar Thesaurus (you must write the letters of the research word) of the fields <strong> Environment </strong> and of the <strong> Parameter Categories </strong> BDOH. Link to Skomos. You can find your variable category : <a href='https://in-situ.theia-land.fr/skosmos/theia_ozcar_thesaurus/en/page/variableCategories' target='_blank'>Here</a>",
+            ],
+            'observatoire'         => [
+                'theiaCode-message'                        => "<strong style=\"color:red; font-size: 10px\">[Theia/Ozcar fields]</strong><br>Corresponds to the first 4 capital letters of the Observatory. <br> The identifiers refer to the Theia / Ozcar pivot data model (Annex 1 page 15) : <a href='https://theia-ozcar.gricad-pages.univ-grenoble-alpes.fr/doc-producer/_downloads/b57adda313eaf801d6ba4348ab86e8ea/description_champs_JSON_v1.1.pdf' target='_blank'>Here</a> ",
+                'jeu'                                      => 'The change of quality code set should be restricted to empty observatories with no uploaded data.',
+                'warning-observatory-has-sites'            => 'This observatory cannot be deleted because it contains the following experimental site:|This observatory cannot be deleted because it contains the following experimental sites:',
+                'warning-observatory-has-scales'           => 'This observatory has the following scale:|This observatory has the following scales:',
+                'warning-observatory-has-dois'             => 'This observatory has the following DOI:|This observatory has the following DOIs:',
+                'warning-observatory-has-basins'           => 'This observatory has the following basin:|This observatory has the following basins:',
+                'warning-observatory-has-rivers'           => 'This observatory has the following river:|This observatory has the folowing rivers:',
+                'confirm-delete-observatory(%name%)'       => "Are you sure you want to delete the observatory “\u{a0}%name%\u{a0}”?",
+                'email-info'                               => 'Email of generic conatct of this producer.',
+                'confirm-delete-observatory-info'          => '<strong style="color:red">The listed scales, basins, rivers and/or DOIs will be deleted as well.</strong>',
+                'warning-delete-observatory-info-redirect' => 'This is the current observatory, if you delete it you will be redirected to the home page of all the observatories.',
+            ],
+            'dataset' => [
+                'contact'                        => "<strong style=\"color:red; font-size: 10px\">[Champ pour Theia/Ozcar]</strong><br>Theia/Ozcar demande la présence obligatoire d'au moins un Project Leader",
+                'description'                    => 'The absract must describe the resource.',
+                'genealogy'                      => 'Describes the genealogy of a dataset, i.e. the history of the dataset and, if known, its life cycle, from the acquisition and entry of information to its compilation with other games and variants of its current form.  ',
+            ],
+            'site'                 => [
+                'warning-site-has-stations' => 'To delete this experimental site you must first dissociate the following station from it:|To delete this experimental site you must first dissociate the following stations from it:',
+            ],
+            'station'              => [
+                'code'                             => 'Characters with accents and special of this code will be automatically replaced.',
+                'codeAlternatif'                   => "Station codes separated by “\u{a0};\u{a0}” in the form of “\u{a0}Format=CODE\u{a0}”, used to download time series in a non-BDOH format. Example: Hydro2 = MY_HYDRO2_CODE",
+                'latlong'                          => 'Lambert93 - EPSG:2154 (meters)',
+                'warning-station-has-time-series'  => 'This station cannot be deleted because it contains the following time series:|This station cannot be deleted because it contains the following time series:',
+                'warning-station-has-basins'       => 'This station is used by the following basin as its outlet station:|This station is used by the following basins as their outlet station:',
+                'town-name-is-case-sensitive'      => '<u>Warning: the search filter is case-sensitive, all town names have capital letters and compound names use dashes and not spaces ' .
+                    '(ex.: Saint-Germain-sur-l\'Arbresle, Sainte-Foy-lès-Lyon, etc.), in doubt use a part of the name that can\'t have capital letters nor dashes or use the zip code.</u>',
+                'confirm-delete-station(%name%)'   => "Are you sure you want to delete the station “\u{a0}%name%\u{a0}”?",
+                'confirm-delete-station-info'      => "The listed basins won't be deleted, they will just lose their outlet station.",
+            ],
+            'chronique'            => [
+                'code'                                   => 'Characters with accents and special characters will be automatically replaced.',
+                'libelle'                                => 'A short text describing the time series in a unique, specific way...',
+                'estVisible'                             => 'Is the time series visible to the public, yes or no?',
+                'warning-has-calculated-time-series'     => 'This time series cannot be deleted because it is used to calculate the following time series:|This time series cannot be deleted because it is used to calculate the following time series:',
+                'warning-has-converted-time-series'      => 'This time series cannot be deleted because it is used for the conversion of the following time series:|This time series cannot be deleted because it is used for the conversion of the following time series:',
+                'warning-no-export-options-were-defined' => '<strong>Warning:</strong> options for regular time step downloads were not defined for this time series yet. Default values have been automatically set. Please check/edit the values and save the modifications.',
+                'contains-n-mesures(%nb%)'               => 'This time series has one data point.|This time series has %nb% data points.',
+                'contains-n-plages(%nb%)'                => 'This time series has one data range.|This time series has %nb% data ranges.',
+                'contains-n-controles(%nb%)'             => 'This time series has one checkpoint.|This time series has %nb% checkpoints.',
+                'confirm-delete-time-series(%name%)'     => "Are you sure you want to delete the time series “\u{a0}%name%\u{a0}”?",
+                'confirm-delete-time-series-info'        => '<u>The data points, data ranges and/or checkpoints of this time series will be deleted as well.</u>',
+                'update-unite-cumul'                     => 'If you allow this time series to be downloaded as accumulations please check or update the unit for accumulations below.',
+                'warning-no-milieu-defined'              => '<strong>Warning:</strong> This time series does not have an environment (the first one is selected by default). You must select an environment for this type and save the modification.',
+            ],
+            'commune'              => [
+                'warning-commune-has-stations'   => 'This town is used by the following station:|This town is used by the following stations:',
+                'confirm-delete-commune(%name%)' => "Are you sure you want to delete the town “\u{a0}%name%\u{a0}”?",
+                'confirm-delete-commune-info'    => "The listed stations won't be deleted, they will just lose their town.",
+            ],
+            'doi'                  => [
+                'identifiant' => 'Identifier example: 10.17180/MY.OBSERVATORY',
+                'description' => 'Details about the data such as: authors, year, title, institution (most often INRAE), the DOI is automatically added to the description.',
+            ],
+            'partenaire'           => [
+                'warning-partenaire-has-time-series'   => 'This partner cannot be deleted because it is used by the following time series as a producer:|This partner cannot be deleted because it is used by the following time series as a producer:',
+                'warning-partenaire-has-observatories' => 'This partner cannot be deleted because it is used by the following observatory:|This partner cannot be deleted because it is used by the following observatories:',
+                'partenaire-has-time-series'           => 'This partner is used by the following time series as a producer:|This partner is used by the following time series as a producer:',
+                'partenaire-has-observatories'         => 'This partner is used by the following observatory:|This partner is used by the following observatories:',
+                'confirm-delete-partenaire(%name%)'    => "Are you sure you want to delete the partner “\u{a0}%name%\u{a0}”?",
+                'confirm-delete-partenaire-info'       => "The listed time series and/or observatories won't be deleted, they will just lose their partner or producer.",
+                'help-scanR'                           => 'Scan Id on the website <a href="https://scanr.enseignementsup-recherche.gouv.fr/" target="_blank">https://scanr.enseignementsup-recherche.gouv.fr/</a> Example : Unité PIAF, ID: 200017466P</strong>',
+            ],
+            'familleParametres'    => [
+                'warning-familleParametres-has-children' => 'This parameter category cannot be deleted because it is used by the following parameter category (as its parent category):|This parameter category cannot be deleted because it is used by the following parameter categories (as their parent category):',
+                'warning-familleParametres-has-types'    => 'This parameter category cannot be deleted because it is used by the following parameter type:|This parameter category cannot be deleted because it is used by the following parameter types:',
+                'help-prefix'                            => 'The prefix is used for ordering the categories of the same hierarchic level (for exemple: 001, 002, 003, ...), it is not displayed.',
+                'help-familleParente'                    => 'Child and descendant categories have been removed from this selection list. You may also remove the parent category with the little cross on the right side.',
+            ],
+            'typeParametre'        => [
+                'warning-typeParametre-has-time-series' => 'This parameter type cannot be deleted because it is used by the following time series:|This parameter type cannot be deleted because it is used by the following time series:',
+                'warning-no-family-defined'             => '<strong>Warning:</strong> This parameter type does not have a parameter category (the first one is selected by default). You must select a parameter category for this type and save the modification.',
+            ],
+            'unite'                => [
+                'warning-unit-has-time-series'     => 'This unit cannot be deleted because it is used by the following time series:|This unit cannot be deleted because it is used by the following time series:',
+                'warning-unit-has-scales'          => 'This unit cannot be deleted because it is used by the following scale:|This unit cannot be deleted because it is used by the following scales:',
+                'warning-unit-has-parameter-types' => 'This unit is used by the following parameter type:|This unit is used by the following parameter types:',
+                'confirm-delete-unit(%name%)'      => "Are you sure you want to delete the unit “\u{a0}%name%\u{a0}”?",
+                'confirm-delete-unit-info'         => "The listed parameter types won't be deleted, they will just lose this unit.",
+            ],
+        ],
+    ],
+    'utilisateur' => [
+        'newAccountMail' => [
+            'body'   => 'Hello,
+
+An account has been created for you on BDOH.
+
+Your login is the e-mail address at which you received this message and the password is “\u{a0}password\u{a0}”, we invite you to change it as soon as you sign in.
+
+You can ask for specific data access form the following link: ',
+            'footer' => 'This e-mail is automatically generated, thank you for not replying.',
+            'title'  => 'Account opened on BDOH',
+        ],
+    ],
+    'export'      => [
+        'exportMail' => [
+            'body'               => 'Please find your downloaded time series as an attachement.',
+            'footer'             => 'This e-mail is automatically generated, thank you for not replying.',
+            'title(%chronique%)' => "BDOH: Downloaded time series “\u{a0}%chronique%\u{a0}”",
+        ],
+    ],
+    'backToBdoh'             => 'Get back to BDOH',
+    'forAllTheObservatories' => 'For all the observatories',
+    'title_edit_defined'     => "%entity% “\u{a0}%name%\u{a0}”",
+    'title_create_undefined' => '%entity%',
+    'title_delete_defined'   => "%entity% “\u{a0}%name%\u{a0}”",
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entitiesActions, $fieldSets, $fileFormats, $measureImport, $various, $controleImport, $transformation, $shapeImport, $conversion, $colors);
diff --git a/src/Irstea/BdohAdminBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohAdminBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c32100927ff88da48899190d598fae5642ef750
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,820 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+define('IrsteaBdohDataBundle_transDir', __DIR__ . '/../../../BdohDataBundle/Resources/translations/');
+define('IrsteaBdohSecurityBundle_transDir', __DIR__ . '/../../../BdohSecurityBundle/Resources/translations/');
+
+$entitiesSingulars_Data = require IrsteaBdohDataBundle_transDir . 'entitiesSingulars.fr.php';
+$entitiesSingularsArticles_Data = require IrsteaBdohDataBundle_transDir . 'entitiesSingularsArticles.fr.php';
+$entitiesSingularsDefinedArticles_Data = require IrsteaBdohDataBundle_transDir . 'entitiesSingularsDefinedArticles.fr.php';
+$entitiesPlurals_Data = require IrsteaBdohDataBundle_transDir . 'entitiesPlurals.fr.php';
+
+$entitiesSingulars_Security = require IrsteaBdohSecurityBundle_transDir . 'entitiesSingulars.fr.php';
+$entitiesSingularsArticles_Security = require IrsteaBdohSecurityBundle_transDir . 'entitiesSingularsArticles.fr.php';
+$entitiesSingularsDefinedArticles_Security = require IrsteaBdohSecurityBundle_transDir . 'entitiesSingularsDefinedArticles.fr.php';
+$entitiesPlurals_Security = require IrsteaBdohSecurityBundle_transDir . 'entitiesPlurals.fr.php';
+
+/*************************************************
+ * ENTITIES ACTIONS (for SonataAdminBundle)
+ ************************************************/
+
+$entitiesActions = [];
+
+// For BdohDataBundle
+$entitiesKeys = array_keys($entitiesSingulars_Data);
+
+foreach ($entitiesKeys as $key) {
+    $entitiesActions[$key . '_list'] =
+        'Liste des ' .
+        ($entitiesPlurals_Data[$key] === 'DOI' ? $entitiesPlurals_Data[$key] : lcfirst($entitiesPlurals_Data[$key]));
+    $entitiesActions[$key . '_create'] =
+        'Créer ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_create_undefined'] =
+        "Création d'" . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_edit'] =
+        'Éditer ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_edit_defined'] =
+        'Modification ' . $entitiesSingularsDefinedArticles_Data[$key] .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_delete'] =
+        'Supprimer ' . $entitiesSingularsArticles_Data[$key] . ' ' .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+    $entitiesActions[$key . '_delete_defined'] =
+        'Suppression ' . $entitiesSingularsDefinedArticles_Data[$key] .
+        ($entitiesSingulars_Data[$key] === 'DOI' ? $entitiesSingulars_Data[$key] : lcfirst($entitiesSingulars_Data[$key]));
+}
+
+// For BdohSecurityBundle
+$entitiesKeys = array_keys($entitiesSingulars_Security);
+
+foreach ($entitiesKeys as $key) {
+    $entitiesActions[$key . '_list'] =
+        'Liste des ' . lcfirst($entitiesPlurals_Security[$key]);
+    $entitiesActions[$key . '_create'] =
+        'Créer ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_create_undefined'] =
+        "Création d'" . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_edit'] =
+        'Éditer ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_edit_defined'] =
+        'Modification ' . $entitiesSingularsDefinedArticles_Security[$key] . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_delete'] =
+        'Supprimer ' . $entitiesSingularsArticles_Security[$key] . ' ' . lcfirst($entitiesSingulars_Security[$key]);
+    $entitiesActions[$key . '_delete_defined'] =
+        'Suppression ' . $entitiesSingularsDefinedArticles_Security[$key] . lcfirst($entitiesSingulars_Security[$key]);
+}
+
+/*************************************************
+ * FIELDSETS
+ ************************************************/
+
+$fieldSets = [
+    'fieldset.text'    => 'Descriptions et autres',
+    'fieldset.graphic' => "Options d'affichage et photos",
+];
+
+/*************************************************
+ * FILE FORMATS
+ ************************************************/
+
+$fileFormats = [
+    'import' => [
+        'Qjo'                   => 'Hydro2 - QJO',
+        'Qtvar'                 => 'Hydro2 - QTVAR',
+        'AixPluie'              => 'Aix - pluie',
+        'AixDebitHauteur'       => 'Aix - débit/hauteur',
+        'AntonyChimie'          => 'Antony - chimie',
+        'AntonyHuml2x'          => 'Antony - HUML2X',
+        'AntonyHutdr'           => 'Antony - HUTDR',
+        'AntonyMeteoJournalier' => 'Antony - météo J',
+        'AntonyMeteoHoraire'    => 'Antony - météo H',
+        'AntonyPiezo'           => 'Antony - piezo',
+        'AntonyPluie'           => 'Antony - pluie',
+        'GrenobleDom'           => 'Grenoble - DOM',
+        'LyonBiche'             => 'Lyon - Biche',
+        'Bdoh'                  => 'BDOH - continu',
+        'BdohPlage'             => 'BDOH - discontinu',
+        'controle'              => 'Points de contrôle',
+    ],
+];
+
+/*************************************************
+ * IMPORT OF MEASURES
+ ************************************************/
+
+$measureImport = [
+    'measure.import' => [
+        'title'                                  => 'Import de mesures',
+        'step'                                   => [
+            '1' => 'Étape 1 : fichier de mesures et format',
+            '2' => 'Étape 2 : station, fuseau horaire et chroniques',
+            '3' => "Étape 3 : validation de l'import",
+            '4' => "Étape 4 : fin de l'import",
+        ],
+        'question'                               => [
+            'importType'      => 'Comment souhaitez-vous importer ces mesures ?',
+            'computeChildren' => 'Mettre à jour la chronique fille|Mettre à jour les chroniques filles',
+        ],
+        'action'                                 => [
+            'doImport'          => 'Les importer.',
+            'doNotImport'       => 'Ne pas les importer.',
+            'keepExisting'      => "Conserver l'existant en cas de chevauchement.",
+            'overwriteExisting' => "Écraser l'existant au profit des nouvelles mesures en cas de chevauchement.",
+            'newImport'         => 'Nouvel import',
+        ],
+        'help'                                   => [
+            'quitWarning'         => "En cours d'import <b>merci de n'annuler que par le bouton prévu à cet effet</b>.",
+            'file.onlyOneStation' => "Un fichier contient des données d'une seule station.",
+            'file.bigInZip'       => 'Vous pouvez envoyer vos <u>gros fichiers de mesures</u> sous format <b>zip</b> <i>(un fichier par zip)</i>.',
+            'file.sizeLimit'      => 'Le fichier envoyé ne doit pas dépasser 2 Mo.',
+            'chroniquesBox'       => "<b>Mode d'emploi :</b> Faites correspondre chaque colonne à importer à une chronique en faisant glisser cette dernière vers la gauche.",
+            'timezoneToUTC'       => 'après passage en UTC',
+            'overlap'             => [
+                'new'         => 'Premier import pour cette chronique.',
+                'before'      => 'Toutes les mesures à importer sont antérieures aux mesures existantes.',
+                'after'       => 'Toutes les mesures à importer sont postérieures aux mesures existantes.',
+                'boundsEqual' => 'Les bornes des mesures existantes et des mesures à importer sont égales.',
+                'newInOld'    => 'Les mesures à importer sont entièrement incluses dans les bornes des mesures existantes.',
+                'oldInNew'    => 'Les mesures existantes sont entièrement incluses dans les bornes des mesures à importer.',
+                'firstIn'     => 'Le début des mesures à importer chevauche la fin des mesures existantes.',
+                'lastIn'      => 'La fin des mesures à importer chevauche le début des mesures existantes.',
+            ],
+            'children'            => 'Chronique fille|Chroniques filles',
+        ],
+        'info'                                   => [
+            'wasCanceled'             => "L'import de mesures a été annulé.",
+            'noMeasuresImported'      => "Aucune mesure n'a été importée.",
+            'measuresInsert'          => 'Mesure(s) insérée(s)',
+            'measuresDelete'          => 'Mesure(s) supprimée(s)',
+            'computingOfFillingRates' => '<b>Attention :</b> le calcul des taux de remplissage est en cours, ' .
+                'cette opération peut prendre quelques minutes pendant lesquelles leur affichage est obsolète.',
+            'jobPage(%jobPageLink%)'  => 'Vous pouvez vérifier la fin de ce calcul depuis <a href="%jobPageLink%">la page des jobs</a>.',
+            'children(%count%)'       => 'Cette chronique a une chronique fille|Cette chronique a %count% chroniques filles',
+        ],
+        'fileColumns'                            => 'Colonne(s) du fichier',
+        'thereAreErrors.cantContinue'            => "L'import ne peut se poursuivre car il y a des erreurs.",
+        'valeurTooLarge(%first%,%last%,%count%)' => '{0}|' .
+            '{1}Une mesure est supérieure au maximum, le <i>%first%</i>|' .
+            ']1,Inf]Du <i>%first%</i> au <i>%last%</i> inclus : ily a <b>%count%</b> mesures supérieures au maximum',
+        'valeurTooSmall(%first%,%last%,%count%)' => '{0}|' .
+            '{1}Une mesure est inférieure au minimum, le <i>%first%</i>|' .
+            ']1,Inf]Du <i>%first%</i> au <i>%last%</i> inclus : il y a <b>%count%</b> mesures inférieures au minimum',
+        'analysisInProgress'                     => 'Analyse en cours',
+        'processingInProgress'                   => 'Traitement en cours',
+        'canTakeAWhile'                          => 'Cette opération peut prendre du temps',
+        'pleaseWait'                             => 'Veuillez patienter...',
+        'timeSeries'                             => 'Chronique(s)',
+        'ignoredTimeSeries'                      => 'Chronique ignorée',
+        'removeTimeSeries'                       => 'Ne pas inclure cette chronique',
+        'restoreTimeSeries'                      => 'Restaurer cette chronique',
+        'formats'                                => [
+            'Bdoh'=> <<<FORMAT
+  <li>
+      <b>Entête (3 lignes) :</b>
+      <ul>
+          <li>"Station ; Fuseau ; Puis, pour N chroniques : Chronique ; Unite ; Chronique ; Unite ... (N fois)"</li>
+          <li>
+              "code station ; valeur fuseau <i>(<u>format</u> : UTC +/-HH)</i> ; code chronique 1 ; unité chronique 1 ;
+              code chronique 2 ; unité chronique 2 ... (N fois)"
+          </li>
+          <li>
+              "DateHeure ; Valeur ; Qualite ; Min (optionnel) ; Max (optionnel) ; Valeur ; Qualite ; Min (optionnel) ;
+              Max (optionnel) ... (N fois)"
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Données :</b> "JJ/MM/AAAA HH:MM:SS ; valeur ; code qualité ; valeur (optionnel) ; valeur (optionnel) ;
+      valeur ; code qualité ; valeur (optionnel) ; valeur (optionnel) ... (N fois)"
+  </li>
+  <li>
+      <b>Valeurs manquantes ou spéciales :</b>
+      <ul>
+          <li>-9999 pour les lacunes ;</li>
+          <li>La qualité doit utiliser le jeu de codes défini pour l'observatoire.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Commentaires :</b>
+      <ul>
+          <li>
+              Le caractère '#' marque une ligne de commentaire et peut également se trouver en cours de ligne,
+              auquel cas toute la suite de la ligne est commentée ;
+          </li>
+          <li>
+              Les commentaires ne sont pas autorisés sur les trois premières lignes du fichier,
+              qui doivent toujours être l'entête tel que décrit ici.
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Les colonnes min et max vont obligatoirement par paires par contre elles peuvent
+      être présentes ou absentes en fonction de chaque chronique.</b>
+  </li>
+FORMAT
+            ,
+            'BdohPlage'=> <<<FORMAT
+  <li>
+      <b>Entête (3 lignes) :</b>
+      <ul>
+          <li>"Station ; Fuseau ; Puis, pour N chroniques : Chronique ; Unite ; Chronique ; Unite ... (N fois)"</li>
+          <li>
+              "code station ; valeur fuseau <i>(<u>format</u> : UTC +/-HH)</i> ; code chronique 1 ; unité chronique 1 ;
+              code chronique 2 ; unité chronique 2 ... (N fois)"
+          </li>
+          <li>
+              "Debut ; Fin ; Valeur ; Qualite ; Min (optionnel) ; Max (optionnel) ; Valeur ; Qualite ; Min (optionnel) ;
+              Max (optionnel) ... (N fois)"
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Données :</b> "JJ/MM/AAAA HH:MM:SS ; JJ/MM/AAAA HH:MM:SS ;  valeur ; code qualité ; valeur (optionnel) ;
+      valeur (optionnel) ; valeur ; code qualité ; valeur (optionnel) ; valeur (optionnel) ... (N fois)"
+  </li>
+  <li>
+      <b>Valeurs manquantes ou spéciales :</b>
+      <ul>
+          <li>-9999 pour les lacunes ;</li>
+          <li>La qualité doit utiliser le jeu de codes défini pour l'observatoire.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Commentaires :</b>
+      <ul>
+          <li>
+              Le caractère '#' marque une ligne de commentaire et peut également se trouver en cours de ligne,
+              auquel cas toute la suite de la ligne est commentée ;
+          </li>
+          <li>
+              Les commentaires ne sont pas autorisés sur les trois premières lignes du fichier,
+              qui doivent toujours être l'entête tel que décrit ici.
+          </li>
+      </ul>
+  </li>
+  <li>
+      <b>Les colonnes min et max vont obligatoirement par paires par contre elles peuvent être
+      présentes ou absentes en fonction de chaque chronique.</b>
+  </li>
+FORMAT
+            ,
+            'Qjo'=> <<<FORMAT
+  <li><b>Entête (3 lignes) :</b> Inexploité</li>
+  <li><b>Données :</b> "QJ0 ; code station HYDRO2 (inexploité) ; AAAAMMJJ ; valeur (en l/s) ; C ou S ; code validité ;"</li>
+  <li><b>Attention :</b> Ne pas oublier la dernière ligne de la forme "FIN;EXP-HYDRO;8007;"</li>
+FORMAT
+            ,
+            'Qtvar'=> <<<FORMAT
+  <li><b>Entête (4 lignes) :</b> Inexploité</li>
+  <li>
+      <b>Données :</b> "920 ; index (inexploité) ; code station HYDRO2 (inexploité) ; AAAAMMJJ ; HH:MM ; valeur (en m3/s) ;
+      code validité ; code de continuité ;"
+  </li>
+  <li><b>Attention :</b> Ne pas oublier la dernière ligne de la forme "FIN;EXP-HYDRO;8007;"</li>
+FORMAT
+            ,
+            'GrenobleDom'=> <<<FORMAT
+  <li>
+      <b>Entête (1 ligne) :</b>
+      <ul>
+          <li>Au moins quatre champs séparés par des «\u{a0};\u{a0}» ;</li>
+          <li>Le code de la station est attendu en quatrième position, le reste est inexploité.</li>
+      </ul>
+  <li>
+      <b>Données :</b>
+      <ul>
+          <li>"JJ/MM/AAAA HH:MM:SS ; valeur ; qualité ; commentaire" ;</li>
+          <li>La ligne contient éventuellement des «\u{a0};\u{a0}» surnuméraires au-delà du commentaire.</li>
+      </ul>
+  </li>
+  <li>
+      <b>Valeurs manquantes ou spéciales :</b>
+      <ul>
+          <li>-999 pour les lacunes ;</li>
+          <li>Le commentaire peut être vide ou contenir «\u{a0}ras\u{a0}», il est ignoré ici ;</li>
+          <li>La qualité doit utiliser le jeu de codes Draix qui doit aussi être celui défini pour l'observatoire.</li>
+      </ul>
+  </li>
+FORMAT
+            ,
+        ],
+    ],
+];
+
+/*************************************************
+ * IMPORT OF CONTROLES
+ ************************************************/
+
+$controleImport = [
+    'controle.import'     => [
+        'title'                       => 'Import de points de contrôle',
+        'step'                        => [
+            '1' => 'Étape 1 : fichier de points de contrôle',
+            '2' => "Étape 2 : validation de l'import",
+            '3' => "Étape 3 : fin de l'import",
+        ],
+        'question'                    => [
+            'importType' => 'Souhaitez-vous importer ces points de contrôle ?',
+        ],
+        'action'                      => [
+            'newImport'         => 'Nouvel import',
+            'doNotImport'       => 'Ne pas les importer',
+            'overwriteExisting' => "Importer les nouvelles donnnées : cela supprimera l'intégralité des points existants.",
+        ],
+        'help'                        => [
+            'quitWarning'            => "En cours d'import <b>merci de n'annuler que par le bouton prévu à cet effet</b>.",
+            'file.onlyOneTimeSeries' => "Un fichier contient des données d'une seule chronique.",
+            'timezoneToUTC'          => 'après passage en UTC',
+            'overlap'                => [
+                'new'         => 'Premier import de points de contrôle pour cette chronique.',
+                'before'      => 'Touts les points de contrôle à importer sont antérieures aux points de contrôle existants.',
+                'after'       => 'Touts les points de contrôle à importer sont postérieures aux points de contrôle existants.',
+                'boundsEqual' => 'Les bornes des points de contrôle existants et des points de contrôle à importer sont égales.',
+                'newInOld'    => 'Les points de contrôle à importer sont entièrement incluses dans les bornes des points de contrôle existants.',
+                'oldInNew'    => 'Les points de contrôle existants sont entièrement incluses dans les bornes des points de contrôle à importer.',
+                'firstIn'     => 'Le début des points de contrôle à importer chevauchent la fin des points de contrôle existants.',
+                'lastIn'      => 'La fin des points de contrôle à importer chevauchent le début des points de contrôle existants.',
+            ],
+        ],
+        'info'                        => [
+            'wasCanceled'        => "L'import de points de contrôles a été annulé.",
+            'noControleImported' => "Aucun point de contrôle n'a été importé.",
+            'timeSeries'         => 'Chronique',
+            'controlesInsert'    => 'Point(s) de contrôle inséré(s)',
+            'controlesDelete'    => 'Point(s) de contrôle supprimé(s)',
+            'nbControles'        => 'Point(s) de contrôle',
+        ],
+        'fileColumns'                 => 'Chronique concernée',
+        'thereAreErrors.cantContinue' => "L'import ne peut se poursuivre car il y a des erreurs.",
+        'formats.bdoh'                => <<<FORMAT
+    <li>
+        <b>Entête (3 lignes) :</b>
+        <ul>
+            <li>"Station ; Fuseau ; Chronique ; Unite"</li>
+            <li>"code station ; valeur fuseau <i>(<u>format</u> : UTC +/-HH)</i> ; code chronique ; unité"</li>
+            <li>"DateHeure ; Valeur ; Qualite ; Min (optionnel) ; Max (optionnel)"</li>
+        </ul>
+    </li>
+    <li>
+        <b>Données :</b> "JJ/MM/AAAA HH:MM:SS ; valeur ; code qualité ; valeur (optionnel) ; valeur (optionnel)"
+    </li>
+    <li>
+        <b>Commentaires :</b>
+        <ul>
+            <li>
+                Le caractère '#' marque une ligne de commentaire et peut également se trouver en cours de ligne,
+                auquel cas toute la suite de la ligne est commentée ;
+            </li>
+            <li>
+                Les commentaires ne sont pas autorisés sur les trois premières lignes du fichier,
+                qui doivent toujours être l'entête tel que décrit ici.
+            </li>
+        </ul>
+    </li>
+FORMAT
+        ,
+    ],
+    'controle.management' => [
+        'title' => "Gestion des points de contrôle d'une chronique",
+    ],
+    'controle.export'     => [
+        'title' => 'Export de points de contrôle',
+        'error' => [
+            'noChronique' => 'Pas de chronique sélectionné.',
+            'cantFinish'  => "Une erreur a bloqué l'export des points de contrôle.",
+            'noRight'     => "Vous n'avez pas les droits suffisants pour exporter ces points de contrôle.",
+        ],
+    ],
+];
+
+/*************************************************
+ * TRANSFORMATION
+ ************************************************/
+
+$transformation = [
+    'transformation' => [
+        'management' => "Calcul d'une chronique fille",
+        'help'       => [
+            'selectionner-chronique-mere' => 'Sélectionnez une chronique mère',
+            'meaning-coefficient'         => 'Coefficient multiplicateur à renseigner pour que les valeurs calculées ' .
+                "soient dans l'unité physique de la chronique fille. Cette unité sera le produit de ce coefficient avec " .
+                'les unités de sortie des barèmes des deux chroniques mères.',
+        ],
+        'bareme'     => [
+            'new'             => 'Ajouter un nouveau barème',
+            'import'          => [
+                'title'                => "Import d'un barème",
+                'step'                 => [
+                    '1' => 'Étape 1 : fichier du barème et format',
+                    '2' => "Étape 2 : validation de l'import",
+                    '3' => "Étape 3 : fin de l'import",
+                ],
+                'help'                 => [
+                    'quitWarning' => "En cours d'import <b>merci de n'annuler que par le bouton prévu à cet effet</b>.",
+                ],
+                'entete'               => 'En-tête (3 lignes) :',
+                'detail'               => '<li>"Nom ; Unite entree ; Unite sortie ; Commentaire"</li>
+                                           <li>"nom du barème ; libellé unité ; libellé unité ; texte (optionnel)"</li>
+                                           <li>"X ; Y ; Qualite ; Min (optionnel) ; Max (optionnel)"</li>',
+                'donnees'              => '<li><b>Données :</b> "valeur ; valeur ; code qualité ; valeur (optionnel) ; valeur (optionnel)"</li>',
+                'valid'                => '<li><b>Les codes de qualité doivent être au format VALIDE pour cet observatoire.</b></li>',
+                'draix'                => '<li><b>Les codes de qualité doivent être au format Draix pour cet observatoire.</b></li>',
+                'commentaires'         => "<li>
+                                               <b>Commentaires :</b>
+                                               <ul>
+                                                   <li>Le caractère '#' marque une ligne de commentaire et peut également se trouver en cours de ligne auquel cas toute la suite de la ligne est commentée ;</li>
+                                                   <li>Les commentaires ne sont pas autorisés sur les trois premières lignes du fichier qui doivent toujours être l'entête tel que décrit ici.</li>
+                                               </ul>
+                                           </li>",
+                'format'               => 'Barème',
+                'stats(%nbDataLines%)' => 'Le fichier contient %nbDataLines% lignes de données.',
+                'success'              => "L'import du barème s'est effectué avec succès.",
+                'nom'                  => 'Nom du barème : ',
+                'uniteEntree'          => "Unité d'entrée : ",
+                'uniteSortie'          => 'Unité de sortie : ',
+                'commentaire'          => 'Commentaire : ',
+                'newImport'            => 'Nouvel import',
+            ],
+            'baremeTechnique' => [
+                'identite' => 'Identité',
+                'lacune'   => 'Lacune',
+                'manuel'   => 'Manuel',
+            ],
+            'export'          => [
+                'doExport'    => 'Exporter des barèmes',
+                'title'       => 'Export de barèmes',
+                'help'        => 'Veuillez sélectionner le(s) barème(s) à exporter dans la liste ci-dessous.',
+                'noSelection' => 'Veuillez sélectionner au moins un barème',
+            ],
+            'dateBareme' => 'd/m/Y H:i:s',
+        ],
+
+        'delaiPropagation'       => 'Temps de propagation (minutes)',
+        'helpDelaiPropagation'   => "Un temps de propagation positif retarde la chronique (décalage vers l'aval) tandis qu'un temps négatif l'avance (décalage vers l'amont).",
+        'jeu-baremes'            => 'Jeu de barèmes',
+        'jeu-baremes-du(%date%)' => 'Jeu de barèmes du %date%',
+        'saveAndCompute'         => 'Sauvegarder et calculer',
+        'erreur'                 => [
+            'coefficientNonNumerique'        => "Coefficient multiplicateur «\u{a0}%coeff%\u{a0}» non numérique",
+            'delaiNonNumerique'              => "Temps de propagation «\u{a0}%delai%\u{a0}» non numérique",
+            'limitPlaceholderNonNumerique'   => "Valeur de remplacement de limite «\u{a0}%placeholder%\u{a0}» non numérique",
+            'chroniqueFilleIntrouvable'      => 'Chronique calculée non reconnue',
+            'chroniqueMere.principale'       => 'Première chronique mère :',
+            'chroniqueMere.secondaire'       => 'Seconde chronique mère :',
+            'chroniqueMereIntrouvable'       => 'Chronique mère non renseignée ou non reconnue',
+            'aucunBareme'                    => 'aucun barème défini',
+            'baremeIntrouvable'              => 'Ligne %numLigne% : barème non renseigné ou non reconnu',
+            'dateDebutIndefinie'             => "Ligne %numLigne% : date de début d'application du barème indéfinie",
+            'dateFinIndefinie'               => "Ligne %numLigne% : date de fin d'application du barème indéfinie",
+            'finAvantDebut'                  => "Ligne %numLigne% : date de fin d'application du barème (%dateFin%) antérieure ou égale à la date de début (%dateDebut%)",
+            'conflitDebutFinPrecedent'       => "Ligne %numLigne% : date de début d'application du barème (%dateDebut%) différente de la date fin du barème précédent (%dateFin%)",
+            'uniteEntreeBaremeIncorrecte'    => "Ligne %numLigne% : unité d'entrée du barème («\u{a0}%uniteEntreeBareme%\u{a0}») différente de l'unité de la chronique mère («\u{a0}%uniteChroniqueMere%\u{a0}»)",
+            'uniteSortieBaremeIncorrecte'    => "Ligne %numLigne% : unité de sortie du barème («\u{a0}%uniteSortieBareme%\u{a0}») différente de l'unité de la chronique calculée («\u{a0}%uniteChroniqueFille%\u{a0}»)",
+            'unitesSortieBaremesDifferentes' => "Les barèmes présentent des unités de sortie différentes, listées ci-dessous dans l'ordre :",
+            'jeuBaremeIntrouvable'           => 'Jeu de barèmes introuvable',
+        ],
+        'submitted'              => [
+            'submitted'  => "Le calcul de la chronique «\u{a0}<a href='_linkToChronique_'>_chroniqueName_</a>\u{a0}» a été envoyé et devrait prendre quelques instants.",
+            'seeJobPage' => "Vous pouvez vérifier la fin du calcul depuis <a href='_linkToJobPage_'>la page des jobs</a> (job #_jobId_).",
+        ],
+        'confirmComputation'     => 'Si vous soumettez le calcul vous ne pourrez plus modifier le choix des chroniques mères ni les temps de propagation. Voulez-vous continuer ?',
+        'cancelModifications'    => 'Annuler les modifications',
+    ],
+];
+
+/*************************************************
+ * IMPORT OF SHAPE
+ ************************************************/
+
+$shapeImport = [
+    'shape.import'     => [
+        'title'                       => 'Import de données géographiques',
+        'step'                        => [
+            '1' => 'Étape 1 : fichier de données géographiques',
+            '2' => "Étape 2 : validation de l'import",
+            '3' => "Étape 3 : fin de l'import",
+        ],
+        'question'                    => [
+            'importType' => 'Que souhaitez-vous importer ?',
+        ],
+        'action'                      => [
+            'newImport'         => 'Nouvel import',
+            'doNotImport'       => 'Ne rien importer',
+            'doImport'          => 'Importer les nouvelles données',
+            'replace'           => 'Remplacer les données existantes',
+            'keepExisting'      => 'Importer uniquement les nouvelles données',
+            'overwriteExisting' => 'Importer les nouvelles données et remplacer les données existantes',
+        ],
+        'help'                        => [
+            'quitWarning'        => "En cours d'import <b>merci de n'annuler que par le bouton prévu à cet effet</b>.",
+            'file.shape'         => 'Une couche shape contient des données géographiques (au moins les fichiers <strong>shx</strong>, <strong>shp</strong> et <strong>dbf</strong>).',
+            'requiredProjection' => '<b>Toutes les données doivent impérativement être projetées en Lambert93 - EPSG:2154.</b>',
+            'sizeLimit'          => 'Le fichier envoyé ne doit pas dépasser 2 Mo.',
+            'station'            => [
+                'existingWithData'    => 'Station existante avec données géographiques|Stations existantes avec données géographiques',
+                'existingWithoutData' => 'Station existante sans données géographiques|Stations existantes sans données géographiques',
+                'nonExisting'         => 'Station inconnue|Stations inconnues',
+            ],
+            'courseau'           => [
+                'new'       => "Nouveau cours d'eau|Nouveaux cours d'eau",
+                'existing'  => "Cours d'eau existant|Cours d'eau existants",
+                'nom'       => "(selon le nom du cours d'eau)",
+            ],
+            'bassin'             => [
+                'new'         => 'Nouveau bassin|Nouveaux bassins',
+                'existing'    => 'Bassin existant|Bassins existants',
+                'nopeStation' => 'Bassin avec station exutoire inconnue|Bassins avec station exutoire inconnue',
+            ],
+        ],
+        'info'                   => [
+            'title'               => 'Import de données géographiques de type',
+            'wasCanceled'         => "L'import de données géographiques a été annulé.",
+            'noShapeImported'     => "Aucune donnée géographique n'a été importé.",
+            'noPossibleImport'    => 'Aucune donnée ne peut être importée.',
+            'shapeInsert'         => 'Donnée géographique ajoutée|Données géographiques ajoutées',
+            'shapeUpdate'         => 'Donnée géographique mise à jour|Données géographiques mises à jour',
+            'noData'              => 'Aucune donnée géographique présente',
+            'nom'                 => 'Nom',
+            'wontupload'          => '(<u>ces données ne peuvent pas être importées</u>)',
+            'codeStationExutoire' => 'Code de la station exutoire',
+            'codeStation'         => 'Code',
+        ],
+        'fileColumns'                 => '????',
+        'thereAreErrors.cantContinue' => "L'import ne peut se poursuivre car il y a des erreurs.",
+        'format'                      => [
+            'bassin'   => <<<FORMAT
+        <li><b>Un zip portant le même nom que tous les fichiers contenus, sans dossier.</b></li>
+        <li><b>Colonnes attributaires attendues (l'orthographe est importante) - ordre indifférent :</b></li>
+        <ul>
+            <li><b>nom</b>, pour le nom du bassin ;</li>
+            <li><b>code_exu</b>, pour le code de la station exutoire du bassin, peut être vide, le code est une chaîne de caractère</b></li>
+        </ul>
+FORMAT
+            ,
+            'coursEau' => <<<FORMAT
+        <li><b>Un zip portant le même nom que tous les fichiers contenus, sans dossier.</b></li>
+        <li><b>Colonnes attributaires attendues (l'orthographe est importante) - ordre indifférent (sur la base du format Carthage) :</b></li>
+        <ul>
+            <li><b>toponyme</b>, pour le nom du cours d'eau ;</li>
+            <li><b>code_hydro</b>, pour le code hydro du cours d'eau, peut être vide, le code est une chaîne de caractère</b> ;</li>
+            <li><b>classifica</b>, pour l'ordre de Strahler du cours d'eau, peut être vide, le classifica est un nombre.</li>
+        </ul>
+
+FORMAT
+            ,
+            'station'  => <<<FORMAT
+        <li><b>Un zip portant le même nom que tous les fichiers contenus, sans dossier.</b></li>
+        <li><b>Colonne attributaire attendue (l'orthographe est importante) :</b></li>
+        <ul>
+            <li><b>code</b>, pour le code de la station, le code est une chaîne de caractère.</li>
+        </ul>
+FORMAT
+            ,
+        ],
+    ],
+];
+
+/*************************************************
+ * CONVERSION
+ ************************************************/
+
+$conversion = [
+    'conversion' => [
+        'chroniqueMere'                  => 'Chronique mère',
+        'paramConversion'                => 'Seuil de lacune',
+        'paramConversionHelp'            => "Intervalle de temps <b><u>en minutes</u></b> entre deux plages de mesures successives qui, si il est dépassé, donne lieu à l'insertion de lacunes.<br>" .
+            'Les lacunes sont insérées à + et − 1 seconde des plages qui les entourent.',
+        'paramConversionTitle'           => 'Nombre de minutes, 1 minute minimum.',
+        'paramConversionError'           => '1 minute minimum.',
+        'saveAndConvert'                 => 'Sauvegarder et convertir',
+        'cancelModifications'            => 'Annuler les modifications',
+        'confirmConversion'              => 'Si vous soumettez la conversion vous ne pourrez plus modifier la chronique mère. Voulez-vous continuer ?',
+        'noChroniqueMere'                => 'Aucune chronique discontinue avec cette unité sur cette station.',
+        'success(%link%, %chronique%)'   => "La conversion de la chronique «\u{a0}<a href=\"%link%\">%chronique%</a>\u{a0}» a été envoyée et devrait prendre quelques instants.",
+        'seeJobPage(%jobPage%, %jobId%)' => 'Vous pouvez vérifier la fin de la conversion depuis <a href="%jobPage%">la page des jobs</a> (job #%jobId%).',
+        'CSRFerror'                      => 'La validité du formulaire a expiré et a été réinitialisée, veuillez ré-envoyer le formulaire.',
+    ],
+];
+
+/*************************************************
+ * COLORS
+ ************************************************/
+
+$colors = [
+    'colors' => [
+        'titles'=> [
+            'qualite'       => 'Styles des qualités',
+            'discontinuous' => 'Marqueurs pour les plages des chroniques discontinues',
+            'checkpoint'    => 'Points de contrôle',
+        ],
+        'default'=> [
+            'qualite'       => 'Pour la visualisation simple, les valeurs initiales sont : ' .
+                'couleur #FF0000 (rouge) et épaisseur 5 pour les qualités traitées en lacune et ' .
+                'couleur #0000FF (bleu) et épaisseur 1 pour les autres qualités.<br>' .
+                'Pour mémoire : Pour la visualisation multiple, la même couleur, générée automatiquement, est utilisée ' .
+                'pour toute la chronique (avec un effet de transparence pour les qualités traitées en lacune) et les ' .
+                'épaisseurs sont de 5 pour les qualités traitées en lacune et de 1 sinon. ' .
+                'Ces styles ne sont pas modifiables.',
+            'discontinuous' => 'Pour la visualisation simple, les valeurs initiales sont : forme ●, épaisseur 2 et taille 5.<br>' .
+                'Pour mémoire : Pour la visualisation multiple, les valeurs suivantes sont utilisées : ' .
+                'forme ●, épaisseur 2 et taille 5. ' .
+                "Ce style n'est pas modifiable.",
+            'checkpoint'    => 'Pour la visualisation simple, les valeurs initiales sont : ' .
+                'forme ○, épaisseur 2, couleur #008000 (vert) et taille 5.<br>' .
+                'Pour mémoire : Les points de contrôle ne sont pas affichés sur la visualisation multiple.',
+        ],
+        'title'          => 'Styles de visualisation',
+        'longTitle'      => 'Styles pour la visualisation simple',
+        'success(%jeu%)' => "Les couleurs des qualitées du jeu «\u{a0}%jeu%\u{a0}» ont été enregistrées.",
+        'color'          => 'Couleur',
+        'thickness'      => 'Épaisseur des lignes',
+        'gap'            => 'Cette qualité est traitée en lacune.',
+        'shape'          => 'Forme',
+        'stroke'         => 'Épaisseur du trait',
+        'strokeHelp'     => 'Épaisseur du trait des formes non pleines uniquement.',
+        'size'           => 'Taille',
+        'save'           => 'Sauvegarder',
+        'cancel'         => 'Annuler les modifications',
+        'CSRFerror'      => 'La validité du formulaire a expiré et a été réinitialisée, veuillez ré-envoyer le formulaire.',
+    ],
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'data'        => [
+        'management' => 'Gestion des données',
+    ],
+    'button' => [
+      'add' => 'Créer',
+    ],
+    'admin'       => [
+        'sendJson' => [
+            'save'              => 'Sauvegarder',
+            'saveMessage'       => 'Cocher et sauvegarder pour automatiser les envois',
+            'send'              => 'Envoyer votre JSON',
+            'result'            => 'Résultat',
+            'resultMessage'     => 'Votre JSON est validé',
+            'resultMessageFail' => "Votre JSON n'est pas valide !",
+            'schema'            => 'Schéma de validation',
+        ],
+        'measuresImport' => 'Import de mesures',
+        'controleImport' => 'Import et export de points de contrôle',
+        'shapeImport'    => 'Import de données géographiques',
+        'help'           => [
+            'astuce'                              => '<strong style="color:#0e90d2; font-size: 10px">Astuce : Cliquer sur la ligne pour afficher la liste déroulante existante. Taper les premières lettres du mot recherché pour filtrer.</strong>',
+            'from_the_observatory'                => "de l'observatoire",
+
+            'inspireTheme' => [
+                'nom' => "Correspond à la liste des thèmes INSPIRE officielle<strong> en anglais</strong> accessible <a href='https://inspire.ec.europa.eu/theme' target='_blank'>Ici</a> ",
+            ],
+            'topicCategory' => [
+                'nom' => "Correspond à la liste des Catégories de thématiques INSPIRE officielle<strong> en anglais</strong> accessible <a href='https://inspire.ec.europa.eu/metadata-codelist/TopicCategory' target='_blank'>Ici</a> ",
+            ],
+            'theia' => [
+                'theia-message'        => '<strong style="color:red; font-size: 10px">[Champ pour Theia/Ozcar]</strong><br> ',
+                'warning-update-theia' => '<strong>Attention :</strong> Veuillez compléter les nouveaux champs pour Theia/Ozcar',
+                'uriOzcarTheia'        => "Ce champs est la (ou les) variable correspondante sur le Thesaurus de Theia/Ozcar (vous pouvez  taper les lettres du mot recherché) des champs <strong>Milieu</strong> et de la <strong>Famille de Paramètre</strong> BDOH. Lien vers le Skosmos pour définir les variables : <a href='https://in-situ.theia-land.fr/skosmos/theia_ozcar_thesaurus/en/page/variableCategories' target='_blank'>Ici</a>",
+            ],
+            'observatoire'         => [
+                'jeu'                                      => 'Le changement de jeu de codes qualité doit être réservé aux observatoires vides, sans aucune mesure importée.',
+                'warning-observatory-has-sites'            => 'Cet observatoire ne peut pas être supprimé car il contient le site expérimental suivant :|Cet observatoire ne peut pas être supprimé car il contient les sites expérimentaux suivants :',
+                'warning-observatory-has-scales'           => 'Cet observatoire possède le bareme suivant :|Cet observatoire possède les baremes suivants :',
+                'warning-observatory-has-dois'             => 'Cet observatoire possède le DOI suivant :|Cet observatoire possède les DOI suivants :',
+                'warning-observatory-has-basins'           => 'Cet observatoire possède le bassin suivant :|Cet observatoire possède les bassins suivants :',
+                'warning-observatory-has-rivers'           => "Cet observatoire possède le cours d'eau suivant :|Cet observatoire possède les cours d'eau suivants :",
+                'confirm-delete-observatory(%name%)'       => "Etes-vous sûr de vouloir supprimer l'observatoire «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-observatory-info'          => "<strong style=\"color:red\">Les barèmes, bassins, cours d'eau et/ou DOI concernés seront également supprimés.</strong>",
+                'warning-delete-observatory-info-redirect' => "Ceci est l'observatoire courant, si vous le supprimer vous serez redirigé sur la page d'accueil de tous les observatoires.",
+                'titre-info'                               => 'Exemple: «AMMA-CATCH: a hydrological, meteorological and ecological observatory on West Africa»',
+                'email-info'                               => 'Email de contact générique de cet observatoire.',
+                'theiaCode-message'                        => "<strong style=\"color:red; font-size: 10px\">[Champ pour Theia/Ozcar]</strong><br>Correspond aux 4 premières lettres en majuscule de l'Observatoire. <br>Les identifiants font références au modèle de données pivot Theia/Ozcar (Annexe 1 page 15) : <a href='https://theia-ozcar.gricad-pages.univ-grenoble-alpes.fr/doc-producer/_downloads/b57adda313eaf801d6ba4348ab86e8ea/description_champs_JSON_v1.1.pdf' target='_blank'>Ici</a> ",
+                'doi-principal-message'                    => " Theia/Ozcar demande un seul DOI pour ses ressources en ligne. Ajouter ici le DOI principal de l'observatoire. ",
+            ],
+            'dataset' => [
+                'contact'                        => "<strong style=\"color:red; font-size: 10px\">[Champ pour Theia/Ozcar]</strong><br>Theia/Ozcar demande la présence obligatoire d'au moins un Project Leader",
+                'description'                    => 'Le résumé doit décrire la ressource de façon compréhensible par l’utilisateur. Pour un producteur, il s’agit en particulier de définir au mieux l’information ou le phénomène représenté dans la donnée. On va donc y trouver des éléments de définition, mais aussi éventuellement une indication sommaire de la zone couverte ou le cas échéant, des informations sur les particularités de la version du jeu de données.',
+                'genealogy'                      => "Décrit la généalogie d'un jeu de données, i.e. l’historique du jeu de données et, s’il est connu, le cycle de vie de celui-ci, depuis l’acquisition et la saisie de l’information jusqu’à sa compilation avec d’autres jeux et les variantes de sa forme actuelle. Il s’agit d’apporter une description littérale et concise soit de l’histoire du jeu de données, soit des  moyens,  procédures  ou  traitements  informatiques  mis  en  œuvre  au  moment  de l’acquisition dujeu de données.",
+            ],
+            'site'                 => [
+                'warning-site-has-stations' => "Pour supprimer ce site expérimental vous devez d'abord en dissocier la station suivante :|Pour supprimer ce site expérimental vous devez d'abord en dissocier les stations suivantes :",
+            ],
+            'station'              => [
+                'code'                             => 'Les caractères accentués et spéciaux de ce code seront automatiquement remplacés.',
+                'codeAlternatif'                   => "Suite de codes de station séparés par des «\u{a0};\u{a0}» et du type «\u{a0}Format=CODE\u{a0}», utilisés pour des exports de chroniques dans des formats non-BDOH. Exemple : Hydro2 = MON_CODE_HYDRO2",
+                'latlong'                          => 'Lambert93 - EPSG:2154 (mètres)',
+                'warning-station-has-time-series'  => 'Cette station ne peut pas être supprimée car elle contient la chronique suivante :|Cette station ne peut pas être supprimée car elle contient les chroniques suivantes :',
+                'warning-station-has-basins'       => 'Cette station est utilisée par le bassin suivant en tant que station exutoire :|Cette station est utilisée par les bassins suivants en tant que station exutoire :',
+                'town-name-is-case-sensitive'      => '<u>Attention : le filtre de recherche est sensible à la casse, les communes ont toutes des majuscules à leur nom et les communes avec des noms composés ont des tirets et non des espaces ' .
+                    '(ex. : Saint-Germain-sur-l\'Arbresle, Sainte-Foy-lès-Lyon, etc.), dans le doute faites une recherche sur une partie du nom qui ne peut pas avoir de majuscule ni de tiret ou faites une recherche sur le code postal.</u>',
+                'confirm-delete-station(%name%)'   => "Etes-vous sûr de vouloir supprimer la station «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-station-info'      => 'Les bassins concernés ne seront pas supprimés, ils perdront simplement leur station exutoire.',
+            ],
+            'chronique'            => [
+                'code'                                   => 'Les caractères accentués et spéciaux de ce code seront automatiquement remplacés.',
+                'libelle'                                => 'Un texte court décrivant la chronique de manière unique, spécifique...',
+                'estVisible'                             => 'La chronique est-elle visible au public, oui ou non ?',
+                'warning-has-calculated-time-series'     => 'Cette chronique ne peut pas être supprimée car elle est utilisée pour le calcul de la chronique suivante :|Cette chronique ne peut pas être supprimée car elle est utilisée pour le calcul des chroniques suivantes :',
+                'warning-has-converted-time-series'      => 'Cette chronique ne peut pas être supprimée car elle est utilisée pour la conversion de la chronique suivante :|Cette chronique ne peut pas être supprimée car elle est utilisée pour la conversion des chroniques suivantes :',
+                'warning-no-export-options-were-defined' => "<strong>Attention :</strong> les options d'export à pas de temps fixe n'ont pas encore été définies pour cette chronique. Des valeurs par défaut ont été automatiquement assignées. Merci de les vérifier/éditer puis d'enregistrer les modifications.",
+                'contains-n-mesures(%nb%)'               => 'Cette chronique contient une mesure.|Cette chronique contient %nb% mesures.',
+                'contains-n-plages(%nb%)'                => 'Cette chronique contient une plage de mesure.|Cette chronique contient %nb% plages de mesure.',
+                'contains-n-controles(%nb%)'             => 'Cette chronique contient un point de controle.|Cette chronique contient %nb% points de controle.',
+                'confirm-delete-time-series(%name%)'     => "Etes-vous sûr de vouloir supprimer la chronique «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-time-series-info'        => '<u>Les mesures, plages de mesures et/ou points de contrôle de cette chronique seront également supprimés.</u>',
+                'update-unite-cumul'                     => "Si vous autorisez l'export de cumuls pour cette chronique pensez à vérifier ou mettre à jour l'unité des cumuls ci-dessous.",
+                'warning-no-milieu-defined'              => "<strong>Attention :</strong> Cette chronique n'a pas de milieu (la premier milieu est sélectionné par défaut). Vous devez sélectionner un milieu pour cette chronique et enregistrer la modification.",
+            ],
+            'commune'              => [
+                'warning-commune-has-stations'   => 'Cette commune est utilisée par la station suivante :|Cette commune est utilisée par les stations suivantes :',
+                'confirm-delete-commune(%name%)' => "Etes-vous sûr de vouloir supprimer la commune «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-commune-info'    => 'Les stations concernées ne seront pas supprimées, elles perdront simplement leur commune.',
+            ],
+            'doi'                  => [
+                'identifiant' => "Exemple d'identifiant : 10.17180/MON.OBSERVATOIRE",
+                'description' => 'Détails sur les données telles que : auteurs, année, titre et établissement (INRAE habituellement), le DOI est rajouté automatiquement au descriptif.',
+            ],
+            'partenaire'           => [
+                'warning-partenaire-has-time-series'   => 'Ce partenaire ne peut pas être supprimé car il est utilisé par la chronique suivante en tant que producteur :|Ce partenaire ne peut pas être supprimé car il est utilisé par les chroniques suivantes en tant que producteur :',
+                'warning-partenaire-has-observatories' => "Ce partenaire ne peut pas être supprimé car il est utilisé par l'observatoire suivant :|Ce partenaire ne peut pas être supprimé car il est utilisé par les observatoires suivants :",
+                'partenaire-has-time-series'           => 'Ce partenaire est utilisé par la chronique suivante en tant que producteur :|Ce partenaire est utilisé par les chroniques suivantes en tant que producteur :',
+                'partenaire-has-observatories'         => "Ce partenaire est utilisé par l'observatoire suivant :|Ce partenaire est utilisé par les observatoires suivants :",
+                'confirm-delete-partenaire(%name%)'    => "Etes-vous sûr de vouloir supprimer le partenaire «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-partenaire-info'       => 'Les chroniques et/ou observatoires concernés ne seront pas supprimés, ils perdront simplement leur partenaire ou producteur.',
+                'help-scanR'                           => 'Identifiant ScanR (ID) sur le site <a href="https://scanr.enseignementsup-recherche.gouv.fr/" target="_blank">https://scanr.enseignementsup-recherche.gouv.fr/</a> Ex : Unité PIAF, ID: 200017466P</strong>',
+                'help-boolean'                         => '<strong style="color:red; font-size: 10px">[Champ pour Theia/Ozcar]</strong> <br/>NB : Theia/Ozcar nécessite au moins un financeur par Observatoire',
+            ],
+            'familleParametres'    => [
+                'warning-familleParametres-has-children' => 'Cette famille de paramètres ne peut pas être supprimée car elle est utilisée par la famille suivante (en tant que famille mère) :|Cette famille de paramètres ne peut pas être supprimée car elle est utilisée par les familles suivantes (en tant que famille mère) :',
+                'warning-familleParametres-has-types'    => 'Cette famille de paramètres ne peut pas être supprimée car elle est utilisée par le type de paramètre suivante :|Cette famille de paramètres ne peut pas être supprimée car elle est utilisée par les types de paramètres suivants :',
+                'help-prefix'                            => "Le préfixe est utilisé pour ordonner les familles de même niveau (par exemple : 001, 002, 003, ...), il n'est pas affiché.",
+                'help-familleParente'                    => 'Les familles filles et descendantes ne sont pas présentes dans cette liste de sélection. Vous pouvez aussi supprimer la famille mère en utilisant la petite croix à droite.',
+            ],
+            'typeParametre'        => [
+                'warning-typeParametre-has-time-series' => 'Ce type de paramètre ne peut pas être supprimé car il est utilisé par la chronique suivante :|Ce type de paramètre ne peut pas être supprimé car il est utilisé par les chroniques suivantes :',
+                'warning-no-family-defined'             => "<strong>Attention :</strong> Ce type de paramètre n'a pas de famille de paramètres (la première famille est sélectionnée par défaut). Vous devez sélectionner une famille de paramètres pour ce type et enregistrer la modification.",
+            ],
+            'unite'                => [
+                'warning-unit-has-time-series'     => 'Cette unité ne peut pas être supprimée car elle est utilisée par la chronique suivante :|Cette unité ne peut pas être supprimée car elle est utilisée par les chroniques suivantes :',
+                'warning-unit-has-scales'          => 'Cette unité ne peut pas être supprimée car elle est utilisée par le barème suivant :|Cette unité ne peut pas être supprimée car elle est utilisée par les barèmes suivants :',
+                'warning-unit-has-parameter-types' => 'Cette unité est utilisée par le type de paramètre suivant :|Cette unité est utilisée par les types de paramètre suivants :',
+                'confirm-delete-unit(%name%)'      => "Etes-vous sûr de vouloir supprimer l'unité «\u{a0}%name%\u{a0}» ?",
+                'confirm-delete-unit-info'         => 'Les types de paramètre concernés ne seront pas supprimés, ils perdront simplement cette unité.',
+            ],
+        ],
+    ],
+    'utilisateur' => [
+        'newAccountMail' => [
+            'body'   => "Bonjour,
+
+Un compte vient d'être créé pour vous sur BDOH.
+
+Votre identifiant est l'adresse e-mail à laquelle vous recevez ce message et le mot de passe est «\u{a0}password\u{a0}», nous vous invitons à le changer dès votre première connexion.
+
+Vous pouvez dès à présent préciser vos besoins d'accès aux données depuis le lien suivant : ",
+            'footer' => 'Cet e-mail est généré automatiquement, merci de ne pas y répondre.',
+            'title'  => 'Compte ouvert sur BDOH',
+        ],
+    ],
+    'export'      => [
+        'exportMail' => [
+            'body'               => 'Veuillez trouver en pièce jointe votre export de chronique.',
+            'footer'             => 'Cet e-mail est généré automatiquement, merci de ne pas y répondre.',
+            'title(%chronique%)' => "BDOH : Export de la chronique %chronique%|Export des chroniques «\u{a0}%chronique%\u{a0}»",
+        ],
+    ],
+    'backToBdoh'             => 'Retourner sur BDOH',
+    'forAllTheObservatories' => 'Pour tous les observatoires',
+    'title_edit_defined'     => "%entity% «\u{a0}%name%\u{a0}»",
+    'title_create_undefined' => '%entity%',
+    'title_delete_defined'   => "%entity% «\u{a0}%name%\u{a0}»",
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entitiesActions, $fieldSets, $fileFormats, $measureImport, $various, $controleImport, $transformation, $shapeImport, $conversion, $colors);
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/action.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/action.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f88185dfcf1ebd0d2ea0d6e5fdd3757e11ad41fd
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/action.html.twig
@@ -0,0 +1,63 @@
+{%- set template = (action != 'create') ? action : 'edit' %}
+{%- extends 'SonataAdminBundle:CRUD:'~template~'.html.twig' %}
+
+{%- if form is defined %}
+    {%- form_theme form 'IrsteaBdohAdminBundle:Form:widgets.html.twig' %}
+{%- elseif delete_form is defined %}
+    {%- form_theme delete_form 'IrsteaBdohAdminBundle:Form:widgets.html.twig' %}
+{%- endif %}
+
+{# titre dans la barre de titre #}
+{% block navbar_title %}
+    BDOH Admin - <b>{{ currentObservatoire() }}</b>
+    {% if currentObservatoire().theiaCode == true %} <strong style="color: orange">(Contraintes Theia/Ozcar)</strong>
+    {% endif %}
+
+    {% if action is defined %}
+        -
+        {% for menu in breadcrumbs_builder.breadcrumbs(admin, action) %}
+            {% if loop.last %}
+                {%- set translation_domain = menu.extra('translation_domain', 'messages') -%}
+                {%- set label = menu.label -%}
+                {%- if translation_domain is not same as(false) -%}
+                    {%- set label = label|trans(menu.extra('translation_params', {}), translation_domain) -%}
+                {%- endif -%}
+                {% if action == 'edit' %}
+                    {% set entity_edition = admin.classnameLabel~'_edit_defined' %}
+                    {{ "title_edit_defined"|trans({'%entity%': entity_edition|trans, '%name%': label}) }}
+                {% elseif action == 'create' %}
+                    {% set entity_creation = admin.classnameLabel~'_create_undefined' %}
+                    {{ "title_create_undefined"|trans({'%entity%': entity_creation|trans}) }}
+                {% elseif action == 'delete' %}
+                    {% set entity_deletion = admin.classnameLabel~'_delete_defined' %}
+                    {{ "title_delete_defined"|trans({'%entity%': entity_deletion|trans, '%name%': admin.tostring(object)}) }}
+                {% else %}
+                    {{ label }}
+                {% endif %}
+            {% endif %}
+        {% endfor %}
+    {% else %}
+        {% if _title is not empty %}
+            -
+            {{ _title|striptags|raw }}
+        {% endif %}
+    {% endif %}
+{% endblock %}
+
+{# in order to have the title bar even when there is no action nor filter button #}
+{% block tab_menu %}&nbsp;{% endblock %}
+
+{% block javascripts %}
+    {% if app.debug %}
+        <script src="http://{{ app.request.host }}:35729/livereload.js"></script>
+    {% endif %}
+    {{ block('sonata_javascript_config') }}
+    {{ block('sonata_javascript_pool') }}
+    {% set locale = app.request.locale[:2] %}
+    <script src="{{ asset('assets/locales/'~locale~'.js') }}"></script>
+    {% if locale != 'en' %}
+        <script src="{{ asset('bundles/sonatacore/vendor/select2/select2_locale_'~locale~'.js') }}"></script>
+    {% endif %}
+{% endblock %}
+
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-chronique.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-chronique.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b35d12e5526a8e1512e3b152dcaf9f047edece39
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-chronique.html.twig
@@ -0,0 +1,56 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation pour préciser le nombre de mesure ou de plages et/ou de points de contrôle
+qui seront supprimées avec la chronique #}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if (object and object.nbMesures > 0) or (admin.checkpoints and admin.checkpoints|length) %}
+                    {% if object and object.nbMesures > 0 %}
+                        {% if object.dtype == 'discontinue' %}
+                            <p style="margin-bottom:5px;">
+                                <b>{{ 'admin.help.chronique.contains-n-plages(%nb%)'|transchoice(object.nbMesures, {'%nb%':object.nbMesures}) }}</b>
+                            </p>
+                        {% else %}
+                            <p style="margin-bottom:5px;">
+                                <b>{{ 'admin.help.chronique.contains-n-mesures(%nb%)'|transchoice(object.nbMesures, {'%nb%':object.nbMesures}) }}</b>
+                            </p>
+                        {% endif %}
+                    {% endif %}
+                    {% if admin.checkpoints and admin.checkpoints|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.chronique.contains-n-controles(%nb%)'|transchoice(admin.checkpoints|length, {'%nb%':admin.checkpoints|length}) }}</b>
+                        </p>
+                    {% endif %}
+                    <p style="margin-top:20px;">
+                        {{ 'admin.help.chronique.confirm-delete-time-series(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.chronique.confirm-delete-time-series-info'|trans|raw }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-commune.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-commune.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7120c58d1ae55c4231ed1041c57f34c921a9b97d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-commune.html.twig
@@ -0,0 +1,61 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation de la suppression de la commune pour préciser les stations qui utilisent cette commune #}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if admin.stations and admin.stations|length %}
+                    <p style="margin-bottom:5px;">
+                        <b>{{ 'admin.help.commune.warning-commune-has-stations'|transchoice(admin.stations|length) }}</b>
+                    </p>
+                    <ul style="margin-bottom:0;">
+                        {% for s in admin.stations %}
+                            <li>
+                                {% if is_granted('EDIT', s) and s.observatoire == currentObservatoire() %}
+                                    <a href="{{ path('bdoh_admin_station_edit', {id:s.id}) }}">
+                                        {{ s.nom }} ({{ s.code }})
+                                    </a>
+                                {% else %}
+                                    {{ s.nom }} ({{ s.code }})
+                                {% endif %}
+                                ({{ 'admin.help.from_the_observatory'|trans }}
+                                {% if is_granted('EDIT', s.observatoire) %}
+                                    <a href="{{ path('bdoh_admin_observatoire_edit', {id:s.observatoire.id}) }}">{{ s.observatoire }}</a>)
+                                {% else %}
+                                    {{ s.observatoire }})
+                                {% endif %}
+                            </li>
+                        {% endfor %}
+                    </ul>
+                    <p style="margin-top:20px;">
+                        {{ 'admin.help.commune.confirm-delete-commune(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.commune.confirm-delete-commune-info'|trans }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-observatoire.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-observatoire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8a5542f403a2f15e6e3162dd50466bce18d859f9
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-observatoire.html.twig
@@ -0,0 +1,111 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation de la suppression de l'observatoire pour préciser le nombre de barèmes,
+de bassins et de DOI qui seront supprimées avec l'observatoire #}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if admin.isCurrentObs %}
+                    <p style="margin-top:0;margin-bottom:20px;">
+                        <b>{{ 'admin.help.observatoire.warning-delete-observatory-info-redirect'|trans }}</b>
+                    </p>
+                {% endif %}
+                {% if (admin.scales and admin.scales|length) or (admin.basins and admin.basins|length) or (admin.rivers and admin.rivers|length) or (admin.dois and admin.dois|length) %}
+                    {% if admin.scales and admin.scales|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.observatoire.warning-observatory-has-scales'|transchoice(admin.scales|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for s in admin.scales %}
+                                <li>
+                                    {% if is_granted('EDIT', s) and s.observatoire == currentObservatoire() %}
+                                        <a href="{{ path('bdoh_admin_bareme_edit', {id:s.id}) }}">
+                                            {{ s }} [{{ s.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                                        </a>
+                                    {% else %}
+                                        {{ s }} [{{ s.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    {% if admin.basins and admin.basins|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.observatoire.warning-observatory-has-basins'|transchoice(admin.basins|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for b in admin.basins %}
+                                <li>
+                                    {% if is_granted('EDIT', b) and b.observatoire == currentObservatoire() %}
+                                        <a href="{{ path('bdoh_admin_bassin_edit', {id:b.id}) }}">{{ b }}</a>
+                                    {% else %}
+                                        {{ b }}
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    {% if admin.rivers and admin.rivers|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.observatoire.warning-observatory-has-rivers'|transchoice(admin.rivers|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for r in admin.rivers %}
+                                <li>
+                                    {% if is_granted('EDIT', r) and r.observatoire == currentObservatoire() %}
+                                        <a href="{{ path('bdoh_admin_courseau_edit', {id:r.id}) }}">{{ r }}</a>
+                                    {% else %}
+                                        {{ r }}
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    {% if admin.dois and admin.dois|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.observatoire.warning-observatory-has-dois'|transchoice(admin.dois|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for d in admin.dois %}
+                                <li>
+                                    {% if is_granted('EDIT', d) and d.observatoire == currentObservatoire() %}
+                                        <a href="{{ path('bdoh_admin_doi_edit', {id:d.id}) }}">{{ d }}</a>
+                                    {% else %}
+                                        {{ d }}
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    <p style="margin-top:0;">
+                        {{ 'admin.help.observatoire.confirm-delete-observatory(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.observatoire.confirm-delete-observatory-info'|trans|raw }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-partenaire.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-partenaire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3478d8795da5b516313567d583080a04d85de627
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-partenaire.html.twig
@@ -0,0 +1,86 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation de la suppression du partenaire pour préciser les chroniques et les
+observatoires qui utilisent ce partenaire #}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if (admin.timeSeries and admin.timeSeries|length) or (admin.observatories and admin.observatories|length) %}
+                    {% if admin.timeSeries and admin.timeSeries|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.partenaire.partenaire-has-time-series'|transchoice(admin.timeSeries|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for t in admin.timeSeries %}
+                                <li>
+                                    {% if is_granted('EDIT', t) and t.observatoire == currentObservatoire() %}
+                                        {%  if t.dtype == 'continue' %}
+                                            <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                        {% elseif t.dtype == 'discontinue' %}
+                                            <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                        {% elseif t.dtype == 'convertie' %}
+                                            <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':t.id}) }}">{{ t }}</a>
+                                        {% else %}
+                                            <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':t.id}) }}">{{ t }}</a>
+                                        {% endif %}
+                                    {% else %}
+                                        {{ t }}
+                                    {% endif %}
+                                    ({{ 'admin.help.from_the_observatory'|trans }}
+                                    {% if is_granted('EDIT', t.observatoire) %}
+                                        <a href="{{ path('bdoh_admin_observatoire_edit', {id:t.observatoire.id}) }}">{{ t.observatoire }}</a>)
+                                    {% else %}
+                                        {{ t.observatoire }})
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    {% if admin.observatories and admin.observatories|length %}
+                        <p style="margin-bottom:5px;">
+                            <b>{{ 'admin.help.partenaire.partenaire-has-observatories'|transchoice(admin.observatories|length) }}</b>
+                        </p>
+                        <ul style="margin-bottom:20px;">
+                            {% for o in admin.observatories %}
+                                <li>
+                                    {% if is_granted('EDIT', o) %}
+                                        <a href="{{ path('bdoh_admin_observatoire_edit', {'id':o.id}) }}">{{ o }}</a>
+                                    {% else %}
+                                        {{ o }}
+                                    {% endif %}
+                                </li>
+                            {% endfor %}
+                        </ul>
+                    {% endif %}
+                    <p style="margin-top:0;">
+                        {{ 'admin.help.partenaire.confirm-delete-partenaire(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.partenaire.confirm-delete-partenaire-info'|trans|raw }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-station.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-station.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e04ac59f3a0384d3917166370b307c3d8bf0bb40
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-station.html.twig
@@ -0,0 +1,53 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation de la suppression de la station pour préciser les bassins qui utilisent cette station en tant que station exutoire #}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if admin.basins and admin.basins|length %}
+                    <p style="margin-bottom:5px;">
+                        <b>{{ 'admin.help.station.warning-station-has-basins'|transchoice(admin.basins|length) }}</b>
+                    </p>
+                    <ul style="margin-bottom:20px;">
+                        {% for b in admin.basins %}
+                            <li>
+                                {% if is_granted('EDIT', b) and b.observatoire == currentObservatoire() %}
+                                    <a href="{{ path('bdoh_admin_bassin_edit', {id:b.id}) }}">{{ b }}</a>
+                                {% else %}
+                                    {{ b }}
+                                {% endif %}
+                            </li>
+                        {% endfor %}
+                    </ul>
+                    <p style="margin-top:0;">
+                        {{ 'admin.help.station.confirm-delete-station(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.station.confirm-delete-station-info'|trans }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-unite.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-unite.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..925f218267e08f512d249c44d656ac7b95b4ff12
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete-unite.html.twig
@@ -0,0 +1,56 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:delete.html.twig' %}
+
+{# redefinition du contenu de confirmation de la suppression de l'unité pour préciser les types de paramètre qui utilisent cette unité #}
+{% from '::macros.html.twig' import i18nEntityLabel %}
+{% block content %}
+    <div class="sonata-ba-delete">
+        <div class="box box-danger">
+            <div class="box-header">
+                <h3 class="box-title">{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h3>
+            </div>
+            <div class="box-body">
+                {% if admin.parameterTypes and admin.parameterTypes|length %}
+                    <p style="margin-bottom:5px;">
+                        <b>{{ 'admin.help.unite.warning-unit-has-parameter-types'|transchoice(admin.parameterTypes|length) }}</b>
+                    </p>
+                    <ul style="margin-bottom:0;">
+                        {% for p in admin.parameterTypes %}
+                            <li>
+                                {% if is_granted('EDIT', p) %}
+                                    <a href="{{ path('bdoh_admin_typeparametre_edit', {id:p.id}) }}">
+                                        {{ i18nEntityLabel(p, 'nom') }}
+                                    </a>
+                                {% else %}
+                                    {{ i18nEntityLabel(p, 'nom') }}
+                                {% endif %}
+                            </li>
+                        {% endfor %}
+                    </ul>
+                    <p style="margin-top:20px;">
+                        {{ 'admin.help.unite.confirm-delete-unit(%name%)'|trans({'%name%':admin.toString(object)}) }}<br>
+                        <small>({{ 'admin.help.unite.confirm-delete-unit-info'|trans }})</small>
+                    </p>
+                {% else %}
+                    {{ 'message_delete_confirmation'|trans({'%object%':admin.toString(object)}, 'SonataAdminBundle') }}
+                {% endif %}
+            </div>
+            <div class="box-footer clearfix">
+                <form method="POST" action="{{ admin.generateObjectUrl('delete', object) }}">
+                    <input type="hidden" name="_method" value="DELETE">
+                    <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
+
+                    <button type="submit" class="btn btn-danger">
+                        <i class="fa fa-trash" aria-hidden="true"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
+                    </button>
+                    {% if admin.hasRoute('edit') and admin.hasAccess('edit', object) %}
+                        {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
+
+                        <a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                            {{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
+                    {% endif %}
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6c7a4f4a0cf830302aa5a8fdd1c00d85f28bafda
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/delete.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:action.html.twig' %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique-continue.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique-continue.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..634f5e76faedf7cd86c90de67af5f6fba474c2e2
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique-continue.html.twig
@@ -0,0 +1,20 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit-chronique.html.twig' %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/crud/edit-chronique-continue.js') }}"
+        {%- autoescape 'html_attr' %}
+        data-oriented-samplings="{{ admin.orientedSamplings | json_encode }}"
+        data-cumulative-samplings="{{ admin.cumulativeSamplings | json_encode }}"
+        data-sampling-orders="{{ admin.samplingOrders | json_encode }}"
+        data-output-time-steps="{{ admin.outputTimeSteps | json_encode }}"
+        {%- endautoescape %}>
+    </script>
+{% endblock %}
+
+{% block sonata_admin_content %}
+    {% if admin.getHadToSetDefaultExportOptions(true) %}
+        <div class="form-actions alert alert-warning">{{ 'admin.help.chronique.warning-no-export-options-were-defined'|trans|raw }}</div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..08f7727ca0914884e6a26997bc011ab32c284ff1
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-chronique.html.twig
@@ -0,0 +1,62 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/crud/edit-chronique.js') }}"
+            data-code-generator-path="{{ path('bdoh_admin_generate_chronique_code') | e('html_attr') }}">
+    </script>
+{% endblock %}
+
+{# bouton vers la consultation de la chronique #}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% block navbar_title %}
+    {{ parent() }}
+    {% if admin and admin.subject and admin.subject.code %}
+        <span class="toolbox-btns">
+            {{ macros.chronique_view(admin.subject) }}
+        </span>
+    {% endif %}
+{% endblock %}
+
+{# message pour expliquer l'interdiction de supprimer la chronique -> liste des chroniques filles #}
+{% block formactions %}
+    {% if admin.childrenTimeSeries and admin.childrenTimeSeries|length %}
+        <div class="well well-small form-actions">
+            <p style="margin-bottom:5px;">
+                {% if admin.subject.isDiscontinue() %}
+                    <b>{{ 'admin.help.chronique.warning-has-converted-time-series'|transchoice(admin.childrenTimeSeries|length) }}</b>
+                {% else %}
+                    <b>{{ 'admin.help.chronique.warning-has-calculated-time-series'|transchoice(admin.childrenTimeSeries|length) }}</b>
+                {% endif %}
+            </p>
+            <ul style="margin-bottom:0;">
+                {% for c in admin.childrenTimeSeries %}
+                    <li>
+                        {% if is_granted('EDIT', c) and c.observatoire == currentObservatoire() %}
+                            {%  if c.dtype == 'continue' %}
+                                <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':c.id}) }}">{{ c }}</a>
+                            {% elseif c.dtype == 'discontinue' %}
+                                <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':c.id}) }}">{{ c }}</a>
+                            {% elseif c.dtype == 'convertie' %}
+                                <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':c.id}) }}">{{ c }}</a>
+                            {% else %}
+                                <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':c.id}) }}">{{ c }}</a>
+                            {% endif %}
+                        {% else %}
+                            {{ c }}
+                        {% endif %}
+                    </li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
+
+{# message warning pour signaler que cette chronique n'a pas de milieu #}
+{% block sonata_admin_content %}
+    {% if admin.getMustDefineMilieu() %}
+        <div class="form-actions alert alert-warning">{{ 'admin.help.chronique.warning-no-milieu-defined'|trans|raw }}</div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-dataset.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-dataset.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ed787bf41df18ec4917d0e8e003395a68bc1a0e2
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-dataset.html.twig
@@ -0,0 +1,21 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# bouton vers la consultation du jeu de données #}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% block navbar_title %}
+    {{ parent() }}
+    {% if admin and admin.subject and admin.subject.uuid and admin.subject.titre is not null %}
+        <span class="toolbox-btns">
+            {{ macros.dataset_view(admin.subject) }}
+        </span>
+    {% endif %}
+{% endblock %}
+
+
+
+
+
+
+
+
+
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-famille-parametres.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-famille-parametres.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..952cb80bb780a9adaa0b89e02e3fd3ca4fd56859
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-famille-parametres.html.twig
@@ -0,0 +1,58 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{% from '::macros.html.twig' import i18nEntityLabel %}
+
+{# ajout du javascrip pour le rendu hierarchique du select des familles #}
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/crud/familles-types.js') }}"></script>
+{% endblock %}
+
+{# ajout du css pour le rendu hierarchique du select des familles #}
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/crud/familles-types.css') }}">
+{% endblock %}
+
+{# message pour expliquer l'interdiction de supprimer la famille de paramètres -> liste des familles et des types qui l'utilisent #}
+{% block formactions %}
+    {% set margin_top = '' %}
+    {% if (admin.childrenFamilies and admin.childrenFamilies|length) or (admin.parameterTypes and admin.parameterTypes|length) %}
+        <div class="well well-small form-actions">
+            {% if admin.childrenFamilies and admin.childrenFamilies|length %}
+                <p style="margin-bottom:5px;">
+                    <b>{{ 'admin.help.familleParametres.warning-familleParametres-has-children'|transchoice(admin.childrenFamilies|length) }}</b>
+                </p>
+                <ul style="margin-bottom:0;">
+                    {% for f in admin.childrenFamilies %}
+                        <li>
+                            {% if is_granted('EDIT', f) %}
+                                <a href="{{ path('bdoh_admin_familleparametres_edit', {'id':f.id}) }}">{{ i18nEntityLabel(f, 'nom', '') }}</a>
+                            {% else %}
+                                {{ i18nEntityLabel(f, 'nom', '') }}
+                            {% endif %}
+                        </li>
+                    {% endfor %}
+                </ul>
+                {% set margin_top = 'margin-top:10px;' %}
+            {% endif %}
+            {% if admin.parameterTypes and admin.parameterTypes|length %}
+                <p style="margin-bottom:5px;{{ margin_top }}">
+                    <b>{{ 'admin.help.familleParametres.warning-familleParametres-has-types'|transchoice(admin.parameterTypes|length) }}</b>
+                </p>
+                <ul style="margin-bottom:0;">
+                    {% for t in admin.parameterTypes %}
+                        <li>
+                            {% if is_granted('EDIT', t) %}
+                                <a href="{{ path('bdoh_admin_typeparametre_edit', {'id':t.id}) }}">{{ i18nEntityLabel(t, 'nom', '') }}</a>
+                            {% else %}
+                                {{ i18nEntityLabel(t, 'nom', '') }}
+                            {% endif %}
+                        </li>
+                    {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-observatoire.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-observatoire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6a235f0073876bc530fc06add3296bef73012f8a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-observatoire.html.twig
@@ -0,0 +1,41 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# bouton vers la consultation de l'observatoire #}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% block navbar_title %}
+    {{ parent() }}
+    {% if admin and admin.subject and admin.subject.slug %}
+        <span class="toolbox-btns">
+            {{ macros.view(path('bdoh_consult_observatoire', {'_observatoire' : admin.subject.slug}), 'viewObservatoire'|trans) }}
+        </span>
+
+    {% if admin.subject.theiaCode == true and admin.subject.theiaPassword == true and is_granted('ROLE_ADMIN') %}
+        <button type="button" class="btn btn-success">
+            <a href="{{ path('bdoh_admin_observatoire_edit_jsonValidator', {'id' :app.request.attributes.get('_route_params')['id']}) }}" style="color: mintcream">
+                <strong>{{ 'validateurJSON'|trans }}</strong></a></button>
+    {% endif %}
+    {% endif %}
+{% endblock %}
+
+{# message pour expliquer l'interdiction de supprimer l'observatoire -> liste des sites #}
+{% block formactions %}
+    {% if admin.sites and admin.sites|length %}
+        <div class="well well-small form-actions">
+            <p style="margin-bottom:5px;">
+                <b>{{ 'admin.help.observatoire.warning-observatory-has-sites'|transchoice(admin.sites|length) }}</b>
+            </p>
+            <ul style="margin-bottom:0;">
+                {% for s in admin.sites %}
+                    <li>
+                        {% if is_granted('EDIT', s) and s.observatoire == currentObservatoire() %}
+                            <a href="{{ path('bdoh_admin_siteexperimental_edit', {id:s.id}) }}">{{ s }}</a>
+                        {% else %}
+                            {{ s }}
+                        {% endif %}
+                    </li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-partenaire.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-partenaire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7535330b2db90e33993598be3d84d4083cd8d3ba
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-partenaire.html.twig
@@ -0,0 +1,72 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/crud/edit-partenaire.js') }}"
+        {%- autoescape 'html_attr' %}
+        data-is-funding="{{ admin.fundings | json_encode }}"
+        {%- endautoescape %}>
+    </script>
+{% endblock %}
+
+
+{# message pour expliquer l'interdiction de supprimer le partenaire si pas gestionnaire de tous les observatoires
+-> liste des chroniques et des observatoires qui utilisent ce partenaire #}
+{% block formactions %}
+    {% set margin_top = '' %}
+    {% if not app.user.isGestionnaireDesObservatoires() %}
+        {% if (admin.timeSeries and admin.timeSeries|length) or (admin.observatories and admin.observatories|length) %}
+            <div class="well well-small form-actions">
+                {% if admin.timeSeries and admin.timeSeries|length %}
+                    <p style="margin-bottom:5px;">
+                        <b>{{ 'admin.help.partenaire.warning-partenaire-has-time-series'|transchoice(admin.timeSeries|length) }}</b>
+                    </p>
+                    <ul style="margin-bottom:0;">
+                        {% for t in admin.timeSeries %}
+                            <li>
+                                {% if is_granted('EDIT', t) and t.observatoire == currentObservatoire() %}
+                                    {%  if t.dtype == 'continue' %}
+                                        <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                    {% elseif t.dtype == 'discontinue' %}
+                                        <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                    {% elseif t.dtype == 'convertie' %}
+                                        <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':t.id}) }}">{{ t }}</a>
+                                    {% else %}
+                                        <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':t.id}) }}">{{ t }}</a>
+                                    {% endif %}
+                                {% else %}
+                                    {{ t }}
+                                {% endif %}
+                                ({{ 'admin.help.from_the_observatory'|trans }}
+                                {% if is_granted('EDIT', t.observatoire) %}
+                                    <a href="{{ path('bdoh_admin_observatoire_edit', {id:t.observatoire.id}) }}">{{ t.observatoire }}</a>)
+                                {% else %}
+                                    {{ t.observatoire }})
+                                {% endif %}
+                            </li>
+                        {% endfor %}
+                    </ul>
+                    {% set margin_top = 'margin-top:10px;' %}
+                {% endif %}
+                {% if admin.observatories and admin.observatories|length %}
+                    <p style="margin-bottom:5px;{{ margin_top }}">
+                        <b>{{ 'admin.help.partenaire.warning-partenaire-has-observatories'|transchoice(admin.observatories|length) }}</b>
+                    </p>
+                    <ul style="margin-bottom:0;">
+                        {% for o in admin.observatories %}
+                            <li>
+                                {% if is_granted('EDIT', o) %}
+                                    <a href="{{ path('bdoh_admin_observatoire_edit', {'id':o.id}) }}">{{ o }}</a>
+                                {% else %}
+                                    {{ o }}
+                                {% endif %}
+                            </li>
+                        {% endfor %}
+                    </ul>
+                {% endif %}
+            </div>
+        {% endif %}
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-site.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-site.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ea7eeb1117272f157f573d5ea0f5907fa24da37c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-site.html.twig
@@ -0,0 +1,26 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# message pour expliquer l'interdiction de supprimer le site -> liste des stations #}
+{% block formactions %}
+    {% if admin.stations and admin.stations|length %}
+        <div class="well well-small form-actions">
+            <p style="margin-bottom:5px;">
+                <b>{{ 'admin.help.site.warning-site-has-stations'|transchoice(admin.stations|length) }}</b>
+            </p>
+            <ul style="margin-bottom:0;">
+                {% for s in admin.stations %}
+                    <li>
+                        {% if is_granted('EDIT', s) and s.observatoire == currentObservatoire() %}
+                            <a href="{{ path('bdoh_admin_station_edit', {id:s.id}) }}">
+                                {{ s.nom }} ({{ s.code }})
+                            </a>
+                        {% else %}
+                            {{ s.nom }} ({{ s.code }})
+                        {% endif %}
+                    </li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-station.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-station.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8dca8a83139b59d5cd4786360d01e3f39e227cfe
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-station.html.twig
@@ -0,0 +1,43 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# bouton vers la consultation de la station #}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% block navbar_title %}
+    {{ parent() }}
+    {% if admin and admin.subject and admin.subject.code %}
+        <span class="toolbox-btns">
+            {{ macros.station_view(admin.subject) }}
+        </span>
+    {% endif %}
+{% endblock %}
+
+{# message pour expliquer l'interdiction de supprimer la station -> liste des chroniques #}
+{% block formactions %}
+    {% if admin.timeSeries and admin.timeSeries|length %}
+        <div class="well well-small form-actions">
+            <p style="margin-bottom:5px;">
+                <b>{{ 'admin.help.station.warning-station-has-time-series'|transchoice(admin.timeSeries|length) }}</b>
+            </p>
+            <ul style="margin-bottom:0;">
+                {% for t in admin.timeSeries %}
+                    <li>
+                        {% if is_granted('EDIT', t) and t.observatoire == currentObservatoire() %}
+                            {%  if t.dtype == 'continue' %}
+                                <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% elseif t.dtype == 'discontinue' %}
+                                <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% elseif t.dtype == 'convertie' %}
+                                <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% else %}
+                                <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% endif %}
+                        {% else %}
+                            {{ t }}
+                        {% endif %}
+                    </li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-type-parametre.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-type-parametre.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6e882d1bf8b029d64b7410bef8bd478580c9509b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-type-parametre.html.twig
@@ -0,0 +1,58 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# ajout du javascrip pour le rendu hierarchique du select des familles #}
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/crud/familles-types.js') }}"></script>
+{% endblock %}
+
+{# ajout du css pour le rendu hierarchique du select des familles #}
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/crud/familles-types.css') }}">
+{% endblock %}
+
+{# message pour expliquer l'interdiction de supprimer le type de paramètre -> liste des chroniques qui l'utilisent #}
+{% block formactions %}
+    {% if admin.timeSeries and admin.timeSeries|length %}
+        <div class="well well-small form-actions">
+            <p style="margin-bottom:5px;">
+                <b>{{ 'admin.help.typeParametre.warning-typeParametre-has-time-series'|transchoice(admin.timeSeries|length) }}</b>
+            </p>
+            <ul style="margin-bottom:0;">
+                {% for t in admin.timeSeries %}
+                    <li>
+                        {% if is_granted('EDIT', t) and t.observatoire == currentObservatoire() %}
+                            {%  if t.dtype == 'continue' %}
+                                <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% elseif t.dtype == 'discontinue' %}
+                                <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% elseif t.dtype == 'convertie' %}
+                                <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% else %}
+                                <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':t.id}) }}">{{ t }}</a>
+                            {% endif %}
+                        {% else %}
+                            {{ t }}
+                        {% endif %}
+                        ({{ 'admin.help.from_the_observatory'|trans }}
+                        {% if is_granted('EDIT', t.observatoire) %}
+                            <a href="{{ path('bdoh_admin_observatoire_edit', {id:t.observatoire.id}) }}">{{ t.observatoire }}</a>)
+                        {% else %}
+                            {{ t.observatoire }})
+                        {% endif %}
+                    </li>
+                {% endfor %}
+            </ul>
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
+
+{# message warning pour signaler que ce type n'a pas de famille de paramètres #}
+{% block sonata_admin_content %}
+    {% if admin.getMustDefineParameterFamily() %}
+        <div class="form-actions alert alert-warning">{{ 'admin.help.typeParametre.warning-no-family-defined'|trans|raw }}</div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-unite.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-unite.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..29c9e9ec2eb4b712762fdaf3256f930bf6bb8f1f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit-unite.html.twig
@@ -0,0 +1,66 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:edit.html.twig' %}
+
+{# message pour expliquer l'interdiction de supprimer l'unité -> liste des chroniques et des barèmes qui l'utilise #}
+{% block formactions %}
+    {% set margin_top = '' %}
+    {% if (admin.timeSeries and admin.timeSeries|length) or (admin.scales and admin.scales|length) %}
+        <div class="well well-small form-actions">
+            {% if admin.timeSeries and admin.timeSeries|length %}
+                <p style="margin-bottom:5px;">
+                    <b>{{ 'admin.help.unite.warning-unit-has-time-series'|transchoice(admin.timeSeries|length) }}</b>
+                </p>
+                <ul style="margin-bottom:0;">
+                    {% for t in admin.timeSeries %}
+                        <li>
+                            {% if is_granted('EDIT', t) and t.observatoire == currentObservatoire() %}
+                                {%  if t.dtype == 'continue' %}
+                                    <a href="{{ path('bdoh_admin_chroniquecontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                {% elseif t.dtype == 'discontinue' %}
+                                    <a href="{{ path('bdoh_admin_chroniquediscontinue_edit', {'id':t.id}) }}">{{ t }}</a>
+                                {% elseif t.dtype == 'convertie' %}
+                                    <a href="{{ path('bdoh_admin_chroniqueconvertie_edit', {'id':t.id}) }}">{{ t }}</a>
+                                {% else %}
+                                    <a href="{{ path('bdoh_admin_chroniquecalculee_edit', {'id':t.id}) }}">{{ t }}</a>
+                                {% endif %}
+                            {% else %}
+                                {{ t }}
+                            {% endif %}
+                            ({{ 'admin.help.from_the_observatory'|trans }}
+                            {% if is_granted('EDIT', t.observatoire) %}
+                                <a href="{{ path('bdoh_admin_observatoire_edit', {id:t.observatoire.id}) }}">{{ t.observatoire }}</a>)
+                            {% else %}
+                                {{ t.observatoire }})
+                            {% endif %}
+                        </li>
+                    {% endfor %}
+                </ul>
+                {% set margin_top = 'margin-top:10px;' %}
+            {% endif %}
+            {% if admin.scales and admin.scales|length %}
+                <p style="margin-bottom:5px;{{ margin_top }}">
+                    <b>{{ 'admin.help.unite.warning-unit-has-scales'|transchoice(admin.scales|length) }}</b>
+                </p>
+                <ul style="margin-bottom:0;">
+                    {% for s in admin.scales %}
+                        <li>
+                            {% if is_granted('EDIT', s) and s.observatoire == currentObservatoire() %}
+                                <a href="{{ path('bdoh_admin_bareme_edit', {id:s.id}) }}">
+                                    {{ s }} [{{ s.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                                </a>
+                            {% else %}
+                                {{ s }} [{{ s.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                            {% endif %}
+                            ({{ 'admin.help.from_the_observatory'|trans }}
+                            {% if is_granted('EDIT', s.observatoire) %}
+                                <a href="{{ path('bdoh_admin_observatoire_edit', {id:s.observatoire.id}) }}">{{ s.observatoire }}</a>)
+                            {% else %}
+                                {{ s.observatoire }})
+                            {% endif %}
+                        </li>
+                    {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6c7a4f4a0cf830302aa5a8fdd1c00d85f28bafda
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/edit.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:action.html.twig' %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/CRUD/list.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6c7a4f4a0cf830302aa5a8fdd1c00d85f28bafda
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/CRUD/list.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohAdminBundle:CRUD:action.html.twig' %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Colors/colors.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Colors/colors.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..86c642161e7eb39ad1bcc43171b70ca02345828c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Colors/colors.html.twig
@@ -0,0 +1,224 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle, submit, reset%}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+{% block title %}
+    {{ pageTitle('colors.title'|trans) }}
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/colors.css') }}"/>
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/colors.js') }}"></script>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'colors.title'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <div id="colors">
+        <h1>{{ 'colors.longTitle'|trans }}</h1>
+
+        <form class="form-horizontal" name="main" action="{{ path('bdoh_admin_colors_form') }}"
+              method="post" enctype="multipart/form-data" id="formColorsId">
+
+            <div class="form-group">
+                <label for="jeuQualiteId" class="col-sm-4 control-label">{{ 'JeuQualite'|trans }}</label>
+                <div class="col-md-4">
+                    <select id="jeuQualiteId" name="jeuQualiteId" class="form-control" autocomplete="off"
+                        {% if jeuQualite is defined -%}
+                            data-id="{{ jeuQualite.id }}"
+                        {%- endif -%}
+                    >
+                        <option></option>
+                        {% for jeu in jeux %}
+                            <option value="{{ jeu.id }}"
+                                {% if jeuQualite is defined and jeuQualite.id == jeu.id %}
+                                    selected="selected"
+                                {% endif %}
+                            >{{ jeu }}</option>
+                        {% endfor %}
+                    </select>
+                    <input type="hidden" autocomplete="off" id="jeuQualiteChangedId" name="jeuQualiteChanged" value=""/>
+                    <input type="hidden" autocomplete="off" name="{{ CSRFTokenName }}" value="{{ CSRFTokenValue }}"/>
+                </div>
+            </div>
+
+            {% if jeuQualite is defined %}
+
+                <fieldset id="blocQualites" class="box">
+                    <legend>{{ 'colors.titles.qualite'|trans }}</legend>
+                    <div class="alert alert-info">{{ 'colors.default.qualite'|trans|raw }}</div>
+                    <table class="table table-condensed table-hover">
+                        <tr><th>{{ 'Qualite'|trans }}</th><th>{{ 'colors.color'|trans }}</th><th>{{ 'colors.thickness'|trans }}</th></tr>
+                    {% for qualite in qualitesData %}
+                        <tr>
+                            <td class="qualiteLabel">
+                                {{ qualite.label }}&nbsp;&nbsp;&nbsp;&nbsp;<span class="code">{{ 'open_quote'|trans~qualite.code~'close_quote'|trans }}</span>
+                                {%- if qualite.gap %}&nbsp;&nbsp;&nbsp;&nbsp;<span class="gap">{{ 'colors.gap'|trans }}</span>{% endif %}
+                            </td>
+                            <td>
+                                <input id="colorId_{{ qualite.id }}" type="text" name="colorId_{{ qualite.id }}" autocomplete="off"
+                                       class="form-control colorpicker" value="{{ qualite.color }}" />
+                            </td>
+                            <td>
+                                <select id="thicknessId_{{ qualite.id }}" name="thicknessId_{{ qualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {% for thickness in thicknesses %}
+                                        <option value="{{ thickness }}"
+                                            {% if thickness == qualite.thickness %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ thickness }}</option>
+                                    {% endfor %}
+                                </select>
+                            </td>
+                        </tr>
+                    {% endfor %}
+                    </table>
+                </fieldset>
+
+                <fieldset id="blocDiscontinuous" class="box">
+                    <legend>{{ 'colors.titles.discontinuous'|trans }}</legend>
+                    <div class="alert alert-info">{{ 'colors.default.discontinuous'|trans|raw }}</div>
+                    <table class="table table-condensed table-hover">
+                        <tr>
+                            <th>{{ 'colors.shape'|trans }}</th>
+                            <th>{{ 'colors.stroke'|trans }} <sup class="strokeHelp" title="{{ 'colors.strokeHelp'|trans }}">(?)</sup></th>
+                            <th>{{ 'colors.size'|trans }}</th>
+                        </tr>
+                        <tr>
+                            <td>
+                                <select id="discontinuousShapeId" name="discontinuousShapeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {% for shape, shapeShape in shapes %}
+                                        <option value="{{ shape }}"
+                                            {% if shape == discontinuousData.shape %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ shapeShape }}</option>
+                                    {% endfor %}
+                                </select>
+                            </td>
+                            <td>
+                                <select id="discontinuousStrokeId" name="discontinuousStrokeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {%- for stroke in strokes -%}
+                                        <option value="{{ stroke }}"
+                                            {% if stroke == discontinuousData.stroke %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ stroke }}</option>
+                                    {%- endfor -%}
+                                </select>
+                            </td>
+                            <td>
+                                <select id="discontinuousSizeId" name="discontinuousSizeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {%- for size in sizes -%}
+                                        <option value="{{ size }}"
+                                            {% if size == discontinuousData.size %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ size }}</option>
+                                    {%- endfor -%}
+                                </select>
+                            </td>
+                        </tr>
+                    </table>
+                </fieldset>
+
+                <fieldset id="blocCheckpoint" class="box">
+                    <legend>{{ 'colors.titles.checkpoint'|trans }}</legend>
+                    <div class="alert alert-info">{{ 'colors.default.checkpoint'|trans|raw }}</div>
+                    <table class="table table-condensed table-hover">
+                        <tr>
+                            <th>{{ 'colors.shape'|trans }}</th>
+                            <th>{{ 'colors.stroke'|trans }} <sup class="strokeHelp" title="{{ 'colors.strokeHelp'|trans }}">(?)</sup></th>
+                            <th>{{ 'colors.color'|trans }}</th>
+                            <th>{{ 'colors.size'|trans }}</th>
+                        </tr>
+                        <tr>
+                            <td>
+                                <select id="checkpointShapeId" name="checkpointShapeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {% for shape, shapeShape in shapes %}
+                                        <option value="{{ shape }}"
+                                            {% if shape == checkpointData.shape %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ shapeShape }}</option>
+                                    {% endfor %}
+                                </select>
+                            </td>
+                            <td>
+                                <select id="checkpointStrokeId" name="checkpointStrokeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {%- for stroke in strokes -%}
+                                        <option value="{{ stroke }}"
+                                            {% if stroke == checkpointData.stroke %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ stroke }}</option>
+                                    {%- endfor -%}
+                                </select>
+                            </td>
+                            <td>
+                                <input id="checkpointColorId" type="text" name="checkpointColorId_{{ jeuQualite.id }}" autocomplete="off"
+                                       class="form-control colorpicker" value="{{ checkpointData.color }}" />
+                            </td>
+                            <td>
+                                <select id="checkpointSizeId" name="checkpointSizeId_{{ jeuQualite.id }}" autocomplete="off"
+                                        class="form-control">
+                                    {%- for size in sizes -%}
+                                        <option value="{{ size }}"
+                                            {% if size == checkpointData.size %}
+                                                selected="selected"
+                                            {% endif %}
+                                        >{{ size }}</option>
+                                    {%- endfor -%}
+                                </select>
+                            </td>
+                        </tr>
+                    </table>
+                </fieldset>
+
+                <div id="btnDivId">
+                    {{ submit('colors.save'|trans, 'btn btn-success') }}
+                    {{ reset('colors.cancel'|trans, 'btn btn-danger') }}
+                </div>
+
+            {% endif %}
+
+        </form>
+
+        {% if errorsColors is defined %}
+            <div class="alert alert-block alert-danger" id="errorsColorsAlertId" style="margin-top:1em;margin-bottom:0;">
+                <a class="close" id="errorsColorsCloseId">&times;</a>
+                <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+                <ul>
+                    {% for error in errorsColors %}
+                        <li>{{ error|raw }}</li>
+                    {% endfor %}
+                </ul>
+            </div>
+        {% endif %}
+
+        {% if successColors is defined %}
+            <div class="alert alert-block alert-success" id="successColorsAlertId" style="margin-top:1em;margin-bottom:0;">
+                <a class="close" id="successColorsCloseId">&times;</a>
+                <strong>{{ 'colors.success(%link%, %chronique%)'|trans({'%link%': successColors.link, '%chronique%': successColors.chronique})|raw }}<br/>
+                    {{ 'colors.seeJobPage(%jobPage%, %jobId%)'|trans({'%jobPage%': successColors.jobPage, '%jobId%': successColors.jobId})|raw }}</strong>
+            </div>
+        {% endif %}
+
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/errors.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/errors.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..548ee62eadf6c7e438230f5f82d72cd869e68d95
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/errors.html.twig
@@ -0,0 +1,18 @@
+<div class="alert alert-block alert-danger">
+    <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+    <ul>
+        {% for error in errors %}
+            <li>{{ error|raw }}</li>
+        {% endfor %}
+    </ul>
+</div>
+
+<div class="alert alert-block alert-info">
+    <h4 class="alert-heading">
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i>{{ ('import.'~idImporter)|trans }}</i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+    {% include 'IrsteaBdohAdminBundle:ControleManagement:format-descriptions.html.twig' %}
+</div>
+
+<a href="{{ path('bdoh_admin_controle_import') }}" class="btn btn-danger">{{ 'restart'|trans }} {{ 'import(the)'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/format-descriptions.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/format-descriptions.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..971e9ae801290c510b58d89aed6db3300580dfa6
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/format-descriptions.html.twig
@@ -0,0 +1,12 @@
+<div id="format-description">
+
+    <h4 class="alert-heading">
+        <hr>
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i>{{ ('import.controle')|trans }}</i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+
+    <!-- =================================================================== -->
+    <ul name="controle">
+        {{ 'controle.import.formats.bdoh'|trans|raw }}
+    </ul>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/layout.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..075240a612044ba849e6330679f288dbb520a66d
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/layout.html.twig
@@ -0,0 +1,29 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('admin.controleImport'|trans) }}
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/controle-import.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/measure-import.css') }}"/>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'admin.controleImport'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <div id="measure-import">
+        {% block step %}{% endblock %}
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step1.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step1.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0db34af70a41341857499e9636f36f3601a7987f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step1.html.twig
@@ -0,0 +1,90 @@
+{% import '::macros.html.twig' as macros %}
+{% extends 'IrsteaBdohAdminBundle:ControleManagement:layout.html.twig' %}
+
+{% block step %}
+
+    <!-- The import part of the page -->
+    <div class="col-md-14" style="padding:0;">
+
+
+        <h1>{{ 'controle.import.title'|trans }}</h1>
+
+        <!-- The steps of controles import -->
+        <p><h2>{{ 'controle.import.step.1'|trans }}</h2></p>
+        <p><h2 class="inactive">{{ 'controle.import.step.2'|trans }}</h2></p>
+        <p><h2 class="inactive" style="margin-bottom:1em;">{{ 'controle.import.step.3'|trans }}</h2></p>
+
+        <form class="form-inline" name="import" action="{{ path('bdoh_admin_controle_import_step2') }}"
+              method="post" enctype="multipart/form-data">
+
+            <!-- Some information -->
+            <div class="alert alert-block alert-info">
+                <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+                <ul>
+                    <li>{{ 'controle.import.help.quitWarning'|trans|raw }}</li>
+                    <li>{{ 'controle.import.help.file.onlyOneTimeSeries'|trans|raw }}</li>
+                </ul>
+
+                <!-- Format description -->
+                {% include 'IrsteaBdohAdminBundle:ControleManagement:format-descriptions.html.twig' %}
+            </div>
+
+            <!-- File -->
+            <label>{{ 'file'|trans }}</label>&nbsp;
+
+            <div class="form-group">
+                <input id="file-import" name="file" type="file"/>
+            </div>
+
+            <div class="form-group">
+                {{ macros.submit }}
+            </div>
+
+            <!-- Progress bar : displayed only when uploading a file -->
+            <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+                <div class="progress-bar"></div>
+            </div>
+
+        </form>
+
+    </div>
+
+    <div class="col-md-1" style="padding:0;"></div>
+
+    <!-- The export part of the page -->
+    <div class="col-md-9" style="padding:0;">
+        <h1>{{ 'controle.export.title'|trans }}</h1>
+
+        <form class="form-inline" name="export" action="{{ path('bdoh_admin_controle_export') }}"
+              method="post" enctype="multipart/form-data">
+
+            <div class="form-group">
+                <label for="choniqueExportId" class="control-label">{{ 'Chronique'|trans }}</label>&nbsp;
+                <select id="choniqueExportId" name="chronique" class="form-control">
+                    <option selected></option>
+                    {% for chronique in chroniques %}
+                        <option value="{{ chronique.id }}">{{ chronique.station.code }} / {{ chronique.code }}</option>
+                    {% endfor %}
+                </select>
+            </div><br/><br/>
+            <div class="form-group">
+                <label for="timeZoneExportId" class="control-label">{{ 'timezone'|trans }}</label>&nbsp;
+                <div class="input-group">
+                    <div class="input-group-addon">UTC</div>
+                    <select id="timeZoneExportId"  name="timezone" class="form-control">
+                        {% for hour in 0..12 %}
+                            <option value="+{{ hour }}" {{ loop.first ? 'selected' : '' }}>+{{ "%02d"|format(hour) }}</option>
+                        {% endfor %}
+                        {% for hour in 1..12 %}
+                            <option value="-{{ hour }}">&minus;{{ "%02d"|format(hour) }}</option>
+                        {% endfor %}
+                    </select>
+                </div>
+            </div><br/><br/>
+
+            {{ macros.submit }}
+
+        </form>
+    </div>
+
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2-info-and-validation.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2-info-and-validation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b5821c84b9501008a7202a62c8455f31af10dd94
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2-info-and-validation.html.twig
@@ -0,0 +1,91 @@
+<!-- Tab of information and validation form -->
+<div>
+    <!-- Overlap -->
+    <div class="alert alert-warning col-md-3" style="padding:10px 0 5px;text-align:center;">
+        <h4 class="alert-heading">
+            {{ 'overlap'|trans }}
+            <i class="overlapHelp fam-help" data-original-title="{{ 'overlap'|trans }}"
+               data-content="{{ ('controle.import.help.overlap.' ~ chroniqueData.overlap) | trans }}" style="vertical-align:-3px;">
+            </i>
+        </h4>
+        <img src="{{ asset('images/admin/overlap_' ~ chroniqueData.overlap ~ '.png') }}"/>
+    </div>
+
+    <div class="col-md-21">
+        <!-- 'Chronique' information -->
+        <div class="col-md-12">
+            <p class="import-title"><strong>{{ 'existing'|trans }}</strong></p>
+
+            <!-- Dates of first and last existing controles -->
+
+            <div class="col-md-24">
+                <strong>{{ 'begin'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:red;">
+                    {{ chroniqueData.existingFirstDate ? (chroniqueData.existingFirstDate | date('transformation.bareme.dateBareme'|trans, false)) : ('empty'|trans) }}
+                </span>
+            </div>
+
+            <div class="col-md-24">
+                <strong>{{ 'end'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:red;">
+                    {{ chroniqueData.existingLastDate ? (chroniqueData.existingLastDate | date('transformation.bareme.dateBareme'|trans, false)) : ('empty'|trans) }}
+                </span>
+            </div>
+
+            <div class="col-md-24"><em>{{ 'UTC(in)'|trans }}</em></div>
+
+            <div class="col-md-24">
+                <strong>{{ 'controle.import.info.nbControles'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:red;">{{ nbPointControle }}</span>
+            </div>
+
+        </div>
+        <!-- END_'Chronique' information -->
+
+        <!-- Import information -->
+        <div class="col-md-12">
+            <p class="import-title"><strong>{{ 'import'|trans }}</strong></p>
+
+            <!-- Dates of first and last controles to import -->
+            <div class="col-md-24">
+                <strong>{{ 'begin'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:green;">
+                    {{ chroniqueData.importerFirstDate | date('transformation.bareme.dateBareme'|trans, false) }}
+                </span>
+            </div>
+
+            <div class="col-md-24">
+                <strong>{{ 'end'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:green;">
+                    {{ chroniqueData.importerLastDate | date('transformation.bareme.dateBareme'|trans, false) }}
+                </span>
+            </div>
+
+            <div class="col-md-24">
+                <em>{{ 'measure.import.help.timezoneToUTC'|trans }}</em>
+            </div>
+
+            <div class="col-md-24">
+                <strong>{{ 'controle.import.info.nbControles'|trans }}{{ 'deux_points'|trans }}</strong>
+                <span style="color:green;">{{ nbNewPointControle }}</span>
+            </div>
+        </div>
+    </div>
+    <!-- END_Import information -->
+
+    <!-- Validation form -->
+    <div class="col-md-24 alert alert-warning" style="margin-top:0.5em;">
+        <h4 class="alert-heading">{{ 'controle.import.question.importType'|trans }}</h4>
+
+        <input type="radio" name="{{ importTypeName }}" value="doNotImport" id="{{ doNotImportId }}">
+        <label for="{{ doNotImportId }}">{{ 'controle.import.action.doNotImport'|trans }}</label>
+        <br>
+
+        <input type="radio" name="{{ importTypeName }}" value="import" id="{{ overwriteExistingId }}">
+        <label style="color:red;"
+               for="{{ overwriteExistingId }}">{{ 'controle.import.action.overwriteExisting'|trans }}</label>
+        <br>
+    </div>
+    <!-- END_Validation form -->
+</div>
+<!-- END_Tab of information and validation form -->
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cc32e34b018ca4379249f8c0bbfed83b28b305ed
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step2.html.twig
@@ -0,0 +1,43 @@
+{% import '::macros.html.twig' as macros %}
+
+<h1>{{ 'controle.import.title'|trans }}</h1>
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_controle_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<!-- The steps of controles import -->
+<p><h2><span class="inactive">{{ 'controle.import.step.1'|trans }}</span></h2></p>
+<p><h2>{{ 'controle.import.step.2'|trans }}</h2></p>
+<p><h2 class="inactive" style="margin-bottom:1em;">{{ 'controle.import.step.3'|trans }}</h2></p>
+
+<form class="form-inline" name="import" action="{{ path('bdoh_admin_controle_import_step3') }}" method="post">
+    {# For each 'chronique' : displays information, validation form and viewer #}
+
+    {% if chroniqueData %}
+
+        {% set prefix              = chronique.id %}
+        {% set informationId       = 'information' %}
+        {% set viewerId            = 'viewer' %}
+
+        {# Variables for validation form #}
+        {% set importTypeName      = 'importType' %}
+        {% set doNotImportId       = 'doNotImport' %}
+        {% set keepExistingId      = 'keepExistingId' %}
+        {% set overwriteExistingId = 'overwriteExistingId' %}
+
+        <div class="panel panel-default">
+            <!-- Header -->
+            <div class="panel-heading">
+                <h3>{{ chronique }}</h3>
+                <strong>{{ macros.i18nEntityLabel(chronique, 'libelle') }}</strong> <em>[{{ chronique.unite }}]</em>
+            </div>
+
+            <!-- Tabs content -->
+            <div class="panel-body">
+                {% include 'IrsteaBdohAdminBundle:ControleManagement:step2-info-and-validation.html.twig' %}
+            </div>
+        </div>
+    {% endif %}
+    {{ macros.submit(('validate'|trans)~' '~('import(the)'|trans)) }}
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step3.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step3.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4c24ed11bb9595d2e7e0568f112b27f2eecd15d5
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ControleManagement/step3.html.twig
@@ -0,0 +1,35 @@
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+<h1>{{ 'controle.import.title'|trans }}</h1>
+
+<!-- The steps of controles import -->
+<p><h2 class="inactive">{{ 'controle.import.step.1'|trans }}</h2></p>
+<p><h2 class="inactive">{{ 'controle.import.step.2'|trans }}</h2></p>
+<p><h2 style="margin-bottom: 1em;">{{ 'controle.import.step.3'|trans }}</h2></p>
+
+{% if stats is not empty %}
+    <table class="table well">
+        <thead>
+        <tr>
+            <th>{{ 'controle.import.info.timeSeries'|trans }}</th>
+            <th>{{ 'controle.import.info.controlesInsert'|trans }}</th>
+            <th>{{ 'controle.import.info.controlesDelete'|trans }}</th>
+        </tr>
+        </thead>
+        <tbody>
+        {% for chroniqueTxt, stat in stats %}
+            <tr>
+                <td>{{ macros.chronique_view(stat.entity, chroniqueTxt, 'text') }}</td>
+                <td>{{ stat.insert }}</td>
+                <td>{{ stat.delete }}</td>
+            </tr>
+        {% endfor %}
+        </tbody>
+    </table>
+{% else %}
+    {{ 'controle.import.info.noControleImported'|trans }}
+{% endif %}
+
+
+<a href="{{ path('bdoh_admin_controle_import') }}" class="btn btn-default">{{ 'controle.import.action.newImport'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn btn-default">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Conversion/conversion.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Conversion/conversion.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..16cdd8c42661c7452ad3657e74b5149c9b5e9b3b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Conversion/conversion.html.twig
@@ -0,0 +1,191 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle, submit, reset%}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+{% block title %}
+    {{ pageTitle('ConversionChroniques'|trans) }}
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/conversion.css') }}"/>
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/conversion.js') }}"></script>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'ConversionChroniques'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <div id="conversion">
+        <h1>{{ 'ConversionChroniques'|trans }}</h1>
+
+        <form class="form-horizontal" name="main" action="{{ path('bdoh_admin_conversion_form') }}"
+              method="post" enctype="multipart/form-data" id="formConversionId">
+
+            <div class="form-group">
+                <label for="chroniqueConvertieId" class="col-sm-4 control-label">{{ 'ChroniqueConvertie'|trans }}</label>
+                <div class="col-md-8">
+                    <select id="chroniqueConvertieId" name="chroniqueConvertieId" class="form-control" autocomplete="off"
+                            {% if chroniqueConvertie is defined %}
+                                data-id="{{ chroniqueConvertie.id }}"
+                            {% endif %}
+                    >
+                        <option></option>
+                        {% for station in stations if chroniquesConverties[station.id] is defined %}
+                            <optgroup label="{{ station.code }}">
+                                {% for chroniqueConvertieInList in chroniquesConverties[station.id] %}
+                                    <option value="{{ chroniqueConvertieInList.id }}"
+                                        {% if chroniqueConvertie is defined and chroniqueConvertie.id == chroniqueConvertieInList.id %}
+                                            selected="selected"
+                                        {% endif %}
+                                    >{{ chroniqueConvertieInList }}</option>
+                                {% endfor %}
+                            </optgroup>
+                        {% endfor %}
+                    </select>
+                    <input type="hidden" autocomplete="off" id="chroniqueChangedId" name="chroniqueChanged" value=""/>
+                    <input type="hidden" autocomplete="off" name="{{ CSRFTokenName }}" value="{{ CSRFTokenValue }}"/>
+                </div>
+
+                {% if chroniqueConvertie is defined %}
+                    <div>
+                        <label for="stationId" class="col-sm-4 control-label" style="padding-right:5px;">
+                            {{ 'Station'|trans }}
+                        </label>
+                        <div class="col-md-8">
+                            <p id="stationId" class="form-control-static">
+                                <a href="{{ path('bdoh_consult_station', {station: chroniqueConvertie.station.code}) }}"
+                                   class="viewStation"
+                                   title="{{ 'viewStation'|trans }}">
+                                    {{ chroniqueConvertie.station.nom }} ({{ chroniqueConvertie.station.code }})
+                                </a>
+                            </p>
+                        </div>
+                    </div>
+                {% endif %}
+
+            </div>
+
+            {% if chroniqueConvertie is defined %}
+
+                <div class="form-group">
+                    <div>
+                        <label for="uniteId" class="col-sm-4 control-label">{{ 'unite'|trans }}</label>
+                        <div class="col-md-8">
+                            <p id="uniteId" class="form-control-static">{{ unite }}</p>
+                        </div>
+                    </div>
+
+                    {% if maj %}
+                        <div>
+                            <label for="dateMajId" class="col-sm-4 control-label">{{ 'miseAJour'|trans }}</label>
+                            <div class="col-md-8">
+                                <p id="dateMajId" class="form-control-static">{{ maj }}</p>
+                            </div>
+                        </div>
+                    {% endif %}
+                </div>
+
+                <div class="form-group">
+                    <label for="genealogieId" class="col-sm-4 control-label">{{ 'genealogie'|trans }}</label>
+                    <div class="col-md-20">
+                        <textarea id="genealogieId" name="genealogie" class="form-control" rows="3">{{ genealogie }}</textarea>
+                    </div>
+                    <label for="genealogieEnId" class="col-sm-4 control-label">{{ 'genealogieEn'|trans }}</label>
+                    <div class="col-md-20">
+                        <textarea id="genealogieEnId" name="genealogieEn" class="form-control" rows="3">{{ genealogieEn }}</textarea>
+                    </div>
+                </div>
+
+                {% if hasChildren %}
+                    <div class="form-group">
+                        <div class="col-md-20 col-sm-offset-4">
+                            <input id="propagateId" name="propagate" value="propagate" type="checkbox" checked="checked" autocomplete="off" style="vertical-align:-3px;"/>
+                            <label for="propagateId">
+                                <strong><span>{{ 'measure.import.question.computeChildren'|transchoice(childrenCount) }}</span>
+                                    <i id="childrenHelpId" class="fam-help"
+                                       data-original-title="{{ 'measure.import.help.children'|transchoice(childrenCount) }}"
+                                       data-content="{{ childrenList }}" style="vertical-align:-3px;"></i>
+                                </strong>
+                            </label>
+                        </div>
+                    </div>
+                {% endif %}
+
+                <div class="form-group">
+                    <label for="chroniqueMereId" class="col-sm-4 control-label">{{ 'conversion.chroniqueMere'|trans }}</label>
+                    <div class="col-md-8">
+                        {% if chroniqueMere is defined %}
+                            <p id="chroniqueMereId" class="form-control-static" data-id="{{ chroniqueConvertie.id }}">
+                                <a href="{{ path('bdoh_consult_chronique', {station: chroniqueMere.station.code, chronique: chroniqueMere.code}) }}"
+                                   class="viewChroniqueMere"
+                                   title="{{ 'viewChronique'|trans }}">{{ chroniqueMere }}</a>{{- macros.chronique_isVisible(chroniqueMere) }}
+                            </p>
+                        {% else %}
+                            {% if chroniquesDiscontinues is empty %}
+                                <p id="chroniqueMereId" class="noChroniqueMere form-control-static" data-no-chronique-mere="noChroniqueMere">{{ 'conversion.noChroniqueMere'|trans }}</p>
+                            {% else %}
+                                <select id="chroniqueMereId" name="chroniqueMereId" class="form-control" autocomplete="off" required="required">
+                                    <option></option>
+                                    {% for chroniqueDiscontinue in chroniquesDiscontinues %}
+                                        <option value="{{ chroniqueDiscontinue.id }}">{{ chroniqueDiscontinue }}</option>
+                                    {% endfor %}
+                                </select>
+                            {% endif %}
+                        {% endif %}
+                    </div>
+
+                    <div class="col-md-12" style="text-align:right;">
+                        <label for="paramConversionId" class="control-label" style="padding-right:5px;">
+                            {{ 'conversion.paramConversion'|trans }}
+                            <sup title="{{ 'conversion.paramConversionHelp'|trans|raw }}" id="paramConversionHelpId">(?)</sup>
+                        </label>
+                        {% set paramConversionMinuntes = paramConversion ? paramConversion // 60 %}
+                        <div style="display:inline-block;width:20%;padding-right:5px;">
+                            <input type="text" class="form-control" id="paramConversionId" name="paramConversion" autocomplete="off"
+                                   required="required" value="{{ paramConversionMinuntes }}"
+                                   title="{{ 'conversion.paramConversionTitle'|trans }}"/>
+                        </div>
+                        <div id="displayParamConversionId" style="display:inline-block;width:46%;text-align:left;"></div>
+                    </div>
+                </div>
+
+                <div id="btnDivId" style="display:none;">
+                    {{ submit('conversion.saveAndConvert'|trans, 'btn btn-success') }}
+                    {{ reset('conversion.cancelModifications'|trans, 'btn btn-danger') }}
+                </div>
+
+            {% endif %}
+
+        </form>
+
+        {% if errorsConversion is defined %}
+            <div class="alert alert-block alert-danger" id="errorsConversionAlertId" style="margin-top:1em;margin-bottom:0;">
+                <a class="close" id="errorsConversionCloseId">&times;</a>
+                <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+                <ul>
+                    {% for error in errorsConversion %}
+                        <li>{{ error|raw }}</li>
+                    {% endfor %}
+                </ul>
+            </div>
+        {% endif %}
+
+        {% if successConversion is defined %}
+            <div class="alert alert-block alert-success" id="successConversionAlertId" style="margin-top:1em;margin-bottom:0;">
+                <a class="close" id="successConversionCloseId">&times;</a>
+                <strong>{{ 'conversion.success(%link%, %chronique%)'|trans({'%link%': successConversion.link, '%chronique%': successConversion.chronique})|raw }}<br/>
+                    {{ 'conversion.seeJobPage(%jobPage%, %jobId%)'|trans({'%jobPage%': successConversion.jobPage, '%jobId%': successConversion.jobId})|raw }}</strong>
+            </div>
+        {% endif %}
+
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Form/bdoh_theiathesaurus_widget.js.twig b/src/Irstea/BdohAdminBundle/Resources/views/Form/bdoh_theiathesaurus_widget.js.twig
new file mode 100644
index 0000000000000000000000000000000000000000..48c455bfb28c02cc9fdf163cc5f387bf94a64eeb
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Form/bdoh_theiathesaurus_widget.js.twig
@@ -0,0 +1,78 @@
+jQuery(function() { // une fois la page chargée...
+    const $ = jQuery;
+
+    const createQuery = term => ({
+        query: `
+PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
+PREFIX theia: <https://w3id.org/ozcar-theia/>
+SELECT REDUCED ?uri ?prefLabel
+FROM theia:
+WHERE {
+    ?uri skos:prefLabel ?prefLabel .
+    theia:variableCategoriesGroup skos:member ?uri .
+    FILTER (
+        lang(?prefLabel) = "en"
+        && CONTAINS(LCASE(?prefLabel), "${term.toLowerCase()}")
+    )
+    MINUS { ?uri skos:narrower ?o }
+}
+ORDER BY ?prefLabel
+LIMIT 10`.replaceAll(/\s+/g, ' ')
+    });
+
+    const processResults = data => ({
+        results: data.results.bindings.map(
+            entry => ({
+                prefLabel: entry.prefLabel.value,
+                uri: entry.uri.value
+            })
+        )
+    });
+
+    function reloadSelection (element, callback) {
+        const uris = element.val().split(',');
+        if (uris.length === 0) {
+            callback([]);
+        }
+
+        const values = uris
+            .map(uri => uri.replace('https://w3id.org/ozcar-theia/', 'theia:'))
+            .join(', ');
+
+        $.ajax({
+            method: 'GET',
+            url: {{ ( thesaurusUrl ~ "/fuseki/theia_vocabulary" ) | json_encode | raw }},
+            dataType: 'json',
+            data: {
+                query: `
+PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
+PREFIX theia: <https://w3id.org/ozcar-theia/>
+SELECT ?uri ?prefLabel
+FROM theia:
+WHERE {
+    ?uri skos:prefLabel ?prefLabel .
+    FILTER ( ?uri IN (${values}) )
+}`.replaceAll(/\s+/g, ' ')
+            },
+            success: data => callback(processResults(data).results)
+        });
+    }
+
+    $('#{{ id }}').select2({
+        width: '100%',
+        multiple: {{ multiple | json_encode }},
+        minimumInputLength: 0,
+        id: 'uri',
+        separator: ',',
+        ajax: {
+            method: 'GET',
+            url: {{ ( thesaurusUrl ~ "/fuseki/theia_vocabulary" ) | json_encode | raw }},
+            dataType: 'json',
+            data: createQuery,
+            results: processResults
+        },
+        formatResult: result => result.prefLabel,
+        formatSelection: selection => selection.prefLabel,
+        initSelection: reloadSelection
+    });
+});
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Form/widgets.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Form/widgets.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dd072f37d366ea7402f7bfc7452af13c39c5e765
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Form/widgets.html.twig
@@ -0,0 +1,57 @@
+{##
+ # Customized fields for 'Observatoire' admin.
+ #}
+
+{% extends 'SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig' %}
+
+{% block wysiwyg_widget %}
+    {%- set attr = attr | merge({'class': (attr.class|default('') ~ ' htmleditor') | trim }) %}
+    {{ block('textarea_widget') }}
+{% endblock %}
+
+{% block couleur_widget %}
+    {%- set attr = attr | merge({'class': (attr.class|default('') ~ ' colorpicker') | trim }) %}
+    {{ block('form_widget') }}
+{% endblock %}
+
+{% block bdoh_file_widget %}
+    {% spaceless %}
+        {%- set isImage = 'image/' in accept %}
+        <div id="{{ id }}-file-widget"
+            data-file-widget="{{- isImage ? 'image' : 'file' -}}"
+            data-base-path="{{ asset('') }}"
+        >
+            {% if isImage %}
+                <div class="thumbnail text-center" style="width:150px;">
+                    <img class="preview"/>
+                    <i class="placeholder glyphicon glyphicon-picture text-muted" style="font-size:50px"></i>
+                </div>
+            {% else %}
+                <p class="preview form-control">
+                    <a><i class="glyphicon glyphicon-file"></i>&nbsp;<span>-</span></a>
+                </p>
+            {% endif %}
+
+            <a class="pull-left btn btn-danger delete" title="Supprimer">
+                <i class="glyphicon glyphicon-trash"></i>
+            </a>
+
+            <a class="pull-left btn btn-default undo" title="Annuler">
+                <i class="glyphicon glyphicon-step-backward"></i>
+            </a>
+
+            {{ form_widget(form.current) }}
+            {{ form_widget(form.new) }}
+        </div>
+        <script>enableFileWidget('#{{ id }}-file-widget');</script>
+    {% endspaceless %}
+{% endblock %}
+
+{% block bdoh_theiathesaurus_widget %}
+    {% spaceless %}
+        <input type="hidden" id="{{ id }}" name="{{ full_name }}" value="{{ value | e('html_attr') }}"/>
+        <script>
+        {% include '@IrsteaBdohAdmin/Form/bdoh_theiathesaurus_widget.js.twig' %}
+        </script>
+    {% endspaceless %}
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Mail/newAccount.txt.twig b/src/Irstea/BdohAdminBundle/Resources/views/Mail/newAccount.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..87bcae2e55189f5c525cb3e5f0787c6cf8c5d5f0
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Mail/newAccount.txt.twig
@@ -0,0 +1,3 @@
+{{ 'utilisateur.newAccountMail.body'|trans|raw }}{{ url('bdoh_home') }}
+
+{{ 'utilisateur.newAccountMail.footer'|trans|raw }}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/errors.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/errors.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f65de86932da136b6f7ba3070cb44f8fb24d8389
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/errors.html.twig
@@ -0,0 +1,20 @@
+<div class="alert alert-block alert-danger">
+    <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+    <ul>
+        {% for error in errors %}
+            <li>{{ error|raw }}</li>
+        {% endfor %}
+    </ul>
+    <br/>
+    <div>{{ 'errorsMayComeFromEncoding'|trans }}</div>
+</div>
+
+<div class="alert alert-block alert-info">
+    <h4 class="alert-heading">
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i>{{ ('import.'~idImporter)|trans }}</i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+    {% include 'IrsteaBdohAdminBundle:MeasureImport:format-descriptions.html.twig' %}
+</div>
+
+<a href="{{ path('bdoh_admin_measure_import') }}" class="btn btn-danger">{{ 'restart'|trans }} {{ 'import(the)'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/format-descriptions.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/format-descriptions.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..17ce9d5cff2145e301d6e8f9bbbd19c97cae06f3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/format-descriptions.html.twig
@@ -0,0 +1,125 @@
+<div id="format-description">
+
+    <h4 class="alert-heading">
+        <hr>
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i></i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+
+    <!-- =================================================================== -->
+    <ul name="Qjo">
+        {{ 'measure.import.formats.Qjo'|trans|raw }}
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="Qtvar">
+        {{ 'measure.import.formats.Qtvar'|trans|raw }}
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AixPluie">
+        <li><b>Entête (1 ligne) :</b> "date ; pluie"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA HH:MM:SS ; valeur"</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AixDebitHauteur">
+        <li><b>Entête (1 ligne) :</b> "Date ; Hauteur(cm) ; débit(m3/s) ; Tarage"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA HH:MM ; valeur ; valeur ; numéro de la courbe"</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -99.9 pour la hauteur ; -99 pour le débit ; NA pour le tarage. La colonne Tarage est
+            inexploitée par BDOH.
+        </li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyChimie">
+        <li><b>Entête (2 lignes) :</b>
+            <ul>
+                <li>"! nom fichier"</li>
+                <li>"! code station ; date_debut ; heure_debut ; date_fin ; heure_fin ; nom_chronique (n fois) ; commentaire"</li>
+            </ul>
+        </li>
+        <li><b>Données :</b> "valeur ; JJ/MM/AAAA ; HH:MM ; JJ/MM/AAAA ; HH:MM ; valeur (n fois) ; commentaire"</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9999</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyHuml2x">
+        <li><b>Entête (1 ligne) :</b> "!Date ; heure ; Theta1 ; Theta2 ; power ; code_validite"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA ; HH:MM ; v1 ; v2 ; v3 ; code de 0 à 3"</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9999. La colonne "power" n'est pas traitée par BDOH.</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyHutdr">
+        <li><b>Entête (1 ligne) :</b> Inexploité.</li>
+        <li><b>Données :</b> Champs de taille fixe. Généralement 10, mais parfois 24. Dans les champs d'intérêt :
+            <ul>
+                <li>le 3<sup>ème</sup> champ est le nom de la station ; le 9<sup>ème</sup> champ est le numéro de la voie. L'association des
+                    deux définit une chronique ;
+                </li>
+                <li>le 14<sup>ème</sup> champ est dateHeure, au format JJ/MM/AAAA (H)H:MM:SS ;</li>
+                <li>le 4<sup>ème</sup> champ est la valeur</li>
+                <li>le 15<sup>ème</sup> champ est la qualité ; ne sont constatées que 0 ou -9999.</li>
+            </ul>
+            Les autres champs sont inexploités par BDOH.
+        <li><b>Valeurs manquantes ou spéciales :</b> -9.999, -9999.</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyMeteoJournalier">
+        <li><b>Entête (1 ligne) :</b> "!Date ; NomParametre (unite) (n fois)"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA ; valeur (n fois)</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9999</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyMeteoHoraire">
+        <li><b>Entête (1 ligne) :</b> "!Date ; Heure UTC ; NomParametre (unite) (n fois)"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA ; HH UTC ; valeur (n fois)</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9999</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyPiezo">
+        <li><b>Entête (1 ligne) :</b> "!Date ; Heure ; Profondeur (mm) ; Code_qualité"</li>
+        <li><b>Données :</b> "JJ/MM/AAAA ; HH:MM ; valeur (négative) ; code de 0 à 3"</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9999</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="AntonyPluie">
+        <li><b>Entête (1 ligne) :</b> "!DateHeure ; P_brute (mm) ; Lacune ; P_Reconst (mm) ; Nb_Ref"</li>
+        <li><b>Données (horaire) :</b> "AAAA/MM/JJ HH:MM ; valeur ; 0 ou 1 ; valeur ; nombre"</li>
+        <li><b>Données (journalière) :</b> "AAAA/MM/JJ ; valeur ; 0 ou 1 ; valeur ; nombre"</li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -9.999 ; 1 pour Lacune ; BDOH ne conserve que P_Reconst.</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="GrenobleDom">
+        {{ 'measure.import.formats.GrenobleDom'|trans|raw }}
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="LyonBiche">
+        <li>
+            <b>Entête (10 ou 11 lignes) :</b>
+            Séparateur ';' BDOH n'utilise que le Code Station, attendu en 2ème ligne
+            et le Fuseau horaire, attendu selon les cas en 9ème ou 10ème ligne.
+        </li>
+        <li>
+            <b>Données :</b> "JJ/MM/AAAA HH:MM:SS ; valeur ; qualité".<br>
+            La ligne contient éventuellement des ";" surnuméraires.
+        </li>
+        <li><b>Valeurs manquantes ou spéciales :</b> -999.</li>
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="Bdoh">
+        {{ 'measure.import.formats.Bdoh'|trans|raw }}
+    </ul>
+
+    <!-- =================================================================== -->
+    <ul name="BdohPlage">
+        {{ 'measure.import.formats.BdohPlage'|trans|raw }}
+    </ul>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/layout.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dce7b148991e932b0522a8e5d7c2d6f59899c5b3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/layout.html.twig
@@ -0,0 +1,32 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('admin.measuresImport'|trans) }}
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/measure-import.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/measure-import.css') }}"/>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'admin.measuresImport'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+
+    <h1>{{ 'admin.measuresImport'|trans }}</h1>
+
+    <div id="measure-import">
+        {% block step %}{% endblock %}
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step1.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step1.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f9745445740e013218127604bd3761e9dfe232c3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step1.html.twig
@@ -0,0 +1,61 @@
+{% import '::macros.html.twig' as macros %}
+{% extends 'IrsteaBdohAdminBundle:MeasureImport:layout.html.twig' %}
+
+{% block step %}
+
+    <!-- The steps of measures import -->
+    <p><h2>{{ 'measure.import.step.1'|trans }}</h2></p>
+    <p><h2 class="inactive">{{ 'measure.import.step.2'|trans }}</h2></p>
+    <p><h2 class="inactive">{{ 'measure.import.step.3'|trans }}</h2></p>
+    <p><h2 class="inactive" style="margin-bottom:1em;">{{ 'measure.import.step.4'|trans }}</h2></p>
+
+
+    <form class="form-inline" name="main" action="{{ path('bdoh_admin_measure_import_step2') }}"
+          method="post" enctype="multipart/form-data">
+
+        <!-- Some information -->
+        <div class="alert alert-block alert-info">
+            <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+            <ul>
+                <li>{{ 'measure.import.help.quitWarning'|trans|raw }}</li>
+                <li>{{ 'measure.import.help.file.onlyOneStation'|trans|raw }}</li>
+                <li>{{ 'measure.import.help.file.bigInZip'|trans|raw }}</li>
+                <li>{{ 'measure.import.help.file.sizeLimit'|trans|raw }}</li>
+            </ul>
+
+            <!-- Format description -->
+            {% include 'IrsteaBdohAdminBundle:MeasureImport:format-descriptions.html.twig' %}
+        </div>
+
+        <!-- Form -->
+
+        <!-- File format -->
+        <div class="form-group" style="margin-right:1em;">
+            <label for="file-format">{{ 'format'|trans }}</label>&nbsp;
+            <select id="file-format" name="file-format" class="form-control">
+                <option selected></option>
+                {% for format in fileFormats %}
+                    <option value="{{ format }}">{{ ('import.'~format)|trans }}</option>
+                {% endfor %}
+            </select>
+        </div>
+
+        <!-- File -->
+        <label>{{ 'file'|trans }}</label>&nbsp;
+
+        <div class="form-group">
+            <input id="file-import" name="file" type="file"/>
+        </div>
+
+        <div class="form-group">
+            {{ macros.submit }}
+        </div>
+
+        <!-- Progress bar : displayed only when uploading a file -->
+        <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+            <div class="progress-bar"></div>
+        </div>
+
+    </form>
+
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2-askStation.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2-askStation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..253447feeebb7ac63798f014f9a6dd1e442af600
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2-askStation.html.twig
@@ -0,0 +1,25 @@
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_measure_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<!-- The steps of measures import -->
+<p><h2><span class="inactive">{{ 'measure.import.step.1'|trans }}</span></h2></p>
+<p><h2>{{ 'measure.import.step.2'|trans }}</h2></p>
+<p><h2 class="inactive">{{ 'measure.import.step.3'|trans }}</h2></p>
+<p><h2 class="inactive" style="margin-bottom:1em;">{{ 'measure.import.step.4'|trans }}</h2></p>
+
+<form class="form-inline" name="main" action="{{ path('bdoh_admin_measure_import_step2_next') }}" method="post">
+
+    <!-- Station -->
+    <label for="selectStationIdstep2">{{ 'station'|trans }}</label>&nbsp;
+    <select id="selectStationIdstep2" class="form-control" name="station" style="margin-right:1em;">
+        <option selected></option>
+        {% for station in stations %}
+            <option value="{{ station.code }}">{{ station }}</option>
+        {% endfor %}
+    </select>
+
+    {{ macros.submit }}
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..79761ea62f1bdccbf34a18962e71a21f9a1495d3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step2.html.twig
@@ -0,0 +1,94 @@
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_measure_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<!-- The steps of measures import -->
+<p><h2><span class="inactive">{{ 'measure.import.step.1'|trans }}</span></h2></p>
+<p><h2>{{ 'measure.import.step.2'|trans }}</h2></p>
+<p><h2 class="inactive">{{ 'measure.import.step.3'|trans }}</h2></p>
+<p><h2 class="inactive" style="margin-bottom:1em;">{{ 'measure.import.step.4'|trans }}</h2></p>
+
+<hr/>
+
+<form class="form-horizontal" name="main" action="{{ path('bdoh_admin_measure_import_step3') }}" method="post">
+
+    <!-- Station -->
+    <div class="form-group">
+        <label class="control-label">{{ 'station'|trans }}</label>
+        <div class="controls controls-text">{{ station }}</div>
+    </div>
+
+    <!-- Timezone -->
+    <div class="form-group">
+        <label class="control-label">{{ 'timezone'|trans }}</label>
+        {% if timezone %}
+            <div class="controls controls-text">{{ timezone }}</div>
+        {% else %}
+            <div class="controls">
+                <div class="input-group col-md-3">
+                    <span class="input-group-addon">UTC</span>
+
+                    <select class="form-control" name="timezone">
+                        <option selected></option>
+                        {% for hour in 0..12 %}
+                            <option value="+{{ hour }}">+{{ "%02d"|format(hour) }}</option>
+                        {% endfor %}
+                        {% for hour in 1..12 %}
+                            <option value="-{{ hour }}">&minus;{{ "%02d"|format(hour) }}</option>
+                        {% endfor %}
+                    </select>
+                </div>
+            </div>
+        {% endif %}
+    </div>
+
+    <!-- Chronique(s) -->
+    <div name="chroniques" class="form-group">
+        {# All 'chroniques' read #}
+        {% if chroniques %}
+            <label class="control-label">{{ 'measure.import.timeSeries'|trans }}</label>
+            <div class="controls controls-text">
+                <ol>
+                    {% for chronique in chroniques %}
+                        <li name="{{ chronique.code }}">{{ chronique }}</li>
+                    {% endfor %}
+                </ol>
+            </div>
+
+            {# No 'chronique' read #}
+        {% else %}
+            {# Info #}
+            <div class="alert alert-info alert-block">
+                {{ 'measure.import.help.chroniquesBox'|trans|raw }}
+            </div>
+            {# Columns list #}
+            <div name="out" class="well col-md-11" style="margin-left:0;">
+                <div><strong>{{ 'measure.import.fileColumns'|trans }}</strong></div>
+            </div>
+            {# 'Chroniques' list #}
+            <div name="in" class="well col-md-offset-1 col-md-11 pull-right">
+                <div><strong>{{ chroniquesBoxTxt }}</strong></div>
+            </div>
+        {% endif %}
+    </div>
+
+    {{ macros.submit }}
+
+    <div id="modalStep2" class="modal fade" tabindex="-1" role="dialog">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h2>{{ 'measure.import.analysisInProgress'|trans }}</h2>
+                </div>
+                <div class="modal-body" style="text-align:center;">
+                    <h2>{{ 'measure.import.canTakeAWhile'|trans }}</h2>
+                    <p>{{ 'measure.import.pleaseWait'|trans }}</p>
+                    <p><img src="{{ asset('/images/loader.gif') }}"/></p>
+                </div>
+            </div><!-- /.modal-content -->
+        </div><!-- /.modal-dialog -->
+    </div>
+
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3-info-and-validation.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3-info-and-validation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e7ed6835e84fa34f0c352a7f1691a187e5448cd3
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3-info-and-validation.html.twig
@@ -0,0 +1,144 @@
+<!-- Tab of information and validation form -->
+<div>
+    <!-- Overlap -->
+    <div class="alert alert-warning col-md-3" style="padding:10px 0 5px;text-align:center;">
+        <h4 class="alert-heading">
+            {{ 'overlap'|trans }}
+            <i class="overlapHelp fam-help" data-original-title="{{ 'overlap'|trans }}"
+               data-content="{{ ('measure.import.help.overlap.' ~ chroniqueData.overlap) | trans }}" style="vertical-align:-3px;">
+            </i>
+        </h4>
+        <img src="{{ asset('images/admin/overlap_' ~ chroniqueData.overlap ~ '.png') }}"/>
+    </div>
+
+    <div class="col-md-21">
+        <!-- 'Chronique' information -->
+        <div class="col-md-24">
+            <p class="import-title"><strong>{{ 'existing'|trans }}</strong></p>
+
+            <!-- Dates of first and last existing measures -->
+
+            <div class="col-md-12">
+                <strong>{{ 'begin'|trans }}{{ 'deux_points'|trans }} </strong>
+                <span style="color:red;">
+                    {{ chroniqueData.existingFirstDate ? (chroniqueData.existingFirstDate | date('transformation.bareme.dateBareme'|trans, false)) : ('empty'|trans) }}
+                </span>
+            </div>
+            <!-- 'minimum valide' and 'maximum valide' -->
+            <div class="col-md-12">
+                <strong>{{ 'minimumValide'|trans }}{{ 'deux_points'|trans }} </strong>
+                {{ chronique.minimumValide | default(('empty'|trans)) }}
+            </div>
+
+            <div class="col-md-12">
+                <strong>{{ 'end'|trans }}{{ 'deux_points'|trans }} </strong>
+                <span style="color:red;">
+                    {{ chroniqueData.existingLastDate ? (chroniqueData.existingLastDate | date('transformation.bareme.dateBareme'|trans, false)) : ('empty'|trans) }}
+                </span>
+            </div>
+            <!-- 'minimum valide' and 'maximum valide' -->
+            <div class="col-md-12">
+                <strong>{{ 'maximumValide'|trans }}{{ 'deux_points'|trans }} </strong>
+                {{ chronique.maximumValide | default('empty'|trans) }}
+            </div>
+
+            <div class="col-md-12"><em>{{ 'UTC(in)'|trans }}</em></div>
+
+
+            <!-- 'minimum valide' and 'maximum valide' -->
+        </div>
+        <!-- END_'Chronique' information -->
+
+        <div class="col-md-24">
+            <hr/>
+        </div>
+
+        <!-- Import information -->
+        <div class="col-md-24">
+            <p class="import-title"><strong>{{ 'import'|trans }}</strong></p>
+
+            <!-- Dates of first and last measures to import -->
+            <div class="col-md-24">
+                <strong>{{ 'begin'|trans }}{{ 'deux_points'|trans }} </strong>
+                <span style="color:green;">
+                    {{ chroniqueData.importerFirstDate | date('transformation.bareme.dateBareme'|trans, false) }}
+                </span>
+            </div>
+
+            <div class="col-md-24">
+                <strong>{{ 'end'|trans }}{{ 'deux_points'|trans }} </strong>
+                <span style="color:green;">
+                    {{ chroniqueData.importerLastDate | date('transformation.bareme.dateBareme'|trans, false) }}
+                </span>
+            </div>
+
+            <div class="col-md-24">
+                <em>{{ 'measure.import.help.timezoneToUTC'|trans }}</em>
+            </div>
+        </div>
+
+        <!-- "Too small" and "too large" measures -->
+        {% set tooSmall %}
+            {{ 'measure.import.valeurTooSmall(%first%,%last%,%count%)'|transchoice(
+            chroniqueData.valeurTooSmall.count, {
+                '%first%' : chroniqueData.valeurTooSmall.first|date('transformation.bareme.dateBareme'|trans, false),
+                '%last%'  : chroniqueData.valeurTooSmall.last |date('transformation.bareme.dateBareme'|trans, false),
+                '%count%' : chroniqueData.valeurTooSmall.count
+            })|raw }}
+        {% endset %}
+
+        {% set tooLarge %}
+            {{ 'measure.import.valeurTooLarge(%first%,%last%,%count%)'|transchoice(
+            chroniqueData.valeurTooLarge.count, {
+                '%first%' : chroniqueData.valeurTooLarge.first|date('transformation.bareme.dateBareme'|trans, false),
+                '%last%'  : chroniqueData.valeurTooLarge.last |date('transformation.bareme.dateBareme'|trans, false),
+                '%count%' : chroniqueData.valeurTooLarge.count
+            })|raw }}
+        {% endset %}
+
+        <div class="col-md-24">
+            <ul>
+                {% if chroniqueData.valeurTooSmall.count > 0 %}
+                    <li>{{ tooSmall }}</li>{% endif %}
+                {% if chroniqueData.valeurTooLarge.count > 0 %}
+                    <li>{{ tooLarge }}</li>{% endif %}
+            </ul>
+        </div>
+
+    </div>
+    <!-- END_Import information -->
+
+    <!-- Validation form -->
+    <div class="col-md-24 alert alert-warning" style="margin-top:0.5em;">
+        <h4 class="alert-heading">{{ 'measure.import.question.importType'|trans }}</h4>
+
+        <input type="radio" name="{{ importTypeName }}" value="doNotImport" id="{{ doNotImportId }}">
+        <label for="{{ doNotImportId }}">{{ 'measure.import.action.doNotImport'|trans }}</label>
+        <br>
+
+        {# No overlap => easiest choices #}
+        {% if chroniqueData.overlap in ['before', 'after', 'new'] %}
+            <input type="radio" name="{{ importTypeName }}" value="keepExisting" id="{{ keepExistingId }}">
+            <label for="{{ keepExistingId }}">{{ 'measure.import.action.doImport'|trans }}</label>
+            <br>
+        {# Overlap => all choices #}
+        {% else %}
+            <input type="radio" name="{{ importTypeName }}" value="keepExisting" id="{{ keepExistingId }}">
+            <label for="{{ keepExistingId }}">{{ 'measure.import.action.keepExisting'|trans }}</label>
+            <br>
+            <input type="radio" name="{{ importTypeName }}" value="overwriteExisting" id="{{ overwriteExistingId }}">
+            <label for="{{ overwriteExistingId }}">{{ 'measure.import.action.overwriteExisting'|trans }}</label>
+            <br>
+        {% endif %}
+    </div>
+    <!-- Children list -->
+    {% if chroniqueData.hasChildren %}
+    <div class="col-md-24 alert alert-info">
+        <strong>{{ 'measure.import.info.children(%count%)'|transchoice(chroniqueData.childrenCount, {'%count%' : chroniqueData.childrenCount}) }}
+            <i class="childrenHelp fam-help" data-original-title="{{ 'measure.import.help.children'|transchoice(chroniqueData.childrenCount) }}" data-content="{{ chroniqueData.childrenList }}"></i>
+        </strong>
+    </div>
+    {% endif %}
+    <!-- END_Validation form -->
+</div>
+<!-- END_Tab of information and validation form -->
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..722e51beb466d43d69dc496765b3734d1f81499c
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step3.html.twig
@@ -0,0 +1,69 @@
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_measure_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<!-- The steps of measures import -->
+<p><h2><span class="inactive">{{ 'measure.import.step.1'|trans }}</span></h2></p>
+<p><h2 class="inactive">{{ 'measure.import.step.2'|trans }}</h2></p>
+<p><h2>{{ 'measure.import.step.3'|trans }}</h2></p>
+<p><h2 class="inactive" style="margin-bottom:1em;">{{ 'measure.import.step.4'|trans }}</h2></p>
+
+
+<form class="form-inline" name="main" action="{{ path('bdoh_admin_measure_import_step4') }}" method="post">
+
+    {# For each 'chronique' : displays information, validation form and viewer #}
+    {% for chroniqueData in chroniques %}
+
+        {% set chronique           = chroniqueData.chronique %}
+        {% set prefix              = chronique.id ~ '-' %}
+        {% set informationId       = prefix ~ 'information' %}
+        {% set viewerId            = prefix ~ 'viewer' %}
+
+        {# Variables for validation form #}
+        {% set importTypeName      = 'importTypes[' ~ chronique.id ~ ']' %}
+        {% set doNotImportId       = prefix ~ 'doNotImport' %}
+        {% set keepExistingId      = prefix ~ 'keepExistingId' %}
+        {% set overwriteExistingId = prefix ~ 'overwriteExistingId' %}
+
+        <div class="panel panel-default">
+            <!-- Header -->
+            <div class="panel-heading">
+                <h3>{{ chronique }}</h3>
+                <strong>{{ macros.i18nEntityLabel(chronique, 'libelle') }}</strong> <em>[{{ chronique.unite }}]</em>
+                <a data-toggle="collapse" class="dropdown-toggle import-title pull-right" href="#{{- informationId -}}"><b class="caret"></b> {{ 'information'|trans }}</a>
+            </div>
+
+            <!-- Tabs content -->
+            <div class="panel-body panel-collapse collapse in" id="{{- informationId -}}">
+                {% include 'IrsteaBdohAdminBundle:MeasureImport:step3-info-and-validation.html.twig' %}
+            </div>
+        </div>
+    {% endfor %}
+
+    {% if hasChildrenGlobal %}
+        <div class="col-md-24 alert alert-warning">
+            <input type="checkbox" checked="checked" name="propagate" value="propagate" id="propagateId" style="vertical-align:-3px;">
+            <label for="propagateId">{{ 'measure.import.question.computeChildren'|transchoice(childrenCountGlobal) }}</label>
+        </div>
+    {% endif %}
+
+    {{ macros.submit(('validate'|trans)~' '~('import(the)'|trans)) }}
+
+    <div id="modalStep3" class="modal fade" tabindex="-1" role="dialog">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h2>{{ 'measure.import.analysisInProgress'|trans }}</h2>
+                </div>
+                <div class="modal-body" style="text-align:center;">
+                    <h2>{{ 'measure.import.canTakeAWhile'|trans }}</h2>
+                    <p>{{ 'measure.import.pleaseWait'|trans }}</p>
+                    <p><img src="{{ asset('/images/loader.gif') }}"/></p>
+                </div>
+            </div><!-- /.modal-content -->
+        </div><!-- /.modal-dialog -->
+    </div>
+
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step4.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step4.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9e62e54866d42f76d1c758504bb4288085bd0f4a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/MeasureImport/step4.html.twig
@@ -0,0 +1,46 @@
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+<!-- The steps of measures import -->
+<p><h2 class="inactive">{{ 'measure.import.step.1'|trans }}</h2></p>
+<p><h2 class="inactive">{{ 'measure.import.step.2'|trans }}</h2></p>
+<p><h2 class="inactive">{{ 'measure.import.step.3'|trans }}</h2></p>
+<p><h2 style="margin-bottom:1em;">{{ 'measure.import.step.4'|trans }}</h2></p>
+
+{% if stats is not empty %}
+    <table class="table well">
+        <thead>
+        <tr>
+            <th>{{ 'measure.import.timeSeries'|trans }}</th>
+            <th>{{ 'measure.import.info.measuresInsert'|trans }}</th>
+            <th>{{ 'measure.import.info.measuresDelete'|trans }}</th>
+        </tr>
+        </thead>
+        <tbody>
+        {% set hasInserts = 0 %}
+        {% for chroniqueTxt, stat in stats %}
+            <tr>
+                <td>{{ macros.chronique_view(stat.entity, chroniqueTxt, 'text') }}</td>
+                <td>{{ stat.insert }}</td>
+                <td>{{ stat.delete }}</td>
+                {% set hasInserts = hasInserts + stat.insert %}
+            </tr>
+        {% endfor %}
+        </tbody>
+    </table>
+
+    {# If there were any inserts on 'ChroniqueContinue' => displays a warning #}
+    {% if hasInserts > 0 and chroniqueType == 'Continue' %}
+        <div class="alert alert-info">
+            {{ 'measure.import.info.computingOfFillingRates'|trans|raw }}
+            {% if is_granted('JOB_LIST', currentObservatoire()) %}
+                <br/>{{ 'measure.import.info.jobPage(%jobPageLink%)'|trans({'%jobPageLink%':jobPageLink})|raw }}
+            {% endif %}
+        </div>
+    {% endif %}
+{% else %}
+    {{ 'measure.import.info.noMeasuresImported'|trans }}
+{% endif %}
+
+
+<a href="{{ path('bdoh_admin_measure_import') }}" class="btn btn-default">{{ 'measure.import.action.newImport'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn btn-default">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/errors.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/errors.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8eb9805cb4904db64322122277c272d93e69f211
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/errors.html.twig
@@ -0,0 +1,18 @@
+<div class="alert alert-block alert-danger">
+    <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+    <ul>
+        {% for error in errors %}
+            <li>{{ error|raw }}</li>
+        {% endfor %}
+    </ul>
+</div>
+
+<div class="alert alert-block alert-info">
+    <h4 class="alert-heading">
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i>{{ idImporter|trans }}</i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+    {% include 'IrsteaBdohAdminBundle:ShapeImport:format-descriptions.html.twig' %}
+</div>
+
+<a href="{{ path('bdoh_admin_shape_import') }}" class="btn btn-danger">{{ 'restart'|trans }} {{ 'import(the)'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/format-descriptions.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/format-descriptions.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cb28f22c8966636221acde1ccbc8e690550a8194
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/format-descriptions.html.twig
@@ -0,0 +1,17 @@
+<div id="format-description">
+
+    <h4 class="alert-heading">
+        <hr>
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i></i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+
+    <ul name="bassin">
+        {{ 'shape.import.format.bassin'|trans|raw }}
+    </ul>
+    <ul name="coursEau">
+        {{ 'shape.import.format.coursEau'|trans|raw }}
+    </ul>
+    <ul name="station">
+        {{ 'shape.import.format.station'|trans|raw }}
+    </ul>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/layout.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1cc046e6cf13312cad8be5400e71ef2ebf3edefe
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/layout.html.twig
@@ -0,0 +1,31 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('admin.shapeImport'|trans) }}
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/shape-import.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/shape-import.css') }}" />
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'admin.shapeImport'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <h1>{{ 'shape.import.title'|trans }}</h1>
+
+    <div id="shape-import">
+        {% block step %}{% endblock %}
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step1.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step1.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d9fc754be726548937b46102510c219e9b4bcf4a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step1.html.twig
@@ -0,0 +1,50 @@
+{% import '::macros.html.twig' as macros %}
+{% extends 'IrsteaBdohAdminBundle:ShapeImport:layout.html.twig' %}
+
+{% block step %}
+
+    <h2>{{ 'shape.import.step.1'|trans }}</h2>
+    <h2 class="inactive">{{ 'shape.import.step.2'|trans }}</h2>
+    <h2 class="inactive" style="margin-bottom:1em;">{{ 'shape.import.step.3'|trans }}</h2>
+
+    <form class="form-inline" name="import" action="{{ path('bdoh_admin_shape_import_step2') }}"
+          method="post" enctype="multipart/form-data">
+
+        <div class="alert alert-block alert-info">
+            <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+            <ul>
+                <li>{{ 'shape.import.help.quitWarning'|trans|raw }}</li>
+                <li>{{ 'shape.import.help.file.shape'|trans|raw }}</li>
+                <li>{{ 'shape.import.help.requiredProjection'|trans|raw }}</li>
+                <li>{{ 'shape.import.help.sizeLimit'|trans|raw }}</li>
+            </ul>
+
+            {% include 'IrsteaBdohAdminBundle:ShapeImport:format-descriptions.html.twig' %}
+        </div>
+
+        <div class="form-group" style="margin-right:1em;">
+            <label for="file-shape">{{ 'format'|trans }}</label>&nbsp;
+            <select id="file-shape" name="file-shape" class="form-control">
+                <option selected></option>
+                {% for shape in fileShapes %}
+                    <option value="{{ shape }}">{{ (shape)|trans }}</option>
+                {% endfor %}
+            </select>
+        </div>
+
+        <label>{{ 'file'|trans }}</label>&nbsp;
+        <div class="form-group">
+            <input id="file" name="file" type="file"/>
+        </div>
+
+        <div class="form-group">
+            {{ macros.submit }}
+        </div>
+
+        <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+            <div class="progress-bar"></div>
+        </div>
+
+    </form>
+
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-bassin.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-bassin.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4127359a879458aa00213c8602d2efd82927d849
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-bassin.html.twig
@@ -0,0 +1,181 @@
+{% set fontNew="panel-success" %}
+{% set fontExisting="panel-warning" %}
+{% set fontNopeStation="panel-danger" %}
+{% set showNew="" %}
+{% set showExisting="" %}
+{% set showNopeStation="" %}
+{% set collapseNew="collapsed" %}
+{% set collapseExisting="collapsed" %}
+{% set collapseNopeStation="collapsed" %}
+
+{% if shapeData.countNew > 0 %}
+    {% set showNew="in" %}
+    {% set collapseNew="" %}
+{% endif %}
+{% if shapeData.countExisting > 0 and showNew == "" %}
+    {% set showExisting="in" %}
+    {% set collapseExisting="" %}
+{% endif %}
+{% if shapeData.countNopeStation > 0 and showNew == "" and showExisting == "" %}
+    {% set showNopeStation="in" %}
+    {% set collapseNopeStation="" %}
+{% endif %}
+
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_shape_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<h2 class="inactive">{{ 'shape.import.step.1'|trans }}</h2>
+<h2>{{ 'shape.import.step.2'|trans }}</h2>
+<h2 class="inactive" style="margin-bottom:1em;">{{ 'shape.import.step.3'|trans }}</h2>
+
+<form class="form-inline" name="import" action="{{ path('bdoh_admin_shape_import_step3') }}" method="post">
+
+    <div class="panel panel-default">
+
+        <div class="panel-heading">
+            <h3>{{ 'shape.import.info.title'|trans }} {{ 'open_quote'|trans }}<i>{{ shapeData.cible|trans }}</i>{{ 'close_quote'|trans }}</h3>
+        </div>
+
+        <div class="panel-body">
+
+            {# nouveaux bassins #}
+            {% if shapeData.countNew > 0 %}
+                <div class="panel {{ fontNew }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseNew }}" data-toggle="collapse" href="#collapseOne">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.bassin.new'|transchoice(shapeData.countNew) }}{{ 'deux_points'|trans }} {{ shapeData.countNew }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseOne" class="panel-collapse collapse {{ showNew }}">
+                        <div class="panel-body">
+                            {% for bassin in shapeData.new %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.nom'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.nom }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'surface'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.aire }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStationExutoire'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.code_exu }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# bassins existants #}
+            {% if shapeData.countExisting > 0 %}
+                <div class="panel {{ fontExisting }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseExisting }}" data-toggle="collapse" href="#collapseTwo">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.bassin.existing'|transchoice(shapeData.countExisting) }}{{ 'deux_points'|trans }} {{ shapeData.countExisting }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseTwo" class="panel-collapse collapse {{ showExisting }}">
+                        <div class="panel-body">
+                            {% for bassin in shapeData.existing %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.nom'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.nom }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'surface'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.aire }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStationExutoire'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.code_exu }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# station exutoire inconnue #}
+            {% if shapeData.countNopeStation > 0 %}
+                <div class="panel {{ fontNopeStation }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseNopeStation }}" data-toggle="collapse" href="#collapseThree">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.bassin.nopeStation'|transchoice(shapeData.countNopeStation) }} {{ 'shape.import.info.wontupload'|trans|raw }}{{ 'deux_points'|trans }} {{ shapeData.countNopeStation }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseThree" class="panel-collapse collapse {{ showNopeStation }}">
+                        <div class="panel-body">
+                            {% for bassin in shapeData.nopeStation %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.nom'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.nom }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'surface'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.aire }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStationExutoire'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ bassin.code_exu }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# choix d'import #}
+            {% if shapeData.countNew > 0 or shapeData.countExisting > 0 %}
+                <div class="col-md-24 alert alert-warning">
+                    <h4 class="alert-heading">{{ 'shape.import.question.importType'|trans }}</h4>
+
+                    {# ne pas importer #}
+                    <input type="radio" name="shapeImportType" value="doNotImport" id="doNotImport">
+                    <label for="doNotImport">{{ 'shape.import.action.doNotImport'|trans }}</label>
+                    <br>
+
+                    {# que des nouveaux bassins -> keepExisting #}
+                    {% if shapeData.countNew > 0 and shapeData.countExisting == 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.doImport'|trans }}</label>
+                        <br>
+                    {# que des bassins existants -> overwriteExisting #}
+                    {% elseif shapeData.countNew == 0 and shapeData.countExisting > 0 %}
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.replace'|trans }}</label>
+                        <br>
+                    {# les deux #}
+                    {% elseif  shapeData.countNew > 0 and shapeData.countExisting > 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.keepExisting'|trans }}</label>
+                        <br>
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.overwriteExisting'|trans }}</label>
+                        <br>
+                    {% endif %}
+                </div>
+            {% else %}
+                {# pas de données à importer -> alerte #}
+                <div class="col-md-24 alert alert-danger">
+                    <strong>{{ 'shape.import.info.noPossibleImport'|trans }}</strong>
+                </div>
+            {% endif %}
+
+        </div> {# panel-body #}
+    </div> {# panel #}
+
+    {% if shapeData.countNew > 0 or shapeData.countExisting > 0 %}
+        {{ macros.submit(('validate'|trans)~' '~('import(the)'|trans)) }}
+    {% endif %}
+
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-courseau.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-courseau.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..70fda0af1055b987f99ab887f6aab4b01d7183d8
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-courseau.html.twig
@@ -0,0 +1,143 @@
+{% set fontNew="panel-success" %}
+{% set fontExisting="panel-warning" %}
+{% set showNew="" %}
+{% set showExisting="" %}
+{% set collapseNew="collapsed" %}
+{% set collapseExisting="collapsed" %}
+
+{% if shapeData.countNew > 0 %}
+    {% set showNew="in" %}
+    {% set collapseNew="" %}
+{% endif %}
+{% if shapeData.countExisting > 0 and showNew == "" %}
+    {% set showExisting="in" %}
+    {% set collapseExisting="" %}
+{% endif %}
+
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_shape_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<h2 class="inactive">{{ 'shape.import.step.1'|trans }}</h2>
+<h2>{{ 'shape.import.step.2'|trans }}</h2>
+<h2 class="inactive" style="margin-bottom:1em;">{{ 'shape.import.step.3'|trans }}</h2>
+
+<form class="form-inline" name="import" action="{{ path('bdoh_admin_shape_import_step3') }}" method="post">
+
+    <div class="panel panel-default">
+
+        <div class="panel-heading">
+            <h3>{{ 'shape.import.info.title'|trans }} {{ 'open_quote'|trans }}<i>{{ shapeData.cible|trans }}</i>{{ 'close_quote'|trans }}</h3>
+        </div>
+
+        <div class="panel-body">
+
+            {# nouveaux cours d'eau (selon le nom) #}
+            {% if shapeData.countNew > 0 %}
+                <div class="panel {{ fontNew }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseNew }}" data-toggle="collapse" href="#collapseOne">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.courseau.new'|transchoice(shapeData.countNew) }} {{ 'shape.import.help.courseau.nom'|trans }}{{ 'deux_points'|trans }} {{ shapeData.countNew }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseOne" class="panel-collapse collapse {{ showNew }}">
+                        <div class="panel-body">
+                            {% for river in shapeData.new %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.nom'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.toponyme }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'codeHydro'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.code_hydro }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'classifica'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.classifica }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# cours d'eau existants (selon le nom) #}
+            {% if shapeData.countExisting > 0 %}
+                <div class="panel {{ fontExisting }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseExisting }}" data-toggle="collapse" href="#collapseTwo">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.courseau.existing'|transchoice(shapeData.countExisting) }} {{ 'shape.import.help.courseau.nom'|trans }}{{ 'deux_points'|trans }} {{ shapeData.countExisting }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseTwo" class="panel-collapse collapse {{ showExisting }}">
+                        <div class="panel-body">
+                            {% for river in shapeData.existing %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.nom'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.toponyme }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'codeHydro'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.code_hydro }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'classifica'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ river.classifica }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# choix d'import #}
+            {% if shapeData.countNew > 0 or shapeData.countExisting > 0 %}
+                <div class="col-md-24 alert alert-warning">
+                    <h4 class="alert-heading">{{ 'shape.import.question.importType'|trans }}</h4>
+
+                    {# ne pas importer #}
+                    <input type="radio" name="shapeImportType" value="doNotImport" id="doNotImport">
+                    <label for="doNotImport">{{ 'shape.import.action.doNotImport'|trans }}</label>
+                    <br>
+
+                    {# que des nouveaux cours d'eau -> keepExisting #}
+                    {% if shapeData.countNew > 0 and shapeData.countExisting == 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.doImport'|trans }}</label>
+                        <br>
+                    {# que des cours d'eau existants -> overwriteExisting #}
+                    {% elseif shapeData.countNew == 0 and shapeData.countExisting > 0 %}
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.replace'|trans }}</label>
+                        <br>
+                    {# les deux #}
+                    {% elseif  shapeData.countNew > 0 and shapeData.countExisting > 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.keepExisting'|trans }}</label>
+                        <br>
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.overwriteExisting'|trans }}</label>
+                        <br>
+                    {% endif %}
+                </div>
+            {% else %}
+                {# pas de données à importer -> alerte #}
+                <div class="col-md-24 alert alert-danger">
+                    <strong>{{ 'shape.import.info.noPossibleImport'|trans }}</strong>
+                </div>
+            {% endif %}
+
+        </div> {# panel-body #}
+    </div> {# panel #}
+
+    {% if shapeData.countNew > 0 or shapeData.countExisting > 0 %}
+        {{ macros.submit(('validate'|trans)~' '~('import(the)'|trans)) }}
+    {% endif %}
+
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-station.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-station.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6ea1e3a47a55b57ceb3f4434d8752e50b75844d7
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step2-station.html.twig
@@ -0,0 +1,181 @@
+{% set fontExistingWithoutData="panel-success" %}
+{% set fontExistingWithData="panel-warning" %}
+{% set fontNonExisting="panel-danger" %}
+{% set showExistingWithoutData="" %}
+{% set showExistingWithData="" %}
+{% set showNonExisting="" %}
+{% set collapseExistingWithoutData="collapsed" %}
+{% set collapseExistingWithData="collapsed" %}
+{% set collapseNonExisting="collapsed" %}
+
+{% if shapeData.countExistingWithoutData > 0 %}
+    {% set showExistingWithoutData="in" %}
+    {% set collapseExistingWithoutData="" %}
+{% endif %}
+{% if shapeData.countExistingWithData > 0 and showExistingWithoutData == "" %}
+    {% set showExistingWithData="in" %}
+    {% set collapseExistingWithData="" %}
+{% endif %}
+{% if shapeData.countNonExisting > 0 and showExistingWithoutData == "" and showExistingWithData == "" %}
+    {% set showNonExisting="in" %}
+    {% set collapseNonExisting="" %}
+{% endif %}
+
+{% import '::macros.html.twig' as macros %}
+
+<div class="pull-right">
+    {{ macros.cancelForm('bdoh_admin_shape_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+</div>
+
+<h2 class="inactive">{{ 'shape.import.step.1'|trans }}</h2>
+<h2>{{ 'shape.import.step.2'|trans }}</h2>
+<h2 class="inactive" style="margin-bottom:1em;">{{ 'shape.import.step.3'|trans }}</h2>
+
+<form class="form-inline" name="import" action="{{ path('bdoh_admin_shape_import_step3') }}" method="post">
+
+    <div class="panel panel-default">
+
+        <div class="panel-heading">
+            <h3>{{ 'shape.import.info.title'|trans }} {{ 'open_quote'|trans }}<i>{{ shapeData.cible|trans }}</i>{{ 'close_quote'|trans }}</h3>
+        </div>
+
+        <div class="panel-body">
+
+            {# stations existantes SANS données géographies #}
+            {% if shapeData.countExistingWithoutData > 0 %}
+                <div class="panel {{ fontExistingWithoutData }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseExistingWithoutData }}" data-toggle="collapse" href="#collapseOne">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.station.existingWithoutData'|transchoice(shapeData.countExistingWithoutData) }}{{ 'deux_points'|trans }} {{ shapeData.countExistingWithoutData }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseOne" class="panel-collapse collapse {{ showExistingWithoutData }}">
+                        <div class="panel-body">
+                            {% for station in shapeData.existingWithoutData %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStation'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.code }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'latitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.latitude }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'longitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.longitude }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# stations existantes AVEC données géographies #}
+            {% if shapeData.countExistingWithData > 0 %}
+                <div class="panel {{ fontExistingWithData }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseExistingWithData }}" data-toggle="collapse" href="#collapseTwo">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.station.existingWithData'|transchoice(shapeData.countExistingWithData) }}{{ 'deux_points'|trans }} {{ shapeData.countExistingWithData }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseTwo" class="panel-collapse collapse {{ showExistingWithData }}">
+                        <div class="panel-body">
+                            {% for station in shapeData.existingWithData %}
+                                <div class="row">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStation'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.code }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'latitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.latitude }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'longitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.longitude }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# stations inconnues #}
+            {% if shapeData.countNonExisting > 0 %}
+                <div class="panel {{ fontNonExisting }}">
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title {{ collapseNonExisting }}" data-toggle="collapse" href="#collapseThree">
+                            <strong><b class="caret"></b> {{ 'shape.import.help.station.nonExisting'|transchoice(shapeData.countNonExisting) }} {{ 'shape.import.info.wontupload'|trans|raw }}{{ 'deux_points'|trans }} {{ shapeData.countNonExisting }}</strong>
+                        </a>
+                    </div>
+                    <div id="collapseThree" class="panel-collapse collapse {{ showNonExisting }}">
+                        <div class="panel-body">
+                            {% for station in shapeData.nonExisting %}
+                                <div class="col-md-24">
+                                    <div class="col-md-8">
+                                        <strong>{{ 'shape.import.info.codeStation'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.code }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'latitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.latitude }}</span>
+                                    </div>
+                                    <div class="col-md-8">
+                                        <strong>{{ 'longitude'|trans }}{{ 'deux_points'|trans }}</strong>
+                                        <span style="color:green;">{{ station.longitude }}</span>
+                                    </div>
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+
+            {# choix d'import #}
+            {% if shapeData.countExistingWithoutData > 0 or shapeData.countExistingWithData > 0 %}
+                <div class="col-md-24 alert alert-warning">
+                    <h4 class="alert-heading">{{ 'shape.import.question.importType'|trans }}</h4>
+
+                    {# ne pas importer #}
+                    <input type="radio" name="shapeImportType" value="doNotImport" id="doNotImport">
+                    <label for="doNotImport">{{ 'shape.import.action.doNotImport'|trans }}</label>
+                    <br>
+
+                    {# que des stations existantes SANS données géographiques -> keepExisting #}
+                    {% if shapeData.countExistingWithoutData > 0 and shapeData.countExistingWithData == 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.doImport'|trans }}</label>
+                        <br>
+                    {# que des stations existantes AVEC données géographiques -> overwriteExisting #}
+                    {% elseif shapeData.countExistingWithoutData == 0 and shapeData.countExistingWithData > 0 %}
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.replace'|trans }}</label>
+                        <br>
+                    {# les deux #}
+                    {% elseif  shapeData.countExistingWithoutData > 0 and shapeData.countExistingWithData > 0 %}
+                        <input type="radio" name="shapeImportType" value="keepExisting" id="keepExisting">
+                        <label for="keepExisting">{{ 'shape.import.action.keepExisting'|trans }}</label>
+                        <br>
+                        <input type="radio" name="shapeImportType" value="overwriteExisting" id="overwriteExisting">
+                        <label for="overwriteExisting">{{ 'shape.import.action.overwriteExisting'|trans }}</label>
+                        <br>
+                    {% endif %}
+                </div>
+            {% else %}
+                {# pas de données à importer -> alerte #}
+                <div class="col-md-24 alert alert-danger">
+                    <strong>{{ 'shape.import.info.noPossibleImport'|trans }}</strong>
+                </div>
+            {% endif %}
+
+        </div> {# panel-body #}
+    </div> {# panel #}
+
+    {% if shapeData.countExistingWithoutData > 0 or shapeData.countExistingWithData > 0 %}
+        {{ macros.submit(('validate'|trans)~' '~('import(the)'|trans)) }}
+    {% endif %}
+
+</form>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step3.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step3.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..811c4df63487a8cc3e5a5b15fdbbbeaa5cc5512a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/ShapeImport/step3.html.twig
@@ -0,0 +1,27 @@
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+<h2 class="inactive">{{ 'shape.import.step.1'|trans }}</h2>
+<h2 class="inactive">{{ 'shape.import.step.2'|trans }}</h2>
+<h2 style="margin-bottom:1em;">{{ 'shape.import.step.3'|trans }}</h2>
+
+{% if stats is not empty %}
+    <table class="table well">
+        <thead>
+            <tr>
+                <th>{{ 'shape.import.info.shapeInsert'|transchoice(stats[0]) }}</th>
+                <th>{{ 'shape.import.info.shapeUpdate'|transchoice(stats[1]) }}</th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr>
+                <td>{{ stats[0] }}</td>
+                <td>{{ stats[1] }}</td>
+            </tr>
+        </tbody>
+    </table>
+{% else %}
+    {{ 'shape.import.info.noShapeImported'|trans }}
+{% endif %}
+
+<a href="{{ path('bdoh_admin_shape_import') }}" class="btn btn-default">{{ 'shape.import.action.newImport'|trans }}</a>
+<a href="{{ path('bdoh_home') }}" class="btn btn-default">{{ 'backToHome'|trans }}</a>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-modal.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-modal.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d7c33b3df1ab3952c0383c062a6df5d1351936c2
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-modal.html.twig
@@ -0,0 +1,50 @@
+{% import '::macros.html.twig' as macros %}
+
+<!-- The modal for export -->
+<div class="modal-dialog" role="document">
+    <div class="modal-content">
+
+        <!-- Modal header -->
+        <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            <h1 class="modal-title" style="margin-bottom:0;" id="myModalLabel">{{ 'transformation.bareme.export.title' | trans }}</h1>
+        </div>
+
+        <form class="form-inline" id="form-bareme-export" action="{{ path('bdoh_admin_bareme_export') }}" method="post">
+
+            <!-- Modal body -->
+            <div class="modal-body">
+
+                <!-- Some information -->
+                <div class="alert alert-block alert-info" style="margin-bottom:0;">
+                    {{ 'transformation.bareme.export.help'|trans|raw }}
+                </div>
+
+                <div id="table-export-bareme-container" style="visibility:hidden">
+                    {% include 'IrsteaBdohAdminBundle:Transformation:bareme-export-table.html.twig' %}
+                </div>
+
+                <input type="hidden" name="baremes-export-info"/>
+                <input type="hidden" name="child-chronicle-name"/>
+
+                <div class="alert alert-block alert-danger" style="display:none" id="no-bareme-to-export">
+                    <!-- Format description -->
+                    {{ 'transformation.bareme.export.noSelection'|trans|raw }}
+                </div>
+            </div>
+            <!-- END_Modal body -->
+
+            <!-- Modal footer -->
+            <div class="modal-footer">
+
+                <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+                    <div class="progress-bar"></div>
+                </div>
+
+                <!-- Submit and close buttons -->
+                {{ macros.submit('export'|trans) }}
+                <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+            </div>
+        </form>
+    </div>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-table.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cd23f9505413a20a4e7712180b162a759721e59a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-export-table.html.twig
@@ -0,0 +1,20 @@
+<table class="table table-striped" id="table-export-bareme">
+    <thead>
+    <tr>
+        <th>#</th>
+        <th>{{ 'nom'|trans }}</th>
+        <th class="col-md-8">{{ 'dateCreation'|trans }} [{{ 'UTC'|trans }}]</th>
+    </tr>
+    </thead>
+    <tbody>
+    {% for bareme in baremes %}
+        <tr>
+            <td><input type="checkbox" id="check-bareme-{{ bareme.id }}" name="{{ bareme.id }}" style="margin-top:0;"/></td>
+            <td>{{ bareme.nom }}</td>
+            <td class="col-md-8" data-type="num" data-order="{{ bareme.dateCreation|date('U', false) }}">
+                {{ bareme.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}
+            </td>
+        </tr>
+    {% endfor %}
+    </tbody>
+</table>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step2.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step2.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..91f0c8bd4546675a59abefe403803328e4397b85
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step2.html.twig
@@ -0,0 +1,55 @@
+{% import '::macros.html.twig' as macros %}
+
+{% set modalId = 'bareme-import' %}
+
+<div class="modal-dialog" role="document">
+    <div class="modal-content">
+        <!-- Modal header -->
+        <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+            <h1 class="modal-title" style="margin-bottom:0;" id="myModalLabel">{{ 'transformation.bareme.import.title' | trans }}</h1>
+        </div>
+
+        <form class="form-inline" id="form-{{ modalId }}" name="form-{{ modalId }}" action="{{ path('bdoh_admin_bareme_import_step3') }}"
+              accesskey="" accept-charset="" method="post" enctype="multipart/form-data">
+
+            <!-- Modal body -->
+            <div class="modal-body">
+                <div class="pull-right">
+                    {{ macros.cancelForm('bdoh_admin_bareme_import_stop', ('cancel'|trans)~' '~('import(the)'|trans)) }}
+                </div>
+
+                <!-- The steps of controles import -->
+                <h3 style="margin-top:0;" class="inactive">{{ 'transformation.bareme.import.step.1'|trans }}</h3>
+                <h3>{{ 'transformation.bareme.import.step.2'|trans }}</h3>
+                <h3 class="inactive" style="margin-bottom:1em;">{{ 'transformation.bareme.import.step.3'|trans }}</h3>
+
+                <!-- Some information -->
+                <div class="alert alert-block alert-info">
+                    <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+                    <ul>
+                        <li>{{ 'transformation.bareme.import.help.quitWarning'|trans|raw }}</li>
+                    </ul>
+                    <hr/>
+                    <b>{{ 'transformation.bareme.import.stats(%nbDataLines%)'|trans({'%nbDataLines%':nbLines}) }}</b>
+                </div>
+
+            </div>
+            <!-- END_Modal body -->
+
+            <!-- Modal footer -->
+            <div class="modal-footer">
+
+                <!-- Progress bar : displayed only when uploading a file -->
+                <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+                    <div class="progress-bar"></div>
+                </div>
+
+                <!-- Submit and close buttons -->
+                {{ macros.submit }}
+                <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+            </div>
+
+        </form>
+    </div>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step3.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step3.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8fe3e404d6431525526a3341ffcf5711705fe179
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal-step3.html.twig
@@ -0,0 +1,40 @@
+{% import '::macros.html.twig' as macros %}
+
+<div class="modal-dialog" role="document">
+    <div class="modal-content">
+        <!-- Modal header -->
+        <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+            <h1 class="modal-title" style="margin-bottom:0;" id="myModalLabel">{{ 'transformation.bareme.import.title' | trans }}</h1>
+        </div>
+
+        <!-- Modal body -->
+        <div class="modal-body">
+
+            <!-- The steps of controles import -->
+            <h3 style="margin-top:0;" class="inactive">{{ 'transformation.bareme.import.step.1'|trans }}</h3>
+            <h3 class="inactive">{{ 'transformation.bareme.import.step.2'|trans }}</h3>
+            <h3 style="margin-bottom:1em;">{{ 'transformation.bareme.import.step.3'|trans }}</h3>
+
+            <div class="alert alert-block alert-info">
+                <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+                <ul>
+                    <li>{{ 'transformation.bareme.import.nom'|trans }}<b>{{ summary.nom }}</b></li>
+                    <li>{{ 'transformation.bareme.import.uniteEntree'|trans }}<b>{{ summary.uniteEntree }}</b></li>
+                    <li>{{ 'transformation.bareme.import.uniteSortie'|trans }}<b>{{ summary.uniteSortie }}</b></li>
+                    <li>{{ 'transformation.bareme.import.commentaire'|trans }}<b>{{ summary.commentaire }}</b></li>
+                </ul>
+                <hr/>
+                <b>{{ 'transformation.bareme.import.success'|trans }}</b>
+            </div>
+
+        </div>
+        <!-- END_Modal body -->
+
+        <!-- Modal footer -->
+        <div class="modal-footer">
+            <!-- Close button -->
+            <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+        </div>
+    </div>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fb36234db71c7359041b3cf56fd28f0dfb9db684
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-modal.html.twig
@@ -0,0 +1,60 @@
+{% import '::macros.html.twig' as macros %}
+
+<!-- Link which triggers the modal for export -->
+
+<!-- The modal for import -->
+<div class="modal-dialog" role="document">
+    <div class="modal-content">
+
+        <!-- Modal header -->
+        <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            <h1 class="modal-title" style="margin-bottom:0;" id="myModalLabel">{{ 'transformation.bareme.import.title' | trans }}</h1>
+        </div>
+
+        <form class="form-inline" name="form-bareme-import" action="{{ path('bdoh_admin_bareme_import_step2') }}"
+              accesskey="" accept-charset="" method="post" enctype="multipart/form-data">
+
+            <!-- Modal body -->
+            <div class="modal-body">
+
+                <!-- The steps of controles import -->
+                <h3 style="margin-top:0;">{{ 'transformation.bareme.import.step.1'|trans }}</h3>
+                <h3 class="inactive">{{ 'transformation.bareme.import.step.2'|trans }}</h3>
+                <h3 class="inactive" style="margin-bottom:1em;">{{ 'transformation.bareme.import.step.3'|trans }}</h3>
+
+                <!-- Some information -->
+                <div class="alert alert-block alert-info">
+                    <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+                    <ul>
+                        <li>{{ 'transformation.bareme.import.help.quitWarning'|trans|raw }}</li>
+                    </ul>
+                    <hr>
+                    <!-- Format description -->
+                    {% include 'IrsteaBdohAdminBundle:Transformation:format-descriptions.html.twig' %}
+                </div>
+
+                <!-- Form -->
+                <div class="row">
+                    <label>{{ 'file'|trans }}</label>&nbsp;
+
+                    <div class="form-group">
+                        <input name="file" type="file"/>
+                    </div>
+                </div>
+            </div>
+            <!-- END_Modal body -->
+
+            <div class="modal-footer">
+                <!-- Progress bar : displayed only when uploading a file -->
+                <div class="col-md-6 progress hide" style="margin-top:0.5em;">
+                    <div class="progress-bar"></div>
+                </div>
+
+                <!-- Submit and close buttons -->
+                {{ macros.submit }}
+                <button type="button" class="btn btn-default" data-dismiss="modal">{{ 'close'|trans }}</button>
+            </div>
+        </form>
+    </div>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-output-unit-list.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-output-unit-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7b4ecd772d132daa35f1de3a79c63c085d25d541
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme-output-unit-list.html.twig
@@ -0,0 +1,5 @@
+<ol>
+    {% for label in labels %}
+        <li>{{ label }}</li>
+    {% endfor %}
+</ol>
\ No newline at end of file
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a2cea1ba8a37c29aa4634993d7dd3d3ccdbce37b
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/bareme.html.twig
@@ -0,0 +1,42 @@
+<div class="bareme form-inline row">
+    <div class="input-group listeBareme">
+        <select class="form-control bareme col-xs-8" name="bareme">
+            <option value="-1"></option>
+            {% for bareme in baremeChoice %}
+                {% if bareme.observatoire is defined and bareme.observatoire %}
+                    <option value='{{ bareme.id }}' input-unit-id='{{ bareme.uniteentree.id }}'
+                            output-unit-id='{{ bareme.unitesortie.id }}'>
+                            {{ bareme.nom }} [{{ bareme.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                    </option>
+                {% endif %}
+            {% endfor %}
+            <option value="-1" disabled="disabled" class="bareme-select-separator">&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;</option>
+            {% for bareme in baremeChoice %}
+                {% if not(bareme.observatoire is defined) or not(bareme.observatoire) %}
+                    <option value='{{ bareme.id }}'>
+                        {{ ('transformation.bareme.baremeTechnique.'~bareme.nom)|trans }}
+                    </option>
+                {% endif %}
+            {% endfor %}
+        </select>
+    </div><!-- no space
+    --><div class="input-group">
+        <input type="text" class="form-control beginDate" required>
+    </div><!-- no space
+    --><div class="input-group divEndDate">
+        <input type="text" class="form-control endDate" required>
+    </div><!-- no space
+    --><div class="input-group pull-right">
+        <span class="input-group-btn">
+            <a class="addBareme btn btn-xs btn-default" href="javascript:void(0);">
+                <i class="glyphicon glyphicon-plus"></i>
+            </a>
+        </span>
+        <span class="input-group-btn">
+            <a class="removeBareme btn btn-xs btn-default" href="javascript:void(0);">
+                <i class="glyphicon glyphicon-minus"></i>
+            </a>
+        </span>
+    </div>
+    <label style="color: #0e90d2; font-size: 10px" ><br>{{ 'astuceDate'|trans }}</label>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/chroniqueMere.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/chroniqueMere.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a569f186368f772ac796231651e3c7aa671f5d91
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/chroniqueMere.html.twig
@@ -0,0 +1,81 @@
+<div class="box">
+    <h4>{{ 'transformation.help.selectionner-chronique-mere' | trans }}</h4>
+    <div class="row">
+        <span class="col-md-4">{{ 'Station'|trans }}{{ 'deux_points'|trans }}</span>
+        <select id='selectStation{{ block }}' class="form-control" style="margin-bottom:2px">
+            <option value="-1"></option>
+            {% for station in stations %}
+                <option value='{{ station.id }}'>{{ station.nom }}</option>
+            {% endfor %}
+        </select>
+    </div>
+    <div class="row">
+        <span class="col-md-4">{{ 'Chronique'|trans }}{{ 'deux_points'|trans }}</span>
+        <select id='selectChroniqueMere{{ block }}' name='selectChroniqueMere{{ block }}' class="form-control">
+            <option value="-1"></option>
+            {% for stationId, stationChroniques in chroniqueChoice %}
+                {% for chronique in stationChroniques %}
+                    <option value='{{ chronique.id }}' unit-id='{{ chronique.unite.id }}' station-id='{{ stationId }}'
+                            {% if chronique.allowValueLimits %}allow-limits='true'{% endif %}>
+                        {{ chronique.code }}
+                    </option>
+                {% endfor %}
+            {% endfor %}
+        </select>
+        <input type="hidden" name="selectChroniqueMere{{ block }}" id="hiddenChroniqueMere{{ block }}"/>
+    </div>
+
+    <div id="div-value-limits-{{ block }}">
+        <hr/>
+        <h4>{{ 'valueLimitTransformationType'|trans }}</h4>
+        <div class="form-group row" style="margin-left:-5px;margin-right:-5px;">
+            <div class="col-sm-12" style="padding-left:0;">
+                <select class="form-control" id='valueLimits{{ block }}' name='valueLimits{{ block }}'>
+                    {% for policy in valueLimitPolicies %}
+                        <option value='{{ policy }}'>{{ policy|trans }}</option>
+                    {% endfor %}
+                </select>
+            </div>
+            <div class="col-sm-12" id="div-limit-placeholder-{{ block }}">
+                <label for="limitPlaceholder{{ block }}" style="font-weight:normal;">{{ 'valueLimitPlaceholder'|trans }}{{ 'deux_points'|trans }}</label>
+                <div style="display:inline-block;">
+                    <input class="form-control" type="text" id="limitPlaceholder{{ block }}" name="limitPlaceholder{{ block }}"
+                       pattern="-?[0-9]+(\.[0-9]+)?(e-?[0-9]+)?" style="width:75px"/>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="bareme{{ block }}">
+        <hr/>
+        <div class="row">
+            <div class="col-md-8">
+                <h4>{{ 'transformation.jeu-baremes' | trans }}</h4>
+            </div>
+            <div class="col-md-16" style="text-align:right;padding-right:0;">
+                <a class="btn btn-xs btn-success" data-toggle="modal" data-target="#bareme-import" data-backdrop="static" data-keyboard="false">
+                    {{ 'transformation.bareme.new' | trans }}
+                </a>
+                <a class="btn btn-xs btn-info btn-open-modal" id="exportBareme{{ block }}" data-toggle="modal">
+                    {{ ('transformation.bareme.export.doExport') | trans }}
+                </a>
+            </div>
+        </div>
+        <div class="listeBaremes{{ block }}" block="{{ block }}"></div>
+    </div>
+    <div class="form-group row div-delai-propagation">
+        <hr/>
+        <div class="col-sm-16">
+            <label for="delaiPropagation{{ block }}" style="padding-right:5px;">
+                {{ 'transformation.delaiPropagation'|trans }}
+                <sup class="help-delay" title="{{ 'transformation.helpDelaiPropagation'|trans }}">(?)</sup>
+            </label>
+            <div style="display:inline-block;">
+                <input class="form-control" type="text" id="delaiPropagation{{ block }}" name="delaiPropagation{{ block }}"
+                       pattern="-?[0-9]+(\.[0-9]+)?(e-?[0-9]+)?" style="width:75px"/>
+                <input type="hidden" name="delaiPropagation{{ block }}" id="hiddenDelaiPropagation{{ block }}"/>
+            </div>
+        </div>
+    </div>
+    <div style="margin-top:15px;"></div>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors-transformation.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors-transformation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5b3defb5fe2d4b0c0bd683d4d702e285e796be4f
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors-transformation.html.twig
@@ -0,0 +1,15 @@
+<ul>
+    {% for e in errors.general %}
+        <li>{{ e }}</li>
+    {% endfor %}
+    {% for mere in ['principale', 'secondaire'] %}
+        {% if errors[mere]|length > 0 %}
+            <b>{{ ('transformation.erreur.chroniqueMere.'~mere)|trans }}</b>
+            <ul>
+                {% for e in errors[mere] %}
+                    <li>{{ e|raw }}</li>
+                {% endfor %}
+            </ul>
+        {% endif %}
+    {% endfor %}
+</ul>
\ No newline at end of file
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..efc4a58932f91b6c81394ba3f4579dff8ea8586a
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/errors.html.twig
@@ -0,0 +1,21 @@
+<div class="modal-body">
+    <div class="alert alert-block alert-danger">
+        <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+        <ul>
+            {% for error in errors %}
+                <li>{{ error|raw }}</li>
+            {% endfor %}
+        </ul>
+    </div>
+
+    <div class="alert alert-block alert-info">
+        {% include 'IrsteaBdohAdminBundle:Transformation:format-descriptions.html.twig' %}
+    </div>
+</div>
+
+<div class="modal-footer">
+    <div class="pull-left">
+        <a href="javascript:void(0);" class="btn btn-default">{{ 'transformation.bareme.import.newImport'|trans }}</a>
+    </div>
+    <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/format-descriptions.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/format-descriptions.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..56a0c0bc277ea5322b6ad3698fa830494eba54e5
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/format-descriptions.html.twig
@@ -0,0 +1,19 @@
+<div id="format-description-template">
+
+    <h4 class="alert-heading">
+        {{ 'format'|trans }} {{ 'open_quote'|trans }}<i>{{ ('Bareme')|trans }}</i>{{ 'close_quote'|trans }}{{ 'deux_points'|trans }}
+    </h4>
+
+    {% if jeuQualite|lower == 'valid' %}
+        <ul name="valid">
+            <li><b>{{ 'transformation.bareme.import.entete'|trans }}</b>
+                <ul>
+                    {{ 'transformation.bareme.import.detail'|trans|raw }}
+                </ul>
+            </li>
+            {{ 'transformation.bareme.import.donnees'|trans|raw }}
+            {{ 'transformation.bareme.import.valid'|trans|raw }}
+            {{ 'transformation.bareme.import.commentaires'|trans|raw }}
+        </ul>
+    {% endif %}
+</div>
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/Transformation/main.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/main.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6e36b91b7c0ddb31caa81f3b60666cdecc865933
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/Transformation/main.html.twig
@@ -0,0 +1,163 @@
+{% extends '::layout.html.twig' %}
+{% import '::macros.html.twig' as macros %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/admin/transformation.js') }}"
+            data-chroniques-list="{{ path('bdoh_admin_get_chronique_calculee') | e('html_attr') }}"
+            data-chroniques-get="{{ path('bdoh_consult_chronique', {'station': '_codeStation_', 'chronique': '_codeChronique_'} )
+            | e('html_attr') }}"
+            data-baremes-export="{{ path('bdoh_admin_get_baremes_export') | e('html_attr') }}"
+    ></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/admin/transformation.css') }}"/>
+{% endblock %}
+
+{% block title %}
+    {{ macros.pageTitle('CalculChroniques'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'CalculChroniques'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+
+<h1>{{ 'CalculChroniques'|trans }}</h1>
+
+<form class="form-horizontal" name="main" action="{{ path('bdoh_admin_save_transformation') }}"
+      method="post" enctype="multipart/form-data" id="formTransformation">
+
+    <div id="chroniqueFille">
+        <div class="form-group">
+            <label for="chroniqueCalculee" class="col-sm-4 control-label">{{ 'ChroniqueCalculee'|trans }}</label>
+            <div class="col-md-8">
+                <select id="chroniqueCalculee" name="chroniqueCalculee" class="form-control">
+                    <option value="-1">-</option>
+                    {% for station in stations if chroniquesFilles[station.id] is defined %}
+                        <optgroup label="{{ station.code }}">
+                            {% for chroniqueFille in chroniquesFilles[station.id] %}
+                                <option value="{{ chroniqueFille.id }}" unit-id="{{ chroniqueFille.unite.id }}">
+                                    {{ chroniqueFille }}
+                                </option>
+                            {% endfor %}
+                        </optgroup>
+                    {% endfor %}
+                </select>
+            </div>
+            <div id="coefficientDiv" class="col-md-12" style="text-align:right;">
+                <label for="coefficient" class="control-label" style="padding-right:5px;">
+                    {{ 'coefficientMultiplicateur'|trans }}
+                    <sup title="{{ 'transformation.help.meaning-coefficient'|trans }}" id="coefficient-help">(?)</sup>
+                </label>
+                <div style="display:inline-block;width:66%;">
+                    <input type="text" class="form-control" id="coefficient" name="coefficient"
+                           pattern="-?[0-9]+(\.[0-9]+)?(e-?[0-9]+)?"/>
+                </div>
+            </div>
+        </div>
+
+        <div class="form-group">
+            <div id="uniteDiv">
+                <label for="uniteChroniqueFille" class="col-sm-4 control-label">{{ 'unite'|trans }}</label>
+                <div class="col-md-8">
+                    <p id="uniteChroniqueFille" class="form-control-static"></p>
+                </div>
+            </div>
+
+            <div id="majDiv">
+                <label for="majChroniqueFille" class="col-sm-4 control-label">{{ 'miseAJour'|trans }}</label>
+                <div class="col-md-8">
+                    <p id="majChroniqueFille" class="form-control-static"></p>
+                </div>
+            </div>
+        </div>
+
+        <div id="genealogieDiv" class="form-group">
+            <label for="genealogie" class="col-sm-4 control-label">{{ 'genealogie'|trans }}</label>
+            <div class="col-md-20">
+                <textarea id="genealogie" name="genealogie" class="form-control" rows="3"></textarea>
+            </div>
+        </div>
+
+        <div id="genealogieEnDiv" class="form-group">
+            <label for="genealogieEn" class="col-sm-4 control-label">{{ 'genealogieEn'|trans }}</label>
+            <div class="col-md-20">
+                <textarea id="genealogieEn" name="genealogieEn" class="form-control" rows="3"></textarea>
+            </div>
+        </div>
+
+    </div>
+
+    <div class="form-group" id="propagateGroup">
+        <div class="col-md-20 col-sm-offset-4">
+            <input id="propagateId" name="propagate" value="propagate" type="checkbox" checked="checked" style="vertical-align:-3px;"/>
+            <label for="propagateId">
+                <strong><span id="propagateSpanId"></span>
+                    <i id="propagateHelpId" class="childrenHelp fam-help" data-original-title="" data-content="" style="vertical-align:-3px;"></i>
+                </strong>
+            </label>
+        </div>
+    </div>
+
+    <div class="row">
+        <div id="chroniqueMerePrincipale" class="col-md-12">
+            {{ include('IrsteaBdohAdminBundle:Transformation:chroniqueMere.html.twig',
+                {block: 'Principale', stations: stations, chroniqueChoice: chroniques, valueLimitPolicies: valueLimitPolicies},
+                with_context = false) }}
+        </div>
+        <div id="chroniqueMereSecondaire" class="col-md-12">
+            {{ include('IrsteaBdohAdminBundle:Transformation:chroniqueMere.html.twig',
+                {block: 'Secondaire', stations: stations, chroniqueChoice: chroniques, valueLimitPolicies: valueLimitPolicies},
+                with_context = false) }}
+        </div>
+    </div>
+
+    <input type="hidden" id="jeuBaremePrincipale" name="jeuBaremePrincipale"/>
+    <input type="hidden" id="jeuBaremeSecondaire" name="jeuBaremeSecondaire"/>
+    <div id="btnDiv">
+        {{ macros.submit('transformation.saveAndCompute'|trans, 'btn btn-success') }}
+        {{ macros.reset('transformation.cancelModifications'|trans, 'btn btn-danger') }}
+    </div>
+
+</form>
+
+<template id="templateLineBareme">
+    {{ include('IrsteaBdohAdminBundle:Transformation:bareme.html.twig', {baremeChoice: baremes}) }}
+</template>
+
+<div class="modal fade" id="bareme-import" tabindex="-1" role="dialog" aria-labelledby="bareme-import">
+</div>
+
+<div id="bareme-modal-step1-template" style="display:none;">
+    {% include 'IrsteaBdohAdminBundle:Transformation:bareme-modal.html.twig' %}
+</div>
+
+<div class="modal fade" id="bareme-export" tabindex="-1" role="dialog" aria-labelledby="bareme-import">
+    {% include 'IrsteaBdohAdminBundle:Transformation:bareme-export-modal.html.twig' %}
+</div>
+
+<div class="alert alert-block alert-danger" id="errors-transformation" style="display:none;margin-top:1em;margin-bottom:0;">
+    <h4 class="alert-heading">{{ 'errors'|trans }}{{ 'deux_points'|trans }}</h4>
+    <div id="errors-transformation-details"></div>
+</div>
+
+<div class="alert alert-block alert-success" id="submitted-transformation" style="display:none;margin-top:1em;margin-bottom:0;">
+    <a class="close" id="submitted-close">&times;</a>
+    <strong id="submitted-info">
+        {{ 'transformation.submitted.submitted'|trans|raw }}
+        {% if is_granted('JOB_LIST', currentObservatoire()) %}
+            <br/>{{ 'transformation.submitted.seeJobPage'|trans|raw }}
+        {% endif %}
+    </strong>
+</div>
+
+<div style="display:none;" id="div-confirm-computation">{{ 'transformation.confirmComputation'|trans }}</div>
+
+{% endblock %}
diff --git a/src/Irstea/BdohAdminBundle/Resources/views/standard_layout.html.twig b/src/Irstea/BdohAdminBundle/Resources/views/standard_layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..292b34a7c725fc678da03d9a1a2c62a067e74b31
--- /dev/null
+++ b/src/Irstea/BdohAdminBundle/Resources/views/standard_layout.html.twig
@@ -0,0 +1,144 @@
+{% extends '@SonataAdmin/standard_layout.html.twig' %}
+
+{# ajout du favicon #}
+{% block meta_tags %}
+    {{ parent() }}
+<link rel="shortcut icon" href="{{ asset('favicon.ico') }}"/>
+{% endblock %}
+
+{# titre de la page #}
+{% block sonata_head_title %}
+    BDOH Admin - {{ currentObservatoire() }}
+    {% if action is defined %}
+        -
+        {% for menu in breadcrumbs_builder.breadcrumbs(admin, action) %}
+            {% if loop.last %}
+                {%- set translation_domain = menu.extra('translation_domain', 'messages') -%}
+                {%- set label = menu.label -%}
+                {%- if translation_domain is not same as(false) -%}
+                    {%- set label = label|trans(menu.extra('translation_params', {}), translation_domain) -%}
+                {%- endif -%}
+                {% if action == 'edit' %}
+                    {% set entity_edition = admin.classnameLabel~'_edit_defined' %}
+                    {{ "title_edit_defined"|trans({'%entity%': entity_edition|trans, '%name%': label}) }}
+                {% elseif action == 'create' %}
+                    {% set entity_creation = admin.classnameLabel~'_create_undefined' %}
+                    {{ "title_create_undefined"|trans({'%entity%': entity_creation|trans}) }}
+                {% elseif action == 'delete' %}
+                    {% set entity_deletion = admin.classnameLabel~'_delete_defined' %}
+                    {{ "title_delete_defined"|trans({'%entity%': entity_deletion|trans, '%name%': admin.tostring(object)}) }}
+                {% else %}
+                    {{ label }}
+                {% endif %}
+            {% endif %}
+        {% endfor %}
+    {% else %}
+        {% if _title is not empty %}
+            -
+            {{ _title|striptags|raw }}
+        {% endif %}
+    {% endif %}
+{% endblock %}
+
+{# changement du lien qui ne sert a rien en un span dans la barre de titre #}
+{% block tab_menu_navbar_header %}
+    {% if _navbar_title is not empty %}
+        <div class="navbar-header">
+            <span class="navbar-brand">{{ _navbar_title|raw }}</span>
+        </div>
+    {% endif %}
+{% endblock %}
+
+{# suppression du lien vers sonata-project en bas du menu de gauche #}
+{% block side_bar_after_nav %}{% endblock %}
+
+{# breadcrumb : suppression du burger button (toggle)
+suppression du home button (confusing avec le home de BDOH)
+et amélioration des titres création, modification et suppression #}
+{% block sonata_nav %}
+    <nav class="navbar navbar-static-top" role="navigation">
+        <div class="navbar-left">
+            {% block sonata_breadcrumb %}
+                <div class="hidden-xs">
+                    {% if _breadcrumb is not empty or action is defined %}
+                        <ol class="nav navbar-top-links breadcrumb">
+                            {% if _breadcrumb is empty %}
+                                {% if action is defined %}
+                                    <li><span><b>{{ currentObservatoire() }}</b></span></li>
+                                    {% for menu in breadcrumbs_builder.breadcrumbs(admin, action) %}
+                                        {% if not loop.first %}
+                                            {%- set translation_domain = menu.extra('translation_domain', 'messages') -%}
+                                            {%- set label = menu.label -%}
+                                            {%- if translation_domain is not same as(false) -%}
+                                                {%- set label = label|trans(menu.extra('translation_params', {}), translation_domain) -%}
+                                            {%- endif -%}
+                                            {% if not loop.last %}
+                                                <li>
+                                                    {% if menu.uri is not empty %}
+                                                        <a href="{{ menu.uri }}">
+                                                            {% if menu.extra('safe_label', true) %}
+                                                                {{- label|raw -}}
+                                                            {% else %}
+                                                                {{- label -}}
+                                                            {% endif %}
+                                                        </a>
+                                                    {% else %}
+                                                        <span>{{ label }}</span>
+                                                    {% endif %}
+                                                </li>
+                                            {% else %}
+                                                {% if action == 'edit' %}
+                                                    {% set entity_edition = admin.classnameLabel~'_edit_defined' %}
+                                                    {% set label = "title_edit_defined"|trans({'%entity%': entity_edition|trans, '%name%': label}) %}
+                                                {% elseif action == 'create' %}
+                                                    {% set entity_creation = admin.classnameLabel~'_create_undefined' %}
+                                                    {% set label = "title_create_undefined"|trans({'%entity%': entity_creation|trans}) %}
+                                                {% elseif action == 'delete' %}
+                                                    {% set entity_deletion = admin.classnameLabel~'_delete_defined' %}
+                                                    {% set label = "title_delete_defined"|trans({'%entity%': entity_deletion|trans, '%name%': admin.tostring(object)}) %}
+                                                {% endif %}
+                                                <li class="active"><span>{{ label }}</span></li>
+                                            {% endif %}
+                                        {% endif %}
+                                    {% endfor %}
+                                {% endif %}
+                            {% else %}
+                                {{ _breadcrumb|raw }}
+                            {% endif %}
+                        </ol>
+                    {% endif %}
+                </div>
+            {% endblock sonata_breadcrumb %}
+        </div>
+        {% block sonata_top_nav_menu %}
+            {{ parent() }}
+        {% endblock %}
+    </nav>
+{% endblock sonata_nav %}
+
+        {% block sonata_left_side %}
+            <aside class="main-sidebar" style="width: 242px">
+                <section class="sidebar">
+                    {% block sonata_side_nav %}
+                        {% block sonata_sidebar_search %}
+                            <form action="{{ path('sonata_admin_search') }}" method="GET" class="sidebar-form" role="search">
+                                <div class="input-group custom-search-form">
+                                    <input type="text" name="q" value="{{ app.request.get('q') }}" class="form-control" placeholder="{{ 'search_placeholder'|trans({}, 'SonataAdminBundle') }}">
+                                    <span class="input-group-btn">
+                                            <button class="btn btn-flat" type="submit">
+                                                <i class="fa fa-search" aria-hidden="true"></i>
+                                            </button>
+                                        </span>
+                                </div>
+                            </form>
+                        {% endblock sonata_sidebar_search %}
+
+                        {% block side_bar_before_nav %} {% endblock %}
+                        {% block side_bar_nav %}
+                            {{ knp_menu_render('sonata_admin_sidebar', {template: sonata_admin.adminPool.getTemplate('knp_menu_template')}) }}
+                        {% endblock side_bar_nav %}
+                    {% endblock sonata_side_nav %}
+                </section>
+            </aside>
+        {% endblock sonata_left_side %}
+
diff --git a/src/Irstea/BdohBundle/Command/BdohPreInstallDatabaseCommand.php b/src/Irstea/BdohBundle/Command/BdohPreInstallDatabaseCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..42f5b161272a0a7c68e0e68c37473b79f1c7aa07
--- /dev/null
+++ b/src/Irstea/BdohBundle/Command/BdohPreInstallDatabaseCommand.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class BdohPreInstallDatabaseCommand extends Command
+{
+    protected $conn;
+
+    protected function configure()
+    {
+        $this->setName('bdoh:preinstall:database');
+        $this->setDescription('Installs PostGis and schemas temp, bdoh');
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $this->conn = $this->getContainer()->get('doctrine')->getEntityManager()->getConnection();
+
+        $output->write(sprintf('<info>Create language : plpgsql</info>...'));
+        try {
+            $createLanguage = 'create language plpgsql;';
+            $this->conn->exec($createLanguage);
+            $output->writeln('Ok');
+        } catch (\Exception $e) {
+            $output->writeln('Error!');
+            //$output->writeln($e->getMessage());
+        }
+
+        $output->writeln('');
+        $output->writeln(sprintf('<info>Installation PostGis</info>'));
+
+        $this->importFile(
+            $output,
+            [
+                '/usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql',
+                '/usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql',
+            ]
+        );
+
+        $output->writeln('');
+        $output->write(sprintf('<info>Create schema : bdoh</info>...'));
+        try {
+            $createSchemaBdoh = 'CREATE SCHEMA bdoh;';
+            $this->conn->exec($createSchemaBdoh);
+            $output->writeln('Ok');
+        } catch (\Exception $e) {
+            $output->writeln('Error!');
+            //$output->writeln($e->getMessage());
+        }
+
+        $output->writeln('');
+        $output->write(sprintf('<info>Create schema : temp</info>...'));
+        try {
+            $createSchemaTemp = 'CREATE SCHEMA temp;';
+            $this->conn->exec($createSchemaTemp);
+            $output->writeln('Ok');
+        } catch (\Exception $e) {
+            $output->writeln('Error!');
+            //$output->writeln($e->getMessage());
+        }
+    }
+}
diff --git a/src/Irstea/BdohBundle/Command/Command.php b/src/Irstea/BdohBundle/Command/Command.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9ee10e37f0158bf055c4a2f8f1bae0509833462
--- /dev/null
+++ b/src/Irstea/BdohBundle/Command/Command.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Command;
+
+use Irstea\BdohBundle\Command\Helper\DialogHelper;
+use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
+
+/**
+ * Base command for Bdoh project.
+ */
+abstract class Command extends ContainerAwareCommand
+{
+    /**
+     * @var Symfony\Component\Translation\TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * @return Symfony\Component\Translation\TranslatorInterface
+     */
+    protected function getTranslator()
+    {
+        if (null === $this->translator) {
+            $this->translator = $this->getContainer()->get('translator');
+        }
+
+        return $this->translator;
+    }
+
+    /**
+     * @return Irstea\BdohBundle\Command\Helper\DialogHelper
+     */
+    protected function getDialogHelper()
+    {
+        $dialog = $this->getHelperSet()->get('dialog');
+        if (!$dialog || get_class($dialog) !== 'Irstea\BdohBundle\Command\Helper\DialogHelper') {
+            $this->getHelperSet()->set($dialog = new DialogHelper($this->getTranslator()));
+        }
+
+        return $dialog;
+    }
+
+    /**
+     * Shortcut to translate a message.
+     *
+     * @param mixed $message
+     * @param mixed $catalog
+     */
+    protected function trans($message, array $params = [], $catalog = 'commands')
+    {
+        return $this->getTranslator()->trans($message, $params, $catalog);
+    }
+
+    /**
+     * For execute Sql file in command.
+     *
+     * @param mixed $output
+     */
+    protected function importFile($output, array $fileNames)
+    {
+        if ($fileNames !== null) {
+            foreach ((array) $fileNames as $fileName) {
+                $fileName = realpath($fileName);
+
+                if (!file_exists($fileName)) {
+                    throw new \InvalidArgumentException(
+                        sprintf("SQL file '<info>%s</info>' does not exist.", $fileName)
+                    );
+                } elseif (!is_readable($fileName)) {
+                    throw new \InvalidArgumentException(
+                        sprintf("SQL file '<info>%s</info>' does not have read permissions.", $fileName)
+                    );
+                }
+
+                $output->write(sprintf("Processing file '<info>%s</info>'... ", $fileName));
+                $sql = file_get_contents($fileName);
+
+                try {
+                    $this->conn->exec($sql);
+                    $output->writeln('OK!');
+                } catch (\Exception $e) {
+                    $output->writeln('Error!');
+                    //$output->writeln($e->getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/src/Irstea/BdohBundle/Command/Helper/DialogHelper.php b/src/Irstea/BdohBundle/Command/Helper/DialogHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..368e59e742a8c94c6058973dd0adc70923dca9ad
--- /dev/null
+++ b/src/Irstea/BdohBundle/Command/Helper/DialogHelper.php
@@ -0,0 +1,179 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Command\Helper;
+
+use Symfony\Component\Console\Helper\DialogHelper as BaseDialogHelper;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Dialog helper for Bdoh project.
+ */
+class DialogHelper extends BaseDialogHelper
+{
+    /**
+     * @var Symfony\Component\Translation\TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * @param Symfony\Component\Translation\TranslatorInterface $translator
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    /**
+     * Shortcut to translate a message.
+     *
+     * @param mixed $message
+     * @param mixed $catalog
+     */
+    protected function trans($message, array $params = [], $catalog = 'commands')
+    {
+        return $this->translator->trans($message, $params, $catalog);
+    }
+
+    /**
+     * Let a list of elements, each identified by a unique key.
+     * Asks user to select one of these keys.
+     * Then, returns the pair [key, corresponding element].
+     *
+     * If $emptySelection parameter is true, the user is allowed to select nothing.
+     * Then, the pair [-1, NULL] is returned.
+     *
+     * If $freeSelection parameter is true, the user can input any string.
+     * Then, the pair [-1, free string] is returned.
+     *
+     * If $stopSelection parameter is true, the user can stop the process without any selection.
+     * Then, the pair [-1, -1] is returned.
+     *
+     * @param OutputInterface $output
+     * @param string          $title
+     * @param array           $elements
+     * @param bool            $emptySelection
+     * @param bool            $freeSelection
+     * @param bool            $stopSelection
+     *
+     * @return array A pair : 1st element = key selected ; 2nd = the corresponding element
+     */
+    public function getSelection(
+        OutputInterface $output,
+        $title,
+        array $elements,
+        $emptySelection = false,
+        $freeSelection = false,
+        $stopSelection = false
+    ) {
+        $translator = $this->translator;
+        $emptyKey = $this->trans('selection.empty.key');
+        $emptyMsg = $this->trans('selection.empty.msg');
+        $freeKey = $this->trans('selection.free.key');
+        $freeMsg = $this->trans('selection.free.msg');
+        $stopKey = $this->trans('selection.stop.key');
+        $stopMsg = $this->trans('selection.stop.msg');
+
+        if ($emptySelection) {
+            $elements[$emptyKey] = $emptyMsg;
+        }
+        if ($freeSelection) {
+            $elements[$freeKey] = $freeMsg;
+        }
+        if ($stopSelection) {
+            $elements[$stopKey] = $stopMsg;
+        }
+
+        // Computes sprintf pattern for a good display of selection list
+        $align = max(array_map('strlen', array_keys($elements))) + 2;
+        $pattern = '  <comment>%-' . $align . 's  %s</comment>';
+
+        // Displays the selection list
+        $text = ['<info>' . $title . ' :</info>'];
+        foreach ($elements as $key => $value) {
+            $text[] = sprintf($pattern, "[$key]", $value);
+        }
+        $output->writeln($text);
+
+        // Asks a key to the user until its validation
+        $keySelected = $this->askAndValidate(
+            $output,
+            '<question>' . $this->trans('selection.ask.key') . '</question> ',
+            function ($keySelected) use ($elements, $translator) {
+                if ('' === $keySelected) {
+                    throw new \Exception(
+                        $translator->trans('selection.error.empty', [], 'commands')
+                    );
+                } elseif (false === array_key_exists($keySelected, $elements)) {
+                    throw new \Exception(
+                        $translator->trans('selection.error.invalid(%key%)', ['%key%' => $keySelected], 'commands')
+                    );
+                }
+
+                return $keySelected;
+            }
+        );
+
+        // Treatment of user selection
+        switch ($keySelected) {
+            case $stopKey:
+                return [-1, -1];
+            case $emptyKey:
+                return [-1, null];
+            case $freeKey:
+                return [-1, $this->ask($output, '<question>' . $this->trans('selection.ask.element') . '</question> ')];
+            default:
+                return [$keySelected, $elements[$keySelected]];
+        }
+    }
+
+    public function getRunner(OutputInterface $output, &$errors)
+    {
+        $runner = function ($err) use ($output, &$errors) {
+            if ($err) {
+                $output->writeln('<fg=red>FAILED</>');
+                $errors = array_merge($errors, $err);
+            } else {
+                $output->writeln('<info>OK</info>');
+            }
+        };
+
+        return $runner;
+    }
+
+    public function writeSection(OutputInterface $output, $text, $style = 'bg=blue;fg=white')
+    {
+        $output->writeln(
+            [
+                '',
+                $this->getHelperSet()->get('formatter')->formatBlock($text, $style, true),
+                '',
+            ]
+        );
+    }
+
+    public function getQuestion($question, $default, $sep = ':')
+    {
+        return $default ? sprintf('<info>%s</info> [<comment>%s</comment>]%s ', $question, $default, $sep) :
+            sprintf('<info>%s</info>%s ', $question, $sep);
+    }
+}
diff --git a/src/Irstea/BdohBundle/Controller/Controller.php b/src/Irstea/BdohBundle/Controller/Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf32e300a68ce2ffa0017a014e247264fe7e5445
--- /dev/null
+++ b/src/Irstea/BdohBundle/Controller/Controller.php
@@ -0,0 +1,176 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Controller;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityRepository;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Bundle\FrameworkBundle\Controller\Controller as BaseController;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class Controller extends BaseController
+{
+    /**
+     * Shortcut to return the session manager.
+     *
+     * @return SessionInterface
+     */
+    public function getSession(): SessionInterface
+    {
+        return $this->get('session');
+    }
+
+    /**
+     *  Shortcut to return the translator.
+     *
+     * @return TranslatorInterface
+     */
+    public function getTranslator(): TranslatorInterface
+    {
+        return $this->get('translator');
+    }
+
+    /**
+     * Shortcut to return the default Doctrine Entity Manager.
+     *
+     * @return EntityManagerInterface
+     */
+    public function getEm(): EntityManagerInterface
+    {
+        /* @noinspection PhpIncompatibleReturnTypeInspection */
+        return $this->getDoctrine()->getManager();
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository.
+     *
+     * @param string $entity
+     *
+     * @return EntityRepository
+     */
+    public function getRepository(string $entity): EntityRepository
+    {
+        return $this->getDoctrine()->getRepository($entity);
+    }
+
+    /**
+     * Shortcut to return the Doctrine repository suitable for an entity class.
+     *
+     * @param object $entity
+     *
+     * @return EntityRepository
+     */
+    public function getClassRepo($entity): EntityRepository
+    {
+        return $this->getRepository(get_class($entity));
+    }
+
+    /**
+     *  Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     *
+     * @return EntityRepository
+     */
+    public function getBdohRepo(string $bdohEntity): EntityRepository
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository of a "BDOH Security" entity.
+     *
+     * @param string $securityEntity
+     *
+     * @return EntityRepository
+     */
+    public function getSecurityRepo(string $securityEntity): EntityRepository
+    {
+        return $this->getRepository('IrsteaBdohSecurityBundle:' . $securityEntity);
+    }
+
+    /**
+     * @param mixed $data
+     * @param int   $status
+     * @param array $headers
+     *
+     * @return Response with json encoded data
+     */
+    public function renderJson($data, int $status = 200, array $headers = [])
+    {
+        return new JsonResponse($data, $status, $headers);
+    }
+
+    /**
+     * @return bool true if the request is done by an ajax query
+     */
+    public function isXmlHttpRequest(): bool
+    {
+        $request = $this->get('request_stack')->getMasterRequest();
+
+        return $request ? $request->isXmlHttpRequest() : false;
+    }
+
+    /**
+     * @return RedirectResponse to HTTP_REFERER
+     */
+    public function redirectToReferer(): RedirectResponse
+    {
+        $referer = $this->get('request_stack')->getMasterRequest()->headers->get('referer');
+
+        return new RedirectResponse($referer);
+    }
+
+    /**
+     * @return bool
+     */
+    protected function isLocaleEn(): bool
+    {
+        $locale = $this->get('session')->get('_locale');
+
+        return \strtolower(\substr($locale, 0, 2)) === 'en';
+    }
+
+    /**
+     * @return Observatoire|null
+     */
+    protected function getCurrentObservatoire()
+    {
+        return $this->get('irstea_bdoh.manager.observatoire')->getCurrent();
+    }
+
+    /**
+     * @return Utilisateur|null
+     */
+    protected function getUtilisateur()
+    {
+        $token = $this->get('security.token_storage')->getToken();
+        $user = $token ? $token->getUser() : null;
+
+        return $user instanceof Utilisateur ? $user : null;
+    }
+}
diff --git a/src/Irstea/BdohBundle/Controller/MainController.php b/src/Irstea/BdohBundle/Controller/MainController.php
new file mode 100644
index 0000000000000000000000000000000000000000..36f6b888a7c54b4cc17caabfb9ec62d37d5893cf
--- /dev/null
+++ b/src/Irstea/BdohBundle/Controller/MainController.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Controller;
+
+use Irstea\BdohBundle\Util\HttpFileResponse;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+
+/**
+ * Class MainController.
+ */
+class MainController extends Controller
+{
+    /**
+     * @Route("", name="bdoh_all_home")
+     * @Method("GET")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     */
+    public function homeAction()
+    {
+        return $this->render('IrsteaBdohBundle:Core:home.html.twig');
+    }
+
+    /**
+     * @Route("/user_manual", name="bdoh_user_manual")
+     * @Method("GET")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @return HttpFileResponse
+     */
+    public function userManualAction()
+    {
+        $userManualPath = $this->container->getParameter('irstea_bdoh.user_manual');
+
+        return new HttpFileResponse($userManualPath, 'application/octet-stream');
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/FromDateTimeMsTransformer.php b/src/Irstea/BdohBundle/DataTransformer/FromDateTimeMsTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f85f1e7da241e3e45cee524e044fc7c9d314731
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/FromDateTimeMsTransformer.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Transforms datetime (without validating), from DateTimeMs format ("YYYY-MM-DD hh:mm:ss.uuu") to any format
+ * (see : Irstea\BdohDataBundle\Doctrine\DBAL\Types\DateTimeMs).
+ *
+ * Each function returns :
+ *  => the transformed datetime ;
+ *  => or FALSE if any error occured.
+ */
+class FromDateTimeMsTransformer
+{
+    /**
+     * Return format : "DD/MM/YYYY hh:mm:ss" or "DD/MM/YYYY hh:mm:ss.uuu".
+     *
+     * @param mixed $dt
+     */
+    public static function toFrenchDateTimeMs($dt)
+    {
+        return substr($dt, 8, 2) . '/' .
+            substr($dt, 5, 2) . '/' .
+            substr($dt, 0, 4) . ' ' .
+            substr($dt, 11);
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsFastTransformer.php b/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsFastTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..58f828b2cf7dc3d5086dc4052ffcf56d64b8ddca
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsFastTransformer.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Transforms datetime (without validating), from any format to DateTimeMs format
+ * (see : Irstea\BdohDataBundle\Doctrine\DBAL\Types\DateTimeMs).
+ *
+ * Each function returns :
+ *  => the transformed datetime (format "YYYY-MM-DD hh:mm:ss.uuu") ;
+ *  => or FALSE if any error occured.
+ */
+class ToDateTimeMsFastTransformer
+{
+    /**
+     * Format : strictly "YYYY-MM-DD hh:mm:ss".
+     *
+     * @param mixed $datetime
+     */
+    public static function dateTime($datetime)
+    {
+        return trim($datetime);
+    }
+
+    /**
+     * Format : strictly "DD/MM/YYYY hh:mm:ss".
+     *
+     * @param mixed $datetime
+     */
+    public static function frenchDateTime($datetime)
+    {
+        $datetime = trim($datetime);
+        $day = strtok($datetime, '/');
+        $month = strtok('/');
+        $year = strtok(' ');
+        $time = strtok('');
+
+        return "$year-$month-$day $time";
+    }
+
+    /**
+     * Format : strictly "DD/MM/YY hh:mm:ss".
+     *
+     * @param mixed $datetime
+     */
+    public static function shortFrenchDateTimeMs($datetime)
+    {
+        $datetime = trim($datetime);
+        $day = strtok($datetime, '/');
+        $month = strtok('/');
+        $year = strtok(' ');
+        $time = strtok('');
+        $year = (((int) $year > 45) ? '19' : '20') . $year;
+
+        return "$year-$month-$day $time";
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsTransformer.php b/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6e8bab22d1b2571cdf5bc9323fc2788f502bf69
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/ToDateTimeMsTransformer.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Validates and transforms datetime, from any format to DateTimeMs format
+ * (see : Irstea\BdohDataBundle\Doctrine\DBAL\Types\DateTimeMs).
+ *
+ * Each function returns :
+ *  => the transformed datetime (format "YYYY-MM-DD hh:mm:ss.uuu") ;
+ *  => or FALSE if any error occured.
+ */
+class ToDateTimeMsTransformer
+{
+    /**
+     * Format : "YYYY-MM-DD" + a possible variable time.
+     * See    : ToTimeMsTransformer::varTimeMs().
+     *
+     * @param mixed $datetime
+     */
+    public static function varDateTimeMs($datetime)
+    {
+        // Splits $datetime into its "date" and "time" parts
+        $datetime = trim($datetime);
+        $date = strtok($datetime, ' ');
+        $time = strtok(' ');
+
+        if (false === $date = ToDateTransformer::date($date)) {
+            return false;
+        }
+
+        if (false !== $time) {
+            return ($time = ToTimeMsTransformer::varTimeMs($time)) ?
+                ($date . ' ' . $time) : false;
+        }
+
+        return $date . ' 00:00:00.000';
+    }
+
+    /**
+     * Format : "D/MM/YYYY" or "DD/MM/YYYY" + a possible variable time
+     * See    : ToTimeMsTransformer::varTimeMs().
+     *
+     * @param mixed $datetime
+     */
+    public static function varFrenchDateTimeMs($datetime)
+    {
+        // Splits $datetime into its "date" and "time" parts
+        $datetime = trim($datetime);
+        $date = strtok($datetime, ' ');
+        $time = strtok(' ');
+
+        if (false === $date = ToDateTransformer::frenchDate($date)) {
+            return false;
+        }
+
+        if (false !== $time) {
+            return ($time = ToTimeMsTransformer::varTimeMs($time)) ?
+                ($date . ' ' . $time) : false;
+        }
+
+        return $date . ' 00:00:00.000';
+    }
+
+    /**
+     * Format : "D/MM/YY" or "DD/MM/YY" + a possible variable time
+     * See    : ToTimeMsTransformer::varTimeMs().
+     *
+     * @param mixed $datetime
+     */
+    public static function varShortFrenchDateTimeMs($datetime)
+    {
+        // Splits $datetime into its "date" and "time" parts
+        $datetime = trim($datetime);
+        $date = strtok($datetime, ' ');
+        $time = strtok(' ');
+
+        if (false === $date = ToDateTransformer::shortFrenchDate($date)) {
+            return false;
+        }
+
+        if (false !== $time) {
+            return ($time = ToTimeMsTransformer::varTimeMs($time)) ?
+                ($date . ' ' . $time) : false;
+        }
+
+        return $date . ' 00:00:00.000';
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/ToDateTransformer.php b/src/Irstea/BdohBundle/DataTransformer/ToDateTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..7fb580c3e9098e20c50ed7e5505481fc9c99942c
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/ToDateTransformer.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Validates and transforms date, from any format to "YYYY-MM-DD" format.
+ *
+ * Each function returns :
+ *  => the transformed date (format "YYYY-MM-DD") ;
+ *  => or FALSE if any error occured.
+ */
+class ToDateTransformer
+{
+    /**
+     * Format : "YYYY-MM-DD"
+     * Note   : $date is supposed have a good length (so, do a "trim" before).
+     *
+     * @param mixed $date
+     */
+    public static function date($date)
+    {
+        // Bad length
+        if (10 !== strlen($date)) {
+            return false;
+        }
+
+        // Splits date
+        $year = substr($date, 0, 4);
+        $month = substr($date, 5, 2);
+        $day = substr($date, 8, 2);
+
+        return static::checkSplitDate($year, $month, $day, $date[4], $date[7]) ?
+            $date : false;
+    }
+
+    /**
+     * French date : format "D/MM/YYYY" or  "DD/MM/YYYY"
+     * Note        : $date is supposed have a good length (so, do a "trim" before).
+     *
+     * @param mixed $date
+     */
+    public static function frenchDate($date)
+    {
+        $len = strlen($date);
+
+        // Bad length
+        if (9 !== $len && 10 !== $len) {
+            return false;
+        }
+
+        // Splits date
+        $day = substr($date, 0, $len - 8);
+        $month = substr($date, $len - 7, 2);
+        $year = substr($date, $len - 4, 4);
+
+        return static::checkSplitDate($year, $month, $day, $date[$len - 5], $date[$len - 8], '/') ?
+            $year . '-' . $month . '-' . (9 === $len ? '0' : '') . $day :
+            false;
+    }
+
+    /**
+     * Short french date : format "D/MM/YY" or  "DD/MM/YY"
+     * Note              : $date is supposed have a good length (so, do a "trim" before).
+     *
+     * @param mixed $date
+     */
+    public static function shortFrenchDate($date)
+    {
+        $len = strlen($date);
+
+        // Bad length
+        if (7 !== $len && 8 !== $len) {
+            return false;
+        }
+
+        // Splits date
+        $day = substr($date, 0, $len - 6);
+        $month = substr($date, $len - 5, 2);
+        $year = substr($date, $len - 2, 2);
+        $year = (((int) $year > 45) ? '19' : '20') . $year;
+
+        return static::checkSplitDate($year, $month, $day, $date[$len - 3], $date[$len - 6], '/') ?
+            $year . '-' . $month . '-' . (7 === $len ? '0' : '') . $day :
+            false;
+    }
+
+    /**
+     * Returns true if each part of a date is valid.
+     * Else, returns false.
+     *
+     * @param mixed $year
+     * @param mixed $month
+     * @param mixed $day
+     * @param mixed $yearDelimiter
+     * @param mixed $monthDelimiter
+     * @param mixed $goodDelimiter
+     */
+    public static function checkSplitDate($year, $month, $day, $yearDelimiter, $monthDelimiter, $goodDelimiter = '-')
+    {
+        return ($yearDelimiter === $goodDelimiter) && ($monthDelimiter === $goodDelimiter)
+            && is_numeric($year) && is_numeric($month) && is_numeric($day)
+            && checkdate((int) $month, (int) $day, (int) $year);
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/ToTimeMsTransformer.php b/src/Irstea/BdohBundle/DataTransformer/ToTimeMsTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..36480866b9a2782daafd0fc76f5bfc6d68483254
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/ToTimeMsTransformer.php
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Validates and transforms time, from any format to TimeMs format (hh:mm:ss.uuu).
+ *
+ * Each function returns :
+ *  => the transformed time (format "H:i:s.u") ;
+ *  => or FALSE if any error occured.
+ */
+class ToTimeMsTransformer
+{
+    /**
+     * The parameter should be :
+     *    => a time with just hours       :  format (h)h
+     *    => a time without seconds       :  format (h)h:mm
+     *    => a time without milliseconds  :  format (h)h:mm:ss
+     *    => a time with milliseconds     :  format (h)h:mm:ss.uuu.
+     *
+     * @param mixed $time
+     */
+    public static function varTimeMs($time)
+    {
+        $time = trim($time);
+        $len = strlen($time);
+
+        // Cases of once digit for hours
+        if (in_array($len, [1, 4, 7, 11])) {
+            ++$len;
+            $time = '0' . $time;
+        }
+
+        switch ($len) {
+            case 2:
+                return static::checkTimeJustHours($time) ? $time . ':00:00.000' : false;
+            case 5:
+                return static::checkTimeWithoutSeconds($time) ? $time . ':00.000' : false;
+            case 8:
+                return static::checkTime($time) ? $time . '.000' : false;
+            case 12:
+                return static::checkTimeMs($time) ? $time : false;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Checks that a time with just hours is valid.
+     * Note : the string length is assumed to be good (equal to 2).
+     *
+     * @param mixed $time
+     */
+    public static function checkTimeJustHours($time)
+    {
+        return (($time[0] === '0' || $time[0] === '1') && ctype_digit($time[1]))
+            || ($time[0] === '2' && $time[1] >= '0' && $time[1] <= '4');
+    }
+
+    /**
+     * Checks that a time without seconds is valid.
+     * Note : the string length is assumed to be good (equal to 5).
+     *
+     * @param mixed $time
+     */
+    public static function checkTimeWithoutSeconds($time)
+    {
+        return ('24:00' === $time)
+            ||
+            ((':' === $time[2])
+                && ($time[3] >= '0' && $time[3] < '6')
+                && ctype_digit($time[4])
+                && static::checkTimeJustHours($time[0] . $time[1]));
+    }
+
+    /**
+     * Checks that a time without milliseconds is valid.
+     * Note : the string length is assumed to be good (equal to 8).
+     *
+     * @param mixed $time
+     */
+    public static function checkTime($time)
+    {
+        return ('24:00:00' === $time)
+            ||
+            ((':' === $time[5])
+                && ($time[6] >= '0' && $time[6] < '6')
+                && ctype_digit($time[7])
+                && static::checkTimeWithoutSeconds(substr($time, 0, 5)));
+    }
+
+    /**
+     * Checks that a time with milliseconds is valid.
+     * Note : the string length is assumed to be good (equal to 12).
+     *
+     * @param mixed $time
+     */
+    public static function checkTimeMs($time)
+    {
+        return ('24:00:00.000' === $time)
+            ||
+            (('.' === $time[8])
+                && is_numeric($time[9] . $time[10] . $time[11])
+                && static::checkTime(substr($time, 0, 8)));
+    }
+}
diff --git a/src/Irstea/BdohBundle/DataTransformer/ToUtcDiffTransformer.php b/src/Irstea/BdohBundle/DataTransformer/ToUtcDiffTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..0368ecf56421ab286d1ced04056e928e2aca56a3
--- /dev/null
+++ b/src/Irstea/BdohBundle/DataTransformer/ToUtcDiffTransformer.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\DataTransformer;
+
+/**
+ * Validates and transforms timezone, from any format to "UTC diff" format
+ * (+/-hh:mm ; eg: +02:00, -04:30, +11:00, -00:49...).
+ *
+ * Each function returns :
+ *  => the transformed timezone ("UTC diff" format "+/-hh:mm") ;
+ *  => or FALSE if any error occured.
+ */
+class ToUtcDiffTransformer
+{
+    /**
+     * "UTC diff" timezone : format "+/-hh:mm"
+     * Note : Consistency of hours and minutes is tested (only hitch : "+12:37" or "-12:01" pass).
+     *
+     * @param mixed $utcDiffTimezone
+     */
+    public static function utcDiff($utcDiffTimezone)
+    {
+        $tz = trim($utcDiffTimezone);
+
+        if (strlen($tz) === 6
+            && in_array($tz[0], ['+', '-'])
+            && (
+                ($tz[1] === '0' && ctype_digit($tz[2]))
+                || ($tz[1] === '1' && in_array($tz[2], ['0', '1', '2']))
+            )
+            && $tz[3] === ':'
+            && in_array($tz[4], ['0', '1', '2', '3', '4', '5'])
+            && ctype_digit($tz[5])
+        ) {
+            return $tz;
+        }
+
+        return false;
+    }
+
+    /**
+     * Bdoh timezone format : "UTC+/-(h)h" (ex : +2, -10, +0...).
+     * Consistency of hour is tested  :
+     *      => no hour bigger than 12 ;
+     *      => both +12 and -12 are accepted ;
+     *      => hour entered as "+/- 0X" (ex : -02, +03) is accepted .
+     *
+     * @param mixed $timezone
+     */
+    public static function bdohTimezone($timezone)
+    {
+        // The string without any space
+        $tz = str_replace(' ', '', $timezone);
+
+        // $tz should contain 'UTC', treats it
+        if ('UTC' === strtoupper(substr($tz, 0, 3))) {
+            $tz = substr($tz, 3);
+            $len = strlen($tz);
+
+            if (($len === 2 || $len === 3) && in_array($tz[0], ['+', '-'])) {
+                if ($len === 2) {
+                    if (ctype_digit($tz[1])) {
+                        return $tz[0] . '0' . $tz[1] . ':00';
+                    }
+                } elseif (($tz[1] === '0' && ctype_digit($tz[2])) ||
+                    ($tz[1] === '1' && in_array($tz[2], ['0', '1', '2']))) {
+                    return $tz . ':00';
+                }
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/src/Irstea/BdohBundle/EventListener/ContentTypeNegociator.php b/src/Irstea/BdohBundle/EventListener/ContentTypeNegociator.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f931c8e26704f3da76ba6d0cf416632aac72f8f
--- /dev/null
+++ b/src/Irstea/BdohBundle/EventListener/ContentTypeNegociator.php
@@ -0,0 +1,91 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\EventListener;
+
+use JMS\DiExtraBundle\Annotation as DI;
+use Negotiation\Accept;
+use Negotiation\Negotiator;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Class ContentTypeNegociator.
+ *
+ * @DI\Service
+ * @DI\Tag("kernel.event_subscriber")
+ */
+class ContentTypeNegociator implements EventSubscriberInterface
+{
+    /**
+     * @var Negotiator
+     */
+    private $negotiator;
+
+    /**
+     * @var string[]
+     */
+    private $priorities;
+
+    /**
+     * ContentTypeNegociator constructor.
+     *
+     * @param Negotiator $negotiator
+     */
+    public function __construct(array $priorities = null, Negotiator $negotiator = null)
+    {
+        $this->negotiator = $negotiator ?? new Negotiator();
+        $this->priorities = $priorities ?? ['text/html', 'application/json'];
+    }
+
+    /**
+     * @param GetResponseEvent $ev
+     */
+    public function onRequest(GetResponseEvent $ev)
+    {
+        $request = $ev->getRequest();
+        $accept = $request->headers->get('Accept');
+
+        /** @var Accept|null $match */
+        $match = $this->negotiator->getBest($accept, $this->priorities);
+        if (!$match) {
+            $ev->setResponse(new Response(null, Response::HTTP_NOT_ACCEPTABLE));
+            $ev->stopPropagation();
+
+            return;
+        }
+
+        $format = $request->getFormat($match->getNormalizedValue());
+        if ($format) {
+            $request->setRequestFormat($format);
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public static function getSubscribedEvents()
+    {
+        return [KernelEvents::REQUEST => 'onRequest'];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Exception/Exception.php b/src/Irstea/BdohBundle/Exception/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..290915042cbbd9ceea08cb440466b48d412e6a9c
--- /dev/null
+++ b/src/Irstea/BdohBundle/Exception/Exception.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Exception;
+
+interface Exception
+{
+}
diff --git a/src/Irstea/BdohBundle/Exception/NotFoundEntityException.php b/src/Irstea/BdohBundle/Exception/NotFoundEntityException.php
new file mode 100644
index 0000000000000000000000000000000000000000..e918773a0faea439f712674f8e0d42317e26ece9
--- /dev/null
+++ b/src/Irstea/BdohBundle/Exception/NotFoundEntityException.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Exception;
+
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+/**
+ * Thrown when the searching for an entity (from certain criteria)
+ * returns nothing.
+ */
+class NotFoundEntityException extends NotFoundHttpException implements Exception
+{
+    private $criteria;
+
+    private $entityClass;
+
+    /**
+     * @param string $entityClass
+     * @param array  $criteria    Keys are criteria and values are values for these criteria
+     */
+    public function __construct($entityClass, $criteria = [])
+    {
+        $this->entityClass = $entityClass;
+        $this->criteria = $criteria;
+
+        $txt = "A '%s' entity was not found";
+        if ($criteria) {
+            $txt .= ' from the following criteria : %s';
+        }
+
+        parent::__construct(sprintf($txt, $entityClass, $this->criteriaToString()));
+    }
+
+    public function getCriteria()
+    {
+        return $this->criteria;
+    }
+
+    public function getEntityClass()
+    {
+        return $this->entityClass;
+    }
+
+    public function criteriaToString()
+    {
+        $txt = '';
+        foreach ($this->criteria as $key => $value) {
+            $txt .= $key . $value . ', ';
+        }
+
+        return substr($txt, 0, -2);
+    }
+}
diff --git a/src/Irstea/BdohBundle/Form/Type/UTCDateTimeType.php b/src/Irstea/BdohBundle/Form/Type/UTCDateTimeType.php
new file mode 100644
index 0000000000000000000000000000000000000000..2840aa80e2c5cb69e87d270b7d48e3ba0c44b3cb
--- /dev/null
+++ b/src/Irstea/BdohBundle/Form/Type/UTCDateTimeType.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+/**
+ * Class UTCDateTimeType.
+ */
+class UTCDateTimeType extends AbstractType
+{
+    /** @noinspection PhpMissingParentCallCommonInspection */
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParent()
+    {
+        return DateTimeType::class;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults(
+            [
+                'widget'         => 'single_text',
+                'model_timezone' => 'UTC',
+                'view_timezone'  => 'UTC',
+            ]
+        );
+    }
+}
diff --git a/src/Irstea/BdohBundle/IrsteaBdohBundle.php b/src/Irstea/BdohBundle/IrsteaBdohBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..e56fe7a40d3cbe48e68ecadb921afdb82924fb58
--- /dev/null
+++ b/src/Irstea/BdohBundle/IrsteaBdohBundle.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohBundle extends Bundle
+{
+}
diff --git a/src/Irstea/BdohBundle/Manager/CssManager.php b/src/Irstea/BdohBundle/Manager/CssManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e912cbe57ece664e3d2cb078a49b2bea6c68238
--- /dev/null
+++ b/src/Irstea/BdohBundle/Manager/CssManager.php
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Manager;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+/**
+ * This class allows to :
+ *   => load the 'observatoire' context ;
+ *   => manage the current 'observatoire' ;
+ *   => manage the css file of an 'observatoire' ;.
+ */
+class CssManager
+{
+    /**
+     * @var array
+     */
+    protected $files;
+
+    /**
+     * @var string
+     */
+    protected $cssPath;
+
+    /**
+     * @var string
+     */
+    protected $webRoot;
+
+    /**
+     * @var array
+     */
+    protected $options;
+
+    /**
+     * @var array
+     */
+    protected $variables;
+
+    /**
+     * @var bool
+     */
+    protected $debug;
+
+    /**
+     * @var bool
+     */
+    protected $failsafe;
+
+    /**
+     * @param array  $files
+     * @param string $cssPath
+     * @param string $webRoot
+     * @param array  $options
+     * @param array  $variables
+     * @param mixed  $debug
+     */
+    public function __construct(array $files, $cssPath, $webRoot, array $options, array $variables = [], $debug = false)
+    {
+        $this->files = $files;
+        $this->cssPath = $cssPath;
+        $this->webRoot = $webRoot;
+        $this->options = $options;
+        $this->variables = $variables;
+        $this->debug = $debug;
+    }
+
+    /**
+     * Gets CSS file path, relative to the web directory.
+     * If this file doesn't exist, creates it !
+     *
+     * @param Observatoire|null $obs
+     *
+     * @return string
+     */
+    public function getObservatoireCssFile(Observatoire $obs = null)
+    {
+        list($webPath, $localPath) = $this->getPaths($obs);
+        if ($this->debug || !file_exists($localPath)) {
+            $this->updateObservatoireCssFile($obs);
+        }
+
+        return $webPath;
+    }
+
+    /**
+     * Gets CSS file path, relative to the web directory.
+     * If this file doesn't exist, creates it !
+     *
+     * @param Observatoire|null $obs
+     *
+     * @throws \Less_Exception_Parser
+     */
+    public function updateObservatoireCssFile(Observatoire $obs = null)
+    {
+        list(, $localPath) = $this->getPaths($obs);
+
+        $opts = $this->options;
+        $opts['output'] = $localPath;
+        $opts['compress'] = !$this->debug;
+
+        try {
+            \Less_Cache::Get($this->files, $opts, $this->getVariables($obs));
+        } catch (\Less_Exception_Parser $ex) {
+            $ex->genMessage();
+            file_put_contents($localPath, sprintf("/* LESS compilation error:\n\n%s\n*/", $ex->getMessage()));
+            if (!$this->failsafe) {
+                $this->failsafe = true;
+                throw $ex;
+            }
+        }
+    }
+
+    /**
+     * @param Observatoire|null $obs
+     */
+    public function removeObservatoireCssFile(Observatoire $obs = null)
+    {
+        list(, $localPath) = $this->getPaths($obs);
+        if (file_exists($localPath)) {
+            unlink($localPath);
+        }
+    }
+
+    /**
+     * @param Observatoire|null $obs
+     *
+     * @return array
+     */
+    private function getVariables(Observatoire $obs = null)
+    {
+        $vars = $this->variables;
+        if ($obs !== null) {
+            $vars['primaryColor'] = $obs->getCouleurPrimaire();
+            $vars['secondaryColor'] = $obs->getCouleurSecondaire();
+        }
+
+        return $vars;
+    }
+
+    /**
+     * @param Observatoire|null $obs
+     *
+     * @return array [string, string]
+     */
+    private function getPaths(Observatoire $obs = null)
+    {
+        $slug = $obs !== null ? $obs->getSlug() : 'home';
+        $webPath = $this->cssPath . $slug . ($this->debug ? '' : '.min') . '.css';
+        $localPath = $this->webRoot . $webPath;
+
+        return [$webPath, $localPath];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Manager/JobManager.php b/src/Irstea/BdohBundle/Manager/JobManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..018eb0aa68ba17f27da969030655951172803d1e
--- /dev/null
+++ b/src/Irstea/BdohBundle/Manager/JobManager.php
@@ -0,0 +1,314 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Manager;
+
+use Doctrine\ORM\NonUniqueResultException;
+use Irstea\BdohDataBundle\Command\AbstractExportCommand;
+use Irstea\BdohDataBundle\Command\ComputeChroniqueCommand;
+use Irstea\BdohDataBundle\Command\ComputeFillingRateCommand;
+use Irstea\BdohDataBundle\Command\ConvertChroniqueCommand;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohTheiaOzcarBundle\Command\SendJSONToTheiaCommand;
+use JMS\DiExtraBundle\Annotation as DI;
+use JMS\JobQueueBundle\Entity\Job;
+use Psr\Log\InvalidArgumentException;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+
+/**
+ * Class JobManager.
+ *
+ * @DI\Service("irstea_bdoh.job_manager")
+ */
+class JobManager implements JobManagerInterface
+{
+    /**
+     * @var RegistryInterface
+     * @DI\Inject
+     */
+    public $doctrine;
+
+    /**
+     * @var TokenStorageInterface
+     * @DI\Inject("security.token_storage")
+     */
+    public $tokenStorage;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enqueueComputeFillingRates(
+        Chronique $chronique,
+        \DateTime $start = null,
+        \DateTime $end = null
+    ) {
+        $arguments = [
+            $chronique->getId(),
+            $start !== null ? $start->format(DATE_ATOM) : '',
+            $end !== null ? $end->format(DATE_ATOM) : '',
+        ];
+
+        $job = new Job(
+            ComputeFillingRateCommand::COMMAND_NAME,
+            $arguments,
+            true,
+            'job_queue_chronique_' . $chronique->getId(),
+            Job::PRIORITY_DEFAULT
+        );
+        $job->addRelatedEntity($chronique);
+        $job->addRelatedEntity($chronique->getObservatoire());
+        $this->submit($job);
+
+        return $job;
+    }
+
+    /**
+     * @param Job $job
+     */
+    private function submit(Job $job)
+    {
+        $token = $this->tokenStorage->getToken();
+        if ($token !== null) {
+            $job->addRelatedEntity($token->getUser());
+        }
+        $this->persist($job);
+    }
+
+    /**
+     * @param Job $job
+     */
+    private function persist(Job $job)
+    {
+        $manager = $this->doctrine->getManagerForClass(Job::class);
+        $manager->persist($job);
+        $manager->flush();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enqueueExport(
+        Utilisateur $user,
+        $type,
+        $format,
+        \DateTime $begin,
+        \DateTime $end,
+        array $chroniques,
+        $timestep = null,
+        \DateTimeZone $timezone = null,
+        $locale = null
+    ) {
+        $arguments = [];
+
+        if ($type !== 'identical') {
+            if (!$timestep) {
+                throw new InvalidArgumentException("Cannot do a $type export without a timestep");
+            }
+            $arguments[] = $timestep;
+        }
+
+        $arguments[] = $begin->format(\DateTime::ATOM);
+        $arguments[] = $end->format(\DateTime::ATOM);
+
+        foreach ($chroniques as $chronique) {
+            $arguments[] = $chronique->getId();
+        }
+
+        $options = [
+            'format'   => strtolower($format),
+            'send-to'  => $user->getEmail(),
+            'timezone' => $timezone ? "'" . $timezone->getName() . "'" : null,
+            'locale'   => $locale,
+        ];
+        foreach ($options as $key => $value) {
+            if ($value !== null) {
+                $arguments[] = '--' . $key;
+                $arguments[] = $value;
+            }
+        }
+
+        $job = new Job(
+            AbstractExportCommand::COMMAND_NAME_PREFIX . $type,
+            $arguments,
+            true,
+            'job_queue_export',
+            Job::PRIORITY_LOW
+        );
+
+        $job->addRelatedEntity($user);
+        foreach ($chroniques as $chronique) {
+            $job->addRelatedEntity($chronique);
+            $job->addRelatedEntity($chronique->getObservatoire());
+        }
+
+        $this->submit($job);
+
+        return $job;
+    }
+
+    /**
+     * @param Job $job
+     *
+     * @return Job
+     */
+    public function retry(Job $job)
+    {
+        assert('$this->canRetry($job)');
+
+        $newJob = clone $job;
+        foreach ($job->getRelatedEntities() as $entity) {
+            $newJob->addRelatedEntity($entity);
+        }
+
+        $this->submit($newJob);
+
+        return $newJob;
+    }
+
+    /**
+     * @param Job $job
+     *
+     * @return bool
+     */
+    public function canRetry(Job $job)
+    {
+        return $job->isIncomplete() || $job->isTerminated() || $job->isFailed();
+    }
+
+    /**
+     * @param $job
+     */
+    public function cancel(Job $job)
+    {
+        assert('$this->canCancel($job)');
+
+        $job->setState(Job::STATE_CANCELED);
+        $this->persist($job);
+    }
+
+    /**
+     * @param $job
+     *
+     * @return bool
+     */
+    public function canCancel(Job $job)
+    {
+        return $job->isNew() || $job->isPending();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enqueueChronicleComputation(ChroniqueCalculee $chronique, Utilisateur $user, $propagate)
+    {
+        $args = [(string) $chronique->getId(), (string) $user->getId()];
+        if ($propagate) {
+            array_unshift($args, '--propagate');
+        }
+
+        $job = new Job(
+            ComputeChroniqueCommand::COMMAND_NAME,
+            $args,
+            true,
+            'job_queue_chronique_' . $chronique->getId(),
+            Job::PRIORITY_HIGH
+        );
+
+        $job->addRelatedEntity($chronique);
+        $job->addRelatedEntity($chronique->getObservatoire());
+
+        $this->submit($job);
+
+        return $job;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enqueueChronicleConversion(ChroniqueConvertie $chronique, Utilisateur $user, $propagate)
+    {
+        $args = [(string) $chronique->getId(), (string) $user->getId()];
+        if ($propagate) {
+            array_unshift($args, '--propagate');
+        }
+
+        $job = new Job(
+            ConvertChroniqueCommand::COMMAND_NAME,
+            $args,
+            true,
+            'job_queue_chronique_' . $chronique->getId(),
+            Job::PRIORITY_HIGH
+        );
+
+        $job->addRelatedEntity($chronique);
+        $job->addRelatedEntity($chronique->getObservatoire());
+
+        $this->submit($job);
+
+        return $job;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enqueueJsonTheia(Observatoire $observatoire)
+    {
+        $args = [(string) $observatoire->getTheiaCode()];
+        $job = new Job(
+            SendJSONToTheiaCommand::COMMAND_NAME,
+            $args,
+            true,
+            'json_theia',
+            Job::PRIORITY_HIGH
+        );
+
+        $job->addRelatedEntity($observatoire);
+
+        $this->submit($job);
+
+        return $job;
+    }
+
+    /**
+     * @param Chronique $chonique
+     *
+     * @return bool
+     */
+    public function hasActiveJobs($chonique)
+    {
+        /** @var \JMS\JobQueueBundle\Entity\Repository\JobRepository $jobRepo */
+        $jobRepo = $this->doctrine->getRepository('JMSJobQueueBundle:Job');
+        try {
+            $jobComputeChronique = $jobRepo->findOpenJobForRelatedEntity(ComputeChroniqueCommand::COMMAND_NAME, $chonique);
+            $jobConvertChronique = $jobRepo->findOpenJobForRelatedEntity(ConvertChroniqueCommand::COMMAND_NAME, $chonique);
+            $jobComputeFillingRate = $jobRepo->findOpenJobForRelatedEntity(ComputeFillingRateCommand::COMMAND_NAME, $chonique);
+        } catch (NonUniqueResultException $e) {
+            return true;
+        }
+
+        return $jobComputeChronique !== null || $jobConvertChronique !== null || $jobComputeFillingRate !== null;
+    }
+}
diff --git a/src/Irstea/BdohBundle/Manager/JobManagerInterface.php b/src/Irstea/BdohBundle/Manager/JobManagerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf7b841d5a9bab02183ea57474aa69be084bed86
--- /dev/null
+++ b/src/Irstea/BdohBundle/Manager/JobManagerInterface.php
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Manager;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\JobQueueBundle\Entity\Job;
+
+/**
+ * Interface JobManagerInterface.
+ */
+interface JobManagerInterface
+{
+    /**
+     * @param Chronique      $chronique
+     * @param \DateTime|null $start
+     * @param \DateTime|null $end
+     *
+     * @return Job
+     */
+    public function enqueueComputeFillingRates(
+        Chronique $chronique,
+        \DateTime $start = null,
+        \DateTime $end = null
+    );
+
+    /**
+     * @param Utilisateur        $user
+     * @param string             $type
+     * @param string             $format
+     * @param \DateTime          $begin
+     * @param \DateTime          $end
+     * @param Chronique[]        $chroniques
+     * @param int|null           $timestep
+     * @param \DateTimeZone|null $timezone
+     * @param string|null        $locale
+     *
+     * @return Job
+     */
+    public function enqueueExport(
+        Utilisateur $user,
+        $type,
+        $format,
+        \DateTime $begin,
+        \DateTime $end,
+        array $chroniques,
+        $timestep = null,
+        \DateTimeZone $timezone = null,
+        $locale = null
+    );
+
+    /**
+     * @param Job $job
+     *
+     * @return Job
+     */
+    public function retry(Job $job);
+
+    /**
+     * @param Job $job
+     *
+     * @return bool
+     */
+    public function canRetry(Job $job);
+
+    /**
+     * @param Job $job
+     */
+    public function cancel(Job $job);
+
+    /**
+     * @param Job $job
+     *
+     * @return bool
+     */
+    public function canCancel(Job $job);
+
+    /**
+     * @param ChroniqueCalculee $chronique
+     * @param Utilisateur       $user
+     * @param bool              $propagate
+     *
+     * @return Job $job
+     */
+    public function enqueueChronicleComputation(ChroniqueCalculee $chronique, Utilisateur $user, $propagate);
+
+    /**
+     * @param ChroniqueConvertie $chronique
+     * @param Utilisateur        $user
+     * @param bool               $propagate
+     *
+     * @return Job $job
+     */
+    public function enqueueChronicleConversion(ChroniqueConvertie $chronique, Utilisateur $user, $propagate);
+
+    /**
+     * @param Observatoire $observatoire
+     *
+     * @return mixed
+     */
+    public function enqueueJsonTheia(Observatoire $observatoire);
+
+    /**
+     * @param Chronique $chonique
+     *
+     * @return bool
+     */
+    public function hasActiveJobs($chonique);
+}
diff --git a/src/Irstea/BdohBundle/Manager/ObservatoireManager.php b/src/Irstea/BdohBundle/Manager/ObservatoireManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d2a672a820432e2b4bae56bbaf066537329629d
--- /dev/null
+++ b/src/Irstea/BdohBundle/Manager/ObservatoireManager.php
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Manager;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\ObservatoireRepository;
+use Symfony\Component\HttpKernel\Event\KernelEvent;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * This class allows to :
+ *   => load the 'observatoire' context ;
+ *   => manage the current 'observatoire' ;
+ *   => manage the css file of an 'observatoire' ;.
+ */
+class ObservatoireManager implements ObservatoireManagerInterface
+{
+    /**
+     * @var EntityManagerInterface
+     */
+    protected $em;
+
+    /**
+     * @var RouterInterface
+     */
+    protected $router;
+
+    /**
+     * @var TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * Constructor.
+     *
+     * @param EntityManagerInterface $em
+     * @param RouterInterface        $router
+     * @param TranslatorInterface    $translator
+     */
+    public function __construct(EntityManagerInterface $em, RouterInterface $router, TranslatorInterface $translator)
+    {
+        $this->em = $em;
+        $this->router = $router;
+        $this->translator = $translator;
+    }
+
+    /**
+     * Gets the current 'observatoire'.
+     *
+     * @return Observatoire
+     */
+    public function getCurrent()
+    {
+        return Observatoire::getCurrent();
+    }
+
+    /**
+     * Loads the 'observatoire' context only if request contains the '_observatoire' attribute.
+     * This attribute must be an 'observatoire' slug.
+     */
+    public function loadContext(KernelEvent $event)
+    {
+        $request = $event->getRequest();
+
+        // If no '_observatoire' attribute => nothing to do !
+        if (false === $request->attributes->has('_observatoire')) {
+            return;
+        }
+
+        $observatoireSlug = strtoupper($request->attributes->get('_observatoire'));
+
+        // Stores the 'observatoire' entity from its slug
+        $this->setCurrentFromSlug($observatoireSlug);
+
+        // Stores this slug in the request context of router service
+        $this->router->getContext()->setParameter('_observatoire', $observatoireSlug);
+    }
+
+    /**
+     * Gets 'observatoire' entity in DB from its slug.
+     * Then, stores it as the current 'observatoire'.
+     *
+     * @param string $observatoireSlug
+     *
+     * @throws NotFoundHttpException if 'observatoire' doesn't exist in DB
+     */
+    protected function setCurrentFromSlug($observatoireSlug)
+    {
+        /** @var ObservatoireRepository $repObs */
+        $repObs = $this->em->getRepository(Observatoire::class);
+
+        // If does NOT EXIST in DB => EXCEPTION !
+
+        /* @var $observatoire \Irstea\BdohDataBundle\Entity\Observatoire */
+        $observatoire = $repObs->findOneBySlug($observatoireSlug);
+
+        if (!$observatoire) {
+            $errorMessage = $this->translator->trans(
+                'Observatoire.notExist(%observatoireSlug%)',
+                ['%observatoireSlug%' => $observatoireSlug]
+            );
+            throw new NotFoundHttpException($errorMessage);
+        }
+
+        $observatoire->defineAsCurrent();
+    }
+}
diff --git a/src/Irstea/BdohBundle/Manager/ObservatoireManagerInterface.php b/src/Irstea/BdohBundle/Manager/ObservatoireManagerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..cef86aa08230a477b611fbc5568716c9f85fd425
--- /dev/null
+++ b/src/Irstea/BdohBundle/Manager/ObservatoireManagerInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Manager;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+/**
+ * This class allows to :
+ *   => load the 'observatoire' context ;
+ *   => manage the current 'observatoire' ;
+ *   => manage the css file of an 'observatoire' ;.
+ */
+interface ObservatoireManagerInterface
+{
+    /**
+     * Gets the current 'observatoire'.
+     *
+     * @return Observatoire
+     */
+    public function getCurrent();
+}
diff --git a/src/Irstea/BdohBundle/Model/LabelledEntityInterface.php b/src/Irstea/BdohBundle/Model/LabelledEntityInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..af80d972bf129fa125baf7dd5bea0bc4de08fbbb
--- /dev/null
+++ b/src/Irstea/BdohBundle/Model/LabelledEntityInterface.php
@@ -0,0 +1,44 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Model;
+
+/**
+ * Interface LabelledEntityInterface.
+ */
+interface LabelledEntityInterface
+{
+    /**
+     * Get libelle.
+     *
+     * @param string $lang
+     *
+     * @return string
+     */
+    public function getLibelle(string $lang = 'fr'): string;
+
+    /**
+     * Get libelleEn.
+     *
+     * @return string|null
+     */
+    public function getLibelleEn();
+}
diff --git a/src/Irstea/BdohBundle/Model/LabelledEntityTrait.php b/src/Irstea/BdohBundle/Model/LabelledEntityTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cca79541880f7e51101b69f452194ea56c48986
--- /dev/null
+++ b/src/Irstea/BdohBundle/Model/LabelledEntityTrait.php
@@ -0,0 +1,96 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Model;
+
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * @UniqueEntity(fields="libelle")
+ * @UniqueEntity(fields="libelleEn")
+ */
+trait LabelledEntityTrait
+{
+    /**
+     * @var string
+     */
+    protected $libelle;
+
+    /**
+     * @var string
+     */
+    protected $libelleEn;
+
+    /**
+     * Set libelle.
+     *
+     * @param string|null $libelle
+     * @param string      $lang
+     *
+     * @return $this
+     */
+    public function setLibelle(string $libelle, string $lang = 'fr')
+    {
+        if (\strpos($lang, 'fr') === 0) {
+            $this->libelle = $libelle;
+        } else {
+            $this->libelleEn = $libelle;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Get libelle.
+     *
+     * @param string $lang
+     *
+     * @return string
+     */
+    public function getLibelle(string $lang = 'fr'): string
+    {
+        if (\strpos($lang, 'fr') === 0) {
+            return $this->libelle ?? $this->libelleEn ?? '';
+        }
+
+        return $this->libelleEn ?? $this->libelle;
+    }
+
+    /**
+     * Set libelleEn.
+     *
+     * @param string|null $libelleEn
+     */
+    public function setLibelleEn(string $libelleEn = null)
+    {
+        $this->libelleEn = $libelleEn;
+    }
+
+    /**
+     * Get libelleEn.
+     *
+     * @return string|null
+     */
+    public function getLibelleEn()
+    {
+        return $this->libelleEn;
+    }
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/async.less b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/async.less
new file mode 100644
index 0000000000000000000000000000000000000000..0d1edb2b8de8bcb6b417bab2619025df914b9d6c
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/async.less
@@ -0,0 +1,43 @@
+.async {
+    & > .waiting {
+        width:      100%;
+        height:     48px;
+        text-align: center;
+        display:    block;
+
+        .glyphicon-hourglass {
+            font-size:      48px;
+            line-height:    1.0;
+            height:         40px;
+            vertical-align: middle;
+            animation:      spinning 2s infinite ease;
+        }
+
+    }
+
+    & > .result {
+        visibility: hidden;
+    }
+}
+
+.async.done {
+    & > .waiting {
+        display: none;
+    }
+
+    & > .result {
+        visibility: visible;
+    }
+}
+
+@keyframes spinning {
+    0% {
+        transform: scale(1) rotate(0deg);
+    }
+    50% {
+        transform: scale(1) rotate(180deg);
+    }
+    100% {
+        transform: scale(1) rotate(360deg);
+    }
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.less b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.less
new file mode 100644
index 0000000000000000000000000000000000000000..0e7c7d0602442723b84cf94be37e018233d26de0
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.less
@@ -0,0 +1,4004 @@
+[class^="fam-"],
+[class*=" fam-"] {
+    display:        inline-block;
+    width:          16px;
+    height:         16px;
+    vertical-align: top;
+    background:     transparent url("./fam-icons.png") no-repeat;
+}
+
+.fam-add {
+    background-position: -0px -0px;
+}
+
+.fam-anchor {
+    background-position: -18px -0px;
+}
+
+.fam-application {
+    background-position: -36px -0px;
+}
+
+.fam-application-add {
+    background-position: -54px -0px;
+}
+
+.fam-application-cascade {
+    background-position: -72px -0px;
+}
+
+.fam-application-delete {
+    background-position: -90px -0px;
+}
+
+.fam-application-double {
+    background-position: -108px -0px;
+}
+
+.fam-application-edit {
+    background-position: -126px -0px;
+}
+
+.fam-application-error {
+    background-position: -144px -0px;
+}
+
+.fam-application-form {
+    background-position: -162px -0px;
+}
+
+.fam-application-form-add {
+    background-position: -180px -0px;
+}
+
+.fam-application-form-delete {
+    background-position: -198px -0px;
+}
+
+.fam-application-form-edit {
+    background-position: -216px -0px;
+}
+
+.fam-application-form-magnify {
+    background-position: -234px -0px;
+}
+
+.fam-application-get {
+    background-position: -252px -0px;
+}
+
+.fam-application-go {
+    background-position: -270px -0px;
+}
+
+.fam-application-home {
+    background-position: -288px -0px;
+}
+
+.fam-application-key {
+    background-position: -306px -0px;
+}
+
+.fam-application-lightning {
+    background-position: -324px -0px;
+}
+
+.fam-application-link {
+    background-position: -342px -0px;
+}
+
+.fam-application-osx {
+    background-position: -360px -0px;
+}
+
+.fam-application-osx-terminal {
+    background-position: -378px -0px;
+}
+
+.fam-application-put {
+    background-position: -396px -0px;
+}
+
+.fam-application-side-boxes {
+    background-position: -414px -0px;
+}
+
+.fam-application-side-contract {
+    background-position: -432px -0px;
+}
+
+.fam-application-side-expand {
+    background-position: -450px -0px;
+}
+
+.fam-application-side-list {
+    background-position: -468px -0px;
+}
+
+.fam-application-side-tree {
+    background-position: -486px -0px;
+}
+
+.fam-application-split {
+    background-position: -504px -0px;
+}
+
+.fam-application-tile-horizontal {
+    background-position: -522px -0px;
+}
+
+.fam-application-tile-vertical {
+    background-position: -540px -0px;
+}
+
+.fam-application-view-columns {
+    background-position: -558px -0px;
+}
+
+.fam-application-view-detail {
+    background-position: -576px -0px;
+}
+
+.fam-application-view-gallery {
+    background-position: -0px -18px;
+}
+
+.fam-application-view.fam- {
+    background-position: -18px -18px;
+}
+
+.fam-application-view-list {
+    background-position: -36px -18px;
+}
+
+.fam-application-view-tile {
+    background-position: -54px -18px;
+}
+
+.fam-application-xp {
+    background-position: -72px -18px;
+}
+
+.fam-application-xp-terminal {
+    background-position: -90px -18px;
+}
+
+.fam-arrow-branch {
+    background-position: -108px -18px;
+}
+
+.fam-arrow-divide {
+    background-position: -126px -18px;
+}
+
+.fam-arrow-down {
+    background-position: -144px -18px;
+}
+
+.fam-arrow-in {
+    background-position: -162px -18px;
+}
+
+.fam-arrow-inout {
+    background-position: -180px -18px;
+}
+
+.fam-arrow-join {
+    background-position: -198px -18px;
+}
+
+.fam-arrow-left {
+    background-position: -216px -18px;
+}
+
+.fam-arrow-merge {
+    background-position: -234px -18px;
+}
+
+.fam-arrow-out {
+    background-position: -252px -18px;
+}
+
+.fam-arrow-redo {
+    background-position: -270px -18px;
+}
+
+.fam-arrow-refresh {
+    background-position: -288px -18px;
+}
+
+.fam-arrow-refresh-small {
+    background-position: -306px -18px;
+}
+
+.fam-arrow-right {
+    background-position: -324px -18px;
+}
+
+.fam-arrow-rotate-anticlockwise {
+    background-position: -342px -18px;
+}
+
+.fam-arrow-rotate-clockwise {
+    background-position: -360px -18px;
+}
+
+.fam-arrow-switch {
+    background-position: -378px -18px;
+}
+
+.fam-arrow-turn-left {
+    background-position: -396px -18px;
+}
+
+.fam-arrow-turn-right {
+    background-position: -414px -18px;
+}
+
+.fam-arrow-undo {
+    background-position: -432px -18px;
+}
+
+.fam-arrow-up {
+    background-position: -450px -18px;
+}
+
+.fam-asterisk-orange {
+    background-position: -468px -18px;
+}
+
+.fam-asterisk-yellow {
+    background-position: -486px -18px;
+}
+
+.fam-attach {
+    background-position: -504px -18px;
+}
+
+.fam-award-star-add {
+    background-position: -522px -18px;
+}
+
+.fam-award-star-bronze-1 {
+    background-position: -540px -18px;
+}
+
+.fam-award-star-bronze-2 {
+    background-position: -558px -18px;
+}
+
+.fam-award-star-bronze-3 {
+    background-position: -576px -18px;
+}
+
+.fam-award-star-delete {
+    background-position: -0px -36px;
+}
+
+.fam-award-star-gold-1 {
+    background-position: -18px -36px;
+}
+
+.fam-award-star-gold-2 {
+    background-position: -36px -36px;
+}
+
+.fam-award-star-gold-3 {
+    background-position: -54px -36px;
+}
+
+.fam-award-star-silver-1 {
+    background-position: -72px -36px;
+}
+
+.fam-award-star-silver-2 {
+    background-position: -90px -36px;
+}
+
+.fam-award-star-silver-3 {
+    background-position: -108px -36px;
+}
+
+.fam-basket {
+    background-position: -126px -36px;
+}
+
+.fam-basket-add {
+    background-position: -144px -36px;
+}
+
+.fam-basket-delete {
+    background-position: -162px -36px;
+}
+
+.fam-basket-edit {
+    background-position: -180px -36px;
+}
+
+.fam-basket-error {
+    background-position: -198px -36px;
+}
+
+.fam-basket-go {
+    background-position: -216px -36px;
+}
+
+.fam-basket-put {
+    background-position: -234px -36px;
+}
+
+.fam-basket-remove {
+    background-position: -252px -36px;
+}
+
+.fam-bell {
+    background-position: -270px -36px;
+}
+
+.fam-bell-add {
+    background-position: -288px -36px;
+}
+
+.fam-bell-delete {
+    background-position: -306px -36px;
+}
+
+.fam-bell-error {
+    background-position: -324px -36px;
+}
+
+.fam-bell-go {
+    background-position: -342px -36px;
+}
+
+.fam-bell-link {
+    background-position: -360px -36px;
+}
+
+.fam-bin {
+    background-position: -378px -36px;
+}
+
+.fam-bin-closed {
+    background-position: -396px -36px;
+}
+
+.fam-bin-empty {
+    background-position: -414px -36px;
+}
+
+.fam-bomb {
+    background-position: -432px -36px;
+}
+
+.fam-book {
+    background-position: -450px -36px;
+}
+
+.fam-book-add {
+    background-position: -468px -36px;
+}
+
+.fam-book-addresses {
+    background-position: -486px -36px;
+}
+
+.fam-book-delete {
+    background-position: -504px -36px;
+}
+
+.fam-book-edit {
+    background-position: -522px -36px;
+}
+
+.fam-book-error {
+    background-position: -540px -36px;
+}
+
+.fam-book-go {
+    background-position: -558px -36px;
+}
+
+.fam-book-key {
+    background-position: -576px -36px;
+}
+
+.fam-book-link {
+    background-position: -0px -54px;
+}
+
+.fam-book-next {
+    background-position: -18px -54px;
+}
+
+.fam-book-open {
+    background-position: -36px -54px;
+}
+
+.fam-book-previous {
+    background-position: -54px -54px;
+}
+
+.fam-box {
+    background-position: -72px -54px;
+}
+
+.fam-brick {
+    background-position: -90px -54px;
+}
+
+.fam-brick-add {
+    background-position: -108px -54px;
+}
+
+.fam-brick-delete {
+    background-position: -126px -54px;
+}
+
+.fam-brick-edit {
+    background-position: -144px -54px;
+}
+
+.fam-brick-error {
+    background-position: -162px -54px;
+}
+
+.fam-brick-go {
+    background-position: -180px -54px;
+}
+
+.fam-brick-link {
+    background-position: -198px -54px;
+}
+
+.fam-bricks {
+    background-position: -216px -54px;
+}
+
+.fam-briefcase {
+    background-position: -234px -54px;
+}
+
+.fam-bug {
+    background-position: -252px -54px;
+}
+
+.fam-bug-add {
+    background-position: -270px -54px;
+}
+
+.fam-bug-delete {
+    background-position: -288px -54px;
+}
+
+.fam-bug-edit {
+    background-position: -306px -54px;
+}
+
+.fam-bug-error {
+    background-position: -324px -54px;
+}
+
+.fam-bug-go {
+    background-position: -342px -54px;
+}
+
+.fam-bug-link {
+    background-position: -360px -54px;
+}
+
+.fam-building {
+    background-position: -378px -54px;
+}
+
+.fam-building-add {
+    background-position: -396px -54px;
+}
+
+.fam-building-delete {
+    background-position: -414px -54px;
+}
+
+.fam-building-edit {
+    background-position: -432px -54px;
+}
+
+.fam-building-error {
+    background-position: -450px -54px;
+}
+
+.fam-building-go {
+    background-position: -468px -54px;
+}
+
+.fam-building-key {
+    background-position: -486px -54px;
+}
+
+.fam-building-link {
+    background-position: -504px -54px;
+}
+
+.fam-bullet-add {
+    background-position: -522px -54px;
+}
+
+.fam-bullet-arrow-bottom {
+    background-position: -540px -54px;
+}
+
+.fam-bullet-arrow-down {
+    background-position: -558px -54px;
+}
+
+.fam-bullet-arrow-top {
+    background-position: -576px -54px;
+}
+
+.fam-bullet-arrow-up {
+    background-position: -0px -72px;
+}
+
+.fam-bullet-black {
+    background-position: -18px -72px;
+}
+
+.fam-bullet-blue {
+    background-position: -36px -72px;
+}
+
+.fam-bullet-delete {
+    background-position: -54px -72px;
+}
+
+.fam-bullet-disk {
+    background-position: -72px -72px;
+}
+
+.fam-bullet-error {
+    background-position: -90px -72px;
+}
+
+.fam-bullet-feed {
+    background-position: -108px -72px;
+}
+
+.fam-bullet-go {
+    background-position: -126px -72px;
+}
+
+.fam-bullet-green {
+    background-position: -144px -72px;
+}
+
+.fam-bullet-key {
+    background-position: -162px -72px;
+}
+
+.fam-bullet-orange {
+    background-position: -180px -72px;
+}
+
+.fam-bullet-picture {
+    background-position: -198px -72px;
+}
+
+.fam-bullet-pink {
+    background-position: -216px -72px;
+}
+
+.fam-bullet-purple {
+    background-position: -234px -72px;
+}
+
+.fam-bullet-red {
+    background-position: -252px -72px;
+}
+
+.fam-bullet-star {
+    background-position: -270px -72px;
+}
+
+.fam-bullet-toggle-minus {
+    background-position: -288px -72px;
+}
+
+.fam-bullet-toggle-plus {
+    background-position: -306px -72px;
+}
+
+.fam-bullet-white {
+    background-position: -324px -72px;
+}
+
+.fam-bullet-wrench {
+    background-position: -342px -72px;
+}
+
+.fam-bullet-yellow {
+    background-position: -360px -72px;
+}
+
+.fam-cake {
+    background-position: -378px -72px;
+}
+
+.fam-calculator {
+    background-position: -396px -72px;
+}
+
+.fam-calculator-add {
+    background-position: -414px -72px;
+}
+
+.fam-calculator-delete {
+    background-position: -432px -72px;
+}
+
+.fam-calculator-edit {
+    background-position: -450px -72px;
+}
+
+.fam-calculator-error {
+    background-position: -468px -72px;
+}
+
+.fam-calculator-link {
+    background-position: -486px -72px;
+}
+
+.fam-calendar {
+    background-position: -504px -72px;
+}
+
+.fam-calendar-add {
+    background-position: -522px -72px;
+}
+
+.fam-calendar-delete {
+    background-position: -540px -72px;
+}
+
+.fam-calendar-edit {
+    background-position: -558px -72px;
+}
+
+.fam-calendar-link {
+    background-position: -576px -72px;
+}
+
+.fam-calendar-view-day {
+    background-position: -0px -90px;
+}
+
+.fam-calendar-view-month {
+    background-position: -18px -90px;
+}
+
+.fam-calendar-view-week {
+    background-position: -36px -90px;
+}
+
+.fam-camera {
+    background-position: -54px -90px;
+}
+
+.fam-camera-add {
+    background-position: -72px -90px;
+}
+
+.fam-camera-delete {
+    background-position: -90px -90px;
+}
+
+.fam-camera-edit {
+    background-position: -108px -90px;
+}
+
+.fam-camera-error {
+    background-position: -126px -90px;
+}
+
+.fam-camera-go {
+    background-position: -144px -90px;
+}
+
+.fam-camera-link {
+    background-position: -162px -90px;
+}
+
+.fam-camera-small {
+    background-position: -180px -90px;
+}
+
+.fam-cancel {
+    background-position: -198px -90px;
+}
+
+.fam-car {
+    background-position: -216px -90px;
+}
+
+.fam-car-add {
+    background-position: -234px -90px;
+}
+
+.fam-car-delete {
+    background-position: -252px -90px;
+}
+
+.fam-cart {
+    background-position: -270px -90px;
+}
+
+.fam-cart-add {
+    background-position: -288px -90px;
+}
+
+.fam-cart-delete {
+    background-position: -306px -90px;
+}
+
+.fam-cart-edit {
+    background-position: -324px -90px;
+}
+
+.fam-cart-error {
+    background-position: -342px -90px;
+}
+
+.fam-cart-go {
+    background-position: -360px -90px;
+}
+
+.fam-cart-put {
+    background-position: -378px -90px;
+}
+
+.fam-cart-remove {
+    background-position: -396px -90px;
+}
+
+.fam-cd {
+    background-position: -414px -90px;
+}
+
+.fam-cd-add {
+    background-position: -432px -90px;
+}
+
+.fam-cd-burn {
+    background-position: -450px -90px;
+}
+
+.fam-cd-delete {
+    background-position: -468px -90px;
+}
+
+.fam-cd-edit {
+    background-position: -486px -90px;
+}
+
+.fam-cd-eject {
+    background-position: -504px -90px;
+}
+
+.fam-cd-go {
+    background-position: -522px -90px;
+}
+
+.fam-chart-bar {
+    background-position: -540px -90px;
+}
+
+.fam-chart-bar-add {
+    background-position: -558px -90px;
+}
+
+.fam-chart-bar-delete {
+    background-position: -576px -90px;
+}
+
+.fam-chart-bar-edit {
+    background-position: -0px -108px;
+}
+
+.fam-chart-bar-error {
+    background-position: -18px -108px;
+}
+
+.fam-chart-bar-link {
+    background-position: -36px -108px;
+}
+
+.fam-chart-curve {
+    background-position: -54px -108px;
+}
+
+.fam-chart-curve-add {
+    background-position: -72px -108px;
+}
+
+.fam-chart-curve-delete {
+    background-position: -90px -108px;
+}
+
+.fam-chart-curve-edit {
+    background-position: -108px -108px;
+}
+
+.fam-chart-curve-error {
+    background-position: -126px -108px;
+}
+
+.fam-chart-curve-go {
+    background-position: -144px -108px;
+}
+
+.fam-chart-curve-link {
+    background-position: -162px -108px;
+}
+
+.fam-chart-line {
+    background-position: -180px -108px;
+}
+
+.fam-chart-line-add {
+    background-position: -198px -108px;
+}
+
+.fam-chart-line-delete {
+    background-position: -216px -108px;
+}
+
+.fam-chart-line-edit {
+    background-position: -234px -108px;
+}
+
+.fam-chart-line-error {
+    background-position: -252px -108px;
+}
+
+.fam-chart-line-link {
+    background-position: -270px -108px;
+}
+
+.fam-chart-organisation {
+    background-position: -288px -108px;
+}
+
+.fam-chart-organisation-add {
+    background-position: -306px -108px;
+}
+
+.fam-chart-organisation-delete {
+    background-position: -324px -108px;
+}
+
+.fam-chart-pie {
+    background-position: -342px -108px;
+}
+
+.fam-chart-pie-add {
+    background-position: -360px -108px;
+}
+
+.fam-chart-pie-delete {
+    background-position: -378px -108px;
+}
+
+.fam-chart-pie-edit {
+    background-position: -396px -108px;
+}
+
+.fam-chart-pie-error {
+    background-position: -414px -108px;
+}
+
+.fam-chart-pie-link {
+    background-position: -432px -108px;
+}
+
+.fam-clock {
+    background-position: -450px -108px;
+}
+
+.fam-clock-add {
+    background-position: -468px -108px;
+}
+
+.fam-clock-delete {
+    background-position: -486px -108px;
+}
+
+.fam-clock-edit {
+    background-position: -504px -108px;
+}
+
+.fam-clock-error {
+    background-position: -522px -108px;
+}
+
+.fam-clock-go {
+    background-position: -540px -108px;
+}
+
+.fam-clock-link {
+    background-position: -558px -108px;
+}
+
+.fam-clock-pause {
+    background-position: -576px -108px;
+}
+
+.fam-clock-play {
+    background-position: -0px -126px;
+}
+
+.fam-clock-red {
+    background-position: -18px -126px;
+}
+
+.fam-clock-stop {
+    background-position: -36px -126px;
+}
+
+.fam-cog {
+    background-position: -54px -126px;
+}
+
+.fam-cog-add {
+    background-position: -72px -126px;
+}
+
+.fam-cog-delete {
+    background-position: -90px -126px;
+}
+
+.fam-cog-edit {
+    background-position: -108px -126px;
+}
+
+.fam-cog-error {
+    background-position: -126px -126px;
+}
+
+.fam-cog-go {
+    background-position: -144px -126px;
+}
+
+.fam-coins {
+    background-position: -162px -126px;
+}
+
+.fam-coins-add {
+    background-position: -180px -126px;
+}
+
+.fam-coins-delete {
+    background-position: -198px -126px;
+}
+
+.fam-color-swatch {
+    background-position: -216px -126px;
+}
+
+.fam-color-wheel {
+    background-position: -234px -126px;
+}
+
+.fam-comment {
+    background-position: -252px -126px;
+}
+
+.fam-comment-add {
+    background-position: -270px -126px;
+}
+
+.fam-comment-delete {
+    background-position: -288px -126px;
+}
+
+.fam-comment-edit {
+    background-position: -306px -126px;
+}
+
+.fam-comments {
+    background-position: -324px -126px;
+}
+
+.fam-comments-add {
+    background-position: -342px -126px;
+}
+
+.fam-comments-delete {
+    background-position: -360px -126px;
+}
+
+.fam-compress {
+    background-position: -378px -126px;
+}
+
+.fam-computer {
+    background-position: -396px -126px;
+}
+
+.fam-computer-add {
+    background-position: -414px -126px;
+}
+
+.fam-computer-delete {
+    background-position: -432px -126px;
+}
+
+.fam-computer-edit {
+    background-position: -450px -126px;
+}
+
+.fam-computer-error {
+    background-position: -468px -126px;
+}
+
+.fam-computer-go {
+    background-position: -486px -126px;
+}
+
+.fam-computer-key {
+    background-position: -504px -126px;
+}
+
+.fam-computer-link {
+    background-position: -522px -126px;
+}
+
+.fam-connect {
+    background-position: -540px -126px;
+}
+
+.fam-contrast {
+    background-position: -558px -126px;
+}
+
+.fam-contrast-decrease {
+    background-position: -576px -126px;
+}
+
+.fam-contrast-high {
+    background-position: -0px -144px;
+}
+
+.fam-contrast-increase {
+    background-position: -18px -144px;
+}
+
+.fam-contrast-low {
+    background-position: -36px -144px;
+}
+
+.fam-control-eject {
+    background-position: -54px -144px;
+}
+
+.fam-control-eject-blue {
+    background-position: -72px -144px;
+}
+
+.fam-control-end {
+    background-position: -90px -144px;
+}
+
+.fam-control-end-blue {
+    background-position: -108px -144px;
+}
+
+.fam-control-equalizer {
+    background-position: -126px -144px;
+}
+
+.fam-control-equalizer-blue {
+    background-position: -144px -144px;
+}
+
+.fam-control-fastforward {
+    background-position: -162px -144px;
+}
+
+.fam-control-fastforward-blue {
+    background-position: -180px -144px;
+}
+
+.fam-control-pause {
+    background-position: -198px -144px;
+}
+
+.fam-control-pause-blue {
+    background-position: -216px -144px;
+}
+
+.fam-control-play {
+    background-position: -234px -144px;
+}
+
+.fam-control-play-blue {
+    background-position: -252px -144px;
+}
+
+.fam-control-repeat {
+    background-position: -270px -144px;
+}
+
+.fam-control-repeat-blue {
+    background-position: -288px -144px;
+}
+
+.fam-control-rewind {
+    background-position: -306px -144px;
+}
+
+.fam-control-rewind-blue {
+    background-position: -324px -144px;
+}
+
+.fam-control-start {
+    background-position: -342px -144px;
+}
+
+.fam-control-start-blue {
+    background-position: -360px -144px;
+}
+
+.fam-control-stop {
+    background-position: -378px -144px;
+}
+
+.fam-control-stop-blue {
+    background-position: -396px -144px;
+}
+
+.fam-controller {
+    background-position: -414px -144px;
+}
+
+.fam-controller-add {
+    background-position: -432px -144px;
+}
+
+.fam-controller-delete {
+    background-position: -450px -144px;
+}
+
+.fam-controller-error {
+    background-position: -468px -144px;
+}
+
+.fam-creditcards {
+    background-position: -486px -144px;
+}
+
+.fam-cross {
+    background-position: -504px -144px;
+}
+
+.fam-css {
+    background-position: -522px -144px;
+}
+
+.fam-css-add {
+    background-position: -540px -144px;
+}
+
+.fam-css-delete {
+    background-position: -558px -144px;
+}
+
+.fam-css-go {
+    background-position: -576px -144px;
+}
+
+.fam-css-valid {
+    background-position: -0px -162px;
+}
+
+.fam-cup {
+    background-position: -18px -162px;
+}
+
+.fam-cup-add {
+    background-position: -36px -162px;
+}
+
+.fam-cup-delete {
+    background-position: -54px -162px;
+}
+
+.fam-cup-edit {
+    background-position: -72px -162px;
+}
+
+.fam-cup-error {
+    background-position: -90px -162px;
+}
+
+.fam-cup-go {
+    background-position: -108px -162px;
+}
+
+.fam-cup-key {
+    background-position: -126px -162px;
+}
+
+.fam-cup-link {
+    background-position: -144px -162px;
+}
+
+.fam-cursor {
+    background-position: -162px -162px;
+}
+
+.fam-cut {
+    background-position: -180px -162px;
+}
+
+.fam-cut-red {
+    background-position: -198px -162px;
+}
+
+.fam-database {
+    background-position: -216px -162px;
+}
+
+.fam-database-add {
+    background-position: -234px -162px;
+}
+
+.fam-database-connect {
+    background-position: -252px -162px;
+}
+
+.fam-database-delete {
+    background-position: -270px -162px;
+}
+
+.fam-database-edit {
+    background-position: -288px -162px;
+}
+
+.fam-database-error {
+    background-position: -306px -162px;
+}
+
+.fam-database-gear {
+    background-position: -324px -162px;
+}
+
+.fam-database-go {
+    background-position: -342px -162px;
+}
+
+.fam-database-key {
+    background-position: -360px -162px;
+}
+
+.fam-database-lightning {
+    background-position: -378px -162px;
+}
+
+.fam-database-link {
+    background-position: -396px -162px;
+}
+
+.fam-database-refresh {
+    background-position: -414px -162px;
+}
+
+.fam-database-save {
+    background-position: -432px -162px;
+}
+
+.fam-database-table {
+    background-position: -450px -162px;
+}
+
+.fam-date {
+    background-position: -468px -162px;
+}
+
+.fam-date-add {
+    background-position: -486px -162px;
+}
+
+.fam-date-delete {
+    background-position: -504px -162px;
+}
+
+.fam-date-edit {
+    background-position: -522px -162px;
+}
+
+.fam-date-error {
+    background-position: -540px -162px;
+}
+
+.fam-date-go {
+    background-position: -558px -162px;
+}
+
+.fam-date-link {
+    background-position: -576px -162px;
+}
+
+.fam-date-magnify {
+    background-position: -0px -180px;
+}
+
+.fam-date-next {
+    background-position: -18px -180px;
+}
+
+.fam-date-previous {
+    background-position: -36px -180px;
+}
+
+.fam-delete {
+    background-position: -54px -180px;
+}
+
+.fam-disconnect {
+    background-position: -72px -180px;
+}
+
+.fam-disk {
+    background-position: -90px -180px;
+}
+
+.fam-disk-multiple {
+    background-position: -108px -180px;
+}
+
+.fam-door {
+    background-position: -126px -180px;
+}
+
+.fam-door-in {
+    background-position: -144px -180px;
+}
+
+.fam-door-open {
+    background-position: -162px -180px;
+}
+
+.fam-door-out {
+    background-position: -180px -180px;
+}
+
+.fam-drink {
+    background-position: -198px -180px;
+}
+
+.fam-drink-empty {
+    background-position: -216px -180px;
+}
+
+.fam-drive {
+    background-position: -234px -180px;
+}
+
+.fam-drive-add {
+    background-position: -252px -180px;
+}
+
+.fam-drive-burn {
+    background-position: -270px -180px;
+}
+
+.fam-drive-cd {
+    background-position: -288px -180px;
+}
+
+.fam-drive-cd-empty {
+    background-position: -306px -180px;
+}
+
+.fam-drive-delete {
+    background-position: -324px -180px;
+}
+
+.fam-drive-disk {
+    background-position: -342px -180px;
+}
+
+.fam-drive-edit {
+    background-position: -360px -180px;
+}
+
+.fam-drive-error {
+    background-position: -378px -180px;
+}
+
+.fam-drive-go {
+    background-position: -396px -180px;
+}
+
+.fam-drive-key {
+    background-position: -414px -180px;
+}
+
+.fam-drive-link {
+    background-position: -432px -180px;
+}
+
+.fam-drive-magnify {
+    background-position: -450px -180px;
+}
+
+.fam-drive-network {
+    background-position: -468px -180px;
+}
+
+.fam-drive-rename {
+    background-position: -486px -180px;
+}
+
+.fam-drive-user {
+    background-position: -504px -180px;
+}
+
+.fam-drive-web {
+    background-position: -522px -180px;
+}
+
+.fam-dvd {
+    background-position: -540px -180px;
+}
+
+.fam-dvd-add {
+    background-position: -558px -180px;
+}
+
+.fam-dvd-delete {
+    background-position: -576px -180px;
+}
+
+.fam-dvd-edit {
+    background-position: -0px -198px;
+}
+
+.fam-dvd-error {
+    background-position: -18px -198px;
+}
+
+.fam-dvd-go {
+    background-position: -36px -198px;
+}
+
+.fam-dvd-key {
+    background-position: -54px -198px;
+}
+
+.fam-dvd-link {
+    background-position: -72px -198px;
+}
+
+.fam-email {
+    background-position: -90px -198px;
+}
+
+.fam-email-add {
+    background-position: -108px -198px;
+}
+
+.fam-email-attach {
+    background-position: -126px -198px;
+}
+
+.fam-email-delete {
+    background-position: -144px -198px;
+}
+
+.fam-email-edit {
+    background-position: -162px -198px;
+}
+
+.fam-email-error {
+    background-position: -180px -198px;
+}
+
+.fam-email-go {
+    background-position: -198px -198px;
+}
+
+.fam-email-link {
+    background-position: -216px -198px;
+}
+
+.fam-email-open {
+    background-position: -234px -198px;
+}
+
+.fam-email-open-image {
+    background-position: -252px -198px;
+}
+
+.fam-emo.fam-evilgrin {
+    background-position: -270px -198px;
+}
+
+.fam-emo.fam-grin {
+    background-position: -288px -198px;
+}
+
+.fam-emo.fam-happy {
+    background-position: -306px -198px;
+}
+
+.fam-emo.fam-smile {
+    background-position: -324px -198px;
+}
+
+.fam-emo.fam-surprised {
+    background-position: -342px -198px;
+}
+
+.fam-emo.fam-tongue {
+    background-position: -360px -198px;
+}
+
+.fam-emo.fam-unhappy {
+    background-position: -378px -198px;
+}
+
+.fam-emo.fam-waii {
+    background-position: -396px -198px;
+}
+
+.fam-emo.fam-wink {
+    background-position: -414px -198px;
+}
+
+.fam-error {
+    background-position: -432px -198px;
+}
+
+.fam-error-add {
+    background-position: -450px -198px;
+}
+
+.fam-error-delete {
+    background-position: -468px -198px;
+}
+
+.fam-error-go {
+    background-position: -486px -198px;
+}
+
+.fam-exclamation {
+    background-position: -504px -198px;
+}
+
+.fam-eye {
+    background-position: -522px -198px;
+}
+
+.fam-feed {
+    background-position: -540px -198px;
+}
+
+.fam-feed-add {
+    background-position: -558px -198px;
+}
+
+.fam-feed-delete {
+    background-position: -576px -198px;
+}
+
+.fam-feed-disk {
+    background-position: -0px -216px;
+}
+
+.fam-feed-edit {
+    background-position: -18px -216px;
+}
+
+.fam-feed-error {
+    background-position: -36px -216px;
+}
+
+.fam-feed-go {
+    background-position: -54px -216px;
+}
+
+.fam-feed-key {
+    background-position: -72px -216px;
+}
+
+.fam-feed-link {
+    background-position: -90px -216px;
+}
+
+.fam-feed-magnify {
+    background-position: -108px -216px;
+}
+
+.fam-female {
+    background-position: -126px -216px;
+}
+
+.fam-film {
+    background-position: -144px -216px;
+}
+
+.fam-film-add {
+    background-position: -162px -216px;
+}
+
+.fam-film-delete {
+    background-position: -180px -216px;
+}
+
+.fam-film-edit {
+    background-position: -198px -216px;
+}
+
+.fam-film-error {
+    background-position: -216px -216px;
+}
+
+.fam-film-go {
+    background-position: -234px -216px;
+}
+
+.fam-film-key {
+    background-position: -252px -216px;
+}
+
+.fam-film-link {
+    background-position: -270px -216px;
+}
+
+.fam-film-save {
+    background-position: -288px -216px;
+}
+
+.fam-find {
+    background-position: -306px -216px;
+}
+
+.fam-flag-blue {
+    background-position: -324px -216px;
+}
+
+.fam-flag-green {
+    background-position: -342px -216px;
+}
+
+.fam-flag-orange {
+    background-position: -360px -216px;
+}
+
+.fam-flag-pink {
+    background-position: -378px -216px;
+}
+
+.fam-flag-purple {
+    background-position: -396px -216px;
+}
+
+.fam-flag-red {
+    background-position: -414px -216px;
+}
+
+.fam-flag-yellow {
+    background-position: -432px -216px;
+}
+
+.fam-folder {
+    background-position: -450px -216px;
+}
+
+.fam-folder-add {
+    background-position: -468px -216px;
+}
+
+.fam-folder-bell {
+    background-position: -486px -216px;
+}
+
+.fam-folder-brick {
+    background-position: -504px -216px;
+}
+
+.fam-folder-bug {
+    background-position: -522px -216px;
+}
+
+.fam-folder-camera {
+    background-position: -540px -216px;
+}
+
+.fam-folder-database {
+    background-position: -558px -216px;
+}
+
+.fam-folder-delete {
+    background-position: -576px -216px;
+}
+
+.fam-folder-edit {
+    background-position: -0px -234px;
+}
+
+.fam-folder-error {
+    background-position: -18px -234px;
+}
+
+.fam-folder-explore {
+    background-position: -36px -234px;
+}
+
+.fam-folder-feed {
+    background-position: -54px -234px;
+}
+
+.fam-folder-find {
+    background-position: -72px -234px;
+}
+
+.fam-folder-go {
+    background-position: -90px -234px;
+}
+
+.fam-folder-heart {
+    background-position: -108px -234px;
+}
+
+.fam-folder-image {
+    background-position: -126px -234px;
+}
+
+.fam-folder-key {
+    background-position: -144px -234px;
+}
+
+.fam-folder-lightbulb {
+    background-position: -162px -234px;
+}
+
+.fam-folder-link {
+    background-position: -180px -234px;
+}
+
+.fam-folder-magnify {
+    background-position: -198px -234px;
+}
+
+.fam-folder-page {
+    background-position: -216px -234px;
+}
+
+.fam-folder-page-white {
+    background-position: -234px -234px;
+}
+
+.fam-folder-palette {
+    background-position: -252px -234px;
+}
+
+.fam-folder-picture {
+    background-position: -270px -234px;
+}
+
+.fam-folder-star {
+    background-position: -288px -234px;
+}
+
+.fam-folder-table {
+    background-position: -306px -234px;
+}
+
+.fam-folder-user {
+    background-position: -324px -234px;
+}
+
+.fam-folder-wrench {
+    background-position: -342px -234px;
+}
+
+.fam-font {
+    background-position: -360px -234px;
+}
+
+.fam-font-add {
+    background-position: -378px -234px;
+}
+
+.fam-font-delete {
+    background-position: -396px -234px;
+}
+
+.fam-font-go {
+    background-position: -414px -234px;
+}
+
+.fam-group {
+    background-position: -432px -234px;
+}
+
+.fam-group-add {
+    background-position: -450px -234px;
+}
+
+.fam-group-delete {
+    background-position: -468px -234px;
+}
+
+.fam-group-edit {
+    background-position: -486px -234px;
+}
+
+.fam-group-error {
+    background-position: -504px -234px;
+}
+
+.fam-group-gear {
+    background-position: -522px -234px;
+}
+
+.fam-group-go {
+    background-position: -540px -234px;
+}
+
+.fam-group-key {
+    background-position: -558px -234px;
+}
+
+.fam-group-link {
+    background-position: -576px -234px;
+}
+
+.fam-heart {
+    background-position: -0px -252px;
+}
+
+.fam-heart-add {
+    background-position: -18px -252px;
+}
+
+.fam-heart-delete {
+    background-position: -36px -252px;
+}
+
+.fam-help {
+    background-position: -54px -252px;
+}
+
+.fam-hourglass {
+    background-position: -72px -252px;
+}
+
+.fam-hourglass-add {
+    background-position: -90px -252px;
+}
+
+.fam-hourglass-delete {
+    background-position: -108px -252px;
+}
+
+.fam-hourglass-go {
+    background-position: -126px -252px;
+}
+
+.fam-hourglass-link {
+    background-position: -144px -252px;
+}
+
+.fam-house {
+    background-position: -162px -252px;
+}
+
+.fam-house-go {
+    background-position: -180px -252px;
+}
+
+.fam-house-link {
+    background-position: -198px -252px;
+}
+
+.fam-html {
+    background-position: -216px -252px;
+}
+
+.fam-html-add {
+    background-position: -234px -252px;
+}
+
+.fam-html-delete {
+    background-position: -252px -252px;
+}
+
+.fam-html-go {
+    background-position: -270px -252px;
+}
+
+.fam-html-valid {
+    background-position: -288px -252px;
+}
+
+.fam-image {
+    background-position: -306px -252px;
+}
+
+.fam-image-add {
+    background-position: -324px -252px;
+}
+
+.fam-image-delete {
+    background-position: -342px -252px;
+}
+
+.fam-image-edit {
+    background-position: -360px -252px;
+}
+
+.fam-image-link {
+    background-position: -378px -252px;
+}
+
+.fam-images {
+    background-position: -396px -252px;
+}
+
+.fam-information {
+    background-position: -414px -252px;
+}
+
+.fam-ipod {
+    background-position: -432px -252px;
+}
+
+.fam-ipod-cast {
+    background-position: -450px -252px;
+}
+
+.fam-ipod-cast-add {
+    background-position: -468px -252px;
+}
+
+.fam-ipod-cast-delete {
+    background-position: -486px -252px;
+}
+
+.fam-ipod-sound {
+    background-position: -504px -252px;
+}
+
+.fam-joystick {
+    background-position: -522px -252px;
+}
+
+.fam-joystick-add {
+    background-position: -540px -252px;
+}
+
+.fam-joystick-delete {
+    background-position: -558px -252px;
+}
+
+.fam-joystick-error {
+    background-position: -576px -252px;
+}
+
+.fam-key {
+    background-position: -0px -270px;
+}
+
+.fam-key-add {
+    background-position: -18px -270px;
+}
+
+.fam-key-delete {
+    background-position: -36px -270px;
+}
+
+.fam-key-go {
+    background-position: -54px -270px;
+}
+
+.fam-keyboard {
+    background-position: -72px -270px;
+}
+
+.fam-keyboard-add {
+    background-position: -90px -270px;
+}
+
+.fam-keyboard-delete {
+    background-position: -108px -270px;
+}
+
+.fam-keyboard-magnify {
+    background-position: -126px -270px;
+}
+
+.fam-layers {
+    background-position: -144px -270px;
+}
+
+.fam-layout {
+    background-position: -162px -270px;
+}
+
+.fam-layout-add {
+    background-position: -180px -270px;
+}
+
+.fam-layout-content {
+    background-position: -198px -270px;
+}
+
+.fam-layout-delete {
+    background-position: -216px -270px;
+}
+
+.fam-layout-edit {
+    background-position: -234px -270px;
+}
+
+.fam-layout-error {
+    background-position: -252px -270px;
+}
+
+.fam-layout-header {
+    background-position: -270px -270px;
+}
+
+.fam-layout-link {
+    background-position: -288px -270px;
+}
+
+.fam-layout-sidebar {
+    background-position: -306px -270px;
+}
+
+.fam-lightbulb {
+    background-position: -324px -270px;
+}
+
+.fam-lightbulb-add {
+    background-position: -342px -270px;
+}
+
+.fam-lightbulb-delete {
+    background-position: -360px -270px;
+}
+
+.fam-lightbulb-off {
+    background-position: -378px -270px;
+}
+
+.fam-lightning {
+    background-position: -396px -270px;
+}
+
+.fam-lightning-add {
+    background-position: -414px -270px;
+}
+
+.fam-lightning-delete {
+    background-position: -432px -270px;
+}
+
+.fam-lightning-go {
+    background-position: -450px -270px;
+}
+
+.fam-link {
+    background-position: -468px -270px;
+}
+
+.fam-link-add {
+    background-position: -486px -270px;
+}
+
+.fam-link-break {
+    background-position: -504px -270px;
+}
+
+.fam-link-delete {
+    background-position: -522px -270px;
+}
+
+.fam-link-edit {
+    background-position: -540px -270px;
+}
+
+.fam-link-error {
+    background-position: -558px -270px;
+}
+
+.fam-link-go {
+    background-position: -576px -270px;
+}
+
+.fam-lock {
+    background-position: -0px -288px;
+}
+
+.fam-lock-add {
+    background-position: -18px -288px;
+}
+
+.fam-lock-break {
+    background-position: -36px -288px;
+}
+
+.fam-lock-delete {
+    background-position: -54px -288px;
+}
+
+.fam-lock-edit {
+    background-position: -72px -288px;
+}
+
+.fam-lock-go {
+    background-position: -90px -288px;
+}
+
+.fam-lock-open {
+    background-position: -108px -288px;
+}
+
+.fam-lorry {
+    background-position: -126px -288px;
+}
+
+.fam-lorry-add {
+    background-position: -144px -288px;
+}
+
+.fam-lorry-delete {
+    background-position: -162px -288px;
+}
+
+.fam-lorry-error {
+    background-position: -180px -288px;
+}
+
+.fam-lorry-flatbed {
+    background-position: -198px -288px;
+}
+
+.fam-lorry-go {
+    background-position: -216px -288px;
+}
+
+.fam-lorry-link {
+    background-position: -234px -288px;
+}
+
+.fam-magifier-zoom-out {
+    background-position: -252px -288px;
+}
+
+.fam-magnifier {
+    background-position: -270px -288px;
+}
+
+.fam-magnifier-zoom-in {
+    background-position: -288px -288px;
+}
+
+.fam-male {
+    background-position: -306px -288px;
+}
+
+.fam-map {
+    background-position: -324px -288px;
+}
+
+.fam-map-add {
+    background-position: -342px -288px;
+}
+
+.fam-map-delete {
+    background-position: -360px -288px;
+}
+
+.fam-map-edit {
+    background-position: -378px -288px;
+}
+
+.fam-map-go {
+    background-position: -396px -288px;
+}
+
+.fam-map-magnify {
+    background-position: -414px -288px;
+}
+
+.fam-medal-bronze-1 {
+    background-position: -432px -288px;
+}
+
+.fam-medal-bronze-2 {
+    background-position: -450px -288px;
+}
+
+.fam-medal-bronze-3 {
+    background-position: -468px -288px;
+}
+
+.fam-medal-bronze-add {
+    background-position: -486px -288px;
+}
+
+.fam-medal-bronze-delete {
+    background-position: -504px -288px;
+}
+
+.fam-medal-gold-1 {
+    background-position: -522px -288px;
+}
+
+.fam-medal-gold-2 {
+    background-position: -540px -288px;
+}
+
+.fam-medal-gold-3 {
+    background-position: -558px -288px;
+}
+
+.fam-medal-gold-add {
+    background-position: -576px -288px;
+}
+
+.fam-medal-gold-delete {
+    background-position: -0px -306px;
+}
+
+.fam-medal-silver-1 {
+    background-position: -18px -306px;
+}
+
+.fam-medal-silver-2 {
+    background-position: -36px -306px;
+}
+
+.fam-medal-silver-3 {
+    background-position: -54px -306px;
+}
+
+.fam-medal-silver-add {
+    background-position: -72px -306px;
+}
+
+.fam-medal-silver-delete {
+    background-position: -90px -306px;
+}
+
+.fam-money {
+    background-position: -108px -306px;
+}
+
+.fam-money-add {
+    background-position: -126px -306px;
+}
+
+.fam-money-delete {
+    background-position: -144px -306px;
+}
+
+.fam-money-dollar {
+    background-position: -162px -306px;
+}
+
+.fam-money-euro {
+    background-position: -180px -306px;
+}
+
+.fam-money-pound {
+    background-position: -198px -306px;
+}
+
+.fam-money-yen {
+    background-position: -216px -306px;
+}
+
+.fam-monitor {
+    background-position: -234px -306px;
+}
+
+.fam-monitor-add {
+    background-position: -252px -306px;
+}
+
+.fam-monitor-delete {
+    background-position: -270px -306px;
+}
+
+.fam-monitor-edit {
+    background-position: -288px -306px;
+}
+
+.fam-monitor-error {
+    background-position: -306px -306px;
+}
+
+.fam-monitor-go {
+    background-position: -324px -306px;
+}
+
+.fam-monitor-lightning {
+    background-position: -342px -306px;
+}
+
+.fam-monitor-link {
+    background-position: -360px -306px;
+}
+
+.fam-mouse {
+    background-position: -378px -306px;
+}
+
+.fam-mouse-add {
+    background-position: -396px -306px;
+}
+
+.fam-mouse-delete {
+    background-position: -414px -306px;
+}
+
+.fam-mouse-error {
+    background-position: -432px -306px;
+}
+
+.fam-music {
+    background-position: -450px -306px;
+}
+
+.fam-new {
+    background-position: -468px -306px;
+}
+
+.fam-newspaper {
+    background-position: -486px -306px;
+}
+
+.fam-newspaper-add {
+    background-position: -504px -306px;
+}
+
+.fam-newspaper-delete {
+    background-position: -522px -306px;
+}
+
+.fam-newspaper-go {
+    background-position: -540px -306px;
+}
+
+.fam-newspaper-link {
+    background-position: -558px -306px;
+}
+
+.fam-note {
+    background-position: -576px -306px;
+}
+
+.fam-note-add {
+    background-position: -0px -324px;
+}
+
+.fam-note-delete {
+    background-position: -18px -324px;
+}
+
+.fam-note-edit {
+    background-position: -36px -324px;
+}
+
+.fam-note-error {
+    background-position: -54px -324px;
+}
+
+.fam-note-go {
+    background-position: -72px -324px;
+}
+
+.fam-overlays {
+    background-position: -90px -324px;
+}
+
+.fam-package {
+    background-position: -108px -324px;
+}
+
+.fam-package-add {
+    background-position: -126px -324px;
+}
+
+.fam-package-delete {
+    background-position: -144px -324px;
+}
+
+.fam-package-go {
+    background-position: -162px -324px;
+}
+
+.fam-package-green {
+    background-position: -180px -324px;
+}
+
+.fam-package-link {
+    background-position: -198px -324px;
+}
+
+.fam-page {
+    background-position: -216px -324px;
+}
+
+.fam-page-add {
+    background-position: -234px -324px;
+}
+
+.fam-page-attach {
+    background-position: -252px -324px;
+}
+
+.fam-page-code {
+    background-position: -270px -324px;
+}
+
+.fam-page-copy {
+    background-position: -288px -324px;
+}
+
+.fam-page-delete {
+    background-position: -306px -324px;
+}
+
+.fam-page-edit {
+    background-position: -324px -324px;
+}
+
+.fam-page-error {
+    background-position: -342px -324px;
+}
+
+.fam-page-excel {
+    background-position: -360px -324px;
+}
+
+.fam-page-find {
+    background-position: -378px -324px;
+}
+
+.fam-page-gear {
+    background-position: -396px -324px;
+}
+
+.fam-page-go {
+    background-position: -414px -324px;
+}
+
+.fam-page-green {
+    background-position: -432px -324px;
+}
+
+.fam-page-key {
+    background-position: -450px -324px;
+}
+
+.fam-page-lightning {
+    background-position: -468px -324px;
+}
+
+.fam-page-link {
+    background-position: -486px -324px;
+}
+
+.fam-page-paintbrush {
+    background-position: -504px -324px;
+}
+
+.fam-page-paste {
+    background-position: -522px -324px;
+}
+
+.fam-page-red {
+    background-position: -540px -324px;
+}
+
+.fam-page-refresh {
+    background-position: -558px -324px;
+}
+
+.fam-page-save {
+    background-position: -576px -324px;
+}
+
+.fam-page-white {
+    background-position: -0px -342px;
+}
+
+.fam-page-white-acrobat {
+    background-position: -18px -342px;
+}
+
+.fam-page-white-actionscript {
+    background-position: -36px -342px;
+}
+
+.fam-page-white-add {
+    background-position: -54px -342px;
+}
+
+.fam-page-white-c {
+    background-position: -72px -342px;
+}
+
+.fam-page-white-camera {
+    background-position: -90px -342px;
+}
+
+.fam-page-white-cd {
+    background-position: -108px -342px;
+}
+
+.fam-page-white-code {
+    background-position: -126px -342px;
+}
+
+.fam-page-white-code-red {
+    background-position: -144px -342px;
+}
+
+.fam-page-white-coldfusion {
+    background-position: -162px -342px;
+}
+
+.fam-page-white-compressed {
+    background-position: -180px -342px;
+}
+
+.fam-page-white-copy {
+    background-position: -198px -342px;
+}
+
+.fam-page-white-cplusplus {
+    background-position: -216px -342px;
+}
+
+.fam-page-white-csharp {
+    background-position: -234px -342px;
+}
+
+.fam-page-white-cup {
+    background-position: -252px -342px;
+}
+
+.fam-page-white-database {
+    background-position: -270px -342px;
+}
+
+.fam-page-white-delete {
+    background-position: -288px -342px;
+}
+
+.fam-page-white-dvd {
+    background-position: -306px -342px;
+}
+
+.fam-page-white-edit {
+    background-position: -324px -342px;
+}
+
+.fam-page-white-error {
+    background-position: -342px -342px;
+}
+
+.fam-page-white-excel {
+    background-position: -360px -342px;
+}
+
+.fam-page-white-find {
+    background-position: -378px -342px;
+}
+
+.fam-page-white-flash {
+    background-position: -396px -342px;
+}
+
+.fam-page-white-freehand {
+    background-position: -414px -342px;
+}
+
+.fam-page-white-gear {
+    background-position: -432px -342px;
+}
+
+.fam-page-white-get {
+    background-position: -450px -342px;
+}
+
+.fam-page-white-go {
+    background-position: -468px -342px;
+}
+
+.fam-page-white-h {
+    background-position: -486px -342px;
+}
+
+.fam-page-white-horizontal {
+    background-position: -504px -342px;
+}
+
+.fam-page-white-key {
+    background-position: -522px -342px;
+}
+
+.fam-page-white-lightning {
+    background-position: -540px -342px;
+}
+
+.fam-page-white-link {
+    background-position: -558px -342px;
+}
+
+.fam-page-white-magnify {
+    background-position: -576px -342px;
+}
+
+.fam-page-white-medal {
+    background-position: -0px -360px;
+}
+
+.fam-page-white-office {
+    background-position: -18px -360px;
+}
+
+.fam-page-white-paint {
+    background-position: -36px -360px;
+}
+
+.fam-page-white-paintbrush {
+    background-position: -54px -360px;
+}
+
+.fam-page-white-paste {
+    background-position: -72px -360px;
+}
+
+.fam-page-white-php {
+    background-position: -90px -360px;
+}
+
+.fam-page-white-picture {
+    background-position: -108px -360px;
+}
+
+.fam-page-white-powerpoint {
+    background-position: -126px -360px;
+}
+
+.fam-page-white-put {
+    background-position: -144px -360px;
+}
+
+.fam-page-white-ruby {
+    background-position: -162px -360px;
+}
+
+.fam-page-white-stack {
+    background-position: -180px -360px;
+}
+
+.fam-page-white-star {
+    background-position: -198px -360px;
+}
+
+.fam-page-white-swoosh {
+    background-position: -216px -360px;
+}
+
+.fam-page-white-text {
+    background-position: -234px -360px;
+}
+
+.fam-page-white-text-width {
+    background-position: -252px -360px;
+}
+
+.fam-page-white-tux {
+    background-position: -270px -360px;
+}
+
+.fam-page-white-vector {
+    background-position: -288px -360px;
+}
+
+.fam-page-white-visualstudio {
+    background-position: -306px -360px;
+}
+
+.fam-page-white-width {
+    background-position: -324px -360px;
+}
+
+.fam-page-white-word {
+    background-position: -342px -360px;
+}
+
+.fam-page-white-world {
+    background-position: -360px -360px;
+}
+
+.fam-page-white-wrench {
+    background-position: -378px -360px;
+}
+
+.fam-page-white-zip {
+    background-position: -396px -360px;
+}
+
+.fam-page-word {
+    background-position: -414px -360px;
+}
+
+.fam-page-world {
+    background-position: -432px -360px;
+}
+
+.fam-paintbrush {
+    background-position: -450px -360px;
+}
+
+.fam-paintcan {
+    background-position: -468px -360px;
+}
+
+.fam-palette {
+    background-position: -486px -360px;
+}
+
+.fam-paste-plain {
+    background-position: -504px -360px;
+}
+
+.fam-paste-word {
+    background-position: -522px -360px;
+}
+
+.fam-pencil {
+    background-position: -540px -360px;
+}
+
+.fam-pencil-add {
+    background-position: -558px -360px;
+}
+
+.fam-pencil-delete {
+    background-position: -576px -360px;
+}
+
+.fam-pencil-go {
+    background-position: -0px -378px;
+}
+
+.fam-phone {
+    background-position: -18px -378px;
+}
+
+.fam-phone-add {
+    background-position: -36px -378px;
+}
+
+.fam-phone-delete {
+    background-position: -54px -378px;
+}
+
+.fam-phone-sound {
+    background-position: -72px -378px;
+}
+
+.fam-photo {
+    background-position: -90px -378px;
+}
+
+.fam-photo-add {
+    background-position: -108px -378px;
+}
+
+.fam-photo-delete {
+    background-position: -126px -378px;
+}
+
+.fam-photo-link {
+    background-position: -144px -378px;
+}
+
+.fam-photos {
+    background-position: -162px -378px;
+}
+
+.fam-picture {
+    background-position: -180px -378px;
+}
+
+.fam-picture-add {
+    background-position: -198px -378px;
+}
+
+.fam-picture-delete {
+    background-position: -216px -378px;
+}
+
+.fam-picture-edit {
+    background-position: -234px -378px;
+}
+
+.fam-picture-empty {
+    background-position: -252px -378px;
+}
+
+.fam-picture-error {
+    background-position: -270px -378px;
+}
+
+.fam-picture-go {
+    background-position: -288px -378px;
+}
+
+.fam-picture-key {
+    background-position: -306px -378px;
+}
+
+.fam-picture-link {
+    background-position: -324px -378px;
+}
+
+.fam-picture-save {
+    background-position: -342px -378px;
+}
+
+.fam-pictures {
+    background-position: -360px -378px;
+}
+
+.fam-pilcrow {
+    background-position: -378px -378px;
+}
+
+.fam-pill {
+    background-position: -396px -378px;
+}
+
+.fam-pill-add {
+    background-position: -414px -378px;
+}
+
+.fam-pill-delete {
+    background-position: -432px -378px;
+}
+
+.fam-pill-go {
+    background-position: -450px -378px;
+}
+
+.fam-plugin {
+    background-position: -468px -378px;
+}
+
+.fam-plugin-add {
+    background-position: -486px -378px;
+}
+
+.fam-plugin-delete {
+    background-position: -504px -378px;
+}
+
+.fam-plugin-disabled {
+    background-position: -522px -378px;
+}
+
+.fam-plugin-edit {
+    background-position: -540px -378px;
+}
+
+.fam-plugin-error {
+    background-position: -558px -378px;
+}
+
+.fam-plugin-go {
+    background-position: -576px -378px;
+}
+
+.fam-plugin-link {
+    background-position: -0px -396px;
+}
+
+.fam-printer {
+    background-position: -18px -396px;
+}
+
+.fam-printer-add {
+    background-position: -36px -396px;
+}
+
+.fam-printer-delete {
+    background-position: -54px -396px;
+}
+
+.fam-printer-empty {
+    background-position: -72px -396px;
+}
+
+.fam-printer-error {
+    background-position: -90px -396px;
+}
+
+.fam-rainbow {
+    background-position: -108px -396px;
+}
+
+.fam-report {
+    background-position: -126px -396px;
+}
+
+.fam-report-add {
+    background-position: -144px -396px;
+}
+
+.fam-report-delete {
+    background-position: -162px -396px;
+}
+
+.fam-report-disk {
+    background-position: -180px -396px;
+}
+
+.fam-report-edit {
+    background-position: -198px -396px;
+}
+
+.fam-report-go {
+    background-position: -216px -396px;
+}
+
+.fam-report-key {
+    background-position: -234px -396px;
+}
+
+.fam-report-link {
+    background-position: -252px -396px;
+}
+
+.fam-report-magnify {
+    background-position: -270px -396px;
+}
+
+.fam-report-picture {
+    background-position: -288px -396px;
+}
+
+.fam-report-user {
+    background-position: -306px -396px;
+}
+
+.fam-report-word {
+    background-position: -324px -396px;
+}
+
+.fam-resultset-first {
+    background-position: -342px -396px;
+}
+
+.fam-resultset-last {
+    background-position: -360px -396px;
+}
+
+.fam-resultset-next {
+    background-position: -378px -396px;
+}
+
+.fam-resultset-previous {
+    background-position: -396px -396px;
+}
+
+.fam-rosette {
+    background-position: -414px -396px;
+}
+
+.fam-rss {
+    background-position: -432px -396px;
+}
+
+.fam-rss-add {
+    background-position: -450px -396px;
+}
+
+.fam-rss-delete {
+    background-position: -468px -396px;
+}
+
+.fam-rss-go {
+    background-position: -486px -396px;
+}
+
+.fam-rss-valid {
+    background-position: -504px -396px;
+}
+
+.fam-ruby {
+    background-position: -522px -396px;
+}
+
+.fam-ruby-add {
+    background-position: -540px -396px;
+}
+
+.fam-ruby-delete {
+    background-position: -558px -396px;
+}
+
+.fam-ruby-gear {
+    background-position: -576px -396px;
+}
+
+.fam-ruby-get {
+    background-position: -0px -414px;
+}
+
+.fam-ruby-go {
+    background-position: -18px -414px;
+}
+
+.fam-ruby-key {
+    background-position: -36px -414px;
+}
+
+.fam-ruby-link {
+    background-position: -54px -414px;
+}
+
+.fam-ruby-put {
+    background-position: -72px -414px;
+}
+
+.fam-script {
+    background-position: -90px -414px;
+}
+
+.fam-script-add {
+    background-position: -108px -414px;
+}
+
+.fam-script-code {
+    background-position: -126px -414px;
+}
+
+.fam-script-code-red {
+    background-position: -144px -414px;
+}
+
+.fam-script-delete {
+    background-position: -162px -414px;
+}
+
+.fam-script-edit {
+    background-position: -180px -414px;
+}
+
+.fam-script-error {
+    background-position: -198px -414px;
+}
+
+.fam-script-gear {
+    background-position: -216px -414px;
+}
+
+.fam-script-go {
+    background-position: -234px -414px;
+}
+
+.fam-script-key {
+    background-position: -252px -414px;
+}
+
+.fam-script-lightning {
+    background-position: -270px -414px;
+}
+
+.fam-script-link {
+    background-position: -288px -414px;
+}
+
+.fam-script-palette {
+    background-position: -306px -414px;
+}
+
+.fam-script-save {
+    background-position: -324px -414px;
+}
+
+.fam-server {
+    background-position: -342px -414px;
+}
+
+.fam-server-add {
+    background-position: -360px -414px;
+}
+
+.fam-server-chart {
+    background-position: -378px -414px;
+}
+
+.fam-server-compressed {
+    background-position: -396px -414px;
+}
+
+.fam-server-connect {
+    background-position: -414px -414px;
+}
+
+.fam-server-database {
+    background-position: -432px -414px;
+}
+
+.fam-server-delete {
+    background-position: -450px -414px;
+}
+
+.fam-server-edit {
+    background-position: -468px -414px;
+}
+
+.fam-server-error {
+    background-position: -486px -414px;
+}
+
+.fam-server-go {
+    background-position: -504px -414px;
+}
+
+.fam-server-key {
+    background-position: -522px -414px;
+}
+
+.fam-server-lightning {
+    background-position: -540px -414px;
+}
+
+.fam-server-link {
+    background-position: -558px -414px;
+}
+
+.fam-server-uncompressed {
+    background-position: -576px -414px;
+}
+
+.fam-shading {
+    background-position: -0px -432px;
+}
+
+.fam-shape-align-bottom {
+    background-position: -18px -432px;
+}
+
+.fam-shape-align-center {
+    background-position: -36px -432px;
+}
+
+.fam-shape-align-left {
+    background-position: -54px -432px;
+}
+
+.fam-shape-align-middle {
+    background-position: -72px -432px;
+}
+
+.fam-shape-align-right {
+    background-position: -90px -432px;
+}
+
+.fam-shape-align-top {
+    background-position: -108px -432px;
+}
+
+.fam-shape-flip-horizontal {
+    background-position: -126px -432px;
+}
+
+.fam-shape-flip-vertical {
+    background-position: -144px -432px;
+}
+
+.fam-shape-group {
+    background-position: -162px -432px;
+}
+
+.fam-shape-handles {
+    background-position: -180px -432px;
+}
+
+.fam-shape-move-back {
+    background-position: -198px -432px;
+}
+
+.fam-shape-move-backwards {
+    background-position: -216px -432px;
+}
+
+.fam-shape-move-forwards {
+    background-position: -234px -432px;
+}
+
+.fam-shape-move-front {
+    background-position: -252px -432px;
+}
+
+.fam-shape-rotate-anticlockwise {
+    background-position: -270px -432px;
+}
+
+.fam-shape-rotate-clockwise {
+    background-position: -288px -432px;
+}
+
+.fam-shape-square {
+    background-position: -306px -432px;
+}
+
+.fam-shape-square-add {
+    background-position: -324px -432px;
+}
+
+.fam-shape-square-delete {
+    background-position: -342px -432px;
+}
+
+.fam-shape-square-edit {
+    background-position: -360px -432px;
+}
+
+.fam-shape-square-error {
+    background-position: -378px -432px;
+}
+
+.fam-shape-square-go {
+    background-position: -396px -432px;
+}
+
+.fam-shape-square-key {
+    background-position: -414px -432px;
+}
+
+.fam-shape-square-link {
+    background-position: -432px -432px;
+}
+
+.fam-shape-ungroup {
+    background-position: -450px -432px;
+}
+
+.fam-shield {
+    background-position: -468px -432px;
+}
+
+.fam-shield-add {
+    background-position: -486px -432px;
+}
+
+.fam-shield-delete {
+    background-position: -504px -432px;
+}
+
+.fam-shield-go {
+    background-position: -522px -432px;
+}
+
+.fam-sitemap {
+    background-position: -540px -432px;
+}
+
+.fam-sitemap-color {
+    background-position: -558px -432px;
+}
+
+.fam-sound {
+    background-position: -576px -432px;
+}
+
+.fam-sound-add {
+    background-position: -0px -450px;
+}
+
+.fam-sound-delete {
+    background-position: -18px -450px;
+}
+
+.fam-sound-low {
+    background-position: -36px -450px;
+}
+
+.fam-sound-mute {
+    background-position: -54px -450px;
+}
+
+.fam-sound-none {
+    background-position: -72px -450px;
+}
+
+.fam-spellcheck {
+    background-position: -90px -450px;
+}
+
+.fam-sport-8ball {
+    background-position: -108px -450px;
+}
+
+.fam-sport-basketball {
+    background-position: -126px -450px;
+}
+
+.fam-sport-football {
+    background-position: -144px -450px;
+}
+
+.fam-sport-golf {
+    background-position: -162px -450px;
+}
+
+.fam-sport-raquet {
+    background-position: -180px -450px;
+}
+
+.fam-sport-shuttlecock {
+    background-position: -198px -450px;
+}
+
+.fam-sport-soccer {
+    background-position: -216px -450px;
+}
+
+.fam-sport-tennis {
+    background-position: -234px -450px;
+}
+
+.fam-star {
+    background-position: -252px -450px;
+}
+
+.fam-status-away {
+    background-position: -270px -450px;
+}
+
+.fam-status-busy {
+    background-position: -288px -450px;
+}
+
+.fam-status-offline {
+    background-position: -306px -450px;
+}
+
+.fam-status-online {
+    background-position: -324px -450px;
+}
+
+.fam-stop {
+    background-position: -342px -450px;
+}
+
+.fam-style {
+    background-position: -360px -450px;
+}
+
+.fam-style-add {
+    background-position: -378px -450px;
+}
+
+.fam-style-delete {
+    background-position: -396px -450px;
+}
+
+.fam-style-edit {
+    background-position: -414px -450px;
+}
+
+.fam-style-go {
+    background-position: -432px -450px;
+}
+
+.fam-sum {
+    background-position: -450px -450px;
+}
+
+.fam-tab {
+    background-position: -468px -450px;
+}
+
+.fam-tab-add {
+    background-position: -486px -450px;
+}
+
+.fam-tab-delete {
+    background-position: -504px -450px;
+}
+
+.fam-tab-edit {
+    background-position: -522px -450px;
+}
+
+.fam-tab-go {
+    background-position: -540px -450px;
+}
+
+.fam-table {
+    background-position: -558px -450px;
+}
+
+.fam-table-add {
+    background-position: -576px -450px;
+}
+
+.fam-table-delete {
+    background-position: -0px -468px;
+}
+
+.fam-table-edit {
+    background-position: -18px -468px;
+}
+
+.fam-table-error {
+    background-position: -36px -468px;
+}
+
+.fam-table-gear {
+    background-position: -54px -468px;
+}
+
+.fam-table-go {
+    background-position: -72px -468px;
+}
+
+.fam-table-key {
+    background-position: -90px -468px;
+}
+
+.fam-table-lightning {
+    background-position: -108px -468px;
+}
+
+.fam-table-link {
+    background-position: -126px -468px;
+}
+
+.fam-table-multiple {
+    background-position: -144px -468px;
+}
+
+.fam-table-refresh {
+    background-position: -162px -468px;
+}
+
+.fam-table-relationship {
+    background-position: -180px -468px;
+}
+
+.fam-table-row-delete {
+    background-position: -198px -468px;
+}
+
+.fam-table-row-insert {
+    background-position: -216px -468px;
+}
+
+.fam-table-save {
+    background-position: -234px -468px;
+}
+
+.fam-table-sort {
+    background-position: -252px -468px;
+}
+
+.fam-tag {
+    background-position: -270px -468px;
+}
+
+.fam-tag-blue {
+    background-position: -288px -468px;
+}
+
+.fam-tag-blue-add {
+    background-position: -306px -468px;
+}
+
+.fam-tag-blue-delete {
+    background-position: -324px -468px;
+}
+
+.fam-tag-blue-edit {
+    background-position: -342px -468px;
+}
+
+.fam-tag-green {
+    background-position: -360px -468px;
+}
+
+.fam-tag-orange {
+    background-position: -378px -468px;
+}
+
+.fam-tag-pink {
+    background-position: -396px -468px;
+}
+
+.fam-tag-purple {
+    background-position: -414px -468px;
+}
+
+.fam-tag-red {
+    background-position: -432px -468px;
+}
+
+.fam-tag-yellow {
+    background-position: -450px -468px;
+}
+
+.fam-telephone {
+    background-position: -468px -468px;
+}
+
+.fam-telephone-add {
+    background-position: -486px -468px;
+}
+
+.fam-telephone-delete {
+    background-position: -504px -468px;
+}
+
+.fam-telephone-edit {
+    background-position: -522px -468px;
+}
+
+.fam-telephone-error {
+    background-position: -540px -468px;
+}
+
+.fam-telephone-go {
+    background-position: -558px -468px;
+}
+
+.fam-telephone-key {
+    background-position: -576px -468px;
+}
+
+.fam-telephone-link {
+    background-position: -0px -486px;
+}
+
+.fam-television {
+    background-position: -18px -486px;
+}
+
+.fam-television-add {
+    background-position: -36px -486px;
+}
+
+.fam-television-delete {
+    background-position: -54px -486px;
+}
+
+.fam-text-align-center {
+    background-position: -72px -486px;
+}
+
+.fam-text-align-justify {
+    background-position: -90px -486px;
+}
+
+.fam-text-align-left {
+    background-position: -108px -486px;
+}
+
+.fam-text-align-right {
+    background-position: -126px -486px;
+}
+
+.fam-text-allcaps {
+    background-position: -144px -486px;
+}
+
+.fam-text-bold {
+    background-position: -162px -486px;
+}
+
+.fam-text-columns {
+    background-position: -180px -486px;
+}
+
+.fam-text-dropcaps {
+    background-position: -198px -486px;
+}
+
+.fam-text-heading-1 {
+    background-position: -216px -486px;
+}
+
+.fam-text-heading-2 {
+    background-position: -234px -486px;
+}
+
+.fam-text-heading-3 {
+    background-position: -252px -486px;
+}
+
+.fam-text-heading-4 {
+    background-position: -270px -486px;
+}
+
+.fam-text-heading-5 {
+    background-position: -288px -486px;
+}
+
+.fam-text-heading-6 {
+    background-position: -306px -486px;
+}
+
+.fam-text-horizontalrule {
+    background-position: -324px -486px;
+}
+
+.fam-text-indent {
+    background-position: -342px -486px;
+}
+
+.fam-text-indent-remove {
+    background-position: -360px -486px;
+}
+
+.fam-text-italic {
+    background-position: -378px -486px;
+}
+
+.fam-text-kerning {
+    background-position: -396px -486px;
+}
+
+.fam-text-letter-omega {
+    background-position: -414px -486px;
+}
+
+.fam-text-letterspacing {
+    background-position: -432px -486px;
+}
+
+.fam-text-linespacing {
+    background-position: -450px -486px;
+}
+
+.fam-text-list-bullets {
+    background-position: -468px -486px;
+}
+
+.fam-text-list-numbers {
+    background-position: -486px -486px;
+}
+
+.fam-text-lowercase {
+    background-position: -504px -486px;
+}
+
+.fam-text-padding-bottom {
+    background-position: -522px -486px;
+}
+
+.fam-text-padding-left {
+    background-position: -540px -486px;
+}
+
+.fam-text-padding-right {
+    background-position: -558px -486px;
+}
+
+.fam-text-padding-top {
+    background-position: -576px -486px;
+}
+
+.fam-text-replace {
+    background-position: -0px -504px;
+}
+
+.fam-text-signature {
+    background-position: -18px -504px;
+}
+
+.fam-text-smallcaps {
+    background-position: -36px -504px;
+}
+
+.fam-text-strikethrough {
+    background-position: -54px -504px;
+}
+
+.fam-text-subscript {
+    background-position: -72px -504px;
+}
+
+.fam-text-superscript {
+    background-position: -90px -504px;
+}
+
+.fam-text-underline {
+    background-position: -108px -504px;
+}
+
+.fam-text-uppercase {
+    background-position: -126px -504px;
+}
+
+.fam-textfield {
+    background-position: -144px -504px;
+}
+
+.fam-textfield-add {
+    background-position: -162px -504px;
+}
+
+.fam-textfield-delete {
+    background-position: -180px -504px;
+}
+
+.fam-textfield-key {
+    background-position: -198px -504px;
+}
+
+.fam-textfield-rename {
+    background-position: -216px -504px;
+}
+
+.fam-thumb-down {
+    background-position: -234px -504px;
+}
+
+.fam-thumb-up {
+    background-position: -252px -504px;
+}
+
+.fam-tick {
+    background-position: -270px -504px;
+}
+
+.fam-time {
+    background-position: -288px -504px;
+}
+
+.fam-time-add {
+    background-position: -306px -504px;
+}
+
+.fam-time-delete {
+    background-position: -324px -504px;
+}
+
+.fam-time-go {
+    background-position: -342px -504px;
+}
+
+.fam-timeline-marker {
+    background-position: -360px -504px;
+}
+
+.fam-transmit {
+    background-position: -378px -504px;
+}
+
+.fam-transmit-add {
+    background-position: -396px -504px;
+}
+
+.fam-transmit-blue {
+    background-position: -414px -504px;
+}
+
+.fam-transmit-delete {
+    background-position: -432px -504px;
+}
+
+.fam-transmit-edit {
+    background-position: -450px -504px;
+}
+
+.fam-transmit-error {
+    background-position: -468px -504px;
+}
+
+.fam-transmit-go {
+    background-position: -486px -504px;
+}
+
+.fam-tux {
+    background-position: -504px -504px;
+}
+
+.fam-user {
+    background-position: -522px -504px;
+}
+
+.fam-user-add {
+    background-position: -540px -504px;
+}
+
+.fam-user-comment {
+    background-position: -558px -504px;
+}
+
+.fam-user-delete {
+    background-position: -576px -504px;
+}
+
+.fam-user-edit {
+    background-position: -0px -522px;
+}
+
+.fam-user-female {
+    background-position: -18px -522px;
+}
+
+.fam-user-go {
+    background-position: -36px -522px;
+}
+
+.fam-user-gray {
+    background-position: -54px -522px;
+}
+
+.fam-user-green {
+    background-position: -72px -522px;
+}
+
+.fam-user-orange {
+    background-position: -90px -522px;
+}
+
+.fam-user-red {
+    background-position: -108px -522px;
+}
+
+.fam-user-suit {
+    background-position: -126px -522px;
+}
+
+.fam-vcard {
+    background-position: -144px -522px;
+}
+
+.fam-vcard-add {
+    background-position: -162px -522px;
+}
+
+.fam-vcard-delete {
+    background-position: -180px -522px;
+}
+
+.fam-vcard-edit {
+    background-position: -198px -522px;
+}
+
+.fam-vector {
+    background-position: -216px -522px;
+}
+
+.fam-vector-add {
+    background-position: -234px -522px;
+}
+
+.fam-vector-delete {
+    background-position: -252px -522px;
+}
+
+.fam-wand {
+    background-position: -270px -522px;
+}
+
+.fam-weather-clouds {
+    background-position: -288px -522px;
+}
+
+.fam-weather-cloudy {
+    background-position: -306px -522px;
+}
+
+.fam-weather-lightning {
+    background-position: -324px -522px;
+}
+
+.fam-weather-rain {
+    background-position: -342px -522px;
+}
+
+.fam-weather-snow {
+    background-position: -360px -522px;
+}
+
+.fam-weather-sun {
+    background-position: -378px -522px;
+}
+
+.fam-webcam {
+    background-position: -396px -522px;
+}
+
+.fam-webcam-add {
+    background-position: -414px -522px;
+}
+
+.fam-webcam-delete {
+    background-position: -432px -522px;
+}
+
+.fam-webcam-error {
+    background-position: -450px -522px;
+}
+
+.fam-world {
+    background-position: -468px -522px;
+}
+
+.fam-world-add {
+    background-position: -486px -522px;
+}
+
+.fam-world-delete {
+    background-position: -504px -522px;
+}
+
+.fam-world-edit {
+    background-position: -522px -522px;
+}
+
+.fam-world-go {
+    background-position: -540px -522px;
+}
+
+.fam-world-link {
+    background-position: -558px -522px;
+}
+
+.fam-wrench {
+    background-position: -576px -522px;
+}
+
+.fam-wrench-orange {
+    background-position: -0px -540px;
+}
+
+.fam-xhtml {
+    background-position: -18px -540px;
+}
+
+.fam-xhtml-add {
+    background-position: -36px -540px;
+}
+
+.fam-xhtml-delete {
+    background-position: -54px -540px;
+}
+
+.fam-xhtml-go {
+    background-position: -72px -540px;
+}
+
+.fam-xhtml-valid {
+    background-position: -90px -540px;
+}
+
+.fam-zoom {
+    background-position: -108px -540px;
+}
+
+.fam-zoom-in {
+    background-position: -126px -540px;
+}
+
+.fam-zoom-out {
+    background-position: -144px -540px;
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.png b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.png
new file mode 100644
index 0000000000000000000000000000000000000000..8de5ff21097300ac0539a23ba2072168d1d536a4
Binary files /dev/null and b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/fam-icons.png differ
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/index.js b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0893f9229da3875454c3b4f738ef73368d5c8f44
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/index.js
@@ -0,0 +1,22 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+
+require('babel-polyfill');
+require('bootstrap');
+require('datatables.net');
+require('translator');
+
+require('datatables.net-bs/css/dataTables.bootstrap.css');
+require('toastr/build/toastr.css');
+
+require('./toastr');
+require('./template-polyfill');
+require('./style.less');
+
+$(() => {
+    $('[data-toggle="tooltip"]').tooltip();
+});
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/style.less b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/style.less
new file mode 100644
index 0000000000000000000000000000000000000000..4ca0803f53245dbd0077116f469ccab98f02cb33
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/style.less
@@ -0,0 +1,5 @@
+@import "~bootstrap/less/bootstrap";
+@import "../../../less/bdoh-variables";
+
+@import "./async";
+@import "./fam-icons";
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/index.js b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..f782321fc4c35c19ec27c2f026bf9016bc1ea7b6
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/index.js
@@ -0,0 +1,20 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+require('./style.css');
+
+document.addEventListener('ready', () => {
+    if ('content' in document.createElement('template')) {
+        return;
+    }
+    const templates = document.getElementsByTagName('template');
+    for (const template of templates) {
+        const fragment = document.createDocumentFragment();
+        for (const node of template.childNodes) {
+            fragment.appendChild(node);
+        }
+        template.content = fragment;
+    }
+});
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/style.css b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..5d854b4c75abd05801f4f095536c4c1a5389ca0e
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/template-polyfill/style.css
@@ -0,0 +1,3 @@
+template {
+    display: none !important;
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/toastr.js b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/toastr.js
new file mode 100644
index 0000000000000000000000000000000000000000..6af3ac0516479a2901b784799a806562d0327d5e
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/bdoh/toastr.js
@@ -0,0 +1,66 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const toastr = require('toastr');
+require('toastr/build/toastr.css');
+
+toastr.options = {
+    containerId: 'notices',
+    closeButton: true,
+    toastClass: 'alert',
+    iconClasses: {
+        error: 'alert-danger',
+        info: 'alert-info',
+        success: 'alert-success',
+        warning: 'alert-warning'
+    },
+    showMethod: 'slideDown',
+    showEasing: 'swing',
+    hideMethod: 'slideUp',
+    hideEasing: 'swing',
+    timeOut: 5000,
+    extendedTimeOut: 1000
+};
+
+function runtimeError(msg, title) {
+    try {
+        toastr.error(msg, title, {timeOut: 300000, extendedTimeOut: 300000});
+    } catch(more) {
+        // eslint-disable-next-line no-console
+        console.log(more);
+    }
+}
+
+$(() => {
+    window.onerror = (msg) => runtimeError(msg, 'Javascript error');
+    $.Deferred.exceptionHook = () => null;
+
+    $(document).ajaxError((_1, xhr, {type, url}) => {
+        const title = `Request error: ${xhr.status} ${xhr.statusText}`;
+        const debugUrl = xhr.getResponseHeader('X-Debug-Token-Link');
+        let msg = `<b>Request:</b> ${type} ${url}`;
+        if (debugUrl) {
+            msg += `<br/><b>Debug:</b> <a href="${debugUrl}">${debugUrl}</a>`;
+        } else {
+            const rid = xhr.getResponseHeader('X-Request-Id');
+            if (rid) {
+                msg += `<br/><b>Request ID:</b> <code>${rid}</code>`;
+            }
+        }
+        runtimeError(msg, title);
+    });
+
+    const notices = $('#notices').data('notices');
+    $.each(notices, (level, notices) =>
+        $.each(notices, (_, msg) => {
+            if(toastr[level]) {
+               toastr[level](msg, '', {showDuration: 0});
+            }
+        })
+    );
+});
+
+module.exports = toastr;
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/home/index.js b/src/Irstea/BdohBundle/Resources/assets/entries/home/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed89fb3daa360583f5f75e614075516deee770b6
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/home/index.js
@@ -0,0 +1,12 @@
+define([
+    'jquery',
+    './style.css'
+], ($) => {
+
+    $(() => {
+        $(document).on('mouseover.data-hover-tab', '[data-hover-tab]', (ev) => {
+           $(ev.currentTarget).tab('show');
+        });
+    });
+
+});
diff --git a/src/Irstea/BdohBundle/Resources/assets/entries/home/style.css b/src/Irstea/BdohBundle/Resources/assets/entries/home/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..e6e22f516693c699ba40856f8ca6bdd2f50b61cb
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/entries/home/style.css
@@ -0,0 +1,14 @@
+li[href="#accueil"]:after{
+    content:"";
+    display:block;
+    margin:0 auto 8px;
+    padding:8px 0 0;
+    width:80%;
+    border-bottom:1px solid #e5e5e5;
+}
+div#main ul.nav.nav-tabs li a{
+    padding:8px 15px;
+}
+div#main ul.nav.nav-tabs li a:focus{
+    background-color:#fff;
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/datatables/column-filters.js b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/column-filters.js
new file mode 100644
index 0000000000000000000000000000000000000000..a23ac8bed6ae41b757b8ccedb7dc0f1571dc69f8
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/column-filters.js
@@ -0,0 +1,137 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const _ = require('lodash');
+
+// Ajout d'une fonction pour gérer des filtres de recherche
+$(document).on('init.dt.columnFilters', (ev) => {
+    if (ev.namespace !== 'dt') {
+        return;
+    }
+    const table = $(ev.target);
+    const api = table.DataTable();
+    const columns = api.columns();
+
+    columns.header().each((header, index) => {
+        const $header = $(header);
+        const selector = $header.data('filter-with');
+        if (!selector) {
+            return;
+        }
+        const $control = $(selector);
+        if (!$control.length) {
+            // eslint-disable-next-line no-console
+            console.error(`Filtering control not found: ${selector}`);
+            return;
+        }
+        const multiSeparator = $header.data('value-separator');
+        initColumnFilter($control, columns.column(index), multiSeparator);
+    });
+});
+
+function initColumnFilter($control, column, multiSeparator) {
+    const regexpBuilder = multiSeparator ? buildMultiSearchRegexp.bind(null, multiSeparator) : buildSingleSearchRegexp;
+    const update = () => {
+        const values = $control.val();
+        const regexp = regexpBuilder(values);
+        column.search(regexp, true, false).draw();
+    };
+
+    $control.on('change', update);
+
+    if ($control.find('option').length === 0) {
+        buildOptions($control, column, multiSeparator);
+    }
+
+    $control.select2({
+        minimumResultsForSearch: 5,
+        allowClear: true
+    });
+
+    update();
+}
+
+function buildOptions($control, column, multiSeparator) {
+    const isMultiple = !!$control.prop('multiple');
+    const values = getDistinctValues(column, multiSeparator);
+    const defaultVal = getQueryString()[$control.attr('name')] || '';
+    let defaultSearch = [];
+
+    if (!isMultiple) {
+        $('<option value="">-</option>').appendTo($control);
+    }
+
+    values.forEach((value) => {
+        const searchRe = $.fn.dataTable.util.escapeRegex(value);
+        $('<option></option>')
+            .text(value)
+            .attr('value', searchRe)
+            .appendTo($control);
+        if (value === defaultVal) {
+            defaultSearch.push(searchRe);
+        }
+    });
+
+    if (defaultSearch.length > 0) {
+        if (!isMultiple) {
+            defaultSearch = defaultSearch[0];
+        }
+        $control.val(defaultSearch);
+    }
+}
+
+function getDistinctValues(column, multiSeparator) {
+    let chain = _(column.cache('search').toArray())
+        .filter();
+    if (multiSeparator) {
+        chain = chain
+            .map((value) => value.split(multiSeparator))
+            .flatten();
+    }
+    return chain
+        .uniq()
+        .sort((a, b) => {return a.localeCompare(b, 'fr', {'sensitivity':'base'});})
+        .value();
+}
+
+function buildSingleSearchRegexp(values) {
+    const re = joinRegexp(values);
+    return re ? `^${re}$` : '';
+}
+
+function buildMultiSearchRegexp(multiSeparator, values) {
+    const re = joinRegexp(values);
+    return re ? `(?:^|${multiSeparator})${re}(?:$|${multiSeparator})` : '';
+}
+
+function joinRegexp(values) {
+    if (_.isEmpty(values)) {
+        return '';
+    }
+    if (_.isArray(values)) {
+        return `(?:${values.join('|')})`;
+    }
+    return values;
+}
+
+
+let queryString = null;
+
+function getQueryString() {
+    if (!queryString) {
+        queryString = extractParameters(window.location.search);
+    }
+    return queryString;
+}
+
+function extractParameters(queryString) {
+    const parameters = {};
+    for (const param of queryString.substr(1).split('&')) {
+        const [name, value] = param.split('=', 2);
+        parameters[name] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : null;
+    }
+    return parameters;
+}
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/datatables/index.js b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..63864c327a81facaa8db4c9328c8fdfcdb13c541
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/index.js
@@ -0,0 +1,10 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+require('./theme');
+require('./row-grouping');
+require('./column-filters');
+
+module.exports = require('datatables.net');
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/datatables/row-grouping.js b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/row-grouping.js
new file mode 100644
index 0000000000000000000000000000000000000000..8bd1762c0f016ef154cd55f0650c41ba6a1b090d
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/row-grouping.js
@@ -0,0 +1,43 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+
+$(document).on('init.dt.rowGrouping', '[data-group-by]', (ev) => {
+    if (ev.namespace !== 'dt') {
+        return;
+    }
+    const table = $(ev.target);
+    const groupingColumn = table.data('group-by');
+    const api = table.DataTable();
+    const column = api.column(groupingColumn);
+    const orderingColumn = $(column.header()).data('group-order') || groupingColumn;
+
+    column.visible(false);
+    api.order.fixed({pre: [[orderingColumn, 'asc']]});
+
+    table.on('draw.dt.rowGrouping', () => {
+        if (ev.namespace !== 'dt' || ev.target !== table[0]) {
+            return;
+        }
+        const rows = $(api.rows({page: 'current'}).nodes());
+        const span = api
+            .columns()
+            .visible()
+            .count();
+        let last = null;
+
+        api
+            .column(groupingColumn, {page: 'current'})
+            .data()
+            .each((item, i) => {
+                if (last === item) {
+                    return;
+                }
+                rows.eq(i).before(`<tr class="group"><td colspan="${span}">${item}</td></tr>`);
+                last = item;
+            });
+    });
+});
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/datatables/theme.js b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/theme.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f50085309a9b2ffcec4bd62bb63d18997c4153b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/datatables/theme.js
@@ -0,0 +1,11 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const dt = require('datatables.net');
+
+require('datatables.net-bs/js/dataTables.bootstrap');
+require('datatables.net-bs/css/dataTables.bootstrap.css');
+
+dt.defaults.dom = "<'row'<'col-sm-12'l><'col-sm-12'f>><'row'<'col-sm-24'tr>><'row'<'col-sm-10'i><'col-sm-14'p>>";
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/date-time/picker.js b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/picker.js
new file mode 100644
index 0000000000000000000000000000000000000000..62b1ba90e36f60c5f30648379ddd6bc63a1bcfb8
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/picker.js
@@ -0,0 +1,441 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const moment = require('../moment');
+const Rx = require('rx');
+const rxWidget = require('./rx-widget');
+const _ = require('lodash');
+const Translator = require('translator');
+require('rx-jquery');
+
+function momentUtcOrNull(value) {
+    return value === undefined ? moment.null() : moment.utc(value);
+}
+
+const toISOString = _.method('toISOString');
+
+const defaults = {
+    placeholder: Translator.trans('placeholder', 'datetime'),
+    format: Translator.trans('format.long', 'datetime'),
+    shortFormat: Translator.trans('format.short', 'datetime'),
+    altFormat: moment.ISO_8601()
+};
+
+
+class Status {
+
+    constructor(value = moment.null(), pristine = true) {
+        this.value = value;
+        this.isPristine = pristine;
+        this.status = 'ok';
+        this.key = 'status.ok';
+        this.isValid = true;
+        this.showError = false;
+    }
+
+    setError(error, data) {
+        this.status = error;
+        this.key = `status.${error}`;
+        this.isValid = false;
+        this.showError = !this.isPristine;
+        if (data) {
+            this.data = data;
+        }
+    }
+
+    format(translator, dateFormat) {
+        const params = {};
+        if (this.data) {
+            Object.assign(params, this.data);
+            const format = dateFormat || Translator.trans('format.long', 'datetime');
+            _.each(params, (value, key) => {
+                if (moment.isMoment(value) && value.isValid()) {
+                    params[key] = value.format(format);
+                }
+            });
+        }
+        return translator.trans(this.key, params);
+    }
+
+    toString() {
+        return JSON.stringify(this);
+    }
+}
+
+const widget = $.widget('bdoh.dateTimePicker', rxWidget, {
+    options: _.assign({}, defaults, {
+        minDate: null,
+        maxDate: null,
+        minDateBounded: null,
+        maxDateBounded: null,
+        altInput: null,
+        setButtons: true,
+        resetButton: true,
+        strict: false
+    }),
+
+    _create() {
+        this._super();
+
+        const el = this.element;
+        const inputGroup = el.closest('.input-group');
+        if (!inputGroup.length) {
+            throw Error('The dateTime must be in a .input-group');
+        }
+
+        // Boutons
+        this._setupWidget(inputGroup);
+        const resetButton = this._resetButton;
+        const setMinButton = this._setMinButton;
+        const setMaxButton = this._setMaxButton;
+
+        const disposables = this._disposables;
+
+        // Crée des sujets les options très souvents utilisées
+        const minDate = this._observeOption('minDate', momentUtcOrNull, toISOString);
+        const maxDate = this._observeOption('maxDate', momentUtcOrNull, toISOString);
+
+        let minDateBounded = minDate;
+        if(this.options.minDateBounded) {
+            minDateBounded = this._observeOption('minDateBounded', momentUtcOrNull, toISOString);
+        }
+        let maxDateBounded = maxDate;
+        if(this.options.maxDateBounded) {
+            maxDateBounded = this._observeOption('maxDateBounded', momentUtcOrNull, toISOString);
+        }
+
+        const format = this._observeOption('format');
+
+        // Valeur courante de l'input control (view)
+        const viewValueInput = new Rx.BehaviorSubject(el.val());
+        disposables.add(viewValueInput);
+        const viewValue = viewValueInput.distinctUntilChanged().shareReplay(1);
+
+        // Valeur courante sous forme de date
+        const value = this._value = new Rx.BehaviorSubject(moment.null());
+        disposables.add(value);
+
+        // L'entrée a-t-elle été modifiée par l'utilisateur ?
+        const pristine = new Rx.BehaviorSubject(true);
+        disposables.add(pristine);
+
+        // Statut de la valeur courante
+        const status = this._status = new Rx.BehaviorSubject(new Status());
+        disposables.add(status);
+
+        // Point d'entrée pour setDateTime
+        const setDateTimeInput = this._setDateTimeInput = new Rx.Subject();
+        disposables.add(setDateTimeInput);
+
+        /* Met en place tous les abonnements, en collectant bien les disposables.
+         * N.B. : les abonnements sont listés par ordre inverse de dépendance. Cela permet
+         * aux dépendances avales d'être initialisées avant que les données arrivent an amont.
+         */
+
+        // Double-bind viewValue <=> input control
+        disposables.add(
+            Rx.Observable
+                .merge(
+                    el.onAsObservable('keyup').debounce(400),
+                    el.onAsObservable('change')
+                )
+                .map(() => el.val())
+                .distinctUntilChanged()
+                .do(() => pristine.onNext(false))
+                .subscribe(viewValueInput)
+        );
+
+        disposables.add(
+            viewValue.subscribe((viewValue) => {
+                if (viewValue !== el.val()) {
+                    el.val(viewValue);
+                }
+            })
+        );
+
+        // Mise à jour sur événéments de l'input
+        disposables.add(
+            Rx.Observable
+                .merge([
+                    // L'input control perd le focus
+                    el
+                        .onAsObservable('blur')
+                        .flatMap(() => status.first())
+                        .pluck('value'),
+
+                    // L'utilisateur clique sur set-min
+                    inputGroup
+                        .onAsObservable('click', '.set-min')
+                        .flatMap(() => minDateBounded.first()),
+
+                    // L'utilisateur clique sur set-max
+                    inputGroup
+                        .onAsObservable('click', '.set-max')
+                        .flatMap(() => maxDateBounded.first())
+                ])
+                .do(() => pristine.onNext(false))
+                .filter(_.method('isValid'))
+                .combineLatest(format, (value, format) => value.format(format))
+                .subscribe(viewValueInput)
+        );
+
+        // Click bouton reset
+        disposables.add(
+            inputGroup
+                .onAsObservable('click', '.reset')
+                .map(_.constant(''))
+                .do(() => pristine.onNext(false))
+                .subscribe(viewValueInput)
+        );
+
+        // Mise à jour via setDateTime
+        disposables.add(
+            setDateTimeInput
+                .combineLatest(
+                    format,
+                    (value, format) => {
+                        const m = moment.utc(value);
+                        return m.isValid() ? m.format(format) : value;
+                    }
+                )
+                .subscribe(viewValueInput)
+        );
+
+        // Colore le groupe en fonction du statut de validation
+        disposables.add(
+            status
+                .combineLatest(format)
+                .subscribe(([status, format]) => {
+                    inputGroup.toggleClass('has-error', status.showError);
+                    const msg = status.showError ? status.format(Translator, format) : '';
+                    el[0].setCustomValidity(msg);
+                    el.attr('title', msg);
+                })
+        );
+
+        // Renseigne l'input secondaire
+        disposables.add(
+            this._observeOption('altInput')
+                .map(_.bindKey(this, '_findAltInput'))
+                .filter(_.property('length'))
+                .combineLatest(
+                    status,
+                    this._observeOption('altFormat'),
+                    (el, {isValid, value}, altFormat) => ({el, value: isValid ? value.format(altFormat) : ''})
+                )
+                .subscribe((o) => o.el.val(o.value))
+        );
+
+        // Validation de la date
+        disposables.add(
+            Rx.Observable
+                .combineLatest(
+                    value,
+                    minDate,
+                    maxDate,
+                    this._observeAttribute('required'),
+                    pristine.distinctUntilChanged(),
+                    _.bindKey(this, '_validate')
+                )
+                .distinctUntilChanged()
+                .subscribe(status)
+        );
+
+        // Parsing de la chaîne en date
+        disposables.add(
+            Rx.Observable
+                .combineLatest(
+                    viewValue,
+                    format,
+                    this._observeOption('shortFormat'),
+                    this._observeOption('strict'),
+                    _.bindKey(this, '_parse')
+                )
+                .distinctUntilChanged(toISOString)
+                .subscribe(value)
+        );
+
+        // Contrôle la visibilité des boutons en fonction des options
+        disposables.add(
+            this._observeOption('setButtons')
+                .subscribe((visible) => {
+                    setMaxButton.toggle(!!visible);
+                    setMinButton.toggle(!!visible);
+                })
+        );
+
+        disposables.add(
+            Rx.Observable
+                .combineLatest(
+                    this._observeOption('resetButton'),
+                    this._observeAttribute('required'),
+                    (wantButton, isRequired) => {
+                        return !!wantButton && !isRequired;
+                    }
+                )
+                .subscribe(_.bindKey(resetButton, 'toggle'))
+        );
+
+        // Désactive le bouton "reset" si on a pas de valeurs saisies
+        disposables.add(
+            viewValue.subscribe((val) => {
+                const disabled = !val;
+                inputGroup
+                    .find('.reset')
+                    .attr('disabled', disabled)
+                    .toggleClass('disabled', disabled);
+            })
+        );
+
+        // Désactive le bouton "set-min" si on a pas de date minimum
+        disposables.add(
+            minDateBounded.subscribe((date) => {
+                inputGroup
+                    .find('.set-min')
+                    .attr('disabled', !date.isValid())
+                    .toggleClass('disabled', !date.isValid());
+            })
+        );
+
+        // Désactive le bouton "set-max" si on a pas de date maximum
+        disposables.add(
+            maxDateBounded.subscribe((date) => {
+                inputGroup
+                    .find('.set-max')
+                    .attr('disabled', !date.isValid())
+                    .toggleClass('disabled', !date.isValid());
+            })
+        );
+
+        // Affiche le placeholder
+        disposables.add(
+            this
+                ._observeOption('placeholder')
+                .subscribe((ph) => el.attr('placeholder', ph))
+        );
+
+        // Génère des événements
+        disposables.add(
+            status.subscribe(
+                (status) => {
+                    this._trigger('change', null, status.value);
+                    this._trigger('status', null, status);
+                }
+            )
+        );
+    },
+
+    _init() {
+        this._super();
+        if (this.options.initialDateTime !== undefined) {
+            this.setDateTime(this.options.initialDateTime);
+            delete this.options.initialDateTime;
+        }
+    },
+
+    _findAltInput(selector) {
+        if (!selector) {
+            return $();
+        }
+        let input;
+        switch (selector[0]) {
+            case '.':
+                input = this.element.closest('.input-group').find(selector);
+                break;
+
+            case '#':
+                input = $(selector);
+                break;
+
+            default:
+                input = $(this.element[0].form[selector]);
+        }
+        return input;
+    },
+
+    _setupWidget(inputGroup) {
+        const el = this.element;
+
+        // TODO: retoucher la stylesheet pour ne pas en avoir besoin
+        el.css({
+            height: 'auto',
+            'text-align': 'center'
+        });
+
+        const mkButton = function (kind, icon) {
+            let button = inputGroup.find(`.${kind}`);
+            if (!button.length) {
+                button = $(
+                    `${'<span class="input-group-btn">' +
+                    '<a href="javascript:void(0);" tabindex="-1" class="btn btn-default '}${kind}" title="${
+                        _.escape(Translator.trans(`buttons.${kind}`, 'datetime'))
+                        }"><i class="glyphicon glyphicon-${icon}"></i></a></span>`
+                );
+            }
+            return button;
+        };
+
+        this._resetButton = mkButton('reset', 'remove').insertAfter(el);
+        this._setMinButton = mkButton('set-min', 'fast-backward').insertBefore(el);
+        this._setMaxButton = mkButton('set-max', 'fast-forward').insertAfter(el);
+    },
+
+    _parse(val, format, shortFormat, strict) {
+        this._debug('_parse', val, format, shortFormat);
+        if (!val) {
+            return moment.null();
+        }
+        return moment.utc(val, [format, shortFormat], strict);
+    },
+
+    _validate(value, minDate, maxDate, required, pristine) {
+        const status = new Status(value, pristine);
+
+        if (moment.isNull(value)) {
+            if (required) {
+                status.setError('required');
+            }
+        } else if (!value.isValid()) {
+            status.setError('invalid', {input: value._i}); // N.B. : un peu triché
+        } else if (minDate.isValid() && value.isBefore(minDate)) {
+            status.setError('afterMaxDate', {maxDate: minDate});
+        } else if (maxDate.isValid() && value.isAfter(maxDate)) {
+            status.setError('beforeMinDate', {minDate: maxDate});
+        }
+
+        return status;
+    },
+
+    setDateTime(value) {
+        this._setDateTimeInput.onNext(value);
+    },
+
+    getDateTime() {
+        return this._value.getValue();
+    },
+
+    observeDateTime() {
+        return this._value.asObservable();
+    },
+
+    getStatus() {
+        return this._status.getValue();
+    },
+
+    observeStatus() {
+        return this._status.asObservable();
+    }
+});
+
+$.fn.dateTimePicker.defaults = defaults;
+
+module.exports = {
+    defaults,
+    momentUtcOrNull,
+    Status,
+    toISOString,
+    widget
+};
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/date-time/range-picker.js b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/range-picker.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f44b1633eb53260f67a926bc9f883e1b9805a42
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/range-picker.js
@@ -0,0 +1,254 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const moment = require('../moment');
+const Rx = require('rx');
+const rxWidget = require('./rx-widget');
+const _ = require('lodash');
+
+const picker = require('./picker');
+const defaults = picker.defaults;
+const momentUtcOrNull = picker.momentUtcOrNull;
+const toISOString = picker.toISOString;
+const Status = picker.Status;
+
+class RangeStatus extends Status {
+    constructor(start, end) {
+        super(
+            { start: start.value, end: end.value },
+            start.isPristine && end.isPristine
+        );
+
+        this.start = start;
+        this.end = end;
+        this.isValid = start.isValid && end.isValid;
+        this.showError = start.showError || end.showError;
+
+        this.key = start.status === 'ok' ? `end.status.${end.status}` : `start.status.${start.status}`;
+        const src = start.status === 'ok' ? end : start;
+        this.status = src.status;
+        this.data = src.data;
+    }
+}
+
+function momentDuration(value) {
+    return value ? moment.duration(value) : moment.duration.invalid();
+}
+
+const widget = $.widget('bdoh.dateTimeRangePicker', rxWidget, {
+    options: _.assign({}, defaults, {
+        minDate: null,
+        maxDate: null,
+
+        minInterval: NaN,
+        maxInterval: NaN,
+
+        startInput: '.start',
+        startAltInput: null,
+
+        endInput: '.end',
+        endAltInput: null,
+
+        allowRangeOutOfBoundaries: false
+    }),
+
+    _create() {
+        this._super();
+
+        const minDate = this._observeOption('minDate', momentUtcOrNull, toISOString);
+        const maxDate = this._observeOption('maxDate', momentUtcOrNull, toISOString);
+        const minInterval = this._observeOption('minInterval', momentDuration, toISOString);
+        const maxInterval = this._observeOption('maxInterval', momentDuration, toISOString);
+        const format = this._observeOption('format');
+        const altFormat = this._observeOption('altFormat');
+        const shortFormat = this._observeOption('shortFormat');
+        const placeholder = this._observeOption('placeholder');
+
+        const status = this._status = new Rx.BehaviorSubject({});
+        this._disposables.add(status);
+
+        const startDate = status.pluck('start', 'value');
+        const endDate = status.pluck('end', 'value');
+
+        const start = this._start = this.element.find(this.options.startInput);
+        if (!start.length) {
+            throw new Error(`Start input not found: ${this.options.startInput}`);
+        }
+
+        const end = this._end = this.element.find(this.options.endInput);
+        if (!end.length) {
+            throw new Error(`End input not found: ${this.options.endInput}`);
+        }
+
+        start.dateTimePicker({
+            format,
+            shortFormat,
+            placeholder,
+            altFormat,
+            altInput: this._observeOption('startAltInput'),
+
+            minDate: Rx.Observable
+                .combineLatest(minDate, endDate, maxInterval, _.bindKey(this, '_calculateStartMinDate'))
+                .distinctUntilChanged(toISOString),
+
+            maxDate: Rx.Observable
+                .combineLatest(maxDate, endDate, minInterval, _.bindKey(this, '_calculateStartMaxDate'))
+                .distinctUntilChanged(toISOString),
+
+            minDateBounded: Rx.Observable
+                .combineLatest(minDate, endDate, maxInterval, _.bindKey(this, '_calculateStartMinDateBounded'))
+                .distinctUntilChanged(toISOString),
+
+            maxDateBounded: Rx.Observable
+                .combineLatest(maxDate, endDate, minInterval, _.bindKey(this, '_calculateStartMaxDateBounded'))
+                .distinctUntilChanged(toISOString)
+        });
+
+        end.dateTimePicker({
+            format,
+            shortFormat,
+            placeholder,
+            altFormat,
+            altInput: this._observeOption('endAltInput'),
+
+            minDate: Rx.Observable
+                .combineLatest(minDate, startDate, minInterval, _.bindKey(this, '_calculateEndMinDate'))
+                .distinctUntilChanged(toISOString),
+
+            maxDate: Rx.Observable
+                .combineLatest(maxDate, startDate, maxInterval, _.bindKey(this, '_calculateEndMaxDate'))
+                .distinctUntilChanged(toISOString),
+
+            minDateBounded: Rx.Observable
+                .combineLatest(minDate, startDate, minInterval, _.bindKey(this, '_calculateEndMinDateBounded'))
+                .distinctUntilChanged(toISOString),
+
+            maxDateBounded: Rx.Observable
+                .combineLatest(maxDate, startDate, maxInterval, _.bindKey(this, '_calculateEndMaxDateBounded'))
+                .distinctUntilChanged(toISOString)
+        });
+
+        this._disposables.add(
+            Rx.Observable
+                .combineLatest(
+                    [start.dateTimePicker('observeStatus'), end.dateTimePicker('observeStatus')],
+                    (start, end) => new RangeStatus(start, end)
+                )
+                .distinctUntilChanged()
+                .subscribe(status)
+        );
+
+        this._disposables.add(
+            this._status.subscribe((status) => {
+                this._trigger('change', null, status.value);
+                this._trigger('status', null, status);
+            })
+        );
+    },
+
+    _calculateStartMinDate(minDate, endDate, maxInterval, bounded=false) {
+        const minDateStartOfYear = minDate
+            .clone()
+            .startOf('year');
+        if (!maxInterval.isValid() || !endDate.isValid()) {
+            if(this.options.allowRangeOutOfBoundaries && !bounded){
+                return minDateStartOfYear;
+            }
+            return minDate;
+        }
+        if(this.options.allowRangeOutOfBoundaries && !bounded) {
+            return moment.max(minDateStartOfYear, endDate.clone().subtract(maxInterval));
+        }
+        return moment.max(minDate, endDate.clone().subtract(maxInterval));
+    },
+
+    _calculateStartMinDateBounded(minDate, endDate, maxInterval) {
+        return this._calculateStartMinDate(minDate, endDate, maxInterval, true);
+    },
+
+    _calculateStartMaxDate(maxDate, endDate, minInterval, bounded=false) {
+        const maxDateEndOfYear = maxDate
+            .clone()
+            .add(1, 'year')
+            .startOf('year');
+        let actualMax = endDate.isValid() ? moment.min(maxDate, endDate) : maxDate;
+        if(this.options.allowRangeOutOfBoundaries && !bounded) {
+            actualMax = endDate.isValid() ? moment.min(maxDateEndOfYear, endDate) : maxDateEndOfYear;
+        }
+        if (!minInterval.isValid()) {
+            return actualMax;
+        }
+        return actualMax.clone().subtract(minInterval);
+    },
+
+    _calculateStartMaxDateBounded(maxDate, endDate, minInterval) {
+        return this._calculateStartMaxDate(maxDate, endDate, minInterval, true);
+    },
+
+    _calculateEndMinDate(minDate, startDate, minInterval, bounded=false) {
+        const minDateStartOfYear = minDate
+            .clone()
+            .startOf('year');
+        let actualMin = startDate.isValid() ? moment.max(minDate, startDate) : minDate;
+        if(this.options.allowRangeOutOfBoundaries && !bounded) {
+            actualMin = startDate.isValid() ? moment.max(minDateStartOfYear, startDate) : minDateStartOfYear;
+        }
+        if (!minInterval.isValid()) {
+            return actualMin;
+        }
+        return actualMin.clone().add(minInterval);
+    },
+
+    _calculateEndMinDateBounded(minDate, startDate, minInterval) {
+        return this._calculateEndMinDate(minDate, startDate, minInterval, true);
+    },
+
+    _calculateEndMaxDate(maxDate, startDate, maxInterval, bounded=false) {
+        const maxDateEndOfYear = maxDate
+            .clone()
+            .add(1, 'year')
+            .startOf('year');
+        if (!startDate.isValid() || !maxInterval.isValid()) {
+            if(this.options.allowRangeOutOfBoundaries && !bounded) {
+                return maxDateEndOfYear;
+            }
+            return maxDate;
+        }
+        if(this.options.allowRangeOutOfBoundaries && !bounded) {
+            return moment.min(maxDateEndOfYear, startDate.clone().add(maxInterval));
+        }
+        return moment.min(maxDate, startDate.clone().add(maxInterval));
+    },
+
+    _calculateEndMaxDateBounded(maxDate, startDate, maxInterval) {
+        return this._calculateEndMaxDate(maxDate, startDate, maxInterval, true);
+    },
+
+    setDateTimeRange(range) {
+        const start = range && range.start;
+        const end = range && range.end;
+        this._start.dateTimePicker('setDateTime', start);
+        this._end.dateTimePicker('setDateTime', end);
+    },
+
+    getDateTimeRange() {
+        return this.getStatus().value;
+    },
+
+    observeDateTimeRange() {
+        return this._status.pluck('value');
+    },
+
+    getStatus() {
+        return this._status.getValue();
+    },
+
+    observeStatus() {
+        return this._status;
+    }
+});
+
+module.exports = widget;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/date-time/rx-widget.js b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/rx-widget.js
new file mode 100644
index 0000000000000000000000000000000000000000..eeebe7f43bf45c581a98140d2c3619872e04f565
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/date-time/rx-widget.js
@@ -0,0 +1,134 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const Rx = require('rx');
+const _ = require('lodash');
+
+require('jquery-ui/ui/widget');
+
+function join(x) {
+    if (_.isFunction(_.get(x, 'subscribe')) || _.isFunction(_.get(x, 'then'))) {
+        return x;
+    }
+    return Rx.Observable.of(x);
+}
+
+const widget = $.widget('bdoh.rxWidget', {
+    _optionsInput: null,
+    _options: null,
+    _disposables: null,
+
+    _create() {
+        this._optionsInput = new Rx.Subject();
+        this._disposables = new Rx.CompositeDisposable();
+
+        this._optionObservables = {};
+        this._disposables.add(this._optionsInput);
+
+        this._options = this._optionsInput.scan(_.assign).publish();
+        this._collectDataOptions();
+    },
+
+    _init() {
+        this._disposables.add(this._options.connect());
+        this._optionsInput.onNext(this.options);
+    },
+
+    _collectDataOptions() {
+        for (const key in this.options) {
+            if (!this.options.hasOwnProperty(key)) {
+                continue;
+            }
+            const value = this.element.data(_.kebabCase(key));
+            if (value !== undefined) {
+                this.options[key] = value;
+            }
+        }
+    },
+
+    _destroy() {
+        this._disposables.dispose();
+        delete this._attributeObservables;
+        delete this._optionObservables;
+    },
+
+    _setOptions(options) {
+        this._optionsInput.onNext(options);
+        return this;
+    },
+
+    _observeOption(key, mapValue, distinctBy) {
+        if (this._optionObservables[key]) {
+            return this._optionObservables[key];
+        }
+
+        let obs = this._options
+            .pluck(key)
+            .flatMap(join);
+        if (mapValue) {
+            obs = obs.map(_.unary(mapValue));
+        }
+        obs = obs
+            .distinctUntilChanged(distinctBy)
+            .shareReplay(1);
+
+        this._optionObservables[key] = obs;
+        return obs;
+    },
+
+    _observeAttribute(name) {
+        if (!this._attributeObservables) {
+            this._initAttributeObservable();
+        }
+
+        if (this._attributeObservables[name]) {
+            return this._attributeObservables[name];
+        }
+
+        const sub = this._attributeObservables[name] =
+            this._attributeObservable
+                .filter((mut) => {
+                    return mut.name === name;
+                })
+                .pluck('value')
+                .shareValue(this.element.attr(name));
+
+        this._attributeObserver.observe(
+            this.element[0],
+            {attributes: true, attributeFilter: _.keys(this._attributeObservables)}
+        );
+
+        return sub;
+    },
+
+    _initAttributeObservable() {
+        this._attributeObservables = {};
+
+        const sub = new Rx.Subject();
+        const ao = this._attributeObserver = new MutationObserver(_.bindKey(sub, 'onNext'));
+
+        this._attributeObservable = sub
+            .flatMap(_.identity)
+            .map((record) => {
+                const attr = record.target.attributes[record.attributeName];
+                return {name: record.attributeName, value: attr ? attr.value : undefined};
+            })
+            .share();
+
+        this._disposables.add(sub);
+        this._disposables.add(new Rx.Disposable(_.bindKey(ao, 'disconnect')));
+    },
+
+    _debug: _.rest(function (prefix) {
+        prefix.unshift(`${this.element.attr('id')} >>`);
+        return _.rest((args) => {
+            // eslint-disable-next-line no-console
+            console.debug(...prefix.concat(args));
+        });
+    }),
+});
+
+module.exports = widget;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/finite-list-widget.js b/src/Irstea/BdohBundle/Resources/assets/lib/finite-list-widget.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb5cfa9cbc727d5850ae175cbe06c5a630a6545e
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/finite-list-widget.js
@@ -0,0 +1,124 @@
+/**
+ * From a list (IN) of distinct elements, allows the user to fill a finite size list (OUT), by dragging and dropping.
+ *    => each element of IN can appear only once in OUT ;
+ *    => empty elements of OUT are filled by a default element .
+ *
+ * @param {String}  containerSelector  jquery selector of the container DOM element
+ * @param {Object}  elements           An associative array of distinct elements
+ * @param {Object}  defaultElement     Format : { name: 'a_name_for_default', value: 'My default element' }
+ * @param {Integer} numOut             The size of the list to fill
+ *
+ * @return An associative array containing the DOM element of lists IN and OUT
+ *
+ * @throws {event : change.finiteList} When an element of list OUT is added or removed
+ *
+ * @requires jquery
+ * @requires jquery-ui
+ *
+ * @example
+ * var lists = $.finiteList(
+ *      '#my_lists_parent',
+ *      { elt_1: 'Element one', elt_2: 'Element two', elt_3: 'Element three' },
+ *      { name: 'default', value: 'Default element' },
+ *      2
+ * );
+ *
+ * $('#my_lists_parent').append(lists.In).append(lists.Out);
+ */
+define([
+    'jquery',
+    'jquery-ui',
+    // --
+    'jquery-ui/ui/widget',
+    'jquery-ui/ui/widgets/draggable',
+    'jquery-ui/ui/widgets/droppable',
+    'jquery-ui/ui/widgets/sortable',
+], ($) => {
+    'use strict';
+
+    $.finiteList = function (containerSelector, elements, defaultElement, numOut) {
+
+        // Default values
+        defaultElement = defaultElement || { name: '', value: '' };
+        numOut = numOut || 1;
+
+        let $listIn  = $('<ul name="listIn"/>'),
+            $listOut = $('<ol name="listOut"/>'),
+            $delete  = $('<span class="glyphicon glyphicon-remove"/>').css('float', 'right')
+                .css('cursor', 'default')
+                .css('margin-right', '15px'),
+            e;
+
+        /**
+         * If the $delete tool of a $listOut element is clicked :
+         *  => Enables this element in $listIn ;
+         *  => And, in $listOut, replaces it by the 'defaultElement' .
+         */
+        $delete.on('click', function () {
+            const parent = $(this).parent();
+            $listIn.children(`[name = "${parent.attr('name')}"]`).draggable('enable');
+            parent.css('cursor', '').attr('name', defaultElement.name)
+                .text(defaultElement.value)
+                .trigger('change.finiteList');
+        });
+
+        // Adds elements to the $listIn
+        for (e in elements) {
+            if (elements.hasOwnProperty(e)) {
+                $('<li/>').css('cursor', 'move')
+                    .attr('name', e)
+                    .text(elements[e])
+                    .appendTo($listIn);
+            }
+        }
+
+        // For the $listOut, prepares 'numOut' <li> with 'defaultElement'
+        for (e = 0; e < numOut; e += 1) {
+            $('<li/>').attr('name', defaultElement.name)
+                .text(defaultElement.value)
+                .appendTo($listOut);
+        }
+
+        // Defines $listIn.li as draggable
+        $listIn.children().draggable({
+            revert: 'invalid',
+            cursor: 'move',
+            helper (event) {
+                return $('<div class="ui-widget-header"/>').text($(this).text());
+            }
+        });
+
+        // Defines $listOut as sortable
+        $listOut.sortable({
+            items: 'li',
+            placeholder: 'ui-state-highlight',
+            cancel: `[name = "${defaultElement.name}"]`
+        });
+
+        // Defines $listOut.li as droppable
+        $listOut.children().droppable({
+            accept      : `${containerSelector} [name = "listIn"] > li`,
+            activeClass : 'ui-state-highlight',
+            hoverClass  : 'ui-state-active',
+
+            drop (event, ui) {
+                // Enables the old element in $listIn
+                $listIn.children(`[name = "${$(this).attr('name')}"]`).draggable('enable');
+
+                // Adds the new in $listOut
+                $(this).css('cursor', 'move')
+                       .attr('name', ui.draggable.attr('name'))
+                       .text(ui.draggable.text())
+                       .append($delete.clone(true));
+
+                // and disables it in $listIn
+                ui.draggable.draggable('disable');
+
+                $(this).trigger('change.finiteList');
+            }
+        });
+
+        return { In: $listIn, Out: $listOut };
+    };
+
+});
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/jqplot.js b/src/Irstea/BdohBundle/Resources/assets/lib/jqplot.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff1926eab2479608c0458b752bea8206a56b81fe
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/jqplot.js
@@ -0,0 +1,46 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+
+/* jqplot n'étant pas "module-compatible", il faut inclure les fichiers dans le bon ordre
+ * pour respecter les dépendances.
+ * cf. src/Irstea/BdohBundle/Resources/scripts/jqplot-deps.js
+ */
+require('jqplot/src/jqplot.core');
+require('jqplot/src/jqplot.linePattern');
+require('jqplot/src/jqplot.shadowRenderer');
+require('jqplot/src/jqplot.shapeRenderer');
+require('jqplot/src/jqplot.sprintf');
+require('jqplot/src/jqplot.axisTickRenderer');
+require('jqplot/src/jqplot.lineRenderer');
+require('jqplot/src/plugins/jqplot.canvasTextRenderer');
+require('jqplot/src/plugins/jqplot.barRenderer');
+require('jqplot/src/plugins/jqplot.canvasAxisTickRenderer');
+require('jqplot/src/jqplot.axisLabelRenderer');
+require('jqplot/src/jqplot.linearTickGenerator');
+require('jqplot/src/jqplot.linearAxisRenderer');
+require('jqplot/src/plugins/jqplot.BezierCurveRenderer');
+require('jqplot/src/jqplot.markerRenderer');
+require('jqplot/src/jqplot.tableLegendRenderer');
+require('jqplot/src/plugins/jqplot.enhancedLegendRenderer');
+require('jqplot/src/plugins/jqplot.donutRenderer');
+require('jqplot/src/plugins/jqplot.funnelRenderer');
+require('jqplot/src/plugins/jqplot.meterGaugeRenderer');
+require('jqplot/src/plugins/jqplot.pieRenderer');
+require('jqplot/src/plugins/jqplot.highlighter');
+require('jqplot/src/plugins/jqplot.highlightingCursor');
+require('jqplot/src/jqplot.divTitleRenderer');
+require('jqplot/src/jqplot.themeEngine');
+require('jqplot/src/jqplot.canvasGridRenderer');
+require('jqplot/src/plugins/jqplot.canvasAxisLabelRenderer');
+require('jqplot/src/plugins/jqplot.cursor');
+require('jqplot/src/jquery.jqplot.css');
+
+$.jqplot.preInitHooks.push(function () {
+     this.drawIfHidden = true;
+});
+
+module.exports = $.jqplot;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/moment/index.js b/src/Irstea/BdohBundle/Resources/assets/lib/moment/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4a0418a7c98e2ceacfc490fa87429172b797eb6
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/moment/index.js
@@ -0,0 +1,26 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const moment = require('./null');
+
+moment.fn.floor = function(precision, unit) {
+    const offset = 'date' === unit ? 1 : 0;
+    const floor = this.clone().startOf(unit);
+    return floor.set(unit, offset + Math.floor((floor.get(unit) - offset) / precision) * precision);
+};
+
+moment.fn.ceil = function(precision, unit) {
+    const floor = this.floor(precision, unit);
+    return this.isAfter(floor) ? floor.add(precision, unit) : floor;
+};
+
+moment.fn.round = function(precision, unit) {
+    const floor = this.floor();
+    const ceil = floor.clone().add(precision, unit);
+    const mean = (floor.valueOf() + ceil.valueOf()) / 2;
+    return this.valueOf() <= mean ? floor : ceil;
+};
+
+module.exports = moment;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/moment/null.js b/src/Irstea/BdohBundle/Resources/assets/lib/moment/null.js
new file mode 100644
index 0000000000000000000000000000000000000000..b76b30a991f8388225a4cd86692235114605c259
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/moment/null.js
@@ -0,0 +1,193 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const _ = require('lodash');
+const BaseMoment = require('moment');
+
+const nullAccessor = function (...args) {
+    return args.length > 0 ? this : NaN
+};
+const returnThis = function () {
+    return this;
+};
+const returnFalse = function () {
+    return false;
+};
+
+// Singleton "null"
+const nullSingleton = {
+    isNull() {
+        return true;
+    },
+
+    inspect() {
+        return 'moment.null()';
+    },
+
+    toDate() {
+        return 'null';
+    },
+
+    toString() {
+        return 'null';
+    },
+
+    toISOString() {
+        return 'null';
+    },
+
+    format() {
+        return 'null';
+    },
+
+    isSame(date) {
+        return moment.isNull(date);
+    },
+
+    isBeforeOrSame(date) {
+        return moment.isNull(date);
+    },
+
+    isAfterOrSame(date) {
+        return moment.isNull(date);
+    },
+
+    isValid: returnFalse,
+
+    isBefore: returnFalse,
+    isAfter: returnFalse,
+
+    isLeapYear: returnFalse,
+    isDST: returnFalse,
+    isDSTShifted: returnFalse,
+
+    second: nullAccessor,
+    seconds: nullAccessor,
+    millsecond: nullAccessor,
+    milliseconds: nullAccessor,
+    minute: nullAccessor,
+    minutes: nullAccessor,
+    hour: nullAccessor,
+    hours: nullAccessor,
+    date: nullAccessor,
+    dates: nullAccessor,
+    day: nullAccessor,
+    days: nullAccessor,
+    weekday: nullAccessor,
+    dayOfYear: nullAccessor,
+    week: nullAccessor,
+    weeks: nullAccessor,
+    isoWeek: nullAccessor,
+    isoWeeks: nullAccessor,
+    month: nullAccessor,
+    months: nullAccessor,
+    quarter: nullAccessor,
+    quarters: nullAccessor,
+    year: nullAccessor,
+    years: nullAccessor,
+    weekYear: nullAccessor,
+    isoWeekYear: nullAccessor,
+    isoWeeksInYear: nullAccessor,
+    get: nullAccessor,
+    unix: nullAccessor,
+    valueOf: nullAccessor,
+    zone: nullAccessor,
+    utcOffset: nullAccessor,
+    diff: nullAccessor,
+    daysInMonth: nullAccessor,
+
+    add: returnThis,
+    subtract: returnThis,
+    startOf: returnThis,
+    endOf: returnThis,
+    utc: returnThis,
+    local: returnThis,
+    clone: returnThis
+};
+
+// Extension de la librairie
+
+function moment(date, ...args) {
+    return moment.isNull(date) ? nullSingleton : BaseMoment.call(this, date, ...args);
+}
+moment.prototype = moment.fn = BaseMoment.prototype;
+
+const baseUtc = BaseMoment.utc;
+const baseLocal = BaseMoment.local;
+const baseMin = BaseMoment.min;
+const baseMax = BaseMoment.max;
+
+_.assign(
+    moment,
+    BaseMoment,
+    {
+        null() {
+            return nullSingleton;
+        },
+
+        isNull(value) {
+            return value === null || value === nullSingleton;
+        },
+
+        nonNullDates(...ms) {
+            return _.reject(ms, moment.isNull);
+        },
+
+        utc(date, ...args) {
+            return moment.isNull(date) ? nullSingleton : baseUtc(date, ...args);
+        },
+
+        local(date, ...args) {
+            return moment.isNull(date) ? nullSingleton : baseLocal(date, ...args);
+        },
+
+        min(...dates) {
+            const nonNulls = _.reject(dates, moment.isNull);
+            return nonNulls.length > 0 ? baseMin(...nonNulls) : nullSingleton;
+        },
+
+        max(...dates) {
+            const nonNulls = _.reject(dates, moment.isNull);
+            return nonNulls.length > 0 ? baseMax(...nonNulls) : nullSingleton;
+        }
+    }
+);
+
+const baseIsSame = BaseMoment.fn.isSame;
+const baseIsBeforeOrSame = BaseMoment.fn.isBeforeOrSame;
+const baseIsAfterOrSame = BaseMoment.fn.isAfterOrSame;
+const baseIsBefore = BaseMoment.fn.isBefore;
+const baseIsAfter = BaseMoment.fn.isAfter;
+
+_.assign(
+    BaseMoment.fn,
+    {
+        isNull() {
+            return false;
+        },
+
+        isSame(date) {
+            return !moment.isNull(date) && baseIsSame.call(this, date);
+        },
+
+        isBeforeOrSame(date) {
+            return !moment.isNull(date) && baseIsBeforeOrSame.call(this, date);
+        },
+
+        isAfterOrSame(date) {
+            return !moment.isNull(date) && baseIsAfterOrSame.call(this, date);
+        },
+
+        isBefore(date) {
+            return !moment.isNull(date) && baseIsBefore.call(this, date);
+        },
+
+        isAfter(date) {
+            return !moment.isNull(date) && baseIsAfter.call(this, date);
+        },
+    }
+);
+
+module.exports = moment;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/select2.js b/src/Irstea/BdohBundle/Resources/assets/lib/select2.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ff4e808a5b092aaffb2524ae7228c89852be4e0
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/select2.js
@@ -0,0 +1,13 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const select2 = require('select2');
+require('select2/dist/css/select2.css');
+require('select2-bootstrap-theme/dist/select2-bootstrap.css');
+
+$.fn.select2.defaults.set('theme', 'bootstrap');
+
+module.exports = select2;
diff --git a/src/Irstea/BdohBundle/Resources/assets/lib/switch-default-list-widget.js b/src/Irstea/BdohBundle/Resources/assets/lib/switch-default-list-widget.js
new file mode 100644
index 0000000000000000000000000000000000000000..73197bb433a41b7d4b95fc48091bbb398d986750
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/assets/lib/switch-default-list-widget.js
@@ -0,0 +1,62 @@
+/**
+ * For each element of a <ul> or <ol> list :
+ *    => allows to switch it to a default element (by a 'delete' tool) ;
+ *    => allows to redo this switching (by a 'redo' tool) .
+ *
+ * @param {Object}  defaultElement  Format : { name: 'a_name_for_default', value: 'My default element' }
+ *
+ * @throws {event : change.switchDefaultList} When any element of a list is changed
+ *
+ * @requires jquery
+ * @requires jquery-ui
+ *
+ * @example
+ * $('#my_list').switchDefaultList({ name: 'default', value: 'Default element' });
+ */
+define([
+    'jquery'
+], ($) => {
+    'use strict';
+
+    $.fn.switchDefaultList = function (defaultElement) {
+        $(this).each(function () {
+
+            // DOM element must be a valid list (<ol> or <ul>)
+            if (this.tagName !== 'OL' && this.tagName !== 'UL') { return; }
+
+            // Tools
+            const $delete = $(`<span title="${defaultElement.titleDelete}" class="glyphicon glyphicon-remove"/>`).css('color', 'red')
+                .css('margin-left', '4px');
+            const $redo   = $(`<span title="${defaultElement.titleRedo}" class= "glyphicon glyphicon-refresh"/>`).css('color', 'green')
+                .css('margin-left', '4px');
+
+            // Behaviors of tools
+            $delete.on('click', function () {
+                $(this).parent()
+                    .attr('name', defaultElement.name)
+                    .text(defaultElement.value)
+                    .append($redo.clone(true))
+                    .trigger('change.switchDefaultList');
+            });
+
+            $redo.on('click', function () {
+                const parent = $(this).parent();
+                parent.attr('name', parent.attr('originalName'))
+                    .text(parent.attr('originalValue'))
+                    .append($delete.clone(true))
+                    .trigger('change.switchDefaultList');
+            });
+
+            // Adds 2 attributes and a 'delete' tool for each list elements
+            $(this).children('li')
+                .each(function () {
+                    $(this).attr('originalName',  $(this).attr('name') || '')
+                       .attr('originalValue', $(this).text())
+                       .append($delete.clone(true));
+            });
+
+        });
+        return $(this);
+    };
+
+});
diff --git a/src/Irstea/BdohBundle/Resources/config/routing.yml b/src/Irstea/BdohBundle/Resources/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a57931a51a3c945c3ad1eb1a859d959b6ee80ba
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/config/routing.yml
@@ -0,0 +1,3 @@
+bdoh_home:
+    path: /home
+    defaults: { _controller: FrameworkBundle:Redirect:redirect, route: bdoh_consult_observatoire }
diff --git a/src/Irstea/BdohBundle/Resources/config/services.yml b/src/Irstea/BdohBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..26140c0b9370b416d246cb9766e8462d78c9c423
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/config/services.yml
@@ -0,0 +1,73 @@
+parameters:
+    # Where to store the cached data of the LESS compiler
+    irstea_bdoh.less.cache_dir: "%kernel.cache_dir%/less"
+
+    # The list of LESS files to compile, and their URI path.
+    irstea_bdoh.less.files:
+        "%kernel.root_dir%/../src/Irstea/BdohBundle/Resources/less/base.less": "%irstea_bdoh.less.css_path%"
+
+    # The list of directories to imports, and their URI path.
+    irstea_bdoh.less.import_dirs:
+        "%kernel.root_dir%/../node_modules/bootstrap/less": ''
+
+    # Where to store the CSS files, relative to the web directory.
+    irstea_bdoh.less.css_path: /css/themes/
+
+    # Directory path (relative to the web dir) where to put uploaded image files.
+    irstea_bdoh.uploaded.image_dir: uploads/images/
+
+    # Directory path (relative to the web dir) where to put uploaded document files.
+    irstea_bdoh.uploaded.document_dir: uploads/documents/
+
+    # The user manual (relative to the web dir)
+    irstea_bdoh.user_manual: documents/DocumentationBDOH.pdf
+
+services:
+    # Intl twig extension
+    twig.extension.intl:
+        class: Twig_Extensions_Extension_Intl
+        tags: [{ name: twig.extension }]
+
+    # 'Observatoire' manager
+    irstea_bdoh.manager.observatoire:
+        class: Irstea\BdohBundle\Manager\ObservatoireManager
+        lazy: true
+        arguments:
+            - "@doctrine.orm.entity_manager"
+            - "@router"
+            - "@translator"
+        tags:
+            # Priority = 10 : after Router (32) ; before Firewall (8)
+            - { name: kernel.event_listener, event: kernel.request, method: loadContext, priority: 10 }
+
+    # css manager
+    irstea_bdoh.manager.css:
+        class: Irstea\BdohBundle\Manager\CssManager
+        lazy: true
+        arguments:
+            - "%irstea_bdoh.less.files%"
+            - "%irstea_bdoh.less.css_path%"
+            - "%kernel.root_dir%/../web"
+            -
+                import_dirs: "%irstea_bdoh.less.import_dirs%"
+                cache_dir:   "%irstea_bdoh.less.cache_dir%"
+            -
+                primaryColor: "#003A80"
+                secondaryColor: "#009E00"
+            - "%kernel.debug%"
+
+    # Bdoh twig extension
+    irstea_bdoh.twig.bdoh_extension:
+        class: Irstea\BdohBundle\Twig\BdohExtension
+        arguments:
+            - "@doctrine.orm.entity_manager"
+            - "@irstea_bdoh.manager.observatoire"
+            - "@irstea_bdoh.manager.css"
+            - "@irstea_bdoh.util.duration_formater"
+        tags: [{ name: twig.extension }]
+
+    # duration formater
+    irstea_bdoh.util.duration_formater:
+        class: Irstea\BdohBundle\Util\DurationFormater
+        arguments:
+            - "@translator"
diff --git a/src/Irstea/BdohBundle/Resources/doc/index.rst b/src/Irstea/BdohBundle/Resources/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohBundle/Resources/less/README b/src/Irstea/BdohBundle/Resources/less/README
new file mode 100644
index 0000000000000000000000000000000000000000..cf2d5d8b01f861823c862f56af9589ab4b8ae51b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/less/README
@@ -0,0 +1 @@
+Warning : delete web/css/*.css files to regenerate the 'observatoires' CSS files.
diff --git a/src/Irstea/BdohBundle/Resources/less/base.less b/src/Irstea/BdohBundle/Resources/less/base.less
new file mode 100644
index 0000000000000000000000000000000000000000..8fba7d4dd1d3beac6e27791cd94ec273982a444b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/less/base.less
@@ -0,0 +1,357 @@
+// From bootstrap
+@import (reference) "bootstrap.less";
+@import "theme.less";
+
+// BDOH custom
+@import "bdoh-variables.less";
+@import "consult.less";
+@import "measure-import.less";
+
+/******************************************************************************
+ * Overloads of bootstrap CSS properties
+ */
+
+.sonata-bc h1 {
+    font-size: 24px;
+    line-height: 36px;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    margin-top: (@line-height-computed / 2);
+
+    small {
+        font-size: 85%;
+    }
+}
+
+.accordion {
+    h2, h3, h4 {
+        line-height: 0px;
+    }
+
+    .accordion-heading {
+        border: 1px solid @primaryColor;
+        background-color: @gray-lighter;
+    }
+
+    .accordion-inner {
+        .odd, .even {
+            margin-top: 0.5em;
+            padding: 0.5em;
+        }
+        .odd {
+            background-color: @gray-lighter;
+        }
+    }
+}
+
+a.accordion-toggle {
+    text-decoration: none;
+}
+
+.table .highlight {
+    background-color: @gray-lighter;
+}
+
+.controls-text {
+    padding-top: 5px;
+}
+
+.tooltip-inner {
+    max-width: none;
+}
+
+.collapse {
+    position: static;
+}
+
+/******************************************************************************
+ * Bootstrap Popovers
+ */
+div.popover {
+    min-width:150px;
+}
+
+h3.popover-title{
+    text-align:center;
+}
+
+/******************************************************************************
+ * Generics
+ */
+h1, .sonata-bc h1 {
+    color: @primaryColor;
+}
+
+.td-center {
+    padding: 0.5em;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.info-high {
+    font-weight: bold;
+}
+
+.inactive {
+    color: #c5c5c5;
+}
+
+.inputs-list-inline li,
+.sonata-bc .inputs-list-inline li {
+    width: 150px;
+    float: left;
+}
+
+/******************************************************************************
+ * Toolbox
+ */
+.iconText {
+    & > * {
+        display: inline-block;
+        float: left;
+    }
+
+    & > .divider-vertical {
+        height: @line-height-base - 4px;
+        margin: 2px 0.3em 2px 0;
+        border-left: 1px solid @gray;
+        border-right: 1px solid @gray;
+    }
+}
+
+.toolbox-btns {
+    background: white;
+    padding: 0 @padding-base-horizontal;
+    &.pull-left {
+        padding-left: 0;
+    }
+    &.pull-right {
+        padding-right: 0;
+    }
+
+    & > a {
+        .btn;
+        .btn-default;
+        .btn-sm;
+        padding: @padding-small-vertical;
+        line-height: 1.0 !important;
+        background-image: inherit;
+        background-repeat: unset;
+        .reset-filter();
+
+        [class^="fam-"] {
+            margin: 0 !important;
+        }
+    }
+}
+
+.btn {
+    background-image: inherit;
+    background-repeat: unset;
+    .reset-filter();
+}
+
+/******************************************************************************
+ * A box for any content
+ */
+.box {
+    margin-bottom:15px;
+    padding: 1em;
+    border-radius: 5px;
+    border: 1px solid @primaryColor;
+
+    legend {
+        width: auto;
+        margin: 0;
+        padding-left: 0.5em;
+        padding-right: 0.5em;
+        border: 0 none;
+        color: @text-color;
+        line-height: @line-height-base;
+    }
+}
+
+/******************************************************************************
+ * Page container
+ */
+#page {
+    margin-top: 1em;
+    margin-bottom: 2em;
+}
+
+/******************************************************************************
+ * Header
+ */
+#header {
+    #logo {
+        text-align: center;
+        img {
+            height: 80px;
+        }
+    }
+
+    #header-bars {
+        margin-left: 0;
+    }
+}
+
+/******************************************************************************
+ * Navigation bar
+ */
+
+.navbar-nav > .divider {
+    border: solid @navbar-default-link-color 1px;
+    margin-top: 7px;
+    margin-bottom: 7px;
+    height: @navbar-height - 14;
+}
+
+#navbar {
+    a {
+        font-weight: bold;
+        font-size: 1.2em;
+    }
+}
+
+#userbar .dropdown-menu .divider{
+    margin:5px 0;
+}
+
+/******************************************************************************
+ * Breadcrumb
+ */
+.breadcrumb {
+    margin-top: 0;
+    margin-bottom: 2px;
+    padding: 0 0.5em;
+    background: none;
+    border: 0;
+    text-align: right;
+    font-size: 0.8em;
+}
+
+/******************************************************************************
+ * Notice
+ */
+#notices {
+    padding-top: 0.5em;
+}
+
+/************************************************
+ * Main content
+ */
+#main {
+    margin: 0;
+    padding-bottom: 1em;
+
+    h1 {
+        margin-bottom: 1em;
+        border-bottom: 1px solid @primaryColor;
+    }
+}
+
+/******************************************************************************
+ * Footer
+ */
+#footer {
+    padding: 0.5em;
+    border-radius: 0 0 15px 15px;
+    .box-shadow(0 2px 5px rgba(0, 0, 0, .50));
+    background-color: @primaryColor;
+
+    table#partenaires {
+        border-collapse: separate;
+        border-spacing: 0.5em;
+
+        td {
+            .td-center;
+            border-radius: 5px;
+            .box-shadow(inset 0 0 5px #888);
+            background-color: white;
+            img {
+                height: 60px;
+            }
+        }
+    }
+}
+
+/******************************************************************************
+ * Misc
+ */
+
+.logo {
+    max-width: 100%;
+}
+
+select[multiple=multiple] {
+    height: 9em;
+}
+
+.nav.nav-pills > li > a {
+    padding: 5px 8px;
+}
+
+// Home page
+.nav-tabs.tabs-left {
+    padding-right: 0;
+    border-bottom: none;
+    border-right: @nav-tabs-border-color solid 1px;
+
+    & > li {
+        float: none;
+        margin: 0 -1px 0 0;
+
+        & > a {
+            margin: 0;
+            border-radius: @border-radius-base 0 0 @border-radius-base;
+        }
+
+        &.active > a,
+        & > a:hover,
+        & > a:focus {
+            border: 1px solid @nav-tabs-border-color;
+            border-right-color: transparent;
+        }
+    }
+}
+
+// affichage des select
+select.form-control{
+    appearance:none;
+    -moz-appearance:none;
+    -webkit-appearance:none;
+    background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAR0lEQVQI132NwQ2AMAwDzx2DZToPTOARPAHrwgekNircJ4nOVuAHJdmBc%2BEOASS5qrGt9uy9uA6g9xrbtgXQhvRW5szq9yc3Jn0OUtofitcAAAAASUVORK5CYII%3D");
+    background-repeat:no-repeat;
+    background-position:right 5px center;
+    padding-right:15px;
+}
+select.form-control.input-sm{
+    line-height:15px;
+}
+select.form-control option{
+    /*padding-left:0;
+    padding-right:0;*/
+    appearance:none;
+    -moz-appearance:none;
+    -webkit-appearance:none;
+}
+select.form-control optgroup option{
+    /*padding-left:25px;*/
+}
+// correction alignement navbar-right ?
+.navbar-right{
+    margin-right:0;
+}
+// desactivation de l'effet sur le focus des tabs (c'est moche)
+ul.nav-tabs.nav li a:focus{
+    outline:0;
+}
+// taille du label du captcha
+label.custom-captcha-label-class.control-label {
+    width:25%;
+}
+// dernière div des boîte alerte sans marge
+div.alert > div:last-of-type{
+    margin-bottom:0;
+}
diff --git a/src/Irstea/BdohBundle/Resources/less/bdoh-variables.less b/src/Irstea/BdohBundle/Resources/less/bdoh-variables.less
new file mode 100644
index 0000000000000000000000000000000000000000..9acb36a9f09ca99ab45c5deeaf4b69fb098253b6
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/less/bdoh-variables.less
@@ -0,0 +1,53 @@
+// Some customized variables
+// -------------------------
+@userbarHeight: 30px;
+
+// Redefinitions of Bootstrap variables
+// -------------------------
+
+@primaryColor: #003A80;
+@secondaryColor: #009EE0;
+
+@brand-primary: @primaryColor;
+
+@gray: #444444;
+@gray-lighter: #e5e5e5;
+
+@text-color: @gray;
+@link-color: @secondaryColor;
+
+@font-size-base: 12px;
+@line-height-base: 18/12;
+
+// Grid
+@grid-columns: 24;
+@grid-gutter-width: 10px;
+
+// Headings
+
+@font-size-h1: 24px;
+@font-size-h2: 16px;
+@font-size-h3: 13px;
+@font-size-h4: 12px;
+@font-size-h5: 11px;
+@font-size-h6: 10px;
+
+@headings-font-weight: 700;
+
+// Navbar
+@navbar-height: 35px;
+@navbar-margin-bottom: 2px;
+
+@navbar-default-bg: @primaryColor;
+@navbar-default-link-color: white;
+@navbar-default-link-hover-color: white;
+@navbar-default-link-hover-bg: transparent;
+@navbar-default-link-active-color: white;
+@navbar-default-link-active-bg: transparent;
+
+@navbar-inverse-bg: @secondaryColor;
+@navbar-inverse-link-color: white;
+@navbar-inverse-link-hover-color: white;
+@navbar-inverse-link-hover-bg: transparent;
+@navbar-inverse-link-active-color: white;
+@navbar-inverse-link-active-bg: transparent;
diff --git a/src/Irstea/BdohBundle/Resources/less/consult.less b/src/Irstea/BdohBundle/Resources/less/consult.less
new file mode 100644
index 0000000000000000000000000000000000000000..9277bd70d06834268368a3ae266cad2fe82f521a
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/less/consult.less
@@ -0,0 +1,63 @@
+#consult-chronique {
+    a.fillingRate, div.fillingRate {
+        color: inherit;
+        display:block;
+        text-decoration:none;
+        padding:2px 4px;
+    }
+    a.fillingRate.discontinue:not(.textLabel), div.fillingRate.discontinue:not(.textLabel) {
+        text-align:right;
+        padding-right:30%;
+    }
+    a.fillingRate.discontinue {
+        //background-color:fade(@secondaryColor, 10%);
+    }
+    a.fillingRate.discontinue:hover {
+        //background-color:fade(@primaryColor, 10%);
+    }
+    div.fillingRate {
+        cursor:default;
+    }
+    a.fillingRate:hover {
+        background-color:#e5e5e5;
+        color:#000;
+    }
+    table#fillingRates.table thead tr.highlight th.discontinue{
+        text-align:center;
+    }
+}
+
+#consult-station, #consult-chronique {
+    #identification {
+        margin-bottom: 2em;
+        .info-high {
+            margin-bottom: 0.5em;
+        }
+        & > [class*="span"] {
+            margin-left: 0;
+        }
+    }
+
+    #identification.box {
+        background-color: #e5e5e5;
+    }
+}
+
+#consult-advancedSearch {
+    .criteria {
+        margin: 1em 0;
+        background-color: #f5f5f5;
+        border: 1px solid @gray;
+        border-radius: 5px;
+    }
+
+    .column-filter-widget select {
+        width: 170px;
+    }
+    // Sized for 5 search criteria
+}
+
+.table tr.group {
+    padding: 0 0 0 0.5em;
+    background-color: #e5e5e5;
+}
diff --git a/src/Irstea/BdohBundle/Resources/less/measure-import.less b/src/Irstea/BdohBundle/Resources/less/measure-import.less
new file mode 100644
index 0000000000000000000000000000000000000000..9fa4b761603010fcf4df238aa12387013a1a7e2f
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/less/measure-import.less
@@ -0,0 +1,49 @@
+#measure-import {
+    h2 {
+        margin: 0;
+    }
+    h3:not(.popover-title) {
+        line-height: 0px;
+    }
+
+    div[name = "chroniques"] .well {
+        padding: 0.5em;
+        border: 1px solid @gray;
+
+        & > div {
+            margin-bottom: 1em;
+            text-align: center;
+            border-bottom: 1px solid @gray;
+        }
+    }
+}
+
+#format-description > * {
+    display: none;
+}
+
+form.form-horizontal[name="main"] .form-group {
+    margin-left:0;
+    margin-right:0;
+}
+div#measure-import div.panel-body > div > div:last-of-type{
+    margin-bottom:0;
+}
+.import-title{
+    border-radius:4px;
+    background-color:grey;
+    color:white;
+    padding:0 5px;
+}
+a.import-title:hover,
+a.import-title:focus{
+    cursor:pointer;
+    text-decoration:none;
+    color:white;
+}
+a.import-title b.caret{
+    transition:transform 0.3s ease-in-out;
+}
+a.import-title.collapsed b.caret{
+    transform:rotate(-90deg);
+}
diff --git a/src/Irstea/BdohBundle/Resources/scripts/jqplot-deps.js b/src/Irstea/BdohBundle/Resources/scripts/jqplot-deps.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac9b1ed5cbd3fd9b594b8ae93a340bb0bf213637
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/scripts/jqplot-deps.js
@@ -0,0 +1,111 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const _ = require('lodash');
+
+/* Ce script permet de calculer l'order dans lequel importer les fichiers jqplot en
+ * tenant compte des dépendances.
+ *
+ * Usage: node src/Irstea/BdohBundle/Resources/scripts/jqplot-deps.js
+ */
+
+// Jqplot ...
+const deps = {
+    'jqplot/src/jqplot.core': [],
+    'jqplot/src/jqplot.axisLabelRenderer': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.axisTickRenderer': ['jqplot/src/jqplot.core', 'jqplot/src/jqplot.sprintf'],
+    'jqplot/src/jqplot.canvasGridRenderer': ['jqplot/src/jqplot.shadowRenderer'],
+    'jqplot/src/jqplot.divTitleRenderer': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.linePattern': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.lineRenderer': ['jqplot/src/jqplot.shadowRenderer', 'jqplot/src/jqplot.shapeRenderer'],
+    'jqplot/src/jqplot.linearAxisRenderer': ['jqplot/src/jqplot.axisLabelRenderer', 'jqplot/src/jqplot.linearTickGenerator', 'jqplot/src/plugins/jqplot.barRenderer', 'jqplot/src/plugins/jqplot.canvasAxisTickRenderer'],
+    'jqplot/src/jqplot.linearTickGenerator': ['jqplot/src/jqplot.sprintf'],
+    'jqplot/src/jqplot.markerRenderer': ['jqplot/src/jqplot.shadowRenderer', 'jqplot/src/jqplot.shapeRenderer'],
+    'jqplot/src/jqplot.shadowRenderer': ['jqplot/src/jqplot.linePattern'],
+    'jqplot/src/jqplot.shapeRenderer': ['jqplot/src/jqplot.linePattern'],
+    'jqplot/src/jqplot.sprintf': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.tableLegendRenderer': ['jqplot/src/plugins/jqplot.BezierCurveRenderer'],
+    'jqplot/src/jqplot.themeEngine': ['jqplot/src/jqplot.core', 'jqplot/src/plugins/jqplot.donutRenderer', 'jqplot/src/plugins/jqplot.funnelRenderer', 'jqplot/src/plugins/jqplot.meterGaugeRenderer', 'jqplot/src/plugins/jqplot.pieRenderer'],
+    'jqplot/src/jqplot.toImage': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.effects.core': ['jqplot/src/jqplot.core'],
+    'jqplot/src/jqplot.effects.blind': ['jqplot/src/jqplot.effects.core'],
+
+    // ... et ses plugins. Cette a été obtenue avec la commande: dev/jsDeps.pl web/vendor/jqplot/ '$.jqplot' 'jqplot/'
+    'jqplot/src/plugins/jqplot.BezierCurveRenderer': ['jqplot/src/jqplot.linearAxisRenderer'],
+    'jqplot/src/plugins/jqplot.barRenderer': ['jqplot/src/jqplot.lineRenderer'],
+    'jqplot/src/plugins/jqplot.blockRenderer': ['jqplot/src/jqplot.lineRenderer'],
+    'jqplot/src/plugins/jqplot.bubbleRenderer': ['jqplot/src/jqplot.linearAxisRenderer'],
+    'jqplot/src/plugins/jqplot.canvasAxisLabelRenderer': ['jqplot/src/jqplot.core', 'jqplot/src/plugins/jqplot.canvasTextRenderer'],
+    'jqplot/src/plugins/jqplot.canvasAxisTickRenderer': ['jqplot/src/jqplot.axisTickRenderer', 'jqplot/src/plugins/jqplot.canvasTextRenderer'],
+    'jqplot/src/plugins/jqplot.canvasOverlay': ['jqplot/src/jqplot.markerRenderer', 'jqplot/src/jqplot.sprintf'],
+    'jqplot/src/plugins/jqplot.canvasTextRenderer': ['jqplot/src/jqplot.core'],
+    'jqplot/src/plugins/jqplot.categoryAxisRenderer': ['jqplot/src/jqplot.linearAxisRenderer'],
+    'jqplot/src/plugins/jqplot.ciParser': ['jqplot/src/plugins/jqplot.json2'],
+    'jqplot/src/plugins/jqplot.cursor': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.dateAxisRenderer': ['jqplot/src/jqplot.linearAxisRenderer'],
+    'jqplot/src/plugins/jqplot.donutRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.dragable': ['jqplot/src/jqplot.markerRenderer'],
+    'jqplot/src/plugins/jqplot.enhancedLegendRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.enhancedPieLegendRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.funnelRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.highlighter': ['jqplot/src/jqplot.markerRenderer', 'jqplot/src/jqplot.sprintf', 'jqplot/src/plugins/jqplot.barRenderer'],
+    'jqplot/src/plugins/jqplot.highlightingCursor': ['jqplot/src/plugins/jqplot.highlighter'],
+    'jqplot/src/plugins/jqplot.json2': [],
+    'jqplot/src/plugins/jqplot.logAxisRenderer': ['jqplot/src/jqplot.linearAxisRenderer'],
+    'jqplot/src/plugins/jqplot.mekkoAxisRenderer': ['jqplot/src/jqplot.axisLabelRenderer', 'jqplot/src/plugins/jqplot.canvasAxisTickRenderer'],
+    'jqplot/src/plugins/jqplot.mekkoRenderer': ['jqplot/src/jqplot.shapeRenderer', 'jqplot/src/plugins/jqplot.mekkoAxisRenderer'],
+    'jqplot/src/plugins/jqplot.meterGaugeRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.mobile': ['jqplot/src/jqplot.core'],
+    'jqplot/src/plugins/jqplot.ohlcRenderer': ['jqplot/src/jqplot.lineRenderer'],
+    'jqplot/src/plugins/jqplot.pieRenderer': ['jqplot/src/jqplot.tableLegendRenderer'],
+    'jqplot/src/plugins/jqplot.pointLabels': ['jqplot/src/jqplot.axisTickRenderer', 'jqplot/src/plugins/jqplot.barRenderer'],
+    'jqplot/src/plugins/jqplot.pyramidAxisRenderer': ['jqplot/src/jqplot.linearAxisRenderer', 'jqplot/src/plugins/jqplot.pyramidRenderer'],
+    'jqplot/src/plugins/jqplot.pyramidGridRenderer': ['jqplot/src/jqplot.canvasGridRenderer'],
+    'jqplot/src/plugins/jqplot.pyramidRenderer': ['jqplot/src/jqplot.lineRenderer', 'jqplot/src/plugins/jqplot.pyramidGridRenderer'],
+    'jqplot/src/plugins/jqplot.trendline': ['jqplot/src/jqplot.lineRenderer']
+};
+
+const queue = [
+    'jqplot/src/jqplot.core',
+    'jqplot/src/jqplot.axisLabelRenderer',
+    'jqplot/src/jqplot.axisTickRenderer',
+    'jqplot/src/jqplot.canvasGridRenderer',
+    'jqplot/src/jqplot.divTitleRenderer',
+    'jqplot/src/jqplot.lineRenderer',
+    'jqplot/src/jqplot.linearAxisRenderer',
+    'jqplot/src/jqplot.markerRenderer',
+    'jqplot/src/jqplot.tableLegendRenderer',
+    'jqplot/src/jqplot.themeEngine',
+    'jqplot/src/plugins/jqplot.canvasAxisLabelRenderer',
+    'jqplot/src/plugins/jqplot.canvasAxisTickRenderer',
+    'jqplot/src/plugins/jqplot.barRenderer',
+    'jqplot/src/plugins/jqplot.highlightingCursor',
+    'jqplot/src/plugins/jqplot.cursor'
+];
+
+const orders = {};
+for (const mod of queue) {
+    orders[mod] = 1;
+}
+
+while (queue.length > 0) {
+    const mod = queue.shift();
+    const depMinOrder = orders[mod] + 1;
+    for (const dep of deps[mod]) {
+        if (!orders[dep] || depMinOrder > orders[dep]) {
+            orders[dep] = depMinOrder;
+            queue.push(dep);
+        }
+    }
+}
+
+const all = _.keys(orders);
+all.sort((a, b) => orders[b] - orders[a]);
+
+for (const dep of all) {
+    // eslint-disable-next-line no-console
+    console.log(`require('${dep}');`);
+}
diff --git a/src/Irstea/BdohBundle/Resources/translations/commands.en.php b/src/Irstea/BdohBundle/Resources/translations/commands.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..12764e85d6e160288ca618e55400da66d6240760
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/commands.en.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$selection = [
+    'selection' => [
+        'empty.key' => 'Nothing',
+        'empty.msg' => 'Select none',
+        'free.key'  => 'Free',
+        'free.msg'  => 'Free selection',
+        'stop.key'  => 'Stop',
+        'stop.msg'  => 'Stop selection',
+
+        'ask.key'     => 'What is your choice?',
+        'ask.element' => 'Your free selection: ',
+
+        'error.empty'          => 'Please select an item from the list.',
+        'error.invalid(%key%)' => "“\u{a0}%key%\u{a0}” is invalid! Please select an item from the list.",
+    ],
+];
+
+/*************************************************
+ * ERRORS
+ ************************************************/
+
+$errors = [
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'file_path'   => 'File path',
+    'file_format' => 'File format',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($selection, $errors, $various);
diff --git a/src/Irstea/BdohBundle/Resources/translations/commands.fr.php b/src/Irstea/BdohBundle/Resources/translations/commands.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..f527d353ed3aaa5861d40eb9e9f55a0ba72383ca
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/commands.fr.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$selection = [
+    'selection' => [
+        'empty.key' => 'Rien',
+        'empty.msg' => 'Ne rien sélectionner',
+        'free.key'  => 'Libre',
+        'free.msg'  => 'Sélection libre',
+        'stop.key'  => 'Stop',
+        'stop.msg'  => 'Stopper la sélection',
+
+        'ask.key'     => 'Quel est votre choix ?',
+        'ask.element' => 'Votre sélection libre : ',
+
+        'error.empty'          => 'Veuillez sélectionner un élément de la liste.',
+        'error.invalid(%key%)' => "«\u{a0}%key%\u{a0}» est invalide ! Veuillez sélectionner un élément de la liste.",
+    ],
+];
+
+/*************************************************
+ * ERRORS
+ ************************************************/
+
+$errors = [
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'file_path'   => 'Chemin du fichier',
+    'file_format' => 'Format du fichier',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($selection, $errors, $various);
diff --git a/src/Irstea/BdohBundle/Resources/translations/messages.en.php b/src/Irstea/BdohBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..b4bd05c8f0b3fba628dd8a66e0d45143b6dbd06b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/messages.en.php
@@ -0,0 +1,214 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$errors = [
+    'Error.notFile(%file%)'                  => "“\u{a0}%file%\u{a0}”: This path is not that of a valid file",
+    'Error.zip.cantCreate'                   => 'Unable to create the ZIP archive',
+    'Error.file.cantRead(%file%)'            => "Unable to read file “\u{a0}%file%\u{a0}”",
+    'Error.file.cantCreate(%file%)'          => "Unable to create file “\u{a0}%file%\u{a0}”",
+    'Error.file.chmodFailed(%file%,%mode%)'  => "Unable to assign permissions “\u{a0}%mode%\u{a0}” to file “\u{a0}%file%\u{a0}”",
+    'Error.baseLessFile.cantCompile(%file%)' => "Unable to compile the LESS base file: “\u{a0}%file%\u{a0}”",
+];
+
+/*************************************************
+ * OBSERVATOIRE
+ ************************************************/
+
+$observatoire = [
+    'Observatoire' => [
+        'selector'                     => 'Observatories',
+        'notExist(%observatoireSlug%)' => "Observatory “\u{a0}%observatoireSlug%\u{a0}” does not exist!",
+        'cssFile.cantCreate(%file%)'   => "Unable to create the CSS file for the observatory: “\u{a0}%file%\u{a0}”",
+        'cssFile.cantRemove(%file%)'   => "Unable to remove the CSS file for the observatory: “\u{a0}%file%\u{a0}”",
+        'Tous'                         => 'All the observatories',
+    ],
+];
+
+/*************************************************
+ * ABOUT DATES
+ ************************************************/
+
+$dates = [
+    'Year'  => 'Year',
+    'Month' => 'Month',
+    'Jan'   => 'Jan',
+    'Feb'   => 'Feb',
+    'Mar'   => 'Mar',
+    'Apr'   => 'Apr',
+    'May'   => 'May',
+    'Jun'   => 'Jun',
+    'Jul'   => 'Jul',
+    'Aug'   => 'Aug',
+    'Sep'   => 'Sep',
+    'Oct'   => 'Oct',
+    'Nov'   => 'Nov',
+    'Dec'   => 'Dec',
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'account.create'                          => 'Register',
+    'account.edit'                            => 'Modify your account',
+    'account.login'                           => 'Sign in',
+    'account.logout'                          => 'Sign out',
+    'accueil'                                 => 'Home',
+    'accueilMessage'                          => "The Hydrology Observatory Database (Base de Données des Observatoires en Hydrologie, BDOH) aims at managing, banking and providing hydrological and biochemical data from long-term observatories managed by or where Irstea (formerly Cemagref) is strongly involved. These observatories consist of experimental sites in which data are collected continuously or during recurring campaigns: rainfall, water height and river flow rates, groundwater levels, suspended matter flow, concentration of various substances, etc. The oldest observatory has been operating since 1962.\n\n" .
+        "Those data are used for research by scientists of Irstea and their partners, as well as the public or private operational community for environment (State services, territory authorities, design offices, industry). The data are accessible to everyone as long as the users register on the application and observe the terms of uses.\n\n" .
+        'In BDOH, data are naturally organised by Observatories, which are independently managed by the research units in charge.',
+    'accueilObservatoires'                    => 'Observatories main page',
+    'administration'                          => 'Administration',
+    'advancedSearch'                          => 'Advanced search',
+    'astuceDate'                              => 'Tip : You can write the date with the number(example : 130495 -> 13/04/1995). If you write 1304 the current year will be automatically add',
+    'applyDates'                              => 'Write dates located',
+    'atBeginning'                             => 'at the beginning',
+    'atEnd'                                   => 'at the end',
+    'ofMeasureRanges'                         => 'of data time ranges',
+    'askDataAccess'                           => 'Ask for data access',
+    'askManager'                              => 'Contact a manager',
+    'backToHome'                              => 'Home',
+    'begin'                                   => 'Start',
+    'beingCanceled'                           => 'Cancelling',
+    'betterStartAtExistingTime'               => "Choosing “\u{a0}from a data point\u{a0}” will usually lead to a more accurate interpolation for this kind of time series",
+    'cancel'                                  => 'Cancel',
+    'captcha'                                 => 'Rewrite the code',
+    'captcha.info'                            => 'Please type the following characters',
+    'captcha.security'                        => 'Security check',
+    'chroniquesBox'                           => 'Time series box',
+    'chroniquesBox(%station%)'                => "Time series in station “\u{a0}%station%\u{a0}”",
+    'close'                                   => 'Close',
+    'dataset'                                 => 'Jeu de données',
+    'contactHelp'                             => 'Help',
+    'ContinueBox(%station%)'                  => "Continuous and calculated time series in station “\u{a0}%station%\u{a0}”",
+    'cumulative'                              => 'Cumulative',
+    'cumulRefHour'                            => 'Start time of accumulations (in the selected time zone)',
+    'DiscontinueBox(%station%)'               => "Discontinuous time series in station “\u{a0}%station%\u{a0}”",
+    'dataAccess'                              => 'See our data',
+    'complexViewer'                           => 'Display several time series',
+    'TextLinkToCV'                            => 'Display several time series on the same page',
+    'date(UTC)'                               => 'UTC Date',
+    'date.firstMeasure'                       => 'Date of the first data',
+    'date.lastMeasure'                        => 'Date of the last data',
+    'date.selectFirst'                        => 'Select the minimum date of all listed time series',
+    'date.selectLast'                         => 'Select the maximum date of all listed time series',
+    'date.selectFirst_empty'                  => 'Select the minimum date of the time series',
+    'date.selectLast_empty'                   => 'Select the minimum date of the time series',
+    'displayData'                             => 'Display data',
+    'displayOnlyInPeriod'                     => 'Display only time series that have data:',
+    'selectStartEndDates'                     => 'Select the start date and end date',
+    'doNotSelect'                             => 'Do not select',
+    'downloadedRangeInTimezone'               => 'Period in this time zone',
+    'editChronique'                           => 'Edit this time series',
+    'editObservatoire'                        => 'Edit this observatory',
+    'editStation'                             => 'Edit this station',
+    'empty'                                   => 'N.A.',
+    'envoialljson'                            => 'Send all json by producer',
+    'end'                                     => 'End',
+    'enSavoirPlus'                            => 'Go to the observatory',
+    'errors'                                  => 'Errors',
+    'errorsMayComeFromEncoding'               => 'Some errors may occur when the uploaded file contains special characters (e.g. µ).
+                                      In such case please make sure this file is UTF-8 encoded.',
+    'existing'                                => 'Existing',
+    'existingMeasureTime'                     => 'from a data point',
+    'export'                                  => 'Download',
+    'exporter'                                => 'Download',
+    'exportType'                              => 'Download type (variable or regular time step)',
+    'exportTypeShort'                         => 'Download type',
+    'fillings'                                => 'Fillings',
+    'fillingRate'                             => 'Data completeness',
+    'from'                                    => 'from',
+    'gaps'                                    => 'Gaps',
+    'home'                                    => 'Home',
+    'home.alt'                                => 'Irstea',
+    'home.choice'                             => 'Choice your observatory',
+    'home.title'                              => "“\u{a0}Base de Données des Observatoires en Hydrologie\u{a0}”",
+    'hour(s)(utc)'                            => 'hour(s) [UTC]',
+    'IAgreeWith'                              => 'I agree with',
+    'identical'                               => 'Identical',
+    'identification'                          => 'Specifications',
+    'ignoreColumn'                            => 'Ignore this column',
+    'illustration'                            => 'Illustration photograph',
+    'import'                                  => 'Upload',
+    'import(the)'                             => 'the upload',
+    'information'                             => 'Information',
+    'instantaneous'                           => 'Instantaneous',
+    'loading'                                 => 'Loading',
+    'maximum.small'                           => 'Max.',
+    'mean'                                    => 'Mean',
+    'measures.table'                          => 'Table',
+    'measures.viewer'                         => 'Viewer',
+    'measuresNumber'                          => 'Data',
+    'checkpoints'                             => 'Checkpoints',
+    'minimum.small'                           => 'Min.',
+    'minutes'                                 => 'minutes',
+    'no'                                      => 'No',
+    'noDescription'                           => 'No description available',
+    'noGenalogy'                              => 'No genealogy available',
+    'none'                                    => 'N.A.',
+    'noneSmall'                               => '-',
+    'noOne'                                   => 'No one',
+    'none'                                    => 'None',
+    'noboby'                                  => 'N.A.',
+    'noneFeminine'                            => 'None',
+    'notActive'                               => 'inactive',
+    'or'                                      => 'or',
+    'overlap'                                 => 'Overlap',
+    'parametersStudied'                       => 'Parameters',
+    'partners'                                => 'Partners',
+    'cgu'                                     => 'Terms of use',
+    'period'                                  => 'Period',
+    'presentation'                            => 'Presentation',
+    'reset'                                   => 'Reset',
+    'restart'                                 => 'Restart',
+    'roundTime'                               => 'from a round hour',
+    'searchPeriod'                            => 'Search period',
+    'startInterpAt'                           => 'Start interpolation',
+    'submit'                                  => 'Submit',
+    'survolez'                                => 'Hover the name of the desired observatory',
+    'step'                                    => 'Time step',
+    'TermsOfUses'                             => 'Terms of uses',
+    'TermsOfUses.none'                        => 'No terms of uses are defined.',
+    'TermsOfUses(the)'                        => 'The terms of uses',
+    'to'                                      => 'to',
+    'toLearnMore'                             => 'To learn more',
+    'citeWithDoi'                             => 'To cite these data you may refer to the following DOI:',
+    'citeWithDois'                            => 'To cite these data you may refer to the following DOIs:',
+    'moreAboutDoi'                            => 'More about this DOI',
+    'type'                                    => 'Type',
+    'UTC'                                     => 'UTC',
+    'UTC(in)'                                 => 'in UTC',
+    'validate'                                => 'Validate',
+    'validateurJSON'                          => 'Dataset validation by Theia/OZCAR',
+    'viewer'                                  => 'Viewer',
+    'viewChronique'                           => 'Show this time series',
+    'viewStation'                             => 'Show this station',
+    'viewObservatoire'                        => 'Show this observatory',
+    'welcome'                                 => 'Welcome',
+    'yes'                                     => 'Yes',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($errors, $observatoire, $dates, $various);
diff --git a/src/Irstea/BdohBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccb232ea7bbded84657e545a0b3e23611c5e8f03
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,214 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$errors = [
+    'Error.notFile(%file%)'                  => "«\u{a0}%file%\u{a0}» : ce chemin n'est pas celui d'un fichier valide",
+    'Error.zip.cantCreate'                   => "Impossible de créer l'archive ZIP",
+    'Error.file.cantRead(%file%)'            => "Impossible de lire le fichier «\u{a0}%file%\u{a0}»",
+    'Error.file.cantCreate(%file%)'          => "Impossible de créer le fichier «\u{a0}%file%\u{a0}»",
+    'Error.file.chmodFailed(%file%,%mode%)'  => "Impossible d'attribuer les permissions «\u{a0}%mode%\u{a0}» au fichier «\u{a0}%file%\u{a0}»",
+    'Error.baseLessFile.cantCompile(%file%)' => "Impossible de compiler le fichier LESS de base : «\u{a0}%file%\u{a0}»",
+];
+
+/*************************************************
+ * OBSERVATOIRE
+ ************************************************/
+
+$observatoire = [
+    'Observatoire' => [
+        'selector'                     => 'Observatoires',
+        'notExist(%observatoireSlug%)' => "L'observatoire «\u{a0}%observatoireSlug%\u{a0}» n'existe pas !",
+        'cssFile.cantCreate(%file%)'   => "Impossible de créer le fichier CSS de l'observatoire : «\u{a0}%file%\u{a0}»",
+        'cssFile.cantRemove(%file%)'   => "Impossible de supprimer le fichier CSS de l'observatoire : «\u{a0}%file%\u{a0}»",
+        'Tous'                         => 'Tous les observatoires',
+    ],
+];
+
+/*************************************************
+ * ABOUT DATES
+ ************************************************/
+
+$dates = [
+    'Year'  => 'Année',
+    'Month' => 'Mois',
+    'Jan'   => 'Jan',
+    'Feb'   => 'Fév',
+    'Mar'   => 'Mar',
+    'Apr'   => 'Avr',
+    'May'   => 'Mai',
+    'Jun'   => 'Juin',
+    'Jul'   => 'Juil',
+    'Aug'   => 'Aoû',
+    'Sep'   => 'Sep',
+    'Oct'   => 'Oct',
+    'Nov'   => 'Nov',
+    'Dec'   => 'Déc',
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'account.create'                          => 'Créer un compte',
+    'account.edit'                            => 'Modifier votre compte',
+    'account.login'                           => 'Se connecter',
+    'account.logout'                          => 'Déconnexion',
+    'accueil'                                 => 'Accueil',
+    'accueilMessage'                          => "La Base de Données pour les Observatoires en Hydrologie (BDOH) a pour vocation de permettre la gestion, la bancarisation et la mise à disposition des données hydrologiques et biogéochimiques issues des observatoires de long terme gérés par ou dans lesquels est fortement impliqué Irstea (anciennement Cemagref). Il s'agit de sites expérimentaux de terrain sur lesquels sont réalisées en continu ou lors de campagnes récurrentes des mesures de pluviométrie, hauteurs d'eau et débits dans les cours d'eau, niveaux de nappes, flux de matières en suspension, concentrations en diverses substances etc. Le plus ancien observatoire fonctionne depuis 1962.\n\n" .
+        "Ces données sont utilisées à des fins scientifiques par les chercheurs d'Irstea et ses partenaires, ainsi que par la communauté opérationnelle de l'environnement publique ou privée (services de l'État, collectivités territoriales, bureaux d'études, industriels). Les données sont accessibles à tous gratuitement moyennant une inscription sur le site et le respect des conditions d'utilisation.\n\n" .
+        'Dans BDOH, les données sont naturellement organisées par Observatoires, qui sont administrés indépendamment par les unités de recherche qui en ont la charge.',
+    'accueilObservatoires'                    => 'Accueil des Observatoires',
+    'administration'                          => 'Administration',
+    'advancedSearch'                          => 'Recherche avancée',
+    'applyDates'                              => 'Exporter les dates situées',
+    'atBeginning'                             => 'en début',
+    'atEnd'                                   => 'en fin',
+    'ofMeasureRanges'                         => 'des intervalles de mesures',
+    'askDataAccess'                           => 'Demander un accès aux données',
+    'askManager'                              => 'Contacter un gestionnaire',
+    'backToHome'                              => "Retour à l'accueil",
+    'begin'                                   => 'Début',
+    'beingCanceled'                           => 'Annulation en cours',
+    'betterStartAtExistingTime'               => "Choisir «\u{a0}sur une mesure\u{a0}» aboutira habituellement à une interpolation plus précise pour ce type de chroniques",
+    'cancel'                                  => 'Annuler',
+    'captcha'                                 => 'Réécrivez le code',
+    'captcha.info'                            => 'Veuillez recopier les caractères suivants',
+    'captcha.security'                        => 'Protection anti-robots',
+    'chroniquesBox'                           => 'Boîte à chroniques',
+    'chroniquesBox(%station%)'                => "Chroniques de la station «\u{a0}%station%\u{a0}»",
+    'close'                                   => 'Fermer',
+    'contactHelp'                             => 'Aide',
+    'ContinueBox(%station%)'                  => "Chroniques continues et calculées de la station «\u{a0}%station%\u{a0}»",
+    'cumulative'                              => 'Cumul',
+    'cumulRefHour'                            => 'Heure de départ des cumuls (dans le fuseau sélectionné)',
+    'DiscontinueBox(%station%)'               => "Chroniques discontinues de la station «\u{a0}%station%\u{a0}»",
+    'dataAccess'                              => 'Consultation des données',
+    'complexViewer'                           => 'Afficher plusieurs chroniques',
+    'TextLinkToCV'                            => 'Afficher plusieurs chroniques sur la même page',
+    'date(UTC)'                               => 'Date en UTC',
+    'date.firstMeasure'                       => 'Date de première mesure',
+    'date.lastMeasure'                        => 'Date de dernière mesure',
+    'date.selectFirst'                        => "Sélectionne la date minimale de l'ensemble des chroniques listées",
+    'date.selectLast'                         => "Sélectionne la date maximale de l'ensemble des chroniques listées",
+    'date.selectFirst_empty'                  => 'Sélectionne la date minimale de la chronique',
+    'date.selectLast_empty'                   => 'Sélectionne la date maximale de la chronique',
+    'displayData'                             => 'Afficher les données',
+    'displayOnlyInPeriod'                     => "N'afficher que les chroniques ayant des mesures :",
+    'astuceDate'                              => "Astuce : La date peut s'écrire en tapant seulement les chiffres (exemple : 130495 -> 13/04/1995). Si vous écrivez 1304 l'année en cours sera ajoutée automatiquement.",
+    'selectStartEndDates'                     => 'Sélectionner les dates de début et fin',
+    'doNotSelect'                             => 'Ne pas sélectionner',
+    'downloadedRangeInTimezone'               => 'Période dans ce fuseau :',
+    'editChronique'                           => 'Éditer la chronique',
+    'editObservatoire'                        => "Éditer l'observatoire",
+    'editStation'                             => 'Éditer la station',
+    'editDataset'                             => 'Éditer le jeu de données',
+    'empty'                                   => 'N.A.',
+    'end'                                     => 'Fin',
+    'enSavoirPlus'                            => "Accéder à l'observatoire",
+    'envoialljson'                            => 'Envoyer toutes les données pour Theia/OZCAR',
+    'errors'                                  => 'Erreurs',
+    'errorsMayComeFromEncoding'               => 'Certaines erreurs peuvent se produire lorsque le fichier importé contient des caractères spéciaux (p. ex. µ).
+                                      Dans ce cas veuillez vous assurer que ce fichier est encodé en UTF-8.',
+    'existing'                                => 'Existant',
+    'existingMeasureTime'                     => 'sur une mesure',
+    'export'                                  => 'Exporter',
+    'exporter'                                => 'Exporter',
+    'exportType'                              => "Type d'export (pas de temps variable ou fixe)",
+    'exportTypeShort'                         => "Type d'export",
+    'fillings'                                => 'Remplissages',
+    'fillingRate'                             => 'Taux de remplissage',
+    'from'                                    => 'de',
+    'gaps'                                    => 'Lacunes',
+    'home'                                    => 'Accueil',
+    'home.alt'                                => 'Irstea',
+    'home.choice'                             => 'Choisissez votre observatoire',
+    'home.title'                              => "«\u{a0}Base de Données des Observatoires en Hydrologie\u{a0}»",
+    'hour(s)(utc)'                            => 'heure(s) [UTC]',
+    'IAgreeWith'                              => "J'accepte",
+    'identical'                               => "À l'identique",
+    'identification'                          => 'Caractéristiques',
+    'ignoreColumn'                            => 'Ignorer cette colonne',
+    'illustration'                            => "Photographie d'illustration",
+    'import'                                  => 'Import',
+    'import(the)'                             => "l'import",
+    'information'                             => 'Informations',
+    'instantaneous'                           => 'Instantané',
+    'loading'                                 => 'Chargement',
+    'maximum.small'                           => 'Max.',
+    'mean'                                    => 'Moyenne',
+    'measures.table'                          => 'Tableau',
+    'measures.viewer'                         => 'La visualisation',
+    'measuresNumber'                          => 'Nombre de mesures',
+    'checkpoints'                             => 'Points de contrôle',
+    'minimum.small'                           => 'Min.',
+    'minutes'                                 => 'minutes',
+    'no'                                      => 'Non',
+    'noDescription'                           => 'Pas de description disponible',
+    'noGenalogy'                              => 'Pas de généalogie disponible',
+    'none'                                    => 'N.A.',
+    'noneSmall'                               => '-',
+    'noOne'                                   => 'Aucun',
+    'none'                                    => 'Aucun',
+    'noneFeminine'                            => 'Aucune',
+    'notActive'                               => 'inactive',
+    'or'                                      => 'ou',
+    'overlap'                                 => 'Chevauchement',
+    'parametersStudied'                       => 'Paramètres étudiés',
+    'partners'                                => 'Partenaires',
+    'cgu'                                     => "Conditions d'utilisation",
+    'period'                                  => 'Période',
+    'presentation'                            => 'Présentation',
+    'reset'                                   => 'Effacer',
+    'restart'                                 => 'Recommencer',
+    'roundTime'                               => 'à une heure ronde',
+    'searchPeriod'                            => 'Période de recherche',
+    'startInterpAt'                           => "Débuter l'interpolation",
+    'submit'                                  => 'Envoyer',
+    'survolez'                                => "Survolez le nom de l'observatoire désiré",
+    'step'                                    => 'Pas de temps',
+    'TermsOfUses'                             => "Conditions d'utilisation",
+    'TermsOfUses.none'                        => "Aucune condition d'utilisation n'est définie.",
+    'TermsOfUses(the)'                        => "les conditions d'utilisation",
+    'to'                                      => 'à',
+    'toLearnMore'                             => 'Pour en savoir plus',
+    'citeWithDoi'                             => 'Pour citer ces données vous pouvez vous référer au DOI suivant :',
+    'citeWithDois'                            => 'Pour citer ces données vous pouvez vous référer aux DOI suivants :',
+    'moreAboutDoi'                            => "Plus d'informations",
+    'type'                                    => 'Type',
+    'UTC'                                     => 'UTC',
+    'UTC(in)'                                 => 'en UTC',
+    'validate'                                => 'Valider',
+    'validateurJSON'                          => 'Validation jeu de données pour Theia/OZCAR',
+    'viewer'                                  => 'La visualisation',
+    'viewChronique'                           => 'Voir la fiche de la chronique',
+    'viewStation'                             => 'Voir la fiche de la station',
+    'viewDataset'                             => 'Voir la fiche du jeu de données',
+    'viewObservatoire'                        => 'Voir cet observatoire',
+    'welcome'                                 => 'Bienvenue',
+    'yes'                                     => 'Oui',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($errors, $observatoire, $dates, $various);
diff --git a/src/Irstea/BdohBundle/Resources/translations/validators.en.php b/src/Irstea/BdohBundle/Resources/translations/validators.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec96526df6ae932ae6d2843cd6c0de97e916e429
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/validators.en.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'captcha.invalid' => 'Incorrect code rewriting.',
+];
diff --git a/src/Irstea/BdohBundle/Resources/translations/validators.fr.php b/src/Irstea/BdohBundle/Resources/translations/validators.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..3629eaad88de02d58ae6ec5c98ff2e0e1f9a7b07
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/translations/validators.fr.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'captcha.invalid' => 'Mauvaise réécriture du code.',
+];
diff --git a/src/Irstea/BdohBundle/Resources/views/Core/home.html.twig b/src/Irstea/BdohBundle/Resources/views/Core/home.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8bcfee3652bbe52b7502bc099e2ac3cd35990696
--- /dev/null
+++ b/src/Irstea/BdohBundle/Resources/views/Core/home.html.twig
@@ -0,0 +1,69 @@
+{% extends '::layout.html.twig' %}
+{% from '::macros.html.twig' import i18nEntityLabel, doi_list, logo, logoObservatoire %}
+
+{% block title %}{{ 'accueilObservatoires'|trans }}{% endblock title %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/home.js') }}"></script>
+{% endblock javascripts %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/home.css') }}"/>
+{% endblock stylesheets %}
+
+{% block main %}
+    <h1>{{ 'home.title'|trans }}</h1>
+
+    <div>
+        <ul class="nav nav-tabs tabs-left col-md-6">
+            <li class="active" href="#accueil" data-hover-tab="true">
+                <a href="#">{{ 'presentation'|trans }}</a>
+            </li>
+            {% for obs in allObservatoires() %}
+                <li href="#{{ obs.slug }}" data-hover-tab="true">
+                    <a href="{{ path('bdoh_home', {'_observatoire' : obs.slug}) }}">{{ obs.nom }}</a>
+                </li>
+            {% endfor %}
+        </ul>
+        <div class="tab-content col-md-18">
+            <div class="tab-pane active" id="accueil">
+                <div class="row" style="margin:0 10px">
+                    <div class="col-md-16">
+                        <h1>{{ 'presentation'|trans }}</h1>
+                        <div>
+                            {{ 'accueilMessage'|trans|replace({"\n": "<br />"})|raw }}
+                        </div><!--
+                        <div class="alert alert-info" style="text-align:center;margin:25px 0 0;padding:5px;">
+                            {{ 'survolez'|trans }}
+                        </div>-->
+                    </div>
+                    <div class="col-md-8 text-center pull-right">
+                        {{ logo('Irstea', logo_short_link_parameters) }}
+                    </div>
+                </div>
+            </div>
+
+            {% for obs in allObservatoires() %}
+                <div class="tab-pane centPC" id="{{ obs.slug }}">
+                    <div class="row" style="margin:0 10px">
+                        <div class="col-md-18">
+                            <h1>{{ obs.nom }}</h1>
+                            <div class="description">
+                                {{ i18nEntityLabel(obs, 'description', 'noDescription') }}
+                                {{ doi_list(obs.dois) }}
+                            </div>
+                        </div>
+                        <div class="col-md-6 text-center pull-right">
+                            <p>{{ logoObservatoire(obs) }}</p>
+                            <a class="btn btn-success" href="{{ path('bdoh_home', {'_observatoire' : obs.slug}) }}">
+                                {{ 'enSavoirPlus'|trans }}
+                            </a>
+                        </div>
+                    </div>
+                </div>
+            {% endfor %}
+        </div>
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTimeMsTransformerTest.php b/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTimeMsTransformerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8056b065e2393406093bee98162bac447cc0cc2b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTimeMsTransformerTest.php
@@ -0,0 +1,195 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Tests\DataTransformer;
+
+use Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer as ToDateTimeMs;
+
+/**
+ * Class ToDateTimeMsTransformerTest.
+ *
+ * @group unit
+ */
+class ToDateTimeMsTransformerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider validDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varDateTimeMs
+     *
+     * @param mixed $validDateTimeMs
+     * @param mixed $dateTimeMs
+     */
+    public function testValidDatetimemsAreTransformed($validDateTimeMs, $dateTimeMs)
+    {
+        $this->assertEquals($dateTimeMs, ToDateTimeMs::varDateTimeMs($validDateTimeMs));
+    }
+
+    public function validDatetimemsProvider()
+    {
+        return [
+            ['2004-10-15', '2004-10-15 00:00:00.000'], // a date
+            ['2004-10-15 1', '2004-10-15 01:00:00.000'], // a datetime with just hours (once digit)
+            ['2004-10-15 12', '2004-10-15 12:00:00.000'], // a datetime with just hours
+            ['2004-10-15 12:37', '2004-10-15 12:37:00.000'], // a datetime without seconds
+            ['2004-10-15 12:37:42', '2004-10-15 12:37:42.000'], // a datetime without milliseconds
+            ['2004-10-15 12:37:42.543', '2004-10-15 12:37:42.543'], // a datetime with milliseconds
+            ['  2004-10-15 12:37:42.543', '2004-10-15 12:37:42.543'], // left spaces
+            ['2004-10-15 12:37:42.543  ', '2004-10-15 12:37:42.543'], // right spaces
+            ['2004-10-15      12:37:42.543', '2004-10-15 12:37:42.543'], // middle spaces
+            ['  2004-10-15    12:37:42.543  ', '2004-10-15 12:37:42.543'], // spaces on all sides
+        ];
+    }
+
+    /**
+     * @dataProvider invalidDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varDateTimeMs
+     *
+     * @param mixed $invalidDateTimeMs
+     */
+    public function testInvalidDatetimemsReturnFalse($invalidDateTimeMs)
+    {
+        $this->assertFalse(ToDateTimeMs::varDateTimeMs($invalidDateTimeMs), "$invalidDateTimeMs is invalid");
+    }
+
+    public function invalidDatetimemsProvider()
+    {
+        return [
+            ['2004/10/15 12:37:42.543'],   // bad date
+            ['2004-10-15 25'],             // bad time with just hours
+            ['2004-10-15 12:61'],          // bad time without seconds
+            ['2004-10-15 12:37:ii'],       // bad time without milliseconds
+            ['2004-10-15 12:37:42.aei'],   // bad time with milliseconds
+            ['2004-10-15...12:37:42.543'], // bad delimiter beetwen date and time
+            ['04-10-15 12:37:42.543'],     // bad date length
+            ['2004-10-15 12:37:42.54'],    // bad milliseconds length
+        ];
+    }
+
+    /**
+     * @dataProvider validFrenchDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varFrenchDateTimeMs
+     *
+     * @param mixed $validFrenchDateTimeMs
+     * @param mixed $dateTimeMs
+     */
+    public function testValidFrenchDatetimemsAreTransformed($validFrenchDateTimeMs, $dateTimeMs)
+    {
+        $this->assertEquals($dateTimeMs, ToDateTimeMs::varFrenchDateTimeMs($validFrenchDateTimeMs));
+    }
+
+    public function validFrenchDatetimemsProvider()
+    {
+        return [
+            ['15/10/2004', '2004-10-15 00:00:00.000'], // a date
+            ['15/10/2004 1', '2004-10-15 01:00:00.000'], // a datetime with just hours (once digit)
+            ['15/10/2004 12', '2004-10-15 12:00:00.000'], // a datetime with just hours
+            ['15/10/2004 12:37', '2004-10-15 12:37:00.000'], // a datetime without seconds
+            ['15/10/2004 12:37:42', '2004-10-15 12:37:42.000'], // a datetime without milliseconds
+            ['15/10/2004 12:37:42.543', '2004-10-15 12:37:42.543'], // a complete datetime
+            ['5/10/2004 12:37:42.543', '2004-10-05 12:37:42.543'], // a complete datetime with date format = d/MM/YYYY
+            ['  15/10/2004 12:37:42.543', '2004-10-15 12:37:42.543'], // left spaces
+            ['15/10/2004 12:37:42.543  ', '2004-10-15 12:37:42.543'], // right spaces
+            ['15/10/2004      12:37:42.543', '2004-10-15 12:37:42.543'], // middle spaces
+            ['  15/10/2004    12:37:42.543  ', '2004-10-15 12:37:42.543'], // spaces on all sides
+        ];
+    }
+
+    /**
+     * @dataProvider invalidFrenchDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varFrenchDateTimeMs
+     *
+     * @param mixed $invalidFrenchDateTimeMs
+     */
+    public function testInvalidFrenchDatetimemsReturnFalse($invalidFrenchDateTimeMs)
+    {
+        $this->assertFalse(ToDateTimeMs::varFrenchDateTimeMs($invalidFrenchDateTimeMs));
+    }
+
+    public function invalidFrenchDatetimemsProvider()
+    {
+        return [
+            ['15/10/04 12:37:42.543'],     // bad date length
+            ['15/10/2004 25'],             // bad time with just hours
+            ['15/10/2004 12:61'],          // bad time without seconds
+            ['15/10/2004 12:37:ii'],       // bad time without milliseconds
+            ['15/10/2004 12:37:42.aei'],   // bad time with milliseconds
+            ['15/10/2004...12:37:42.543'], // bad delimiter beetwen date and time
+            ['15/10/2004 12:37:42.54'],    // bad milliseconds length
+        ];
+    }
+
+    /**
+     * @dataProvider validShortFrenchDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varShortFrenchDateTimeMs
+     *
+     * @param mixed $validShortFrenchDateTimeMs
+     * @param mixed $dateTimeMs
+     */
+    public function testValidShortFrenchDatetimemsAreTransformed($validShortFrenchDateTimeMs, $dateTimeMs)
+    {
+        $this->assertEquals($dateTimeMs, ToDateTimeMs::varShortFrenchDateTimeMs($validShortFrenchDateTimeMs));
+    }
+
+    public function validShortFrenchDatetimemsProvider()
+    {
+        return [
+            ['15/10/04', '2004-10-15 00:00:00.000'], // a date
+            ['15/10/61', '1961-10-15 00:00:00.000'], // a date
+            ['15/10/04 1', '2004-10-15 01:00:00.000'], // a datetime with just hours (once digit)
+            ['15/10/04 12', '2004-10-15 12:00:00.000'], // a datetime with just hours
+            ['15/10/04 12:37', '2004-10-15 12:37:00.000'], // a datetime without seconds
+            ['15/10/04 12:37:42', '2004-10-15 12:37:42.000'], // a datetime without milliseconds
+            ['15/10/04 12:37:42.543', '2004-10-15 12:37:42.543'], // a complete datetime
+            ['5/10/04 12:37:42.543', '2004-10-05 12:37:42.543'], // a complete datetime with date format = d/MM/YYYY
+            ['  15/10/04 12:37:42.543', '2004-10-15 12:37:42.543'], // left spaces
+            ['15/10/04 12:37:42.543  ', '2004-10-15 12:37:42.543'], // right spaces
+            ['15/10/04      12:37:42.543', '2004-10-15 12:37:42.543'], // middle spaces
+            ['  15/10/04    12:37:42.543  ', '2004-10-15 12:37:42.543'], // spaces on all sides
+        ];
+    }
+
+    /**
+     * @dataProvider invalidShortFrenchDatetimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTimeMsTransformer::varShortFrenchDateTimeMs
+     *
+     * @param mixed $invalidShortFrenchDateTimeMs
+     */
+    public function testInvalidShortFrenchDatetimemsReturnFalse($invalidShortFrenchDateTimeMs)
+    {
+        $this->assertFalse(
+            ToDateTimeMs::varShortFrenchDateTimeMs($invalidShortFrenchDateTimeMs),
+            "$invalidShortFrenchDateTimeMs is invalid"
+        );
+    }
+
+    public function invalidShortFrenchDatetimemsProvider()
+    {
+        return [
+            ['15/10/2004 12:37:42.543'], // bad date length
+            ['15/10/04 25'],             // bad time with just hours
+            ['15/10/04 12:61'],          // bad time without seconds
+            ['15/10/04 12:37:ii'],       // bad time without milliseconds
+            ['15/10/04 12:37:42.aei'],   // bad time with milliseconds
+            ['15/10/04...12:37:42.543'], // bad delimiter beetwen date and time
+            ['15/10/04 12:37:42.54'],    // bad milliseconds length
+        ];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTransformerTest.php b/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTransformerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fbea307407467d87896b78ccce8744e6415993b
--- /dev/null
+++ b/src/Irstea/BdohBundle/Tests/DataTransformer/ToDateTransformerTest.php
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Tests\DataTransformer;
+
+use Irstea\BdohBundle\DataTransformer\ToDateTransformer as ToDate;
+
+/**
+ * Class ToDateTransformerTest.
+ *
+ * @group unit
+ */
+class ToDateTransformerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToDateTransformer::checkSplitDate
+     */
+    public function testValidDatesForChecksplitdateFunctionReturnTrue()
+    {
+        $this->assertTrue(ToDate::checkSplitDate('2004', '10', '15', '-', '-'));       // default delimiter
+        $this->assertTrue(ToDate::checkSplitDate('2004', '10', '15', '/', '/', '/'));  // customized delimiter
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToDateTransformer::checkSplitDate
+     */
+    public function testInvalidDatesForChecksplitdateFunctionReturnFalse()
+    {
+        $this->assertFalse(ToDate::checkSplitDate('2oo4', '10', '15', '-', '-'));      // year not numeric
+        $this->assertFalse(ToDate::checkSplitDate('2004', 'io', '15', '-', '-'));      // month not numeric
+        $this->assertFalse(ToDate::checkSplitDate('2004', '10', 'iS', '-', '-'));      // day not numeric
+        $this->assertFalse(ToDate::checkSplitDate('2004', '10', '15', '/', '-'));      // bad year delimiter
+        $this->assertFalse(ToDate::checkSplitDate('2004', '10', '15', '-', '/'));      // bad month delimiter
+        $this->assertFalse(ToDate::checkSplitDate('2004', '10', '15', '-', '-', '/')); // bad both delimiter
+        $this->assertFalse(ToDate::checkSplitDate('-200', '10', '15', '-', '-'));      // bad Gregorian year
+        $this->assertFalse(ToDate::checkSplitDate('2004', '99', '15', '-', '-'));      // bad Gregorian month
+        $this->assertFalse(ToDate::checkSplitDate('2004', '10', '99', '-', '-'));      // bad Gregorian day
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToDateTransformer::date
+     */
+    public function testValidDatesAreTransformed()
+    {
+        $this->assertEquals('2004-10-04', ToDate::date('2004-10-04'));
+    }
+
+    /**
+     * @dataProvider invalidDatesProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTransformer::date
+     *
+     * @param mixed $invalidDate
+     */
+    public function testInvalidDatesReturnFalse($invalidDate)
+    {
+        $this->assertFalse(ToDate::date($invalidDate));
+    }
+
+    public function invalidDatesProvider()
+    {
+        return [
+            ['2005-10-15 05:08:00.777'],
+            ['04-10-15'],               // bad string lengths
+            ['2oo4-10-15'],
+            ['2004-io-15'],
+            ['2004-10-iS'],     // year, month, day not numeric
+            ['2004/10/15'],
+            ['2004-10/15'],
+            ['2004/10-15'],     // bad delimiters
+            ['  2004-10-15  '],                                           // spaces surrounds date
+            ['2004 -10-15'],
+            ['2004- 10-15'],
+            ['2004 - 10-15'], // spaces beetwen day and month
+        ];
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToDateTransformer::frenchDate
+     */
+    public function testValidFrenchDatesAreTransformed()
+    {
+        $this->assertEquals('2004-10-05', ToDate::frenchDate('5/10/2004'));  // Format D/MM/YYYY
+        $this->assertEquals('2004-10-05', ToDate::frenchDate('05/10/2004')); // Format DD/MM/YYYY
+    }
+
+    /**
+     * @dataProvider invalidFrenchDatesProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTransformer::frenchDate
+     *
+     * @param mixed $invalidFrenchDate
+     */
+    public function testInvalidFrenchDatesReturnFalse($invalidFrenchDate)
+    {
+        $this->assertFalse(ToDate::frenchDate($invalidFrenchDate));
+    }
+
+    public function invalidFrenchDatesProvider()
+    {
+        return [
+            ['15/10/2004 05:08:00.777'],
+            ['15/10/04'],               // bad string lengths
+            ['15/10/204'],
+            ['5/1000/204'],                           // bad dates
+            ['iS/10/2004'],
+            ['15/io/2004'],
+            ['15/10/2oo4'],     // year, month, day not numeric
+            ['15-10-2004'],
+            ['15-10/2004'],
+            ['15/10-2004'],     // bad delimiters
+            ['2004/10/15'],                                               // year and day swapped
+            ['  15/10/2004  '],                                           // spaces surrounds date
+            ['15 /10/2004'],
+            ['15/ 10/2004'],
+            ['15 / 10/2004'], // spaces beetwen day and month
+        ];
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToDateTransformer::shortFrenchDate
+     */
+    public function testValidShortFrenchDatesAreTransformed()
+    {
+        $this->assertEquals('2004-10-05', ToDate::shortFrenchDate('5/10/04'));
+        $this->assertEquals('1961-10-05', ToDate::shortFrenchDate('5/10/61'));
+        $this->assertEquals('2004-10-05', ToDate::shortFrenchDate('05/10/04'));
+        $this->assertEquals('1961-10-05', ToDate::shortFrenchDate('05/10/61'));
+    }
+
+    /**
+     * @dataProvider invalidShortFrenchDatesProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToDateTransformer::frenchDate
+     *
+     * @param mixed $invalidShortFrenchDate
+     */
+    public function testInvalidShortFrenchDatesReturnFalse($invalidShortFrenchDate)
+    {
+        $this->assertFalse(ToDate::shortFrenchDate($invalidShortFrenchDate));
+    }
+
+    public function invalidShortFrenchDatesProvider()
+    {
+        return [
+            ['5/10/4'],
+            ['15/10/2004'],                        // bad string lengths
+            ['15/10/4'],
+            ['5/100/4'],                          // bad dates
+            ['iS/10/04'],
+            ['15/io/04'],
+            ['15/10/o4'],     // year, month, day not numeric
+            ['15-10-04'],
+            ['15-10/04'],
+            ['15/10-04'],     // bad delimiters
+            ['  15/10/04  '],                                       // spaces surrounds date
+            ['15 /10/04'],
+            ['15/ 10/04'],
+            ['15 / 10/04'], // spaces beetwen day and month
+        ];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Tests/DataTransformer/ToTimeMsTransformerTest.php b/src/Irstea/BdohBundle/Tests/DataTransformer/ToTimeMsTransformerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..414498ed109933fcb44097a1fd2c323db6f73a34
--- /dev/null
+++ b/src/Irstea/BdohBundle/Tests/DataTransformer/ToTimeMsTransformerTest.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Tests\DataTransformer;
+
+use Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer as ToTimeMs;
+
+/**
+ * Class ToTimeMsTransformerTest.
+ *
+ * @group unit
+ */
+class ToTimeMsTransformerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::checkTimeJustHours
+     */
+    public function testChecktimejusthoursFunctionWorksFine()
+    {
+        $this->assertTrue(ToTimeMs::checkTimeJustHours('04'));
+        $this->assertTrue(ToTimeMs::checkTimeJustHours('14'));
+        $this->assertTrue(ToTimeMs::checkTimeJustHours('23'));
+        $this->assertTrue(ToTimeMs::checkTimeJustHours('24'));
+
+        $this->assertFalse(ToTimeMs::checkTimeJustHours('a1'));
+        $this->assertFalse(ToTimeMs::checkTimeJustHours('0a'));
+        $this->assertFalse(ToTimeMs::checkTimeJustHours('2c'));
+        $this->assertFalse(ToTimeMs::checkTimeJustHours('29'));
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::checkTimeWithoutSeconds
+     */
+    public function testChecktimewithoutsecondsFunctionWorksFine()
+    {
+        $this->assertTrue(ToTimeMs::checkTimeWithoutSeconds('15:00'));
+        $this->assertTrue(ToTimeMs::checkTimeWithoutSeconds('15:59'));
+        $this->assertTrue(ToTimeMs::checkTimeWithoutSeconds('24:00'));
+
+        $this->assertFalse(ToTimeMs::checkTimeWithoutSeconds('15/10'));
+        $this->assertFalse(ToTimeMs::checkTimeWithoutSeconds('15:60'));
+        $this->assertFalse(ToTimeMs::checkTimeWithoutSeconds('15:99'));
+        $this->assertFalse(ToTimeMs::checkTimeWithoutSeconds('15:a5'));
+        $this->assertFalse(ToTimeMs::checkTimeWithoutSeconds('15:5a'));
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::checkTime
+     */
+    public function testChecktimeFunctionWorksFine()
+    {
+        $this->assertTrue(ToTimeMs::checkTime('15:00:00'));
+        $this->assertTrue(ToTimeMs::checkTime('15:59:59'));
+        $this->assertTrue(ToTimeMs::checkTime('24:00:00'));
+
+        $this->assertFalse(ToTimeMs::checkTime('15:00/10'));
+        $this->assertFalse(ToTimeMs::checkTime('15:00:60'));
+        $this->assertFalse(ToTimeMs::checkTime('15:00:99'));
+        $this->assertFalse(ToTimeMs::checkTime('15:00:a5'));
+        $this->assertFalse(ToTimeMs::checkTime('15:00:5a'));
+        $this->assertFalse(ToTimeMs::checkTime('15:60:00')); // bad minutes
+    }
+
+    /**
+     * @covers \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::checkTimeMs
+     */
+    public function testChecktimemsFunctionWorksFine()
+    {
+        $this->assertTrue(ToTimeMs::checkTimeMs('12:45:37.123'));
+        $this->assertTrue(ToTimeMs::checkTimeMs('24:45:37.124'));
+
+        $this->assertFalse(ToTimeMs::checkTimeMs('12:45:37:123'));   // bad delimiter
+        $this->assertFalse(ToTimeMs::checkTimeMs('12:45:37.aei'));   // milliseconds not numeric
+        $this->assertFalse(ToTimeMs::checkTimeMs('12:45:60.123'));   // bad seconds
+        $this->assertFalse(ToTimeMs::checkTimeMs('12:60:37.123'));   // bad minutes
+    }
+
+    /**
+     * @dataProvider validTimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::varTimeMs
+     *
+     * @param mixed $validTimeMs
+     * @param mixed $timeMs
+     */
+    public function testValidTimemsAreTransformed($validTimeMs, $timeMs)
+    {
+        $this->assertEquals($timeMs, ToTimeMs::varTimeMs($validTimeMs));
+    }
+
+    public function validTimemsProvider()
+    {
+        return [
+            ['15', '15:00:00.000'], // a TimeMs with just hours
+            ['15:10', '15:10:00.000'], // a TimeMs without seconds
+            ['15:10:04', '15:10:04.000'], // a TimeMs without milliseconds
+            ['15:10:04.666', '15:10:04.666'], // a complete TimeMs
+            ['  15:10:04.666  ', '15:10:04.666'], // spaces surrounds time
+            ['5', '05:00:00.000'], // once digit for hours
+            ['5:10', '05:10:00.000'], // once digit for hours
+            ['5:10:04', '05:10:04.000'], // once digit for hours
+            ['5:10:04.666', '05:10:04.666'], // once digit for hours
+        ];
+    }
+
+    /**
+     * @dataProvider invalidTimemsProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToTimeMsTransformer::varTimeMs
+     *
+     * @param mixed $invalidTimeMs
+     */
+    public function testInvalidTimemsReturnFalse($invalidTimeMs)
+    {
+        $this->assertFalse(ToTimeMs::varTimeMs($invalidTimeMs), "$invalidTimeMs is invalid");
+    }
+
+    public function invalidTimemsProvider()
+    {
+        return [
+            ['15:10:04.6665'],
+            ['15:10:04.'],
+            ['15:10:'],
+            ['15:'], // bad length
+            ['15:60'],        // bad minutes
+            ['15:10:60'],     // bad seconds
+            ['15:10:04.aaa'], // milliseconds not numeric
+        ];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Tests/DataTransformer/ToUtcDiffTransformerTest.php b/src/Irstea/BdohBundle/Tests/DataTransformer/ToUtcDiffTransformerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec520cd75f7dcdf360b81b86d9bcf93936d051a7
--- /dev/null
+++ b/src/Irstea/BdohBundle/Tests/DataTransformer/ToUtcDiffTransformerTest.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Tests\DataTransformer;
+
+use Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer;
+
+/**
+ * Class ToUtcDiffTransformerTest.
+ *
+ * @group unit
+ */
+class ToUtcDiffTransformerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider validUtcDiffTimezonesProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer::utcDiff
+     *
+     * @param mixed $validUtcDiffTz
+     * @param mixed $utcDiffTimezone
+     */
+    public function testValidUtcDiffTimezonesAreTransformed($validUtcDiffTz, $utcDiffTimezone)
+    {
+        $this->assertEquals($utcDiffTimezone, ToUtcDiffTransformer::utcDiff($validUtcDiffTz));
+    }
+
+    public function validUtcDiffTimezonesProvider()
+    {
+        return [
+            ['+00:00', '+00:00'], // Plus
+            ['-12:45', '-12:45'], // Minus
+            ['  +00:00  ', '+00:00'], // Spaces on left and right sides
+            ['-12:13', '-12:13'], // Semi-consistent timezone
+        ];
+    }
+
+    /**
+     * @dataProvider invalidUtcDiffTimezonesProvider
+     * @covers       \Irstea\BdohBundle\DataTransformer\ToUtcDiffTransformer::utcDiff
+     *
+     * @param mixed $invalidUtcDiffTz
+     */
+    public function testInvalidUtcDiffTimezonesReturnFalse($invalidUtcDiffTz)
+    {
+        $this->assertFalse(ToUtcDiffTransformer::utcDiff($invalidUtcDiffTz));
+    }
+
+    public function invalidUtcDiffTimezonesProvider()
+    {
+        return [
+            ['00:00'],
+            ['+0000'],
+            ['0000'],                      // bad string lengths
+            ['~00:00'],
+            ['+00/00'],                                   // bad sign or delimiter
+            ['+20:00'],
+            ['+15:00'],
+            ['+00:60'],                  // inconsistent hours or minutes
+            ['+a0:00'],
+            ['+2o:00'],
+            ['+20:o0'],
+            ['+20:0o'], // not digit
+        ];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Tests/ORMTestCase.php b/src/Irstea/BdohBundle/Tests/ORMTestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..9cd36aa68664b35786f57a9ef633c746b63f1494
--- /dev/null
+++ b/src/Irstea/BdohBundle/Tests/ORMTestCase.php
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Tests;
+
+use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
+use Doctrine\Common\DataFixtures\Purger\ORMPurger;
+use Doctrine\DBAL\Schema\SchemaException;
+use Doctrine\ORM\Tools\SchemaTool;
+use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader;
+use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * @group database
+ */
+class ORMTestCase extends WebTestCase
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected static $container;
+
+    /**
+     * Le gestionnaire d'entité.
+     *
+     * @var \Doctrine\ORM\EntityManager
+     */
+    protected static $entityManager;
+
+    /**
+     * Les fixtures à charger;
+     *data.
+     *
+     * @var array
+     */
+    protected static $ormFixtures;
+
+    /**
+     * Charge le kernel, l'entityManager et prépare le chargement des fixtures.
+     */
+    public static function setUpBeforeClass()
+    {
+        parent::setUpBeforeClass();
+
+        self::$kernel = static::createKernel();
+        self::$kernel->boot();
+        self::$container = self::$kernel->getContainer();
+        self::$entityManager = self::$container->get('doctrine.orm.entity_manager');
+        // static::generateSchema();
+        self::$ormFixtures = static::prepareFixtures();
+    }
+
+    public function getContainer()
+    {
+        return self::$container;
+    }
+
+    public function get($id)
+    {
+        return self::$container->get($id);
+    }
+
+    protected static function prepareFixtures()
+    {
+        $paths = [];
+        foreach (self::$kernel->getBundles() as $bundle) {
+            if (is_dir($bundle->getPath() . '/DataFixtures/ORM')) {
+                $paths[] = $bundle->getPath() . '/DataFixtures/ORM';
+            }
+        }
+
+        $loader = new ContainerAwareLoader(self::$container);
+        foreach ($paths as $path) {
+            $loader->loadFromDirectory($path);
+        }
+
+        return $loader->getFixtures();
+    }
+
+    public function setUp()
+    {
+        parent::setUp();
+        $this->loadFixtures(self::$ormFixtures);
+    }
+
+    protected function loadFixtures($fixtures)
+    {
+        $purger = new ORMPurger(self::$entityManager);
+        $purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);
+        $executor = new ORMExecutor(self::$entityManager, $purger);
+        $executor->execute($fixtures);
+    }
+
+    /**
+     * Génére le schéma.
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    protected static function generateSchema()
+    {
+        // Get the metadatas of the application to create the schema.
+        $metadatas = static::getMetadatas();
+
+        if (!empty($metadatas)) {
+            // Create SchemaTool
+            $tool = new SchemaTool(static::$entityManager);
+            $tool->createSchema($metadatas);
+        } else {
+            throw new SchemaException('No Metadata Classes to process.');
+        }
+    }
+
+    /**
+     * Overwrite this method to get specific metadatas.
+     *
+     * @return array
+     */
+    protected static function getMetadatas()
+    {
+        return self::$entityManager->getMetadataFactory()->getAllMetadata();
+    }
+}
diff --git a/src/Irstea/BdohBundle/Twig/BdohExtension.php b/src/Irstea/BdohBundle/Twig/BdohExtension.php
new file mode 100644
index 0000000000000000000000000000000000000000..5481f3cafd9d8de219268d6a28d3e0f4395da9d7
--- /dev/null
+++ b/src/Irstea/BdohBundle/Twig/BdohExtension.php
@@ -0,0 +1,132 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Twig;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Irstea\BdohBundle\Manager\CssManager;
+use Irstea\BdohBundle\Manager\ObservatoireManagerInterface;
+use Irstea\BdohBundle\Util\DurationFormater;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Twig\Extension\AbstractExtension;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+
+/**
+ * Twig extension for Bdoh.
+ */
+class BdohExtension extends AbstractExtension
+{
+    /**
+     * @var EntityManagerInterface
+     */
+    protected $em;
+
+    /**
+     * @var ObservatoireManagerInterface
+     */
+    protected $manager;
+
+    /**
+     * @var CssManager
+     */
+    protected $cssManager;
+
+    /**
+     * @var DurationFormater
+     */
+    protected $durationFormater;
+
+    /**
+     * @param EntityManagerInterface       $em
+     * @param ObservatoireManagerInterface $manager
+     * @param CssManager                   $cssManager
+     * @param DurationFormater             $durationFormater
+     */
+    public function __construct(
+        EntityManagerInterface $em,
+        ObservatoireManagerInterface $manager,
+        CssManager $cssManager,
+        DurationFormater $durationFormater
+    ) {
+        $this->em = $em;
+        $this->manager = $manager;
+        $this->cssManager = $cssManager;
+        $this->durationFormater = $durationFormater;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'BdohExtension';
+    }
+
+    /**
+     * @return TwigFunction[]
+     */
+    public function getFunctions()
+    {
+        return [
+            'round'               => new TwigFunction('round', 'round'),
+            'themeCssFile'        => new TwigFunction('themeCssFile', [$this, 'getThemeCssFile']),
+            'currentObservatoire' => new TwigFunction('currentObservatoire', [$this->manager, 'getCurrent']),
+            'allObservatoires'    => new TwigFunction('allObservatoires', [$this, 'getAllObservatoires']),
+        ];
+    }
+
+    /**
+     * @return TwigFilter[]
+     */
+    public function getFilters()
+    {
+        return [
+            'durationFormat' => new TwigFilter('durationFormat', [$this->durationFormater, 'format']),
+        ];
+    }
+
+    /**
+     * @return Observatoire[]
+     */
+    public function getAllObservatoires()
+    {
+        try {
+            return $this->em->getRepository(Observatoire::class)->findAll();
+        } catch (\Exception $ex) {
+            return [];
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getThemeCssFile()
+    {
+        try {
+            $observatoire = $this->manager->getCurrent();
+
+            return $this->cssManager->getObservatoireCssFile($observatoire);
+        } catch (\Exception $ex) {
+            return '';
+        }
+    }
+}
diff --git a/src/Irstea/BdohBundle/Util/DateTimeUtil.php b/src/Irstea/BdohBundle/Util/DateTimeUtil.php
new file mode 100644
index 0000000000000000000000000000000000000000..3749e848533f949345c6db1b25e89b09a5fd6830
--- /dev/null
+++ b/src/Irstea/BdohBundle/Util/DateTimeUtil.php
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Util;
+
+/**
+ * Utilities class for getting data from dates.
+ */
+class DateTimeUtil
+{
+    /**
+     * Formats a SQL datetime, in localized manner.
+     *
+     * @param string     $dateTime   SQL date
+     * @param mixed      $datetime
+     * @param mixed      $dateFormat
+     * @param mixed      $timeFormat
+     * @param mixed|null $locale
+     *
+     * @return string
+     */
+    public static function localizedDate($datetime, $dateFormat = 'medium', $timeFormat = 'medium', $locale = null)
+    {
+        $formatValues = [
+            'none'   => \IntlDateFormatter::NONE,
+            'short'  => \IntlDateFormatter::SHORT,
+            'medium' => \IntlDateFormatter::MEDIUM,
+            'long'   => \IntlDateFormatter::LONG,
+            'full'   => \IntlDateFormatter::FULL,
+        ];
+
+        $formatter = \IntlDateFormatter::create(
+            $locale !== null ? $locale : \Locale::getDefault(),
+            $formatValues[$dateFormat],
+            $formatValues[$timeFormat],
+            \date_default_timezone_get()
+        );
+
+        $datetime = new \DateTime($datetime);
+
+        return $formatter->format($datetime->getTimestamp());
+    }
+
+    /**
+     * Returns the Unix timestamp + milliseconds, from $dateTime.
+     *
+     * @param string $dateTime SQL date
+     *
+     * @return float
+     */
+    public static function toSeconds($dateTime)
+    {
+        // Retrieves the milliseconds
+        strtok($dateTime, '.');
+        $milliseconds = strtok('');
+
+        $date = new \DateTime($dateTime);
+
+        return $milliseconds ? ($date->format('U') + $milliseconds / 1000) : $date->format('U');
+    }
+
+    /**
+     * Returns the first day of current month of given DateTime.
+     *
+     * @param DateTime $date
+     */
+    public static function getFirstDayOfCurrentMonth(\DateTime $datetime)
+    {
+        $newDatetime = clone $datetime;
+        $newDatetime->setDate($datetime->format('Y'), $datetime->format('m'), 1);
+        $newDatetime->setTime(0, 0, 0);
+
+        return $newDatetime;
+    }
+
+    /**
+     * Returns the last day of current month of given DateTime.
+     *
+     * @param DateTime $date
+     */
+    public static function getLastDayOfCurrentMonth(\DateTime $datetime)
+    {
+        $newDatetime = clone $datetime;
+
+        // First, we put it at first day of *next* month
+        if ($datetime->format('m') !== 12) {
+            $newDatetime->setDate($datetime->format('Y'), $datetime->format('m') + 1, 1);
+        } else {
+            $newDatetime->setDate($datetime->format('Y') + 1, 1, 1);
+        }
+        $newDatetime->setTime(0, 0, 0);
+
+        // Then, we substract one second ; should be last second of previous month, as intended
+        $newDatetime->modify('-1 second');
+
+        return $newDatetime;
+    }
+
+    public static function dateValidationAndString($date, $toString = true)
+    {
+        // If $date is null or empty, create new DateTime
+        if (!$date) {
+            $date = new \DateTime();
+        }
+
+        // If $date is a string, try creating a DateTime with it
+        if (\is_string($date)) {
+            try {
+                $date = new \DateTime($date);
+            } catch (\Exception $e) {
+                $date = null;
+            }
+        }
+
+        // By now, $date should be a DateTime
+        $valid = $date && ($date instanceof \DateTime);
+
+        // If so, returned date is $date as DateTime or string. Otherwise, it is null.
+        if ($toString && $valid) {
+            $date = $date->format('Y-m-d H:i:s');
+        }
+
+        return [$valid, $valid ? $date : null];
+    }
+}
diff --git a/src/Irstea/BdohBundle/Util/DurationFormater.php b/src/Irstea/BdohBundle/Util/DurationFormater.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c3cd458480ef095bfffdfc3bf9d3b70b9237290
--- /dev/null
+++ b/src/Irstea/BdohBundle/Util/DurationFormater.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Util;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class DurationFormater.
+ */
+class DurationFormater
+{
+    /**
+     * @var TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * DurationFormater constructor.
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    /**
+     * @param int $duration
+     *
+     * @return string
+     */
+    public function format(int $duration): string
+    {
+        $times = [
+            'jour'    => 86400,
+            'heure'   => 3600,
+            'minute'  => 60,
+            'seconde' => 1,
+        ];
+
+        $text = '';
+
+        foreach ($times as $label => $time) {
+            if ($text !== '') {
+                $text .= ' ';
+            }
+            if ($duration >= $time) {
+                $nb = intdiv($duration, $time);
+                $duration %= $time;
+                $text .= $nb . ' ' . $this->translator->transChoice($label, $nb);
+            }
+        }
+
+        return trim($text);
+    }
+}
diff --git a/src/Irstea/BdohBundle/Util/HttpFileResponse.php b/src/Irstea/BdohBundle/Util/HttpFileResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..976f92041cf01e8809e4ca43f7167c4a6d2d42b7
--- /dev/null
+++ b/src/Irstea/BdohBundle/Util/HttpFileResponse.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Util;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * This class offers some helpers to send file via Http protocol.
+ */
+class HttpFileResponse extends Response
+{
+    protected $filePath;
+
+    protected $removeFile;
+
+    /**
+     * Constructor.
+     *
+     * @param string $filePath    Path of the file to send
+     * @param string $contentType The file content type
+     * @param bool   $removeFile  If true, the file will be removed after sending
+     */
+    public function __construct($filePath, $contentType, $removeFile = false)
+    {
+        parent::__construct(
+            '',
+            200,
+            [
+                'Content-Type'        => $contentType,
+                'Content-Disposition' => 'attachement; filename="' . basename($filePath) . '"',
+            ]
+        );
+
+        $this->setFilePath($filePath);
+
+        $this->removeFile = $removeFile;
+    }
+
+    /**
+     * Shortcut of send() method.
+     */
+    public function __toString()
+    {
+        $this->send();
+
+        return '';
+    }
+
+    /**
+     * Sends the file content for the current web response.
+     */
+    public function sendFile()
+    {
+        readfile($this->filePath);
+
+        if ($this->removeFile) {
+            unlink($this->filePath);
+        }
+    }
+
+    /**
+     * Sends HTTP headers and file content.
+     */
+    public function send()
+    {
+        $this->sendHeaders();
+        $this->sendFile();
+    }
+
+    /**
+     * Sets the file path.
+     *
+     * @param string $filePath
+     */
+    public function setFilePath($filePath)
+    {
+        if (false === is_readable($filePath)) {
+            throw new \RuntimeException('"' . $filePath . '" is not a readable file');
+        }
+        $this->filePath = $filePath;
+    }
+
+    /**
+     * Change the target name.
+     *
+     * @param string $name
+     */
+    public function changeName($name)
+    {
+        $this->headers->set('Content-Disposition', 'attachment;filename="' . $name);
+    }
+}
diff --git a/src/Irstea/BdohBundle/Util/HttpZipResponse.php b/src/Irstea/BdohBundle/Util/HttpZipResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..f4afc9b53db69a285263303d69ab21f3d5c91b9d
--- /dev/null
+++ b/src/Irstea/BdohBundle/Util/HttpZipResponse.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohBundle\Util;
+
+/**
+ * This class allows to send zip archive via Http protocol.
+ */
+class HttpZipResponse extends HttpFileResponse
+{
+    /**
+     * Constructor.
+     *
+     * @param string $basePath    Directory in which write the zip archive
+     * @param string $zipName     Name of the zip archive
+     * @param array  $files       Paths of files to zip
+     * @param bool   $removeFiles If true, the files will be removed after zipping
+     */
+    public function __construct($basePath, $zipName, $files, $removeFiles = false)
+    {
+        $zipPath = $basePath . '/' . $zipName . '.zip';
+        $zip = new \ZipArchive();
+
+        // Creates zip archive
+        if (true !== $zip->open($zipPath, \ZipArchive::CREATE)) {
+            throw new \RuntimeException("Unable to create zip archive : $zipPath");
+        }
+
+        // Adds a main folder
+        $zip->addEmptyDir($zipName);
+
+        // Adds each file in it
+        foreach ($files as $file) {
+            //Verify if file exists to prevent the close() to fail if ever a file were to be missing
+            if (file_exists($file)) {
+                $fileName = str_replace('//', '/', $zipName . '/' . basename($file));
+                $zip->addFile($file, $fileName);
+            }
+        }
+
+        // Saves zip archive
+        if (false === $zip->close()) {
+            throw new \RuntimeException("Unable to save zip archive : $zipPath");
+        }
+
+        // Removes all files, if asked
+        if ($removeFiles) {
+            foreach ($files as $file) {
+                @unlink($file);
+            }
+        }
+
+        parent::__construct($zipPath, 'application/zip', true);
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Controller/ChroniqueController.php b/src/Irstea/BdohConsultBundle/Controller/ChroniqueController.php
new file mode 100644
index 0000000000000000000000000000000000000000..d03abc862434922b4f96d35dd5143bc6b2cb6e8a
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Controller/ChroniqueController.php
@@ -0,0 +1,300 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\MesureRepository;
+use Irstea\BdohDataBundle\Entity\Repository\PlageRepository;
+use Irstea\BdohDataBundle\Entity\Repository\PointControleRepository;
+use Irstea\BdohDataBundle\Entity\Repository\StationRepository;
+use Irstea\BdohDataBundle\EventListener\MeasuresUpdateEvent;
+use Irstea\BdohDataBundle\Events;
+use Irstea\BdohLoggerBundle\Logger\BdohLogger;
+use Irstea\BdohSecurityBundle\Exception\ForbiddenException;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+
+/**
+ * Class ChroniqueController.
+ *
+ * @Route("/{station}/{chronique}", requirements = {
+ *     "station" = "([A-Z0-9_-]+|_[A-Za-z]+_)",
+ *     "chronique" = "([A-Z0-9_-]+|_[A-Za-z]+_)"
+ * })
+ */
+class ChroniqueController extends Controller
+{
+    const DATE_FORMAT = 'Y-m-d\TH:i:sT';
+
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    private $jobManager;
+
+    /**
+     * @Route("", name="bdoh_consult_chronique")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Chronique:show.html.twig")
+     *
+     * @return array
+     */
+    public function getAction(Request $request)
+    {
+        $chronique = $this->fetchChronique($request->attributes);
+
+        $authChecker = $this->get('security.authorization_checker');
+
+        if (!$authChecker->isGranted('CONSULT_TIMESERIES', $chronique)) {
+            throw new ForbiddenException();
+        }
+
+        /** @var ChroniqueRepository $chronRepo */
+        $chronRepo = $this->getClassRepo($chronique);
+
+        $dateFirst = $chronique->getDateDebutMesures();
+        $dateLast = $chronique->getDateFinMesures();
+        $nbMeasures = $chronique->getNbMesures();
+
+        // If the chronicle is a computed one, then send the corresponding "JeuBaremes" to the TWIG template
+        if (!($chronique->isCalculee())) {
+            $jeuxBaremes = null;
+        } else {
+            $jeuxBaremes = [];
+            foreach ([0, 1] as $i) {
+                $transformation = ($i === 0) ? $chronique->getPremiereEntree() : $chronique->getSecondeEntree();
+                $jeuxBaremes[] = ($transformation) ? $transformation->getJeuBaremesHistoriques() : null;
+            }
+        }
+
+        // Si c'est une chronique convertie on récupère l'historique des conversions
+        if (!($chronique->isConvertie())) {
+            $conversions = null;
+        } else {
+            $conversion = $chronique->getConversion();
+            $conversions = ($conversion) ? $conversion->getJeuConversionsHistoriques() : null;
+        }
+
+        // If rights are sufficient, display checkpoint info
+        /** @var PointControleRepository $pctlRepo */
+        $pctlRepo = $this->getBdohRepo('PointControle');
+        $checkpointStats = ($authChecker->isGranted('CONSULT_CHECKPOINTS', $chronique)) ? $pctlRepo->getFirstLastDates($chronique) : null;
+
+        // Allowed sampling types at regular time step
+        $allowedSamplings = [];
+        $allowedTimeSteps = [];
+        if ($chronique->isContinue()) {
+            $dae = $this->container->getParameter('default_allowed_exports');
+            /** @var ChroniqueContinueRepository $chronRepo */
+            $allowedParameters = $chronRepo->getAllowedExportParameters($chronique, $dae);
+
+            $samplingGetter = 'getNom';
+            $timeStepGetter = 'getLibelle';
+            if ($this->isLocaleEn()) {
+                $samplingGetter .= 'En';
+                $timeStepGetter .= 'En';
+            }
+
+            /** @var Echantillonnage $sampling */
+            foreach ($allowedParameters['samplings'] as $sampling) {
+                $samplingCode = $sampling->getCode();
+                $samplingConstant = \strtolower($samplingCode);
+
+                $allowedSamplings[$samplingConstant] = [
+                    'code'  => $samplingCode,
+                    'label' => $sampling->$samplingGetter(),
+                ];
+            }
+
+            /** @var PasEchantillonnage $timeStep */
+            foreach ($allowedParameters['timeSteps'] as $timeStep) {
+                $allowedTimeSteps[$timeStep->getId()] = [
+                    'label'           => $timeStep->$timeStepGetter(),
+                    'approxSeconds'   => $timeStep->getApproxSecondes(),
+                    'askCumulRefHour' => $timeStep->getApproxSecondes() >= 86400,
+                ];
+            }
+        }
+
+        if ($chronique->isContinue()
+            && ($inputSampling = $chronique->getEchantillonnage())
+            && \in_array(($inputSamplingCode = $inputSampling->getCode()), ['mean', 'cumulative'])
+        ) {
+            $preferExistingMeasure = (
+                $inputSamplingCode === 'mean'
+                || ($inputSamplingCode === 'cumulative' && $chronique->getDirectionMesure() === 'ahead')
+            );
+            $displayStartField = [
+                'check'                     => $preferExistingMeasure ? 'existing-measure' : 'round-time',
+                'warnBetterExistingMeasure' => $preferExistingMeasure,
+            ];
+        } else {
+            $displayStartField = false;
+        }
+
+        $children = $chronRepo->findAllChildren($chronique);
+        $childrenList = join('<br>', $children);
+        $childrenCount = count($children);
+
+        $hasActiveJobs = $this->jobManager->hasActiveJobs($chronique);
+
+        return [
+            'chronique'               => $chronique,
+            'dateFirst'               => $dateFirst,
+            'dateLast'                => $dateLast,
+            'measuresNumber'          => $nbMeasures,
+            'fillingRates'            => $chronRepo->getFillingRatesByYearAndMonth($chronique),
+            'jeuxBaremes'             => $jeuxBaremes,
+            'checkpointStats'         => $checkpointStats,
+            'exportSamplings'         => $allowedSamplings,
+            'exportTimeSteps'         => $allowedTimeSteps,
+            'displayStartField'       => $displayStartField,
+            'hasChildren'             => $chronique->hasChildren(),
+            'childrenList'            => $childrenList,
+            'childrenCount'           => $childrenCount,
+            'chroniqueContinue'       => $chronique->isContinue(),
+            'hasActiveJobs'           => $hasActiveJobs,
+            'jobPage'                 => $this->generateUrl('bdoh_job_list'),
+            'conversions'             => $conversions,
+        ];
+    }
+
+    /**
+     * @Route("/empty", name="bdoh_empty_chronique")
+     * @Method("POST")
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function emptyChroniqueAction(Request $request)
+    {
+        $chronique = $this->fetchChronique($request->attributes);
+
+        if (!$this->get('security.authorization_checker')->isGranted('REMOVE_DATA', $chronique)) {
+            throw new AccessDeniedHttpException();
+        }
+
+        $beginDate = $this->parseUTCDate($request, 'beginDate');
+        $endDate = $this->parseUTCDate($request, 'endDate');
+        $propagate = $request->request->get('propagate', false) === 'propagate';
+
+        /** @var ChroniqueRepository $chroniqueRepo */
+        $chroniqueRepo = $this->getClassRepo($chronique);
+
+        /** @var MesureRepository|PlageRepository $measureRepo */
+        $measureRepo = $chroniqueRepo->getMeasureRepoByChronique($chronique);
+
+        $this->getDoctrine()->getManager()->transactional(
+            function () use ($measureRepo, $chronique, $beginDate, $endDate, $propagate, &$result) {
+                $result = $measureRepo->emptyChroniquePeriode($chronique, $beginDate, $endDate);
+
+                if ($result['count'] === 0) {
+                    return;
+                }
+
+                /** @var BdohLogger $logger */
+                $logger = $this->container->get('irstea_bdoh_logger.logger');
+                $logger->createHistoriqueDonneesSuppression(
+                    $this->getUser(),
+                    new \DateTime(),
+                    $chronique->getObservatoire(),
+                    $chronique,
+                    $beginDate->format(DATE_ATOM),
+                    $endDate->format(DATE_ATOM),
+                    $result['count'],
+                    $result['changed']
+                );
+
+                $event = new MeasuresUpdateEvent($chronique, $this->getUser(), $beginDate, $endDate, $propagate);
+                $this->container->get('event_dispatcher')->dispatch(Events::MEASURES_UPDATE, $event);
+            }
+        );
+
+        $session = $request->getSession();
+        if ($session instanceof Session) {
+            $trans = $this->getTranslator();
+            $session->getFlashBag()->add(
+                'success',
+                $result['changed'] ?
+                    $trans->transChoice('changedMeasures(%changed%)', $result['count'], ['%changed%' => $result['count']]) :
+                    $trans->transChoice('removedMeasures(%removed%)', $result['count'], ['%removed%' => $result['count']])
+            );
+        }
+
+        $referer = $request->headers->get('referer');
+
+        return $this->redirect($referer);
+    }
+
+    /**
+     * @param Request $request
+     * @param string  $key
+     *
+     * @return \DateTime
+     */
+    private function parseUTCDate(Request $request, $key)
+    {
+        if (!$request->request->has($key)) {
+            throw new BadRequestHttpException("Missing parameter $key");
+        }
+        $value = $request->request->get($key);
+        $date = \DateTime::createFromFormat(self::DATE_FORMAT, $value, new \DateTimeZone('UTC'));
+        if ($date === false) {
+            throw new BadRequestHttpException(
+                sprintf('Invalid date value for %s: "%s", expected format: "%s"', $key, $value, self::DATE_FORMAT)
+            );
+        }
+
+        return $date;
+    }
+
+    /**
+     * @param ParameterBag $parameters
+     *
+     * @return Chronique
+     */
+    private function fetchChronique(ParameterBag $parameters)
+    {
+        /** @var StationRepository $stationRepo */
+        $stationRepo = $this->getBdohRepo('Station');
+        /** @var ChroniqueRepository $chroniqueRepo */
+        $chroniqueRepo = $this->getBdohRepo('Chronique');
+
+        $station = $stationRepo->findOneByCode($parameters->get('station'));
+
+        return $chroniqueRepo->findOneByStationAndCode($station, $parameters->get('chronique'));
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Controller/DataSetController.php b/src/Irstea/BdohConsultBundle/Controller/DataSetController.php
new file mode 100644
index 0000000000000000000000000000000000000000..00b64a9bc64c537171122cb68780b9211c710ade
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Controller/DataSetController.php
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Controller;
+
+use Doctrine\ORM\ORMException;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Exception\NotFoundEntityException;
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\DataSetRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\Routing\Annotation\Route;
+
+/**
+ * Class DataSetController.
+ *
+ * @Route("/dataset/{dataset}")
+ */
+class DataSetController extends Controller
+{
+    /**
+     * @param ParameterBag $parameters
+     *
+     * @return DataSet
+     */
+    public function fetchDataSet(ParameterBag $parameters)
+    {
+        // $dataset = new DataSet();
+        /** @var DataSetRepository $datasetRepo */
+        $datasetRepo = $this->getBdohRepo('DataSet');
+
+        return $datasetRepo->findOneById($parameters->get('id'));
+    }
+
+    /**
+     * @Route("", name="bdoh_consult_dataset")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Dataset:show.html.twig")
+     *
+     * @param $dataset
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getAction($dataset)
+    {
+        /** @var DataSetRepository $datasetRepo */
+        $datasetRepo = $this->getBdohRepo('Dataset');
+        /** @var ChroniqueRepository $chronRepo */
+        $chronRepo = $this->getBdohRepo('Chronique');
+
+        // Retrieves 'dataset' requested
+        try {
+            $datasetEntity = $datasetRepo->findOneByUuid($dataset);
+        } catch (ORMException $e) {
+            throw new NotFoundEntityException('Dataset', ['uuid' => " = $dataset"]);
+        }
+
+        // Les familles de paramètres utilisées sur ce dataset
+        $familyTable = $this->getBdohRepo('FamilleParametres')->getFamillesAndTypesDataset($this->isLocaleEn(), $datasetEntity);
+
+        // Les familles de niveau 0
+        $rootFamilies = [];
+        foreach ($familyTable as $family) {
+            if ($family['pid'] === null) {
+                $rootFamilies[] = $family['id'];
+            }
+        }
+
+        // les types de paramètres sans famille
+        $typesWithoutFamily = $this->getBdohRepo('Observatoire')->getParametres($this->isLocaleEn());
+        $types = [];
+        foreach ($typesWithoutFamily as $type) {
+            $types[] = $this->isLocaleEn() ? $type['nomEn'] : $type['nom'];
+        }
+
+        // Retrieves 'chroniques' of $dataset
+        $chroniques = $chronRepo->findByDataSet($datasetEntity);
+
+        // For each, gets its first and last dates
+        $dates = $datasetRepo->getFirstLastDatesByChronique($datasetEntity);
+
+        $chroniquesByParam = [];
+        // Groups these 'chroniques' by 'TypeParametre'
+        foreach ($chroniques as $chronique) {
+            $param = $chronique->getParametre();
+            if ($this->isLocaleEn()) {
+                $paramName = $param->getNomEn();
+                if (!$paramName) {
+                    $paramName = $param->getNom();
+                }
+            } else {
+                $paramName = $param->getNom();
+            }
+            $chroniquesByParam[$paramName][] = $chronique;
+        }
+
+        $chroniquesHavingMeasures = [];
+
+        // Selects only 'chroniques' having measures
+        foreach ($chroniques as $chronique) {
+            if (($chronDates = @$dates[$chronique->getId()])
+                && $chronDates['first'] && $chronDates['last']
+            ) {
+                $chroniquesHavingMeasures[] = $chronique;
+            }
+        }
+
+        // Computes the first and last dates, for dataset
+        if ($dates) {
+            $datasetFirstDate = '9999-99-99';
+            $datasetLastDate = '0000-00-00';
+
+            foreach ($dates as $date) {
+                $datasetFirstDate = min($datasetFirstDate, $date['first']);
+                $datasetLastDate = max($datasetLastDate, $date['last']);
+            }
+        } else {
+            $datasetFirstDate = $datasetLastDate = null;
+        }
+
+        return [
+            'dataset'                  => $datasetEntity,
+            'chroniquesHavingMeasures' => $chroniquesHavingMeasures,
+            'chroniquesByParam'        => $chroniquesByParam,
+            'dates'                    => $dates,
+            'datasetFirstDate'         => $datasetFirstDate,
+            'datasetLastDate'          => $datasetLastDate,
+            'typesEchant'              => $this->getBdohRepo('Echantillonnage')->getTypesEchant(),
+            'familyTable'              => $familyTable,
+            'rootFamilies'             => $rootFamilies,
+            'typesWithoutFamily'       => $types,
+        ];
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Controller/ObservatoireController.php b/src/Irstea/BdohConsultBundle/Controller/ObservatoireController.php
new file mode 100644
index 0000000000000000000000000000000000000000..92f8d8897c2623a58b896670dd31cff1e4c94d89
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Controller/ObservatoireController.php
@@ -0,0 +1,453 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Controller;
+
+use Doctrine\ORM\Query;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Form\Type\UTCDateTimeType;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohBundle\Util\HttpFileResponse;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ObservatoireRepository;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohTheiaOzcarBundle\Service\SchemaJSON;
+use Irstea\BdohTheiaOzcarBundle\Service\SerializerJSON;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\Form\Extension\Core\Type\FormType;
+use Symfony\Component\Form\Form;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+/**
+ * Class ObservatoireController.
+ */
+class ObservatoireController extends Controller
+{
+    /** @var SerializerJSON
+     *@DI\Inject("irstea_bdoh_theia_ozcar.serializerjson")
+     */
+    private $serializerJson;
+
+    /**
+     * @var SchemaJSON
+     * @DI\Inject("irstea_bdoh_theia_ozcar.schemajson")
+     */
+    private $schemaJSON;
+
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    private $jobManager;
+
+    /**
+     * @Route("", name="bdoh_consult_observatoire")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Observatoire:show.html.twig")
+     *
+     * @return array
+     */
+    public function getAction()
+    {
+        // Les familles de paramètres utilisées sur cet observatoire
+        $familyTable = $this->getBdohRepo('FamilleParametres')->getFamillesAndTypes($this->isLocaleEn());
+
+        // Les familles de niveau 0
+        $rootFamilies = [];
+        foreach ($familyTable as $family) {
+            if ($family['pid'] === null) {
+                $rootFamilies[] = $family['id'];
+            }
+        }
+
+        return [
+            'familyTable'           => $familyTable,
+            'rootFamilies'          => $rootFamilies,
+            'parametres'            => $this->getBdohRepo('Observatoire')->getParametres($this->isLocaleEn()),
+            'sites'                 => $this->getBdohRepo('SiteExperimental')->findAll(),
+            'countChroniquesBySite' => $this->getBdohRepo('SiteExperimental')->countChroniquesBySite(),
+        ];
+    }
+
+    /**
+     * @Security("is_granted('ROLE_ADMIN') and user.isAManagerOfCurrentObservatory()")
+     *
+     * @param Request $request
+     * @Route("/observatoire/{id}/save", name="bdoh_admin_observatoire_save_miseajour")
+     * @Method({"POST"})
+     */
+    public function saveMiseAJourAutomatiqueFormAction(Request $request)
+    {
+        $observatoire = $this->fetchObservatoire($request->attributes);
+        // récupération des autre paramètres
+        $miseAJourAutomatique = $request->request->get('miseajourAutomatique');
+        $observatoireId = $observatoire->getId();
+
+        // mise à jour de l'observatoire et enregistrement des entities
+        if ($miseAJourAutomatique === null || $miseAJourAutomatique === false) {
+            $observatoire->setMiseajourAutomatique(false);
+        } else {
+            $observatoire->setMiseajourAutomatique($miseAJourAutomatique);
+        }
+
+        $this->getEm()->persist($observatoire);
+        $this->getEm()->flush();
+
+        return $this->redirectToRoute(
+            'bdoh_admin_observatoire_edit_jsonValidator',
+            ['id'                      => $observatoireId,
+                'miseajourAutomatique' => $observatoire->isMiseajourAutomatique(),
+            ]
+        );
+    }
+
+    /**
+     * @Route("/observatoire/{id}/envoieJson", name="bdoh_admin_observatoire_edit_envoieJson")
+     * @Security("is_granted('ROLE_ADMIN') and user.isAManagerOfCurrentObservatory()")
+     * @Method("GET")
+     *
+     * @param Request $request
+     */
+    public function getSendJsonToTheia(Request $request)
+    {
+        $observatoire = $this->fetchObservatoire($request->attributes);
+        // récupération des autre paramètres
+
+        $this->jobManager->enqueueJsonTheia($observatoire);
+
+        return $this->redirectToRoute('bdoh_job_list');
+    }
+
+    /**
+     * @Route("/observatoire/{id}/jsonValidator", name="bdoh_admin_observatoire_edit_jsonValidator")
+     * @Security("is_granted('ROLE_ADMIN') and user.isAManagerOfCurrentObservatory()")
+     * @Method("GET")
+     *
+     * @param Request $request
+     */
+    public function validateTheiaJsonAction(Request $request)
+    {
+        $observatoire = $this->fetchObservatoire($request->attributes);
+
+        $json = $this->serializerJson->serialize($observatoire);
+        $data = json_decode($json);
+
+        $schema = $this->schemaJSON->loadSchemaTheia();
+        $result = $this->schemaJSON->validateSchemaTheia($data);
+
+        return $this->render(
+            '@IrsteaBdohConsult/JsonValidator/report.html.twig',
+            [
+                'json'                 => $json,
+                'schemas'              => $schema->id(),
+                'result'               => $result,
+                'miseajourAutomatique' => $observatoire->isMiseajourAutomatique(),
+            ]
+        );
+    }
+
+    /**
+     * @param ParameterBag $parameters
+     *
+     * @return Observatoire
+     */
+    public function fetchObservatoire(ParameterBag $parameters)
+    {
+        /** @var ObservatoireRepository $obseRepo */
+        $obseRepo = $this->getBdohRepo('Observatoire');
+
+        return $obseRepo->findOneById($parameters->get('id'));
+    }
+
+    /**
+     * @Route("/terms_of_use", name="bdoh_cgu_observatoires")
+     * @Method("GET")
+     *
+     * @return HttpFileResponse
+     */
+    public function cguAction()
+    {
+        $observatoire = Observatoire::getCurrent();
+        $termsOfUses = $observatoire->getConditionsUtilisation();
+        $cguPath = $termsOfUses ?: $this->container->getParameter('irstea_bdoh_data.measure_export.default_termofuses_file');
+
+        return new HttpFileResponse($cguPath, 'application/octet-stream');
+    }
+
+    /**
+     * @Route("/contact", name="bdoh_consult_contact")
+     * @Template("IrsteaBdohConsultBundle:Observatoire:contact.html.twig")
+     * @Method("GET")
+     *
+     * @return array
+     */
+    public function contactAction()
+    {
+        $obs = $this->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        $gestionnaires = $this->getRepository('IrsteaBdohSecurityBundle:Utilisateur')->findGestionnairesByObservatoire($obs);
+
+        $dataToShow = [];
+        /** @var Utilisateur $gest */
+        foreach ($gestionnaires as $gest) {
+            $dataToShow[] = ['firstName' => $gest->getPrenom(), 'lastName' => $gest->getNom(), 'email' => $gest->getEmail()];
+        }
+
+        return ['dataToShow' => $dataToShow];
+    }
+
+    /**
+     * @Route("/nos-donnees", name="bdoh_consult_advancedSearch")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Observatoire:advancedSearch.html.twig")
+     *
+     * @return array
+     */
+    public function advancedSearchAction(Request $request)
+    {
+        /** @var ChroniqueRepository $chronRepo */
+        $chronRepo = $this->getBdohRepo('Chronique');
+        $chroniques = $chronRepo->bigFindAll();
+        $chroniquesNumber = [];
+        /** @var Observatoire $obs */
+        $obs = $this->get('irstea_bdoh.manager.observatoire')->getCurrent();
+
+        // les bassins, cours d'eau et familles parentes pour chaques chroniques
+        $bassins = $chronRepo->findContainingBassins($obs->getId());
+        $coursEaux = $chronRepo->findNeighbouringCoursEaux($obs->getId());
+        $familles = $chronRepo->findParentFamilies($obs->getId(), $this->isLocaleEn());
+
+        // Computes the 'chroniques' number, by 'station'
+        foreach ($chroniques as &$chronique) {
+            $stationId = $chronique->getStation()->getId();
+
+            if (!isset($chroniquesNumber[$stationId])) {
+                $chroniquesNumber[$stationId] = 1;
+            } else {
+                ++$chroniquesNumber[$stationId];
+            }
+
+            $chronique->bassins = isset($bassins[$chronique->getId()]) ? $bassins[$chronique->getId()] : null;
+            $chronique->coursEaux = isset($coursEaux[$chronique->getId()]) ? $coursEaux[$chronique->getId()] : null;
+            $chronique->familles = isset($familles[$chronique->getId()]) ? $familles[$chronique->getId()] : null;
+        }
+
+        return [
+            'chroniques'       => $chroniques,
+            'chroniquesNumber' => $chroniquesNumber,
+        ];
+    }
+
+    /**
+     * @Route("/viewer", name="bdoh_consult_complexViewer")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Observatoire:complexViewer.html.twig")
+     *
+     * @return array
+     */
+    public function complexViewerAction()
+    {
+        $token = $this->get('security.token_storage')->getToken();
+        $userOrNull = $token !== null ? $token->getUser() : null;
+        $user = $userOrNull instanceof Utilisateur ? $userOrNull : null;
+
+        /** @var ChroniqueRepository $repo */
+        $repo = $this->getRepository(Chronique::class);
+
+        $dates = $repo->createSecuredQueryBuilderForView($user)
+            ->select('MIN(ch.dateDebutMesures)', 'MAX(ch.dateFinMesures)')
+            ->getQuery()
+            ->getSingleResult(Query::HYDRATE_ARRAY);
+
+        return [
+            'minDate' => $dates[1],
+            'maxDate' => $dates[2],
+        ];
+    }
+
+    /**
+     * @Route("/viewer/load", name="bdoh_consult_loadComplexViewerData")
+     * @Method("GET")
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function loadComplexViewerDataAction(Request $request)
+    {
+        $token = $this->get('security.token_storage')->getToken();
+        $userOrNull = $token !== null ? $token->getUser() : null;
+        $user = $userOrNull instanceof Utilisateur ? $userOrNull : null;
+
+        $request->setRequestFormat('json');
+
+        $form = $this->createMetadataForm();
+        $form->handleRequest($request);
+        if (!$form->isValid()) {
+            throw new BadRequestHttpException();
+        }
+
+        $startDate = $form->get('start')->getData();
+        $endDate = $form->get('end')->getData();
+
+        $obs = $this->get('irstea_bdoh.manager.observatoire')->getCurrent();
+
+        $data = [
+            'observatory' => ['name' => $obs->getNom()],
+            'stations'    => $this->fetchSecuredStationData($user, $obs, $startDate, $endDate),
+        ];
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * @return Form
+     */
+    private function createMetadataForm()
+    {
+        return $this->container->get('form.factory')
+            ->createNamedBuilder(null, FormType::class, null, ['csrf_protection' => false])
+            ->setMethod('GET')
+            ->add('start', UTCDateTimeType::class, ['constraints' => [new NotBlank()]])
+            ->add('end', UTCDateTimeType::class, ['constraints' => [new NotBlank()]])
+            ->getForm();
+    }
+
+    /**
+     * @param Utilisateur|null $user
+     * @param Observatoire     $obs
+     * @param \DateTime        $startDate
+     * @param \DateTime        $endDate
+     *
+     * @return array
+     */
+    private function fetchSecuredStationData($user, Observatoire $obs, \DateTime $startDate, \DateTime $endDate)
+    {
+        $stations = $this->fetchAllStations($obs);
+
+        return array_map(
+            function (Station $station) use ($user, $startDate, $endDate) {
+                return $this->buildSecuredStationData($user, $station, $startDate, $endDate);
+            },
+            $stations
+        );
+    }
+
+    /**
+     * @param Observatoire $obs
+     *
+     * @return Station[]
+     */
+    private function fetchAllStations(Observatoire $obs)
+    {
+        $stations = [];
+        foreach ($obs->getSites() as $site) {
+            /** @var Station $station */
+            foreach ($site->getStations() as $station) {
+                $stations[$station->getId()] = $station;
+            }
+        }
+
+        return $stations;
+    }
+
+    /**
+     * @param Utilisateur|null $user
+     * @param Station          $station
+     * @param \DateTime        $startDate
+     * @param \DateTime        $endDate
+     *
+     * @return array
+     */
+    private function buildSecuredStationData($user, Station $station, \DateTime $startDate, \DateTime $endDate)
+    {
+        $hasMeasures = array_fill_keys(
+            $this->getBdohRepo('Chronique')->getSecuredChroniqueIDsWithMeasures($user, $station->getId(), $startDate, $endDate),
+            true
+        );
+
+        $chronicles = array_map(
+            function (Chronique $chronique) use ($hasMeasures) {
+                $data = $this->buildChronicleData($chronique);
+                $data['hasMeasures'] = !empty($hasMeasures[$chronique->getId()]);
+
+                return $data;
+            },
+            $station->getChroniques()->toArray()
+        );
+
+        usort($chronicles, function ($a, $b) { return strnatcasecmp($a['code'], $b['code']); });
+
+        return [
+            'id'          => $station->getId(),
+            'name'        => $station->getNom(),
+            'code'        => $station->getCode(),
+            'hasMeasures' => !empty($hasMeasures),
+            'chronicles'  => $chronicles,
+        ];
+    }
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return array
+     */
+    private function buildChronicleData(Chronique $chronique)
+    {
+        if ($chronique instanceof ChroniqueDiscontinue) {
+            $samplingType = 'discontinuous';
+        } else {
+            $sampling = $chronique->getEchantillonnage();
+            $samplingType = $sampling ? $sampling->getCode() : 'instantaneous';
+        }
+
+        $paramType = $chronique->getParametre();
+        $label = $chronique->getLibelle($this->isLocaleEn() ? 'en' : 'fr');
+        if ($this->isLocaleEn()) {
+            $paramName = $paramType->getNomEn() ?: $paramType->getNom();
+        } else {
+            $paramName = $paramType->getNom();
+        }
+
+        $unit = $chronique->getUnite();
+
+        return [
+            'id'           => $chronique->getId(),
+            'label'        => $label,
+            'code'         => $chronique->getCode(),
+            'paramName'    => $paramName,
+            'unitId'       => ($unit) ? $unit->getId() : null,
+            'unitLabel'    => ($unit) ? $unit->getLibelle() : '',
+            'samplingType' => $samplingType,
+            'reverseAxis'  => $chronique->getReverseAxis(),
+        ];
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Controller/StationController.php b/src/Irstea/BdohConsultBundle/Controller/StationController.php
new file mode 100644
index 0000000000000000000000000000000000000000..25ba191633432a4f8560468675a13c91380d994c
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Controller/StationController.php
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Controller;
+
+use Doctrine\ORM\ORMException;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Exception\NotFoundEntityException;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\StationRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Component\Routing\Annotation\Route;
+
+/**
+ * Class StationController.
+ *
+ * @Route("/station/{station}", requirements={"station" = "[A-Z0-9_-]+" })
+ */
+class StationController extends Controller
+{
+    /**
+     * @Route("", name="bdoh_consult_station")
+     * @Method("GET")
+     * @Template("IrsteaBdohConsultBundle:Station:show.html.twig")
+     *
+     * @param $station
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getAction($station)
+    {
+        /** @var StationRepository $stationRepo */
+        $stationRepo = $this->getBdohRepo('Station');
+        /** @var ChroniqueRepository $chronRepo */
+        $chronRepo = $this->getBdohRepo('Chronique');
+
+        // Retrieves 'station' requested
+        try {
+            $stationEntity = $stationRepo->findOneByCode($station);
+        } catch (ORMException $e) {
+            throw new NotFoundEntityException('Station', ['code' => " = $station"]);
+        }
+
+        // Les familles de paramètres utilisées sur cette station
+        $familyTable = $this->getBdohRepo('FamilleParametres')->getFamillesAndTypes($this->isLocaleEn(), $stationEntity);
+
+        // Les familles de niveau 0
+        $rootFamilies = [];
+        foreach ($familyTable as $family) {
+            if ($family['pid'] === null) {
+                $rootFamilies[] = $family['id'];
+            }
+        }
+
+        // les types de paramètres sans famille
+        $typesWithoutFamily = $this->getBdohRepo('Observatoire')->getParametres($this->isLocaleEn());
+        $types = [];
+        foreach ($typesWithoutFamily as $type) {
+            $types[] = $this->isLocaleEn() ? $type['nomEn'] : $type['nom'];
+        }
+
+        // Retrieves 'chroniques' of $station
+        $chroniques = $chronRepo->findByStation($stationEntity);
+
+        // For each, gets its first and last dates
+        $dates = $stationRepo->getFirstLastDatesByChronique($stationEntity);
+
+        $chroniquesByParam = [];
+        // Groups these 'chroniques' by 'TypeParametre'
+        foreach ($chroniques as $chronique) {
+            $param = $chronique->getParametre();
+            if ($this->isLocaleEn()) {
+                $paramName = $param->getNomEn();
+                if (!$paramName) {
+                    $paramName = $param->getNom();
+                }
+            } else {
+                $paramName = $param->getNom();
+            }
+            $chroniquesByParam[$paramName][] = $chronique;
+        }
+
+        $chroniquesHavingMeasures = [];
+
+        // Selects only 'chroniques' having measures
+        foreach ($chroniques as $chronique) {
+            if (($chronDates = @$dates[$chronique->getId()])
+                && $chronDates['first'] && $chronDates['last']
+            ) {
+                $chroniquesHavingMeasures[] = $chronique;
+            }
+        }
+
+        // Computes the first and last dates, for station
+        if ($dates) {
+            $stationFirstDate = '9999-99-99';
+            $stationLastDate = '0000-00-00';
+
+            foreach ($dates as $date) {
+                $stationFirstDate = min($stationFirstDate, $date['first']);
+                $stationLastDate = max($stationLastDate, $date['last']);
+            }
+        } else {
+            $stationFirstDate = $stationLastDate = null;
+        }
+
+        return [
+            'station'                  => $stationEntity,
+            'chroniquesHavingMeasures' => $chroniquesHavingMeasures,
+            'chroniquesByParam'        => $chroniquesByParam,
+            'dates'                    => $dates,
+            'stationFirstDate'         => $stationFirstDate,
+            'stationLastDate'          => $stationLastDate,
+            'typesEchant'              => $this->getBdohRepo('Echantillonnage')->getTypesEchant(),
+            'familyTable'              => $familyTable,
+            'rootFamilies'             => $rootFamilies,
+            'typesWithoutFamily'       => $types,
+        ];
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Exception/Exception.php b/src/Irstea/BdohConsultBundle/Exception/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..088553ca936c0b1d91e0134d0262dc37236f7352
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Exception/Exception.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Exception;
+
+interface Exception
+{
+}
diff --git a/src/Irstea/BdohConsultBundle/Exception/InvalidJsonSchemaURIException.php b/src/Irstea/BdohConsultBundle/Exception/InvalidJsonSchemaURIException.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b454aa6bebabc3ae6f13381f028328c2ad0c4b7
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Exception/InvalidJsonSchemaURIException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Exception;
+
+class InvalidJsonSchemaURIException extends \InvalidArgumentException implements Exception
+{
+}
diff --git a/src/Irstea/BdohConsultBundle/IrsteaBdohConsultBundle.php b/src/Irstea/BdohConsultBundle/IrsteaBdohConsultBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..60e4b08cbeb53358d8a76aff30a0afdd6f801dd4
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/IrsteaBdohConsultBundle.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohConsultBundle extends Bundle
+{
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/advanced-search.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/advanced-search.js
new file mode 100644
index 0000000000000000000000000000000000000000..d69fcc9fcc3dd3b3a71af6c3e193b362b80929c1
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/advanced-search.js
@@ -0,0 +1,62 @@
+/*
+ * © 2016-2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const _ = require('lodash');
+const Translator = require('translator');
+
+require('@IrsteaBdohBundle/lib/date-time/range-picker');
+require('@IrsteaBdohBundle/lib/datatables');
+require('@IrsteaBdohBundle/lib/select2');
+
+$(() => {
+
+    $('#filter-date-range').dateTimeRangePicker();
+
+    let startDate = NaN;
+    let endDate = NaN;
+
+    const $table = $('#main-table').DataTable({
+        initComplete: () => {
+            $('#filter-date-range')
+                .dateTimeRangePicker('observeStatus')
+                .filter(_.property('isValid'))
+                .debounce(100)
+                .pluck('value')
+                .subscribe(({ start, end }) => {
+                    startDate = start.unix();
+                    endDate = end.unix();
+                    $table.draw();
+                });
+
+            $('.async').addClass('done');
+
+            // modification du label de la recherche par mots-clés pour insérer une bulle d'aide
+            const searchLabel = document.querySelector('#main-table_filter > label').firstChild;
+            searchLabel.textContent = searchLabel.textContent
+                .replace('\u00A0:', ' ')
+                .replace(':', ' ');
+            const $sup = $(`<sup title="${Translator.trans('searchInfo', {}, 'messages')}">(?)</sup>`);
+            $sup.insertBefore('#main-table_filter > label > input');
+            $sup.tooltip({container: $('#main-table')})
+                .tooltip('fixTitle');
+            $(`<span>${Translator.trans('deux_points', {}, 'messages')}</span>`)
+                .insertBefore('#main-table_filter > label > input');
+        }
+    });
+
+    $table.on('draw', () => {
+        $('tr.group *[data-original-title]').each((i, e) => {
+            $(e).tooltip({container:$('#main-table')})
+                .tooltip('fixTitle');
+        });
+    });
+
+    $.fn.DataTable.ext.search.push((_, fields) => {
+        // Test en négatif parce que startDate et endDate valent NaN si elles ne sont pas définis.
+        // Or une comparaison avec NaN retourne toujours faux.
+        return !(fields[10] < startDate || fields[9] > endDate);
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/cut-modal.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/cut-modal.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d4d95c425df27b140b9a524c52606600b3bec73
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/cut-modal.js
@@ -0,0 +1,29 @@
+const $ = require('jquery');
+require('@IrsteaBdohBundle/lib/date-time/range-picker');
+
+$(() => {
+    $('[data-cut-modal]').each((_i, dom) => {
+        const modal = $(dom);
+        const submitButton = modal.find('input[type="submit"]');
+
+        modal.one('show.bs.modal', () => {
+            const picker = modal.find('.daterange');
+
+            picker.dateTimeRangePicker({
+                minDate: modal.data('debut'),
+                maxDate: modal.data('fin')
+            });
+
+            picker.dateTimeRangePicker('observeStatus')
+                .subscribe((status) => {
+                    submitButton
+                        .toggleClass('btn-danger', status.isValid)
+                        .attr('disabled', !status.isValid)
+                        .prop('disabled', !status.isValid);
+                });
+
+            // Displays, in a bootstrap-popover, the list of the descendant time series
+            $('.childrenHelp').popover({trigger: 'hover', 'html': true});
+        });
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/export-modal.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/export-modal.js
new file mode 100644
index 0000000000000000000000000000000000000000..33be2b00a1b5a43beb20e56f3c127e64bb875ad1
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/export-modal.js
@@ -0,0 +1,273 @@
+/**
+ * Javascript definitions for 'chroniques_export' macro in 'IrsteaBdohConsultBundle::macros.html.twig' template.
+ */
+const $ = require('jquery');
+const _ = require('lodash');
+const Translator = require('translator');
+
+require('jquery-ui/ui/widget');
+require('@IrsteaBdohBundle/lib/date-time/range-picker');
+
+const ALLOWED_YEARS_PER_MINUTE = 2;
+
+function alwaysTrue() {
+    return true
+}
+
+function isBdohFormat(fmt) {
+    return fmt === 'Bdoh';
+}
+
+function isLessThenYearPerMinute(start, end, timeStep) {
+    const span = end.diff(start, 'years');
+    return span <= timeStep * ALLOWED_YEARS_PER_MINUTE;
+}
+
+const allowedTypes = {
+    'Bdoh': ['identical', 'instantaneous', 'mean', 'cumulative'],
+    'Qtvar': ['identical', 'instantaneous']
+};
+
+const exportTypes = {
+    identical: {
+        timeStepSelector: 'none',
+        isFormatValid: alwaysTrue,
+        isTimeStepValid: alwaysTrue,
+        isTimeSpanValid: alwaysTrue
+    },
+    instantaneous: {
+        timeStepSelector: 'free',
+        isFormatValid: alwaysTrue,
+        isTimeStepValid(timeStep) {
+            return 0 < timeStep && timeStep <= 1440;
+        },
+        isTimeSpanValid: isLessThenYearPerMinute
+    },
+    mean: {
+        timeStepSelector: 'list',
+        isFormatValid: isBdohFormat,
+        isTimeStepValid: alwaysTrue,
+        isTimeSpanValid: isLessThenYearPerMinute
+    },
+    cumulative: {
+        timeStepSelector: 'list',
+        isFormatValid: isBdohFormat,
+        isTimeStepValid: alwaysTrue,
+        isTimeSpanValid: isLessThenYearPerMinute
+    }
+};
+
+$.widget(
+    'bdoh.exportModal',
+    {
+        options: {},
+
+        _create() {
+            this._dateTimeRangePicker = this.element.find('.daterange').dateTimeRangePicker({
+                minDate: this.options.dateFirst,
+                maxDate: this.options.dateLast
+            });
+
+            this._timezone = this.element.find('[name="timezone"]');
+            this._exportType = this.element.find('[name="exportType"]');
+            this._exportFormat = this.element.find('[name="exportFormat"]');
+            this._timeStepSelectors = {
+                free: this.element.find('[name="instantStep"]'),
+                list: this.element.find('[name="meanCumulStep"]')
+            };
+            this._chroniques = this.element.find('[name="chroniques[]"]');
+            this._termsOfUses = this.element.find('[name="termsOfUses"]');
+            this._submit = this.element.find('[type="submit"]');
+
+            const selfUpdate = _.bindKey(this, '_update');
+            this._on(this.element, {
+                'change': selfUpdate,
+                'click input[type="number"]': selfUpdate,
+                'keyup input[type="number"]': selfUpdate
+            });
+
+            this._dateTimeRangePicker.dateTimeRangePicker('observeStatus')
+                .subscribe(selfUpdate);
+
+            selfUpdate();
+        },
+
+        setDateRange(range) {
+            this._dateTimeRangePicker.dateTimeRangePicker('setDateTimeRange', range);
+        },
+
+        _update(showFeedback) {
+            const status = this._dateTimeRangePicker.dateTimeRangePicker('getStatus');
+            const tz = this._getTimeZone();
+            this._updateAvailableTypes();
+            const exportType = this._getExportType();
+            this._updateTimeStepSelector(exportType);
+            const isValid = this._validate(status, exportType, showFeedback);
+            this._updateRangeFeedback(isValid, status.value.start, status.value.end, tz);
+        },
+
+        _getTimeZone() {
+            return parseInt(this._timezone.val(), 10);
+        },
+
+        _getTimeStep() {
+            const exportType = this._getExportType();
+            switch (exportType.timeStepSelector) {
+                case 'none':
+                    return 0;
+                case 'free':
+                    return parseInt(this._timeStepSelectors.free.val(), 10);
+                case 'list':
+                    return parseInt(this._timeStepSelectors.list.children(':selected').data('time-step'), 10) / 60;
+            }
+        },
+
+        _getExportType() {
+            const type = this._exportType.val();
+            if (!(type in exportTypes)) {
+                throw `Invalid export type: ${type}`;
+            }
+            return exportTypes[type];
+        },
+
+        _updateRangeFeedback(show, start, end, tz) {
+            const el=this.element.find('.range-in-timezone');
+            const format = this._dateTimeRangePicker.dateTimeRangePicker('option', 'format');
+            const s = start.clone()
+                .utcOffset(60 * tz)
+                .format(format);
+            const e = end.clone()
+                .utcOffset(60 * tz)
+                .format(format);
+            if(s !== 'null' && e !== 'null'){
+                el.text(`${s}${' - '}${e}`).show();
+            }else {
+                el.text('').hide();
+            }
+        },
+
+        _updateAvailableTypes() {
+            const format = this._exportFormat.val();
+            const types = this._exportType[0];
+            $.each(types, (_, type) => {
+                type.disabled = !allowedTypes[format].includes(type.value);
+                if (type.selected && type.disabled) {
+                    type.selected = false;
+                }
+                if(type.disabled){
+                    $(type).hide();
+                }else{
+                    $(type).show();
+                }
+            });
+        },
+
+        _updateTimeStepSelector(exportType) {
+            $.each(this._timeStepSelectors, (type, selector) => {
+                const group = selector.closest('.form-group');
+                if (type === exportType.timeStepSelector) {
+                    group.show(200);
+                } else {
+                    group.hide(200);
+                }
+            });
+        },
+
+        _validate(status, exportType, showFeedback) {
+            const startError = this._getRangeError(status.start);
+            const endError = this._getRangeError(status.end);
+            const errors = {
+                start: startError ? `start.${startError}` : null,
+                end: endError ? `end.${endError}` : null,
+                timeStep: this._getTimeStepError(status.value.start, status.value.end, exportType, this._getTimeStep()),
+                termsOfUses: this._getTermsOfUsesError(),
+                chroniques: this._getChroniquesError()
+            };
+
+            this._showErrors(showFeedback ? errors : {});
+
+            const isValid = ! _.some(errors);
+            this._submit
+                .toggleClass('btn-success', isValid)
+                .attr('disabled', isValid ? null : 'disabled')
+                .prop('disabled', !isValid);
+            return isValid;
+        },
+
+        _getRangeError(status) {
+            return status.isValid ? false : status.status;
+        },
+
+        _getTimeStepError(start, end, exportType, timeStep) {
+            if (!exportType.isTimeStepValid(timeStep)) {
+                return 'invalid-time-step';
+            }
+            if (!exportType.isTimeSpanValid(start, end, timeStep)) {
+                return 'invalid-time-span';
+            }
+            return false;
+        },
+
+        _getTermsOfUsesError() {
+            if (!this._termsOfUses.prop('checked')) {
+                return 'check-term-of-uses';
+            }
+            return false;
+        },
+
+        _getChroniquesError() {
+            if (!this._chroniques.val()) {
+                return 'select-a-chronique';
+            }
+            return false;
+        },
+
+        _showErrors(errors) {
+            const el = this.element;
+
+            el
+                .find('.error-report')
+                .hide()
+                .find('.errors')
+                .empty();
+
+            this._showError(el.find('.daterange .start'), errors.start);
+            this._showError(el.find('.daterange .end'), errors.end);
+            this._showError(el.find('.time-step.form-group'), errors.timeStep);
+            this._showError(this._termsOfUses.closest('.form-group'), errors.termsOfUses);
+            this._showError(this._chroniques.closest('.form-group'), errors.chroniques);
+        },
+
+        _showError(widget, error) {
+            widget
+                .toggleClass('has-success', error === false)
+                .toggleClass('has-error', !!error);
+            if (!error) {
+                return
+            }
+            const report = this._findErrorReport(widget);
+            report
+                .show()
+                .find('.errors')
+                .append(
+                    $('<div></div>').text(Translator.trans(`validation.${error}`))
+                );
+        },
+
+        _findErrorReport(widget) {
+            return widget.closest('.form-group').find('.error-report')
+                .first();
+        }
+    }
+);
+
+$(() => {
+    $('[data-export-modal] a[href="#chronique-export-help"]').tooltip();
+    $(document).one('show.bs.modal', '[data-export-modal]', (ev) => {
+        const modal = $(ev.target);
+        modal.exportModal({
+            dateFirst: modal.data('min-date'),
+            dateLast: modal.data('max-date')
+        });
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/filling-rates.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/filling-rates.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8b55646867cca025f8620544a615248dcc934ba
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/filling-rates.js
@@ -0,0 +1,20 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+require('@IrsteaBdohBundle/lib/datatables');
+
+module.exports = function initFillingRates(selector) {
+    $(selector).DataTable({
+        autoWidth: false,
+        searching: false,
+        order: [[0, 'desc']],
+        pageLength: 5,
+        lengthMenu: [5, 10, 25, 50, 100],
+        columnDefs: [
+            {orderable: false, targets: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},
+        ],
+    });
+};
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fdb43b731421508d8abb8215795d2c58a92af91
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/index.js
@@ -0,0 +1,19 @@
+const $ = require('jquery');
+const initFillingRates = require('./filling-rates');
+
+require('./cut-modal');
+require('./export-modal');
+//require('./jeux-baremes');
+require('./viewer-graph');
+require('./style.css');
+
+$(() => {
+
+    // contournement d'un bug de jqplot sur l'utilisation de window.getSelection
+    // potentiellement dangereux pour d'autres fonctionnalité (penser à virer au besoin)
+    window.getSelection = null;
+
+    initFillingRates('#fillingRates');
+    $('sup.checkpointsInfo').tooltip();
+    $('a.viewChroniqueMere').tooltip();
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/jeux-baremes.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/jeux-baremes.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddb2361776de9763c375abfc6fa6596beedcc901
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/jeux-baremes.js
@@ -0,0 +1,39 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    '@IrsteaBdohBundle/lib/datatables'
+], ($) => {
+
+    const dtJeuBaremes = function ($table) {
+        return $table.dataTable({
+            bDestroy: true,
+            sScrollY: '500px',
+            bSort: false,
+            bProcessing: false,
+            sDom: 't'
+        }).rowGrouping();
+    };
+
+    const $jeuxBaremesTables = $('.table-jeux-baremes');
+    const $jeuxBaremesDetails = [];
+    $jeuxBaremesTables.each(function () {
+        $jeuxBaremesDetails.push(dtJeuBaremes($(this)));
+    });
+
+    $('#detail-jeux-baremes')
+        .one('show', () => {
+            $jeuxBaremesTables.css('visibility', 'hidden');
+        })
+        .one('shown', () => {
+            $($jeuxBaremesDetails).each(function () {
+                this.fnDraw();
+            });
+            $jeuxBaremesTables.css('visibility', '');
+
+        });
+});
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..4f687daecded4c7dd45a7111c15fc8efecf9116e
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/style.css
@@ -0,0 +1,97 @@
+div#detail-jeux-baremes div.panel.panel-default{
+    margin:10px 0 0;
+}
+div#detail-jeux-baremes div.panel.panel-default > div{
+    padding:0;
+}
+div#detail-jeux-baremes div.alert.alert-info{
+    margin:15px 0 0;
+    padding:15px 8px;
+}
+div#detail-jeux-baremes div.alert.alert-info:first-of-type{
+    margin-top:0;
+}
+table.table-jeux-baremes-infos{
+    width:100%;
+}
+table.table-jeux-baremes-infos td{
+    padding:8px;
+}
+table.table.table-jeux-baremes thead tr th,
+table.table.table-jeux-baremes tbody tr td{
+    line-height:1;
+}
+table.table.table-jeux-baremes:last-of-type{
+    margin-bottom:0;
+}
+a.collapse-title{
+    color:#444444;
+}
+a.collapse-title:hover,
+a.collapse-title:focus{
+    cursor:pointer;
+    text-decoration:none;
+    color:#444444;
+}
+a.collapse-title b.caret{
+    margin:0;
+    padding:0;
+    vertical-align:3px;
+    transition:transform 0.3s ease-in-out;
+}
+a.collapse-title.collapsed b.caret{
+    transform:rotate(-90deg);
+}
+div#viewer div.form-inline div.input-group.col-md-8 span.input-group-addon + span.input-group-btn {
+    width: 1%;
+}
+div#viewer div.form-inline div.input-group.col-md-8 span.input-group-addon + span.input-group-btn > a.btn {
+    border-radius: 0;
+    border-right: 0;
+}
+div#viewer div.form-inline div.input-group.col-md-8 input.form-control + span.input-group-btn > a.btn,
+div.daterangeselector div.daterange div.input-group input.form-control + span.input-group-btn > a.btn {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+    border-left: 0;
+}
+div.daterangeselector div.daterange > div.input-group {
+    margin-bottom: 2px;
+}
+sup.checkpointsInfo, span.subsampledHelp{
+    cursor:default;
+}
+span.info-high div.tooltip-inner,
+div.graph-infos div.tooltip-inner{
+    max-width:250px;
+}
+table#fillingRates th, table#fillingRates td{
+    white-space:nowrap;
+}
+div#viewer div.graph{
+    padding-top:20px;
+}
+div#viewer div.graph-infos{
+    margin-top:15px;
+}
+div#viewer div.graph-infos div.graph-flex{
+    display:flex;
+    justify-content:space-between;
+    align-items:flex-end;
+}
+div.graph-infos div.divControlPoints input#controlPointsId{
+    margin-top:0;
+}
+div.graph-infos div.divControlPoints,
+div.graph-infos div.divControlPoints label{
+    margin-bottom:0;
+}
+div#viewer div.graph div.jqplot-table-legend-swatch{
+    width:0;
+    height:0;
+    border-width:5px 6px 5px 6px;
+    border-style:solid;
+}
+h3.panel-title i[class^='fam-']{
+    vertical-align:text-top;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/viewer-graph.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/viewer-graph.js
new file mode 100644
index 0000000000000000000000000000000000000000..f46d3bb65a756f50b32def5b887048225fdcb601
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/chronique/viewer-graph.js
@@ -0,0 +1,38 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+const moment = require('@IrsteaBdohBundle/lib/moment');
+require('../../lib/viewer/simple');
+
+$(() => {
+    const viewer = $('#viewer');
+
+    viewer.simpleViewer({
+        id: viewer.data('chronique-id'),
+        minDate: viewer.data('min-date'),
+        maxDate: viewer.data('max-date'),
+        measureURL: viewer.data('measure-url')
+    });
+
+    const modal = $('[data-export-modal]');
+
+    viewer.find('.graph-export-button')
+        .onAsObservable('click')
+        .flatMap(() => viewer.simpleViewer('getSelectedDateRange').first())
+        .subscribe((range) => {
+            const boundedStart = moment(modal.data('min-date'));
+            const boundedEnd = moment(modal.data('max-date'));
+            range.start=moment.max(range.start, boundedStart);
+            range.end=moment.min(range.end, boundedEnd);
+            modal.one('shown.bs.modal', () => modal.exportModal('setDateRange', range));
+            modal.modal('show');
+        });
+
+    $(document).on('click', '[href="#measures-display"][data-begin][data-end]', (ev) => {
+        const el = $(ev.currentTarget);
+        viewer.simpleViewer('setDateRange', el.data('begin'), el.data('end'), true);
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/complex-viewer.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/complex-viewer.js
new file mode 100644
index 0000000000000000000000000000000000000000..79d60f894016389a5ab73d694f9c08ff4159c839
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/complex-viewer.js
@@ -0,0 +1,22 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+const $ = require('jquery');
+require('../lib/viewer/complex');
+
+$(() => {
+
+    // contournement d'un bug de jqplot sur l'utilisation de window.getSelection
+    // potentiellement dangereux pour d'autres fonctionnalité (penser à virer au besoin)
+    window.getSelection = null;
+
+    const viewer = $('#complex-viewer');
+    viewer.complexViewer({
+        metadataURL: viewer.data('metadata-url'),
+        measureURL: viewer.data('measure-url'),
+        minDate: viewer.data('min-date'),
+        maxDate: viewer.data('max-date')
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a44f4ff3792c6831813a8cbb83f5ca6057af67f
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/index.js
@@ -0,0 +1 @@
+require('./style.css');
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..d8613da58f6fb9cc29f5adf9f9aed92e6d0df9a7
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/observatoire/style.css
@@ -0,0 +1,44 @@
+div#photos.carousel a.carousel-control{
+    display:flex;
+    justify-content:center;
+    align-items:center;
+}
+div#photos.carousel a.carousel-control span.carousel-control-button{
+    display:block;
+}
+div#photos.carousel > .carousel-inner > .item > img{
+    margin: 0 auto;
+}
+div#consult-observatoire > ul{
+    background:white;
+    padding-left:12px;
+}
+div.box ul{
+    margin-left:0;
+    padding-left:25px;
+}
+div.box ul li{
+    /*list-style-type:disc;*/
+    /* tentative d'homogénéiser le rendu entre chrome et firefox */
+    list-style-image:url("/images/disc.png");
+}
+div.box ul li.famille{
+    list-style:none;
+}
+div.box ul li.famille span.famille{
+    margin-left:-13px;
+}
+div.box ul li.famille span.famille a.advancedSearchLink{
+    font-weight:bold;
+}
+div.box ul li.famille span.famille a b.caret{
+    cursor:pointer;
+    color:#444444;
+    margin-left:0;
+    margin-right:5px;
+    vertical-align:3px;
+    transition:transform 0.3s ease-in-out;
+}
+div.box ul li.famille span.famille a.collapsed b.caret{
+    transform:rotate(-90deg);
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a44f4ff3792c6831813a8cbb83f5ca6057af67f
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/index.js
@@ -0,0 +1 @@
+require('./style.css');
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..f97b5c95c73cd5d0eb9b63f868ccf1a33e232c68
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/entries/station/style.css
@@ -0,0 +1,88 @@
+#consult-station div.panel-body#identification{
+    margin-bottom:0;
+}
+div#identification div.info-high.col-sm-12 + div.span.col-sm-12{
+    padding-right:0;
+    margin-bottom:0.5em;
+}
+div#identification div.span.col-sm-12 ul{
+    margin-left:0;
+    margin-bottom:0;
+    padding-left:0;
+}
+div#identification div.span.col-sm-12 ul li{
+    list-style-position:inside;
+}
+div.panel-famille, div.panel-param {
+    margin-bottom:10px;
+}
+div.panel-param + div.panel-famille,
+div.panel-famille + div.panel-param,
+div.panel-famille + div.panel-famille {
+    margin-top:18px;
+}
+div.panel-famille > div > div.panel-body > div.panel-default:first-of-type {
+    margin-top:8px;
+}
+div.panel-famille > div > div.panel-body > div.panel-default:last-of-type{
+    margin-bottom:0;
+}
+a.collapse-title{
+    color:#444444;
+}
+a.collapse-title:hover,
+a.collapse-title:focus{
+    cursor:pointer;
+    text-decoration:none;
+    color:#444444;
+}
+a.collapse-title b.caret{
+    margin:0;
+    padding:0;
+    vertical-align:3px;
+    transition:transform 0.3s ease-in-out;
+}
+a.collapse-title.collapsed b.caret{
+    transform:rotate(-90deg);
+}
+a.collapse-title h3.panel-title small{
+    color:#777;
+}
+div.panel-collapse div.panel-body{
+    padding:10px;
+}
+div.panel-collapse div.panel-body div.even,
+div.panel-collapse div.panel-body div.odd{
+    margin:0 0 5px;
+    padding:0 5px 5px;
+}
+div.panel-collapse div.panel-body div.even:first-of-type{
+    margin-top:-5px;
+}
+div.panel-collapse div.panel-body div.even:last-of-type,
+div.panel-collapse div.panel-body div.odd:last-of-type{
+    margin-bottom:0;
+}
+div.panel-collapse div.panel-body div.odd{
+    background:#f0f0f0;
+}
+div.panel-collapse div.panel-body div.row{
+    margin:0;
+}
+div.panel-collapse div.panel-body div div.row div.toolbox-btns.pull-right{
+    background:transparent;
+    margin-top:5px;
+    margin-bottom:-5px;
+}
+div.panel-collapse div.panel-body div.row div.toolbox-btns span.isvisible{
+    display:inline-block;
+    padding:6px 0;
+    margin:0;
+    border:0;
+    font-size:11px;
+    line-height:1;
+    vertical-align:top;
+}
+h3.panel-title i[class^='fam-']{
+    vertical-align:text-top;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/base.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5cdf3f9f90b60f4aa7c8fdf2f9b36abadfe3af4
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/base.js
@@ -0,0 +1,143 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    './repositories/measure',
+    './services/ajax-queue',
+    './services/x-axis-config',
+    '@IrsteaBdohBundle/lib/moment',
+    'lodash',
+    'translator',
+    'rx',
+    // --
+    './widgets/progress-bar',
+    '@IrsteaBdohBundle/lib/date-time/range-picker'
+], ($, MeasureRepository, AjaxQueue, createXAxisConfig, moment, _, Translator, Rx) => {
+    'use strict';
+
+    return $.widget(
+        'viewer.baseViewer',
+        {
+            options: {
+                minDate: null,
+                maxDate: null,
+                measureURL: null,
+                allowRangeOutOfBoundaries: false
+            },
+
+            _create() {
+                this._setupDateRangePicker();
+                this._setupDateRangeSubjects();
+                this._setupRepositories();
+                this._setupProgressBar();
+                this._setupXAxisConfig();
+            },
+
+            _setupDateRangePicker() {
+                const picker = this._dateRangePicker = this.element.find('.date-range-picker');
+                picker.dateTimeRangePicker({
+                    minDate: this.options.minDate,
+                    maxDate: this.options.maxDate,
+                    minInterval: moment.duration(1, 'day'),
+                    maxInterval: moment.duration(5, 'years'),
+                    allowRangeOutOfBoundaries: this.options.allowRangeOutOfBoundaries
+                });
+
+                const statusObs = picker.dateTimeRangePicker('observeStatus');
+
+                statusObs
+                    .subscribe((status) => {
+                        const msg = status.showError ? status.format(Translator) : null;
+                        picker
+                            .find('.feedback')
+                            .toggle(!!msg)
+                            .find('.msg')
+                            .text(msg);
+
+                        picker
+                            .find('.btn.validated')
+                            .toggleClass('disabled', !status.isValid)
+                            .attr('disabled', !status.isValid);
+                    });
+
+                this._selectedDateRange =
+                    statusObs
+                        .filter(_.property('isValid'))
+                        .pluck('value');
+
+                this._submitTrigger = new Rx.Subject();
+
+                picker
+                    .find('.btn.validated.submit')
+                    .clickAsObservable()
+                    .subscribe(this._submitTrigger);
+
+                this._submittedDateRange = this._submitTrigger
+                    .flatMap(() => this._selectedDateRange.first());
+            },
+
+            _setupRepositories() {
+                const queue = this._queue = new AjaxQueue();
+                const url = this.options.measureURL;
+                const holder = new Rx.SerialDisposable(Rx.Disposable.empty);
+
+                this._measureRepository = this._inputDateRange
+                    .filter(({start, end}) => start && end)
+                    .map((range) => new MeasureRepository(queue, url, range.start, range.end))
+                    .do((repo) => holder.setDisposable(repo))
+                    .shareReplay(1);
+            },
+
+            _setupDateRangeSubjects() {
+                const lastInputRange = this._inputDateRange = new Rx.ReplaySubject(1);
+                const graphDateRange = this._graphDateRange = new Rx.ReplaySubject(1);
+
+                this._submittedDateRange.subscribe(lastInputRange);
+
+                Rx.Observable
+                    .merge([
+                        this._submittedDateRange,
+                        this.element.onAsObservable('plotzoomreset')
+                            .flatMap(() => lastInputRange.first()),
+                        this.element.onAsObservable('plotzoom')
+                            .map((ev) => ({
+                                start: moment.utc(ev.originalEvent.data.start),
+                                end: moment.utc(ev.originalEvent.data.end)
+                            }))
+                    ])
+                    .subscribe(graphDateRange);
+            },
+
+            _setupXAxisConfig() {
+                this._xAxisConfig = this._graphDateRange
+                    .map(createXAxisConfig)
+                    .shareReplay(1);
+            },
+
+            _setupProgressBar() {
+                $('<div style="display:none"></div>')
+                    .progressBar({state: this._queue.observeState()})
+                    .appendTo(window.document.body);
+            },
+
+            setDateRange(start, end, submit = false) {
+                this._dateRangePicker.dateTimeRangePicker('setDateTimeRange', {start, end});
+                if (submit) {
+                    this._submitTrigger.onNext(submit);
+                }
+            },
+
+            getSubmittedDateRange() {
+                return this._submittedDateRange;
+            },
+
+            getSelectedDateRange() {
+                return this._selectedDateRange;
+            }
+        }
+    );
+
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..9682fc8c5107f074930ec7cf2d4784c9dd00fc2b
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/index.js
@@ -0,0 +1,193 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    '../base',
+    '../repositories/metadata',
+    '../widgets/selector',
+    '../services/state',
+    'rx',
+    '../widgets/panel',
+    '../widgets/x-axis',
+    './style.css'
+], ($, baseViewer, MetadataRepository, Selector, State, Rx) => {
+
+    let panelTemplate;
+    (function () {
+        const tpl = $('#cv-panel-template');
+        panelTemplate = $(tpl.html());
+        tpl.remove();
+    })();
+
+    return $.widget(
+        'viewer.complexViewer',
+        baseViewer,
+        {
+            _create() {
+                this._super();
+
+                this._selectionsDisposable = new Rx.SerialDisposable();
+                this._selections = new Rx.BehaviorSubject([]);
+
+                this._setupXAxis();
+                this._setupPanels();
+                //this._setupState(); // marche trop mal
+            },
+
+            _setupRepositories() {
+                this._super();
+
+                const queue = this._queue;
+                const url = this.options.metadataURL;
+                const holder = new Rx.SerialDisposable(Rx.Disposable.empty);
+
+                const meta = this._metadataRepository = this._measureRepository
+                    .map((measureRepo) => {
+                        return new MetadataRepository(queue, url, measureRepo.start, measureRepo.end, measureRepo);
+                    })
+                    .do((repo) => {
+                        holder.setDisposable(repo);
+                    })
+                    .shareReplay(1);
+
+                this._observatoire = meta.flatMap((repo) => repo.observatoire);
+                this._stations = meta.flatMap((repo) => repo.stations);
+                this._chroniques = meta.flatMap((repo) => repo.chroniques);
+            },
+
+            _setupXAxis() {
+                const xAxis = this.element
+                    .find('.x-axis')
+                    .xAxis({config: this._xAxisConfig});
+
+                this._selections
+                    .map((sels) => sels.length > 0)
+                    .subscribeOnNext(xAxis.toggle, xAxis);
+            },
+
+            _setupPanels() {
+                const panelButtons = this.element.find('.panel-buttons');
+                this._panelContainer = this.element.find('.panel-container');
+
+                this._inputDateRange
+                    .map((range) => range && range.start !== null && range.end !== null)
+                    .subscribeOnNext(panelButtons.toggle, panelButtons);
+
+                this._inputDateRange
+                    .first()
+                    .subscribeOnNext(() => {
+                        if (this.getPanels().length === 0) {
+                            this.createPanel();
+                            this._updateSelections();
+                        }
+                    });
+
+                this._on(this.element, {
+                    'click .add-pane'() {
+                        this.createPanel();
+                        this._updateSelections();
+                    },
+                    'panelselect'(ev, data) {
+                        Selector.open($.extend({}, data, {
+                            index: 1 + $.inArray(ev.target, this.getPanels()),
+                            observatoire: this._observatoire,
+                            stations: this._stations
+                        }));
+                    },
+                    'panelremove'(ev) {
+                        this.removePanel(ev.target);
+                        this._updateSelections();
+                    },
+                });
+            },
+
+            createPanel() {
+                panelTemplate
+                    .clone()
+                    .appendTo(this._panelContainer)
+                    .panel({
+                        xaxis: this._xAxisConfig,
+                        repository: this._metadataRepository
+                    });
+            },
+
+            removePanel(panel) {
+                $(panel).remove();
+            },
+
+            getPanels() {
+                return this._panelContainer.children();
+            },
+
+            _setupState() {
+                const state = this._state = new State(window);
+
+                Rx.Observable
+                    .combineLatest([this._inputDateRange, this._selections], this._serializeState)
+                    .subscribe(state.input);
+
+                state.output.subscribeOnNext(this._restoreState, this);
+
+                state.connect();
+            },
+
+            _serializeState(dates, selections) {
+                return {
+                    dates,
+                    graphs: selections.map((selection) =>
+                        selection.map((side) =>
+                            side.map((chronique) => chronique.id)
+                        )
+                    )
+                };
+            },
+
+            _restoreState(state) {
+                this._dateRangePicker.dateTimeRangePicker('setDateTimeRange', state.dates);
+
+                const graphs = state.graphs;
+                let panels = this.getPanels();
+
+                panels.slice(graphs.length).remove();
+                for (let i = panels.length; i < graphs.length; i++) {
+                    this.createPanel();
+                }
+
+                panels = this.getPanels();
+                this._chroniques
+                    .subscribeOnNext(function (chroniques) {
+                        graphs.forEach((sides, idx) => {
+                            const selections = sides.map((ids) =>
+                                ids
+                                    .map((id) => chroniques[id])
+                                    .filter(Rx.helpers.identity)
+                            );
+                            $(panels[idx]).panel('setSelections', selections[0], selections[1]);
+                        });
+
+                        this._updateSelections();
+                    }, this);
+            },
+
+            _updateSelections() {
+                const selections = this
+                        .getPanels()
+                        .toArray()
+                        .map((panel) => $(panel).panel('observeSelections'));
+                let subscription;
+                if (selections.length > 0) {
+                    subscription = Rx.Observable
+                        .combineLatest(selections)
+                        .subscribe(this._selections);
+                } else {
+                    subscription = Rx.emptyDisposable;
+                    this._selections.onNext([]);
+                }
+                this._selectionsDisposable.setDisposable(subscription);
+            }
+        }
+    );
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..809a2b5733fd4cdf0ed90ba34819e255ce915945
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/complex/style.css
@@ -0,0 +1,25 @@
+.panels .panel.row {
+    margin-bottom: 0;
+}
+div#complex-viewer div.form-inline div.input-group.col-md-8 span.input-group-addon + span.input-group-btn {
+    width: 1%;
+}
+div#complex-viewer div.form-inline div.input-group.col-md-8 span.input-group-addon + span.input-group-btn > a.btn {
+    border-radius: 0;
+    border-right: 0;
+}
+div#complex-viewer div.form-inline div.input-group.col-md-8 input.form-control + span.input-group-btn > a.btn {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+    border-left: 0;
+}
+tr.chronique div.tooltip-inner{
+    max-width:300px;
+}
+table.table tbody tr.chronique td{
+    vertical-align:middle;
+}
+tr.chronique div.toolbox-btns{
+    padding:0;
+    margin:-5px 0;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/chronique.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/chronique.js
new file mode 100644
index 0000000000000000000000000000000000000000..d2b94402bf794342ca22e5ca718d572975899f74
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/chronique.js
@@ -0,0 +1,52 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define(['./serie'], (Serie) => {
+    'use strict';
+
+    function Chronique(station, id, label, code, paramName, unitId, unitLabel, samplingType, reverseAxis, hasMeasures, measuresFetcher) {
+        this.station = station;
+        this.id = id;
+        this.label = label;
+        this.code = code;
+        this.paramName = paramName;
+        this.unitId = unitId;
+        this.unitLabel = unitLabel;
+        this.samplingType = samplingType;
+        this.reverseAxis = reverseAxis;
+        this.hasMeasures = hasMeasures;
+        this._measuresFetcher = measuresFetcher;
+        this._measures = null;
+        this.measuresDisposed = false;
+    }
+
+    Chronique.prototype.dispose = function() {
+        const oldMeasures = this._measures;
+        this._measures = this._measuresFetcher = this.station = null;
+        oldMeasures && oldMeasures.dispose();
+    };
+
+    Chronique.prototype.getMeasures = function() {
+        if (!this._measures || this.measuresDisposed) {
+            this._measures = this._measuresFetcher(this.measuresDisposed);
+        }
+        return this._measures;
+    };
+
+    Chronique.prototype.toString = function() {
+        return `${this.station} / ${this.code}`;
+    };
+
+    Chronique.prototype.isSameAs = function(other) {
+        return (other instanceof Chronique) && this.id === other.id;
+    };
+
+    Chronique.prototype.isDisplayableWith = function(other) {
+        return (other instanceof Chronique) && this.unitId === other.unitId && this.reverseAxis === other.reverseAxis;
+    };
+
+    return Chronique;
+
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/measures.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/measures.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee48e7b3b03bb47d7d82b7128d69cce8af9b3098
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/measures.js
@@ -0,0 +1,60 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    './serie',
+    '../services/ref-count-disposable'
+], (Serie, RefCountDisposable) => {
+    'use strict';
+
+    function Measures(json) {
+        this.series = [];
+        this._refCount = 0;
+        this.color = undefined;
+        this.shown = true;
+        this.id = json.chronicleId;
+        this.name = json.name;
+        this.stationName = json.station;
+        this.dataType = json.dataType;
+        this.unit = json.dataUnit;
+        this.samplingType = json.samplingType;
+        this.reverseAxis = json.reverseAxis;
+        this.pointCount = json.nPts;
+        this.validCount = json.validMeasureCount;
+        this.downSampled = json.tooManyPoints;
+        this.timeStep = json.timeStep;
+        this.stationCode = json.stationCode;
+        this.chroniqueCode = json.chroniqueCode;
+        this.chroniqueClass = json.chroniqueClass;
+        this.checkpointsOnCumulative = json.checkpointsOnCumulative;
+        this.ahead = json.ahead;
+    }
+
+    Measures.prototype.acquire = function () {
+        return new RefCountDisposable(this);
+    };
+
+    Measures.prototype.dispose = function () {
+        if (this.disposed) {
+            return;
+        }
+        this.disposed = true;
+        const oldSeries = this.series;
+        this.series = null;
+        oldSeries.forEach((s) => {
+            s.dispose();
+        });
+    };
+
+    Measures.prototype.isEmpty = function () {
+        return this.pointCount === 0;
+    };
+
+    Measures.prototype.toString = function () {
+        return this.name;
+    };
+
+    return Measures;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/observatoire.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/observatoire.js
new file mode 100644
index 0000000000000000000000000000000000000000..184f8840462c53c701518532ff3885d0aac4e92c
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/observatoire.js
@@ -0,0 +1,18 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([], () => {
+    'use strict';
+
+    function Observatoire(name) {
+        this.name = name;
+    }
+
+    Observatoire.prototype.toString = function () {
+        return this.name;
+    };
+
+    return Observatoire;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/serie.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/serie.js
new file mode 100644
index 0000000000000000000000000000000000000000..618eb23d57b725eacf0e1c078c1bb11f2426b769
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/serie.js
@@ -0,0 +1,24 @@
+
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([], () => {
+    'use strict';
+
+    function Serie(type, measures, values, style, label, showLabel) {
+        this.type = type;
+        this.measures = measures;
+        this.values = values;
+        this.style = style;
+        this.label = label;
+        this.showLabel = showLabel;
+    }
+
+    Serie.prototype.dispose = function() {
+        this.measures = this.values = this.type = null;
+    };
+
+    return Serie;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/station.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/station.js
new file mode 100644
index 0000000000000000000000000000000000000000..19fb961a7906604e72fb0e79768eda4bdcce5356
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/models/station.js
@@ -0,0 +1,29 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define(['./chronique'], (Chronique) => {
+    'use strict';
+
+    function Station(id, name, code, hasMeasures, chroniques) {
+        this.id = id;
+        this.name = name;
+        this.code = code;
+        this.hasMeasures = hasMeasures;
+        this.chroniques = chroniques;
+    }
+
+    Station.prototype.dispose = function() {
+        $.each(this.chroniques, (id, chronique) => {
+            chronique.dispose();
+        });
+        this.chroniques = null;
+    };
+
+    Station.prototype.toString = function() {
+        return this.code;
+    };
+
+    return Station;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/base.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..e13936f9c731696ce6fd5e6789f1850618201660
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/base.js
@@ -0,0 +1,37 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx-jquery',
+    '../services/ajax-queue'
+], ($, Rx, AjaxQueue) => {
+    'use strict';
+
+    function BaseRepository(queue, url, start, end) {
+        if (!(queue instanceof AjaxQueue)) throw `Invalid queue: ${queue}`;
+        if (!url || typeof(url) !== 'string') throw `Invalid url: ${url}`;
+
+        this.start = start;
+        this.end = end;
+
+        this._queue = queue;
+        this._url = url;
+        this._start = start.toISOString();
+        this._end = end.toISOString();
+        this._disposables = new Rx.CompositeDisposable();
+    }
+
+    BaseRepository.prototype.dispose = function() {
+        if (!this._disposables) {
+            return;
+        }
+        const d = this._disposables;
+        this._disposables = this._queue = null;
+        d.dispose();
+    };
+
+    return BaseRepository;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/measure.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/measure.js
new file mode 100644
index 0000000000000000000000000000000000000000..48a57a45f1bcaeedba4aedda26f7aa1f1bf1268b
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/measure.js
@@ -0,0 +1,98 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx-jquery',
+    './base',
+    '../models/measures',
+    '../models/serie'
+], ($, Rx, BaseRepository, Measures, Serie) => {
+    'use strict';
+
+    const SCHEDULER = Rx.Scheduler.async;
+
+    function arrayConcat(arrays) {
+        if(arrays.length === 0) {
+            return [];
+        }
+        const head = arrays.shift();
+        return head.concat(...arrays);
+    }
+
+    function MeasureRepository(queue, url, start, end) {
+        BaseRepository.call(this, queue, url, start, end);
+        this._cache = {};
+    }
+
+    MeasureRepository.prototype = Object.create(BaseRepository.prototype);
+
+    MeasureRepository.prototype.getMeasures = function (id, force) {
+        if (!(id in this._cache) || force) {
+            this._cache[id] = this._queryMeasures(id);
+        }
+        return this._cache[id];
+    };
+
+    MeasureRepository.prototype._queryMeasures = function (id) {
+        const queue = this._queue;
+        const url = this._url.replace('-ID-', `${id}`);
+        const hydrateMeasures = this._hydrateMeasures.bind(this);
+
+        return queue
+            .request({
+                url,
+                data: {beginDate: this._start, endDate: this._end}
+            })
+            .then((response) => {
+                return hydrateMeasures(response.chronicles[0]);
+            });
+    };
+
+    MeasureRepository.prototype._hydrateMeasures = function (response) {
+        const measures = new Measures(response);
+
+        this._disposables.add(measures);
+
+        // Ici, on utilise un observable avec scheduler pour délayer le traitement dans le temps
+        // Cela évite de bloquer le navigateur en cas de gros traitement.
+
+        return Rx.Observable
+            .from(response.series, null, null, SCHEDULER)
+            .reduce(
+                (series, serie) => {
+                    const flag = serie.seriesFlag;
+                    const values = serie.values;
+                    const style = serie.style;
+                    const label = serie.label;
+                    const showLabel = serie.showLabel;
+                    if (values.length > 0) {
+                        if (!(flag in series)) {
+                            series[flag]={};
+                            series[flag]['values'] = [values];
+                        } else {
+                            series[flag]['values'].push([[null, null]], values);
+                        }
+                        series[flag]['style'] = style;
+                        series[flag]['label'] = label;
+                        series[flag]['showLabel'] = showLabel;
+                    }
+                    return series;
+                },
+                {}
+            )
+            .map((series) => {
+                for(const type in series) {
+                    const values = arrayConcat(series[type]['values']);
+                    measures.series.push(new Serie(type, measures, values, series[type]['style'], series[type]['label'], series[type]['showLabel']));
+                }
+                return measures;
+            })
+            .toPromise();
+    };
+
+    return MeasureRepository;
+});
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/metadata.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/metadata.js
new file mode 100644
index 0000000000000000000000000000000000000000..906a51c43938428e465f756022203510cd2c6136
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/repositories/metadata.js
@@ -0,0 +1,142 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx-jquery',
+    './base',
+    './measure',
+    '../models/observatoire',
+    '../models/station',
+    '../models/chronique',
+    'lodash'
+], ($, Rx, BaseRepository, MeasureRepository, Observatoire, Station, Chronique, _) => {
+    'use strict';
+
+    const SCHEDULER = Rx.Scheduler.async;
+
+    function MetadataRepository(queue, url, start, end, measureRepository) {
+        if (!(measureRepository instanceof MeasureRepository)) throw `Invalid measureRepository: ${measureRepository}`;
+        this._measureRepository = measureRepository;
+
+        BaseRepository.call(this, queue, url, start, end);
+
+        this._queryMetadata();
+        this._setupObservatoire();
+        this._setupStations();
+        this._setupChroniques();
+    }
+
+    MetadataRepository.prototype = Object.create(BaseRepository.prototype);
+
+    MetadataRepository.prototype._queryMetadata = function () {
+        const queue = this._queue;
+        const dates = {start: this._start, end: this._end};
+
+        this._metadata = Rx.Observable.fromPromise(
+            queue
+                .request({
+                    url: this._url,
+                    data: dates
+                })
+                .then((response) => {
+                    return {dates, response}
+                })
+        );
+    };
+
+    MetadataRepository.prototype._setupObservatoire = function () {
+        this.observatoire = this._metadata
+            .pluck('response', 'observatory')
+            .map(this._hydrateObservatoire, this)
+            .shareReplay(1);
+    };
+
+    MetadataRepository.prototype._setupStations = function () {
+        const hydrateStation = this._hydrateStation.bind(this);
+        this.stations = this._metadata
+            .flatMap((metadata) => {
+                return Rx.Observable
+                    .pairs(metadata.response.stations, SCHEDULER)
+                    .flatMap((pair) => {
+                        return hydrateStation(metadata.dates, pair[1]);
+                    })
+                    .toArray()
+                    .map(s => s.sort((a, b) => {
+                            return a.name.localeCompare(b.name, 'fr', {'sensitivity':'base'});
+                        }));
+            })
+            .shareReplay(1);
+    };
+
+    MetadataRepository.prototype._setupChroniques = function () {
+        this.chroniques = this.stations
+            .flatMap((stations) => {
+                return Rx.Observable
+                    .from(stations, null, null, SCHEDULER)
+                    .pluck('chroniques')
+                    .reduce((acc, chroniques) => {
+                        _.forEach(chroniques, chro => {
+                          acc[chro.id] = chro;
+                        });
+                        return acc;
+                    }, {});
+            })
+            .shareReplay(1);
+    };
+
+    MetadataRepository.prototype._hydrateObservatoire = function (response) {
+        return new Observatoire(response.name);
+    };
+
+    MetadataRepository.prototype._hydrateStation = function (dates, response) {
+        const chroniques = {};
+        const station = new Station(response.id, response.name, response.code, response.hasMeasures, chroniques);
+
+        const hydrateChronique = this._hydrateChronique.bind(this, dates, station);
+
+        return Rx.Observable
+            .pairs(response.chronicles, SCHEDULER)
+            .map((pair) => {
+                pair[1] = hydrateChronique(pair[1]);
+                return pair;
+            })
+            .reduce(
+                (acc, pair) => {
+                    acc[pair[0]] = pair[1];
+                    return acc;
+                },
+                chroniques
+            )
+            .map((x) => {
+                return station;
+            });
+    };
+
+    MetadataRepository.prototype._hydrateChronique = function (dates, station, response) {
+        const measureRepository = this._measureRepository;
+        const fetcher = function (force) {
+            return measureRepository
+                .getMeasures(chronique.id, force);
+            };
+        const chronique = new Chronique(
+            station,
+            response.id,
+            response.label,
+            response.code,
+            response.paramName,
+            response.unitId,
+            response.unitLabel,
+            response.samplingType,
+            response.reverseAxis,
+            response.hasMeasures,
+            fetcher
+        );
+        return chronique;
+    };
+
+    return MetadataRepository;
+});
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ajax-queue.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ajax-queue.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebf5697b4770e94ea2d1fe15e7611ef14c34d813
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ajax-queue.js
@@ -0,0 +1,142 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx-jquery'
+], ($, Rx) => {
+    'use strict';
+
+    function sum(x, y) {
+        return x + y;
+    }
+
+    // AjaxQueue: queue de requêtes Ajax ; n'éxecute qu'un nombre limité de requêtes en simultanée.
+
+    function AjaxQueue() {
+        this._disposables = new Rx.CompositeDisposable();
+        this._queue = new Rx.Subject();
+        this._maxTries = 3;
+
+        this._setupState();
+        this._setupVisibilityControl();
+        this._setupProcessing();
+    }
+
+    AjaxQueue.prototype._setupState = function () {
+        const queued = this._queued = new Rx.BehaviorSubject(0);
+        const completed = this._completed = new Rx.BehaviorSubject(0);
+        const past = this._past = new Rx.BehaviorSubject(0);
+        const show = this._show = new Rx.BehaviorSubject(false);
+        const completedTotal = this._completedTotal = completed.scan(sum).shareReplay(1);
+        const queuedTotal = this._queuedTotal = queued.scan(sum).shareReplay(1);
+
+        this._state = Rx.Observable.combineLatest(
+            [
+                queuedTotal,
+                completedTotal,
+                past.delay(300),
+                show
+            ],
+            (queued, completed, past, show) => {
+                const c = completed - past;
+                const t = queued - past;
+                return {
+                    progress: t ? c / t : 0,
+                    show
+                };
+            }
+        );
+
+        this._disposables.add(
+            this._completedTotal
+                .sample(
+                    show
+                        .distinctUntilChanged()
+                        .filter((x) => {
+                            return !x;
+                        })
+                )
+                .subscribe(this._past)
+        );
+    };
+
+    AjaxQueue.prototype._setupVisibilityControl = function () {
+        const hasWork = Rx.Observable
+            .combineLatest(
+                [
+                    this._completedTotal,
+                    this._queuedTotal
+                ],
+                (completed, queued) => {
+                    return queued > completed;
+                }
+            )
+            .debounce((show) => {
+                return Rx.Observable.just(show ? 500 : 300);
+            });
+
+        this._disposables.add(
+            hasWork.subscribe(this._show)
+        );
+    };
+
+    AjaxQueue.prototype._setupProcessing = function () {
+        const token = new Rx.Subject();
+        const startRequest = this._startRequest.bind(this);
+        const nextSerial = this._nextSerial.bind(this);
+        const completed = this._completed;
+
+        this._disposables.add(
+            this._queue
+                .zip([token])
+                .flatMap((data) => {
+                    const req = data[0];
+                    const prom = startRequest(req.options);
+                    prom.then(req.resolve, req.reject);
+                    return prom.then(nextSerial, nextSerial);
+                })
+                .do(() => {
+                    completed.onNext(1);
+                })
+                .subscribe(token)
+        );
+
+        token.onNext(nextSerial());
+    };
+
+    AjaxQueue.prototype._startRequest = function (options) {
+        const doRequest = function () {
+                return Promise.resolve($.ajax(options));
+            };
+        let prom = doRequest();
+        for (let i = 1; i < this._maxTries; i++) {
+            prom = prom.then(null, doRequest);
+        }
+        return prom;
+    };
+
+    AjaxQueue.prototype._nextSerial = function () {
+        return ++this._serial;
+    };
+
+    AjaxQueue.prototype.request = function (options) {
+        const queue = this._queue;
+        this._queued.onNext(1);
+        return new Promise(((resolve, reject) => {
+            queue.onNext({options, resolve, reject});
+        }));
+    };
+
+    AjaxQueue.prototype.observeState = function () {
+        return this._state;
+    };
+
+    AjaxQueue.prototype.dispose = function () {
+        this._disposables.dispose();
+    };
+
+    return AjaxQueue;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ref-count-disposable.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ref-count-disposable.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7528bdceda16835c4d1f103449a193b1174abd0
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/ref-count-disposable.js
@@ -0,0 +1,37 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+
+const REFCOUNT = Symbol();
+
+class RefCountDisposable {
+
+    constructor(target) {
+        this.target = target;
+        this.refCount++;
+    }
+
+    get refCount() {
+        return this.target && this.target[REFCOUNT] || 0;
+    }
+
+    set refCount(count) {
+        if (this.target) {
+            this.target[REFCOUNT] = count;
+        }
+    }
+
+    dispose() {
+        if (!this.refCount) {
+            return;
+        }
+        if (--this.refCount === 0) {
+            this.target.dispose();
+            delete this.target;
+        }
+    }
+}
+
+module.exports = RefCountDisposable;
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/state.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/state.js
new file mode 100644
index 0000000000000000000000000000000000000000..336339a7e17ffd0ac7042614b4f6c71fe875277c
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/state.js
@@ -0,0 +1,83 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx-jquery',
+    '@IrsteaBdohBundle/lib/moment'
+], ($, Rx, moment) => {
+    const DATE_FORMAT = 'YYYYMMDDHHmmss';
+
+    const State = function (window) {
+        const newState = this.input = new Rx.Subject();
+        const newHash = new Rx.BehaviorSubject(window.location.hash);
+
+        Rx.Observable
+            .fromEvent(window, 'popstate')
+            .map((ev) => ev.target.location.hash)
+            .subscribe(newHash);
+
+        this.output = newHash
+            .map((hash) => {
+                try {
+                    return this.parse(hash);
+                } catch (_err) {
+                    return false;
+                }
+            }, this)
+            .filter(Rx.helpers.identity)
+            .publish();
+
+        newState
+            .map(function (state) {
+                try {
+                    return this.toString(state);
+                } catch (err) {
+                    return false;
+                }
+            }, this)
+            .filter(Rx.helpers.identity)
+            .subscribe((hash) => window.history.pushState(null, null, `viewer#${hash}`));
+    };
+
+    State.prototype.connect = function () {
+        this.output.connect();
+    };
+
+    State.prototype.parse = function (hash) {
+        const [dates, ...parts] = hash.substr(1).split('/');
+        if (!dates || dates.length < 28) {
+            return false;
+        }
+
+        return {
+            dates: {
+                start: moment.utc(dates.substr(0, 14), DATE_FORMAT),
+                end: moment.utc(dates.substr(14), DATE_FORMAT)
+            },
+            graphs: parts.map((graph) => {
+                const [left = '', right = ''] = graph.split('|');
+                return [left, right]
+                    .map((ids) => ids.split(',').map(Number.parseInt));
+            })
+        };
+    };
+
+    State.prototype.toString = function ({dates: {start, end}, graphs}) {
+        if (!start || !end) {
+            return false;
+        }
+        const dates = start.utc().format(DATE_FORMAT) + end.utc().format(DATE_FORMAT);
+        const parts = graphs.map(graph =>
+            graph
+                .map(ids => ids.join(','))
+                .join('|')
+        );
+
+        return [dates, ...parts].join('/');
+    };
+
+    return State;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/x-axis-config.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/x-axis-config.js
new file mode 100644
index 0000000000000000000000000000000000000000..5b995c860cfe054ee23f594aa9d7a51510422de5
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/services/x-axis-config.js
@@ -0,0 +1,103 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'translator',
+    '@IrsteaBdohBundle/lib/moment',
+    '@IrsteaBdohBundle/lib/jqplot'
+], ($, Translator, moment) => {
+
+    const ds=Translator.trans('dateSeparator', {}, 'messages');
+
+    const formats = {
+        'second': `DD${ds}MM  HH:mm:ss.SSS`,
+        'minute': `DD${ds}MM${ds}YY  HH:mm:ss`,
+        'hour': `DD${ds}MM${ds}YYYY  HH[h]mm`,
+        'day': `DD${ds}MM${ds}YYYY`,
+        'month': `DD${ds}MM${ds}YYYY`,
+        'year': `DD${ds}MM${ds}YYYY`
+    };
+
+    const intervals = $.map(
+        [
+            [1, 'second'], [2, 'second'], [5, 'second'], [10, 'second'], [30, 'second'],
+            [1, 'minute'], [2, 'minute'], [5, 'minute'], [10, 'minute'], [30, 'minute'],
+            [1, 'hour'], [2, 'hour'], [6, 'hour'], [12, 'hour'],
+            [1, 'day'], [2, 'day'], [5, 'day'], [10, 'day'],
+            [1, 'month'], [2, 'month'], [6, 'month'],
+            [1, 'year']
+        ],
+        ([amount, unit]) => ({
+            amount,
+            unit,
+            duration: moment.duration(amount, unit).asMinutes(),
+            format: formats[unit]
+        })
+    );
+
+    function tickInterval(start, end, targetNumberOfTicks) {
+        const targetInterval = end.diff(start, 'minutes', true) / targetNumberOfTicks;
+        let best;
+        let bestDelta;
+        intervals.forEach((interval) => {
+            const delta = Math.abs(targetInterval - interval.duration);
+            if (!best || delta <= bestDelta) {
+                best = interval;
+                bestDelta = delta;
+            }
+        });
+        return best;
+    }
+
+    function momentFormatter(format, val) {
+        return moment(val).utc()
+            .format(format);
+    }
+
+    function createXAxisConfig({start, end}) {
+        if (!moment.isMoment(start)) {
+            return {'error': `invalid range start: ${start}`};
+        }
+        if (!moment.isMoment(end)) {
+            return {'error': `invalid range end: ${end}`};
+        }
+        if (start.isSame(end)) {
+            end.add(1, 'ms');
+        }
+
+        const interval = tickInterval(start, end, 10);
+        const firstTick = start.utc().ceil(interval.amount, interval.unit);
+        const ticks = [];
+
+        if (start.isBefore(firstTick)) {
+            ticks.push(start.valueOf())
+        }
+        const d = firstTick.clone();
+        while (d.isBefore(end)) {
+            ticks.push(d.valueOf());
+            d.add(interval.amount, interval.unit)
+        }
+        ticks.push(end.valueOf());
+
+        return {
+            label:`${Translator.trans('Date')} [${Translator.trans('UTC')}]`,
+            min: start.valueOf(),
+            max: end.valueOf(),
+            ticks,
+            tickRenderer: $.jqplot.CanvasAxisTickRenderer,
+            tickOptions: {
+                angle: -90,
+                formatString: interval.format,
+                formatter: momentFormatter,
+                enableFontSupport: true,
+                fontSize: '0.95em'
+            }
+        };
+    }
+
+    return createXAxisConfig;
+});
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/simple.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/simple.js
new file mode 100644
index 0000000000000000000000000000000000000000..2bfbb744a6b7aed2b229b444c36c079b1f64990e
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/simple.js
@@ -0,0 +1,165 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'translator',
+    './base',
+    'rx',
+    './widgets/serie-config/single-graph',
+    './widgets/graph',
+], ($, Translator, baseViewer, Rx, SingleGraphSerieConfig) => {
+
+    return $.widget(
+        'viewer.simpleViewer',
+        baseViewer,
+        {
+            options: {
+                id: null,
+                allowRangeOutOfBoundaries: true
+            },
+
+            _create() {
+                this._super();
+
+                const showControlPoints = new Rx.BehaviorSubject(true);
+
+                this.element.find('.controlPoints').on('click', (ev) => {
+                    showControlPoints.onNext(ev.target.checked);
+                });
+
+                const config = new SingleGraphSerieConfig();
+
+                this._config  = showControlPoints.map(
+                    checked => {
+                        config.showControlPoints = checked;
+                        return config;
+                  });
+
+                this._setupMeasures();
+            },
+
+            _setupMeasures() {
+                const holder = new Rx.SerialDisposable(Rx.Disposable.empty);
+                const id = this.options.id;
+
+                this._measures = this._measureRepository
+                    .flatMap((repo) => repo.getMeasures(id))
+                    .do((measures) => holder.setDisposable(measures.acquire()))
+                    .shareReplay(1);
+
+                this._measures.subscribe((measures) => this._updateInfos(measures));
+
+                this._measures.first().subscribeOnNext(() => this._setupGraph());
+            },
+
+            _updateInfos(measures) {
+                let controlePoints = false;
+                for(const serie of measures.series){
+                    if(serie.type === 'controlPoints'){
+                        controlePoints = true;
+                        break;
+                    }
+                }
+                let dataType = 'discontinuous';
+                if(measures.samplingType === 'instantaneous'){
+                    dataType = 'instantaneous';
+                }
+                if(measures.samplingType === 'mean'){
+                    dataType = 'meanPast';
+                    if(measures.ahead){
+                        dataType = 'meanNext';
+                    }
+                }
+                if(measures.samplingType === 'cumulative'){
+                    dataType = 'cumulativePast';
+                    if(measures.ahead){
+                        dataType = 'cumulativeNext';
+                    }
+                }
+                this.element
+                    .find('.divTitleDataType')
+                    .text(Translator.trans(`titleDataType.${dataType}`, {}, 'viewer'));
+                this.element
+                    .find('.divControlPoints')
+                    .toggle(controlePoints);
+                this.element
+                    .find('.divCheckpointsOnCumulative')
+                    .toggle(measures.checkpointsOnCumulative);
+                this.element
+                    .find('.divNoticeTimeStep')
+                    .toggle(measures.samplingType === 'cumulative');
+                this.element
+                    .find('.divDummyFillerTitle')
+                    .toggle(measures.samplingType !== 'cumulative' &&
+                        (controlePoints || measures.checkpointsOnCumulative));
+                this.element
+                    .find('.divDummyFillerCheckpoints')
+                    .toggle(measures.samplingType === 'cumulative' &&
+                        (!controlePoints && !measures.checkpointsOnCumulative));
+                this.element
+                    .find('.divNoticeSubsampledText')
+                    .html(Translator.trans('subsampledInfoHelp(%num%)', {'num':measures.validCount}, 'viewer'));
+                this.element
+                    .find('span.subsampledHelp')
+                    .attr('title', Translator.trans('subsampledHelp', {}, 'viewer'))
+                    .tooltip('fixTitle');
+                this.element
+                    .find('.divNoticeSubsampled')
+                    .toggle(measures.downSampled);
+            },
+
+            _setupGraph() {
+                const left = this._measures.map((measures) => [measures]);
+
+                this.element
+                    .find('.graph-infos')
+                    .show();
+
+                this.element
+                    .find('.graph')
+                    .show()
+                    .graph({
+                        xaxis: this._xAxisConfig,
+                        left,
+                        right: Rx.Observable.just([]),
+                        serie_config: this._config,
+                        reverseAxis: false,
+                        showAdvanbcedLabel: true,
+                        allowPadding: true,
+                        plot: {
+                            width: this.element.width(),
+                            height: 520,
+                            default: {
+                                gridPadding: { left: 70, bottom: 170 },
+                                axes: {
+                                    xaxis: {
+                                        tickOptions: {
+                                            showGridline: true,
+                                            showMark: true,
+                                            showLabel: true
+                                        }
+                                    }
+                                },
+                                cursor: {
+                                    constrainZoomTo: 'none'
+                                },
+                                legend: {
+                                    show: true,
+                                    location: 's',
+                                    placement: 'outsideGrid',
+                                    renderer:$.jqplot.EnhancedLegendRenderer,
+                                    rendererOptions: {
+                                        numberRows: 1,
+                                        seriesToggle: 1
+                                    }
+                                }
+                            }
+                        }
+                    });
+            }
+        }
+    );
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/cumulative-serie-renderer.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/cumulative-serie-renderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..925002007d1796671e957640e78d09f667a26410
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/cumulative-serie-renderer.js
@@ -0,0 +1,71 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define(['jquery', '@IrsteaBdohBundle/lib/jqplot'], ($) => {
+    'use strict';
+
+    const formatColor = function (r, g, b, a) {
+        return `rgba(${r}, ${g}, ${b}, ${a})`;
+    };
+
+    const _super = $.jqplot.BarRenderer;
+
+    function CumulativeSerieRenderer() {
+        _super.apply(this, arguments);
+    }
+
+    CumulativeSerieRenderer.prototype = Object.create(_super.prototype);
+    CumulativeSerieRenderer.prototype.constructor = CumulativeSerieRenderer;
+
+    CumulativeSerieRenderer.prototype.draw = function (ctx, gridData, options) {
+        const opts = $.extend({}, options);
+        const xaxis = this._xaxis;
+        const cumulativeSeries = xaxis._series.filter((serie) => {
+                return serie.show && serie.renderer instanceof CumulativeSerieRenderer;
+            });
+        const chroniqueIds = [];
+        cumulativeSeries.forEach((serie, i) => {
+            if(!chroniqueIds.includes(serie.chroniqueId)){
+                chroniqueIds.push(serie.chroniqueId);
+            }
+        });
+        const barIndex = chroniqueIds.findIndex(id => id === this.rendererOptions.chroniqueId);
+        const ahead = this.rendererOptions.ahead;
+        const stepWidth = xaxis.series_u2p(xaxis.min + 1000 * this.rendererOptions.timeStep);
+        const numBars = chroniqueIds.length;
+        const barWidth = stepWidth / numBars;
+        const barOffset = barIndex * barWidth;
+        const shapeRenderer = this.renderer.shapeRenderer;
+        const points = [[null, null], [null, null], [null, null], [null, null]];
+        const yaxis = this._yaxis;
+        // yOffset permet de corriger la correction (!) faite en amont pour les graphes inversés.
+        const yOffset = yaxis.u2p(yaxis.max);
+        const zero = yaxis.u2p(0);
+
+        gridData.forEach((data) => {
+            const x = data[0];
+            const y = data[1];
+
+            if (x === null || y === null) {
+                return;
+            }
+
+            const left = x + barOffset - (ahead ? 0.0 : stepWidth);
+            const right = left + barWidth;
+            const top = Math.min(zero, y + yOffset);
+            const bottom = Math.max(zero, y + yOffset);
+
+            // Ces points doivent être ordonnées dans le sens des aiguilles d'une montre.
+            points[0] = [left, bottom];
+            points[1] = [left, top];
+            points[2] = [right, top];
+            points[3] = [right, bottom];
+
+            shapeRenderer.draw(ctx, points, opts);
+        });
+    };
+
+    return CumulativeSerieRenderer;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/graph.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/graph.js
new file mode 100644
index 0000000000000000000000000000000000000000..5891c4cab1ea60d95346a912f281b9c59b782feb
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/graph.js
@@ -0,0 +1,222 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx',
+    'translator',
+    './serie-config/base',
+    './reversed-axis-renderer',
+    // --
+    'jquery-ui/ui/widget',
+    './plot'
+], ($, Rx, Translator, BaseSerieConfig, ReversedAxisRenderer) => {
+
+    return $.widget(
+        'viewer.graph', {
+            options: {
+                xaxis: null,
+                left: null,
+                right: null,
+                serie_config: new BaseSerieConfig(),
+                reverseAxis: true,
+                showAdvanbcedLabel: false,
+                allowPadding: false,
+                plot: {}
+            },
+
+            _create() {
+                const disposables = this._disposables = new Rx.CompositeDisposable();
+
+                const processing = new Rx.BehaviorSubject(false);
+                const startProcess = function () {
+                        processing.onNext(true);
+                    };
+                const endProcess = function () {
+                        processing.onNext(false);
+                    };
+
+                const xaxis = this.options.xaxis
+                        .do(startProcess);
+                const yaxis = this.options.left
+                        .do(startProcess)
+                        .map(this._prepareYAxis, this);
+                const y2axis = this.options.right
+                        .do(startProcess)
+                        .map(this._prepareYAxis, this);
+                const series = Rx.Observable
+                        .combineLatest(
+                            [this.options.left, this.options.right, this.options.serie_config],
+                            (left, right, config) => {
+                                return {yaxis: left, y2axis: right, config};
+                            }
+                        )
+                        .do(startProcess)
+                        .map(this._prepareSeries, this);
+                const plot = this._plot = this.element.plot(this.options.plot);
+
+                disposables.add(
+                    Rx.Observable
+                        .combineLatest(
+                            [xaxis, yaxis, y2axis, series],
+                            (xaxis, yaxis, y2axis, series) => {
+                                if (xaxis.error || yaxis.error || y2axis.error || series.error) {
+                                    return ['error', xaxis.error || yaxis.error || y2axis.error || series.error];
+                                }
+                                return [
+                                    series.state,
+                                    {
+                                        axes: {xaxis, yaxis, y2axis},
+                                        series: series.options,
+                                    },
+                                    series.values
+                                ];
+                            }
+                        )
+                        .debounce(100)
+                        .do(endProcess)
+                        .catch((reason) => {
+                            return Rx.Observable.of(['error', reason, null]);
+                        })
+                        .subscribe((data) => {
+                            plot.plot('update', data[0], data[1], data[2]);
+                        }),
+
+                    processing
+                        .distinctUntilChanged()
+                        .filter(Rx.helpers.identity)
+                        .subscribe(() => {
+                            plot.plot('update', 'processing');
+                        })
+                );
+            },
+
+            _destroy() {
+                try {
+                    this._disposables.dispose();
+                } catch (e) {
+                    // eslint-disable-next-line no-console
+                    console.error(e);
+                }
+            },
+
+            _getYAxisLabel(measures){
+                let label = measures.dataType;
+                let unit = measures.unit;
+                if(unit){
+                    if(measures.samplingType === 'cumulative') {
+                        unit += `/${this._unitSymbolForTimeStep(measures.timeStep)}`;
+                    }
+                    unit = `[${unit}]`;
+                }
+                if(label && unit){
+                    label += ' ';
+                }
+                label += unit;
+
+                return label;
+            },
+
+            _unitSymbolForTimeStep(timeStep){
+                const standardTimeSteps = [
+                    [1, 's'],
+                    [60, 'min'],
+                    [3600, 'h'],
+                    [86400, Translator.trans('dateDayShort', {}, 'messages')]
+                ];
+                let i = 0;
+                let iMin = i;
+                let dev = Math.abs(timeStep - standardTimeSteps[i][0]);
+                let minDev = dev;
+                for(i = 1; i < standardTimeSteps.length; ++i){
+                    dev = Math.abs(timeStep - standardTimeSteps[i][0]);
+                    if(dev < minDev){
+                        minDev = dev;
+                        iMin = i;
+                    }
+                }
+                return standardTimeSteps[iMin][1];
+            },
+
+            _prepareYAxis(items) {
+                if (items.length === 0) {
+                    return {show: false};
+                }
+                const measures = items[0];
+                const options = { label: `[${measures.unit}]` };
+                if(this.options.showAdvanbcedLabel){
+                    options.label=this._getYAxisLabel(measures);
+                }
+                if (this.options.reverseAxis && measures.reverseAxis) {
+                    options.renderer = ReversedAxisRenderer;
+                }
+                options.newAxis = true;
+                if(this.options.allowPadding
+                    && (measures.samplingType === 'discontinuous'
+                        || measures.chroniqueClass === 'ChroniqueConvertie')) {
+                    options.pad = 1.1;
+                }
+                return options;
+            },
+
+            _prepareSeries(series) {
+                const options = [];
+                const values = [];
+                const prepareSerie = this._prepareSerie.bind(this, values, options, series.config);
+                let total = 0;
+                let visible = 0;
+                let withMeasures = 0;
+
+                ['yaxis', 'y2axis'].forEach((yaxis) => {
+                    const items = series[yaxis];
+                    if (!(items instanceof Array)) {
+                        return;
+                    }
+                    items.forEach((measures) => {
+                        total++;
+                        if (!measures.shown) {
+                            return;
+                        }
+                        visible++;
+                        if (measures.isEmpty() || !measures.series) {
+                            return;
+                        }
+                        withMeasures++;
+
+                        measures.series.forEach((serie) => {
+                            prepareSerie(yaxis, serie);
+                        });
+                    });
+                });
+
+                let state = 'ok';
+                if (total === 0) {
+                    state = 'empty';
+                } else if (visible === 0) {
+                    state = 'all-hidden';
+                } else if (withMeasures === 0) {
+                    state = 'no-measures';
+                }
+
+                return {options, values, state};
+            },
+
+            _prepareSerie(values, options, serieConfig, yaxis, serie) {
+                if (!serieConfig.shouldDraw(serie)) {
+                    return;
+                }
+
+                const serieOptions = {
+                    index: values.length,
+                    yaxis,
+                    markerOptions: { style: 'x', shadow: false, lineWidth: 1, size: 7.5 }
+                };
+                serieConfig.configure(serieOptions, serie);
+
+                values.push(serie.values);
+                options.push(serieOptions);
+            }
+        });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/panel.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/panel.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d91be70b8fdf1f503ef2c1202a7bd573f386ae8
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/panel.js
@@ -0,0 +1,183 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx',
+    './serie-config/multi-graph',
+    // --
+    'jquery-ui/ui/widget',
+    './y-axis',
+    './graph'
+], ($, Rx, MultiGraphSerieConfig) => {
+    'use strict';
+
+    const SIDES = {left: 0, right: 1};
+    const filterSide = function (side, items) {
+            return items.filter((item) => {
+                return item.side === side;
+            });
+        };
+
+    return $.widget(
+        'viewer.panel', {
+            _create() {
+                const element = this.element;
+
+                const subjects = this._subjects = [
+                    new Rx.BehaviorSubject([]),
+                    new Rx.BehaviorSubject([])
+                ];
+
+                const colorGen = new $.jqplot.ColorGenerator([
+                    '#1f77b4',
+                    '#ff7f0e',
+                    '#2ca02c',
+                    '#d62728',
+                    '#9467bd',
+                    '#8c564b',
+                    '#e377c2',
+                    '#7f7f7f',
+                    '#bcbd22',
+                    '#17becf'
+                ]);
+
+                const serialDisp = new Rx.SerialDisposable(Rx.Disposable.empty);
+
+                this._chroMemory = [];
+
+                const selections = this._selections = Rx.Observable
+                        .combineLatest([
+                          subjects[0],
+                          subjects[1],
+                          this.options.repository.flatMap(repo => repo.chroniques)
+                        ])
+                        .debounce(10)
+                        .map(([left, right, chroniques]) => ([
+                            left.map(({ id }) => chroniques[id]),
+                            right.map(({ id }) => chroniques[id])
+                          ]))
+                        .publish();
+
+                const chroniques = selections
+                        .flatMap(this._prepareChroniques.bind(this, colorGen, serialDisp))
+                        .map((items) => {
+                            const bySide = {left: [], right: []};
+                            items.forEach((item) => {
+                                bySide[item.side].push(item);
+                            });
+                            return bySide;
+                        })
+                        .shareReplay(1);
+
+                const yAxes = {
+                        left: this._createYAxis('left', chroniques.pluck('left')),
+                        right: this._createYAxis('right', chroniques.pluck('right'))
+                    };
+
+                element.find('.graph').graph({
+                    xaxis: this.options.xaxis,
+                    left: yAxes.left.yAxis('observeSelection'),
+                    right: yAxes.right.yAxis('observeSelection'),
+                    serie_config: Rx.Observable.of(new MultiGraphSerieConfig()),
+                    plot: { default: { gridPadding: { top: 0, bottom: 0, left: 50, right: 50 } } }
+                });
+
+                element.find('.remove-pane').tooltip({container: element});
+
+                this._on(element, {
+                    'click .remove-pane'(ev) {
+                        this._trigger('remove', ev, {panel: this});
+                    },
+                    'yaxisselect'(ev, data) {
+                        const subject = subjects[SIDES[data.side]];
+                        this._trigger('select', ev, $.extend({}, data, {
+                            selection: subject.getValue(),
+                            callback: subject.onNext.bind(subject)
+                        }));
+                    },
+                });
+
+                this._disposables = new Rx.CompositeDisposable(
+                    serialDisp,
+                    subjects[0],
+                    subjects[1],
+                    selections.connect()
+                );
+
+            },
+
+            _destroy() {
+                try {
+                    this._disposables.dispose();
+                } catch (e) {
+                    // eslint-disable-next-line no-console
+                    console.error(e);
+                }
+            },
+
+            _prepareChroniques(colorGen, serialDisp, sides) {
+                const proms = [];
+                const refs = [];
+                const chro = [];
+
+                sides.forEach((chroniques, i) => {
+                    const side = i === 0 ? 'left' : 'right';
+                    const colorOffset = i === 0 ? 0 : sides[0].length;
+                    chroniques.forEach((chronique, j) => {
+                        chro.push(chronique);
+                        proms.push(
+                            chronique
+                                .getMeasures()
+                                .then((measures) => {
+                                    refs.push(measures.acquire());
+                                    measures.side = side;
+                                    measures.index = j;
+                                    measures.color = $.jqplot.getColorComponents(colorGen.get(colorOffset + j));
+                                    return measures;
+                                })
+                        );
+                    });
+                });
+
+                const chroniquesWithMeasures = proms.length > 0
+                  ? Rx.Observable.forkJoin(proms)
+                  : Rx.Observable.of([]);
+
+                for(const c of this._chroMemory){
+                    if(!chro.includes(c)){
+                        c.measuresDisposed = true;
+                    }
+                }
+                this._chroMemory=chro;
+
+                return chroniquesWithMeasures
+                    .do((x) => {
+                        serialDisp.setDisposable(new Rx.NAryDisposable(refs));
+                    });
+
+            },
+
+            _createYAxis(side, selection) {
+                return this.element
+                    .find(`.${side}-axis`)
+                    .yAxis({
+                        side,
+                        selection
+                    });
+            },
+
+            setSelections(left, right) {
+                this._subjects[SIDES.left].onNext(left);
+                this._subjects[SIDES.right].onNext(right);
+            },
+
+            observeSelections() {
+                return this._selections;
+            }
+        })
+        ;
+})
+;
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e2ae9f3debfbd2c1f0cc4b32b1c85fa21acf399
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/index.js
@@ -0,0 +1,236 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'translator',
+    '@IrsteaBdohBundle/lib/moment',
+    'lodash',
+    '@IrsteaBdohBundle/lib/jqplot',
+    './style.css',
+], ($, Translator, moment, _) => {
+
+    let serial = 0;
+
+    function formatMesure(m) {
+        m=parseFloat(m);
+        if(m == 0){ // might be 0.0
+            return 0;
+        }else if(m < 0.1 || m > 10000){
+            return m.toExponential(3);
+        }else if(m < 1){
+            return _.round(m, 4);
+        }else if(m < 10){
+            return _.round(m, 3);
+        }else if(m < 100){
+            return _.round(m, 2);
+        }else if(m < 1000){
+            return _.round(m, 1);
+        }else if(m < 10000){
+            return _.round(m, 0);
+        }
+    }
+
+    function extractUnitFromLabel(label){
+        const unit=label.match(/^.*?\[(.*?)\]/);
+        if(unit){
+            return unit.pop().replace('unite constructeur', 'u.c.');
+        }
+        return '';
+    }
+
+    const defaultPlotOptions = {
+        axes: {
+            xaxis: {
+                tickOptions: {
+                    showMarker: false,
+                    showLabel: false,
+                    showGridline: true
+                },
+            },
+            yaxis: {
+                labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
+                pad: 1,
+                tickOptions: {
+                    showGridline: false
+                }
+            },
+            y2axis: {
+                labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
+                pad: 1,
+                tickOptions: {
+                    showGridline: false
+                }
+            }
+        },
+        title: {
+            show: false
+        },
+        legend: {
+            show: false
+        },
+        gridPadding: {top: 0, bottom: 0, left: 0, right: 0},
+        seriesDefaults: {
+            renderer: $.jqplot.LineRenderer,
+            shadow: false,
+            showLine: true,
+            showLabel: true,
+            breakOnNull: true,
+            markerOptions: {
+                show: false
+            }
+        },
+        highlighter: {
+            show: true,
+            showToolTip: true,
+            sizeAdjust: 8,
+            showMarker: true,
+            tooltipOffset: 5,
+            useAxesFormatters: true,
+            tooltipContentEditor:(str, seriesIndex, pointIndex, plot)=>{
+                return `${moment(plot.data[seriesIndex][pointIndex][0]).utc()
+                    .format(Translator.trans('formatDateTimeJS', {}, 'messages'))}, ${formatMesure(plot
+                    .data[seriesIndex][pointIndex][1])}<span class="tooltip_unite"> ${extractUnitFromLabel(plot
+                    .series[seriesIndex]._yaxis.label)}</span>`;
+            }
+        },
+        cursor: {
+            show: true,
+            showTooltip: false,
+            zoom: true,
+            constrainZoomTo: 'x',
+            dblClickReset: true
+        },
+        grid:{
+            shadow: false
+        },
+        series: []
+    };
+
+    return $.widget(
+        'viewer.plot',
+        {
+            options: {
+                width: 750,
+                height: 275,
+                default: {},
+
+                status: {
+                    icons: {
+                        'default': 'glyphicon glyphicon-alert',
+                        'processing': 'glyphicon glyphicon-hourglass spinning',
+                        'empty': 'glyphicon glyphicon',
+                        'all-hidden': 'glyphicon glyphicon-eye-close',
+                        'error': 'glyphicon glyphicon-fire'
+                    },
+                    classes: {
+                        'default': 'alert alert-info',
+                        'error': 'alert alert-danger'
+                    }
+                }
+            },
+
+            _create() {
+                this._chartId = `chart${++serial}`;
+                this._chartEl = $(`<div id="${this._chartId}"></div>`)
+                    .width(this.options.width)
+                    .height(this.options.height)
+                    .appendTo(this.element);
+                this._zoomed = false;
+                this._zoomData = {};
+                this._on(this._chartEl, {
+                    jqplotZoom(ev, gridpos, datapos, chart, cursor) {
+                        if(cursor.constrainZoomTo === 'none'){
+                            this._zoomed = true;
+                            const y1 = cursor._zoom.axes.start.yaxis;
+                            const y2 = datapos.yaxis;
+                            this._zoomData = {min: Math.min(y1, y2), max: Math.max(y1, y2)};
+                        }
+                        const start = cursor._zoom.axes.start.xaxis;
+                        const end = datapos.xaxis;
+                        ev.data = {start: Math.min(start, end), end: Math.max(start, end)};
+                        this._trigger('zoom', ev, ev.data);
+                    },
+                    jqplotResetZoom(ev) {
+                        this._zoomed = false;
+                        this._zoomData = {};
+                        this._trigger('zoomreset', ev);
+                    }
+                });
+            },
+
+            update(status, configOrMessage, values) {
+                this._chartEl.empty();
+                if (status === 'ok') {
+                    try {
+                        if (configOrMessage.axes.yaxis) {
+                            if (configOrMessage.axes.yaxis.newAxis) {
+                                configOrMessage.axes.yaxis.newAxis = false;
+                                this._zoomed = false;
+                                this._zoomData = {};
+                            }
+                            if (this._zoomed) {
+                                for(let idx=0; idx < configOrMessage.series.length; ++idx){
+                                    if(configOrMessage.series[idx].bdohSerieType === 'invalid' ||
+                                        configOrMessage.series[idx].bdohSerieType === 'gap'){
+                                        for(let idx2=0; idx2 < values[idx].length; ++idx2){
+                                            if(values[idx][idx2][0] !== null){
+                                                values[idx][idx2][1]=this._zoomData.min;
+                                            }
+                                        }
+                                    }
+                                }
+                                configOrMessage.axes.yaxis.min = this._zoomData.min;
+                                configOrMessage.axes.yaxis.max = this._zoomData.max;
+                            } else {
+                                for(let idx=0; idx < configOrMessage.series.length; ++idx){
+                                    if(configOrMessage.series[idx].bdohSerieType === 'invalid' ||
+                                        configOrMessage.series[idx].bdohSerieType === 'gap'){
+                                        for(let idx2=0; idx2 < values[idx].length; ++idx2){
+                                            if(values[idx][idx2][0] !== null){
+                                                values[idx][idx2][1]=0;
+                                            }
+                                        }
+                                    }
+                                }
+                                delete configOrMessage.axes.yaxis.min;
+                                delete configOrMessage.axes.yaxis.max;
+                            }
+                        }
+                        this._doPlot(values, configOrMessage);
+                        return;
+                    } catch(ex) {
+                        if (ex instanceof Error && ex.message === 'No data specified') {
+                            status = 'no-measures';
+                        } else {
+                            throw ex;
+                        }
+                    }
+                }
+                this._showStatus(status, configOrMessage);
+            },
+
+            _doPlot(values, config) {
+                const finalOptions = $.extend(true, {}, defaultPlotOptions, this.options.default, config);
+                this._chartEl.jqplot(values, finalOptions);
+            },
+
+            _showStatus(status, message) {
+                const icons = this.options.status.icons;
+                const classes = this.options.status.classes;
+                this._chartEl.append(
+                    $(
+                        `${'<div class="chart-state">'
+                        + '<div class="chart-state-inner '}${classes[status in classes ? status : 'default']}">`
+                        + `<i class="${icons[status in icons ? status : 'default']}"></i> ${
+                            Translator.trans(`graph.state.${status}`, {message}, 'viewer')
+                            }</div></div>`
+                    )
+                        .width(this.options.width)
+                        .height(this.options.height)
+                );
+            }
+        });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..d3c2b7496a79937369bccd4a4bfcac256357e4b9
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/plot/style.css
@@ -0,0 +1,82 @@
+
+.chart-state {
+    background: rgb(221, 221, 221);
+    border-radius: 6px;
+    position: relative;
+}
+
+.chart-state .chart-state-inner {
+    position: absolute;
+    width: 50%;
+    height: 4em;
+    margin: auto;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.chart-processing {
+    cursor: wait !important;
+}
+
+div#viewer .jqplot-axis,
+div#complex-viewer .jqplot-axis {
+    font-size: 0.95em;
+}
+
+div#viewer .jqplot-highlighter-tooltip,
+div#viewer .jqplot-canvasOverlay-tooltip,
+div#complex-viewer .jqplot-highlighter-tooltip,
+div#complex-viewer .jqplot-canvasOverlay-tooltip {
+    font-size: 0.95em;
+    white-space: pre;
+    background: rgba(255,255,212,1);
+    padding: 0 4px;
+}
+
+div#complex-viewer div.panels div[id^="chart"] {
+    margin: 0 auto;
+}
+div#complex-viewer div.panels div#chart1 {
+    background-color: rgba(255,255,0,0.2);
+    margin-top: -1px;
+}
+div#complex-viewer div.panel-container > div.panel.row:not(:first-of-type) {
+    margin-top: 10px;
+}
+div#complex-viewer div.panels > div.row.panel-buttons {
+    margin-top: 1em;
+}/*
+div#viewer span.tooltip_unite{
+    display: none;
+}*/
+div#viewer > fieldset,
+div#viewer > fieldset > div.alert-danger.feedback,
+div#complex-viewer > fieldset > div.alert-danger.feedback{
+    margin-bottom: 0;
+}
+/* gestion d'un bug sur la selection et le click sur les graphs dans chrome */
+/* potentiellement également présent sur les autres */
+div#viewer div.graph,
+div#complex-viewer div.graph{
+    -webkit-user-select:none;
+    -moz-user-select:none;
+    -ms-user-select:none;
+    user-select:none;
+}
+/* legende des graphes */
+div#complex-viewer div.graph table.jqplot-table-legend{
+    display:none;
+}
+div#viewer div.graph table.jqplot-table-legend{
+    margin:0;
+    border:0;
+    font-size: 0.95em;
+}
+div#viewer div.graph table.jqplot-table-legend td.jqplot-table-legend-label{
+    padding:5px 15px 5px 5px !important;
+}
+div#viewer div.graph table.jqplot-table-legend td.jqplot-table-legend-label:last-child{
+    padding-right:0 !important;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bb6e57ec28cae65420c1223b274330895e1f66b
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/index.js
@@ -0,0 +1,53 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx',
+    'translator',
+    // --
+    'jquery-ui/ui/widget',
+    './style.css'
+], ($, Rx, Translator) => {
+
+    return $.widget(
+        'viewer.progressBar',
+        {
+            _create() {
+                this.element.html(
+                    `<div class="viewer-progress-bar big-spinner">\
+                            <div class="background"></div>\
+                            <div class="container">\
+                                <h2>${Translator.trans('chart-loading', {}, 'viewer')}</h2 >\
+                                <div class="progress">\
+                                    <div class="progress-bar progress-bar-success"></div>\
+                                </div>\
+                            </div>\
+                        </div>`);
+
+                this.completedBar = this.element.find('.progress-bar-success');
+                this._disposables = new Rx.CompositeDisposable(this.options.state.subscribe(this._update.bind(this)));
+            },
+
+            _destroy() {
+                this._disposables.dispose();
+            },
+
+            _update(data) {
+                const el = this.element;
+
+                this.completedBar.width(`${data.progress * 100}%`);
+
+                if (data.show) {
+                    if (!el.is(':visible')) {
+                        el.fadeIn();
+                    }
+                } else if (el.is(':visible')) {
+                    el.fadeOut();
+                }
+            }
+        }
+    );
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..50a3f2a0bb42da5a0d7e1f124e8b116e8b5212f2
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/progress-bar/style.css
@@ -0,0 +1,37 @@
+.viewer-progress-bar {
+    margin: 0;
+    position: fixed;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    width: 100%;
+    height: 100%;
+    cursor: wait !important;
+}
+
+.viewer-progress-bar .background {
+    z-index: 2000;
+    background: black;
+    opacity: 0.25;
+    position: absolute;
+    width: 100%;
+    height: 100%;
+}
+
+.viewer-progress-bar .container {
+    z-index: 2005;
+    background: white;
+    position: fixed;
+    padding: 2em;
+    width: 50%;
+    left: 25%;
+    top: 50%;
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    border-radius: 6px;
+    border: 1px solid rgba(0, 0, 0, 0.2);
+}
+
+.viewer-progress-bar .progress {
+    margin: 0;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/reversed-axis-renderer.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/reversed-axis-renderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7eeb60559dfbb8b37157d753670fe7b3d196a21
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/reversed-axis-renderer.js
@@ -0,0 +1,39 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    // --
+    '@IrsteaBdohBundle/lib/jqplot'
+], ($) => {
+    'use strict';
+
+    const formatColor = function (r, g, b, a) {
+        return `rgba(${r}, ${g}, ${b}, ${a})`;
+    };
+
+    function ReversedAxisRenderer() {
+        $.jqplot.LinearAxisRenderer.apply(this, arguments);
+    }
+
+    const _super = $.jqplot.LinearAxisRenderer.prototype;
+    ReversedAxisRenderer.prototype = Object.create(_super);
+    ReversedAxisRenderer.prototype.constructor = ReversedAxisRenderer;
+
+    ReversedAxisRenderer.prototype.pack = function (pos, offsets) {
+        pos = pos || {};
+        offsets = offsets || this._offsets;
+        return _super.pack.call(
+            this,
+            pos,
+            {
+                max: Math.max(offsets.max, offsets.min),
+                min: Math.min(offsets.max, offsets.min)
+            }
+        );
+    };
+
+    return ReversedAxisRenderer;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d44ae1cae1874b590be6ec1bddfd0aa266cd4b8
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/index.js
@@ -0,0 +1,243 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'rx',
+    'translator',
+    // --
+    'jquery-ui/ui/widget',
+    'jquery-ui/ui/widgets/selectable',
+    'jquery-ui/ui/widgets/draggable',
+    'jquery-ui/ui/widgets/droppable',
+    'jquery-ui/ui/widgets/sortable',
+    './style.css'
+], ($, Rx, Translator) => {
+
+    let selectorTemplate;
+    (function () {
+        const tpl = $('#cv-selector');
+        selectorTemplate = $(tpl.html());
+        tpl.remove();
+    })();
+
+    const widget = $.widget(
+        'viewer.selector',
+        {
+            options: {
+                index: 0,
+                side: null,
+                selection: [],
+                observatoire: null,
+                stations: null
+            },
+
+            _create() {
+                const element = this.element;
+                const selection = new Rx.BehaviorSubject(this.options.selection);
+
+                // Widgets internes
+
+                const stationList = this._stationList =
+                    element
+                        .find('.stations .list')
+                        .selectable({
+                            cancel: '.loading',
+                            filter: 'li.has-measures'
+                        });
+
+                this._chroniqueList = element.find('.chroniques .list');
+
+                const selectionList = this._selectionList =
+                    element
+                        .find('.selection .list')
+                        .sortable({});
+
+                const confirmButton = element.find('button.confirm');
+
+                const selectedStations = stationList
+                    .onAsObservable('selectablestop')
+                    .map(this._getSelectedStations.bind(this));
+
+                // Tous les abonnements sont enregistrés dans un CompositeDisposable pour tout nettoyer à la fermeture
+                this._disposables = new Rx.CompositeDisposable(
+                    selection,
+                    selectedStations,
+
+                    // Met à jour le titre
+                    this.options.observatoire
+                        .subscribe(this._setTitle.bind(this)),
+
+                    // Met à jour la liste des stations
+                    this.options.stations
+                        .subscribe(this._setStations.bind(this)),
+
+                    // Met à jour la liste des chroniques
+                    selectedStations
+                        .map(this._getChroniqueStations.bind(this))
+                        .combineLatest([selection, selectedStations], this._filterChroniques.bind(this))
+                        .shareValue('emptySelection')
+                        .subscribe(this._setChroniques.bind(this)),
+
+                    // Met à jour l'affichage de la sélection
+                    selection
+                        .subscribe(this._setSelection.bind(this)),
+
+                    // Met à jour la sélection quand on dépose ou retire une chronique
+                    selectionList
+                        .onAsObservable('sortstop')
+                        .merge(
+                            selectionList.onAsObservable('click', '.close')
+                                .do((ev) => {
+                                    $(ev.target).closest('.chronique')
+                                        .remove();
+                                })
+                        )
+                        .map(this._getSelection.bind(this))
+                        .subscribe(selection),
+
+                    // Bouton ok
+                    selection
+                        .sample(confirmButton.onAsObservable('click'))
+                        .subscribe(this.options.callback),
+
+                    // Gestion de la fermeture de la modale (bootstrap)
+                    element
+                        .onAsObservable('hidden.bs.modal')
+                        .subscribe(() => {
+                            element.remove();
+                        })
+                );
+
+                // Affiche la modale
+                element.modal('show');
+            },
+
+            _destroy() {
+                this._disposables.dispose();
+            },
+
+            _setTitle() {
+                this.element.find('h1.title').text(
+                    `${Translator.trans('selector.graph', {}, 'viewer')} ${this.options
+                        .index} - ${Translator.trans(`${this.options.side}-axis`, {}, 'viewer')}`
+                );
+            },
+
+            _setStations(stations) {
+                const list = this._stationList;
+                list.empty();
+                $.each(stations, (id, station) => {
+                    $(`<li class="station"><strong>${station.name}</strong> - ${station.code}</li>`)
+                        .toggleClass('has-measures', station.hasMeasures)
+                        .data('station', station)
+                        .appendTo(list);
+                });
+            },
+
+            _getSelectedStations() {
+                const stations = [];
+                this._stationList.find('.station.ui-selected').each((i, el) => {
+                    stations.push($(el).data('station'));
+                });
+                return stations;
+            },
+
+            _getChroniqueStations(stations) {
+                const chroniques = {};
+                $.each(stations, (id, station) => {
+                    $.extend(chroniques, station.chroniques);
+                });
+                return chroniques;
+            },
+
+            _filterChroniques(chroniques, selection, stations) {
+                if (stations.length === 0) {
+                    return 'emptySelection';
+                } else if ($.isEmptyObject(chroniques)) {
+                    return 'noChronicles';
+                }
+
+                const selected = {};
+                selection.forEach((chronique) => {
+                    selected[chronique.id] = true;
+                });
+
+                const first = selection[0];
+                let available = 0;
+                const result = [];
+
+                $.each(chroniques, (idx, chronique) => {
+                    if (selected[chronique.id] || !chronique.hasMeasures) {
+                        return;
+                    }
+                    available++;
+                    if (!first || chronique.isDisplayableWith(first)) {
+                        result.push(chronique);
+                    }
+                });
+
+                if (available === 0) {
+                    return 'noMoreChronicles';
+                } else if (result.length === 0) {
+                    return 'noCompatibleChronicles';
+                }
+
+                return result;
+            },
+
+            _setChroniques(chroniques) {
+                const list = this._chroniqueList;
+                list.empty();
+
+                if (typeof chroniques === 'string') {
+                    list.html(Translator.trans(`selector.chroniques.${chroniques}`, {}, 'viewer'));
+                    return;
+                }
+
+                $.each(chroniques, (id, chronique) => {
+                    const widget = $(`<li class="chronique"><strong>${chronique}</strong> - ${ 
+                        chronique.paramName} [${chronique.unitLabel}]</li>`)
+                        .data('chronique', chronique)
+                        .toggleClass('has-measures', chronique.hasMeasures)
+                        .appendTo(list);
+
+                    if (chronique.hasMeasures) {
+                        widget.draggable({
+                            revert: 'invalid',
+                            connectToSortable: '.selection .list'
+                        });
+                    }
+                });
+            },
+
+            _setSelection(chroniques) {
+                const list = this._selectionList;
+                list.empty();
+                $.each(chroniques, (id, chronique) => {
+                    const c = $(`<li class="chronique"><button class="close pull-right">&times;</button>${ 
+                        chronique} [${chronique.unitLabel}]</li>`)
+                        .data('chronique', chronique)
+                        .appendTo(list);
+                });
+            },
+
+            _getSelection() {
+                const sel = [];
+                this._selectionList.find('.chronique').each((i, el) => {
+                    sel.push($(el).data('chronique'));
+                });
+                return sel;
+            }
+        }
+    );
+
+    widget.open = function (options) {
+        return selectorTemplate.clone().appendTo($('body'))
+            .selector(options);
+    };
+
+    return widget;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..3607738ca91376487044a19c1238d0af5a4df2e9
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/selector/style.css
@@ -0,0 +1,61 @@
+@import '../spinning.css';
+
+.selector .modal-dialog {
+    width: 860px;
+}
+
+.selector ul.list {
+    border-style: solid;
+    border-color: darkgrey;
+    border-width: 1px;
+    border-radius: 3px;
+    height: 125px;
+    overflow-x: hidden;
+    overflow-y: auto;
+    list-style-type: none;
+    list-style-position: inside;
+    padding: 3px 3px;
+    margin: 0;
+}
+
+
+.selector .stations .loading {
+    width: 100%;
+    line-height: 125px;
+    font-size: 30px;
+    text-align: center;
+    position: absolute;
+    vertical-align: bottom;
+}
+
+.selector .chronique {
+    width: 385px;
+}
+
+.selector .stations li:not(.has-measures),
+.selector .chroniques li:not(.has-measures) {
+    color: gray;
+    font-style: italic;
+    cursor: default;
+}
+
+.selector li.ui-selected,
+.selector li.ui-selecting {
+    background: #9999FF !important;
+}
+
+.selector li.has-measures:hover {
+    background-color: #CCCCFF;
+}
+
+.selector .stations li.has-measures {
+    cursor: pointer;
+}
+
+.selector .chroniques li.has-measures  {
+    cursor: move;
+}
+
+.selector .selection li  {
+    cursor: move;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/base.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e79ccbd8f71d5e5b1165f7b198fcf364d433a85
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/base.js
@@ -0,0 +1,94 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    '../cumulative-serie-renderer'
+], ($, CumulativeSerieRenderer) => {
+    'use strict';
+
+    function BaseSerieConfig() {
+    }
+
+    BaseSerieConfig.prototype.shouldDraw = function (serie) {
+        return serie.type !== 'controlPoints';
+    };
+
+    BaseSerieConfig.prototype.configure = function (options, serie) {
+        this._applySerieType(options, serie);
+        this._applyRendererType(options, serie);
+    };
+
+    BaseSerieConfig.prototype._applySerieType = function (options, serie) {
+        // sauvegarde du type de la série dans les options du graphe
+        // pour la gestion du zoom en Y sur les invalides et les gaps
+        options.bdohSerieType = serie.type;
+
+        // enregistrement du label pour la legende du graphe simple
+        options.label = serie.label;
+        options.showLabel = serie.showLabel;
+
+        // desactivation du tooltip sur les invalides et les gaps
+        if (serie.type === 'invalid' || serie.type === 'gap') {
+            options.showHighlight = false;
+        }
+
+        // couleur des lignes (par défaut)
+        options.color = this._formatColor(0, 0, 255); // bleu #0000FF
+        if (serie.type === 'invalid' || serie.type === 'gap') {
+            options.color = this._formatColor(255, 0, 0); // rouge #FF0000
+        }
+
+        // épaisseur des lignes (par défaut)
+        options.lineWidth = 1;
+        if (serie.type === 'invalid' || serie.type === 'gap') {
+            options.lineWidth = 5;
+        }
+
+        // marqueurs des bornes des plages des discontinues (par défaut)
+        if (serie.type !== 'invalid' && serie.type !== 'gap' &&
+            serie.measures.samplingType === 'discontinuous') {
+            options.showMarker = true;
+            options.markerOptions.show = true;
+            options.markerOptions.shadow = false;
+            options.markerOptions.style = 'filledCircle';
+            options.markerOptions.lineWidth = 2;
+            options.markerOptions.size = 5;
+        }
+    };
+
+    BaseSerieConfig.prototype._getColor = function (serie, r, g, b) {
+        return this._formatColor(r, g, b, 1.0);
+    };
+
+    BaseSerieConfig.prototype._formatColor = function (r, g, b, a) {
+        return (
+            (typeof a === 'number')
+                ? `rgba(${r}, ${g}, ${b}, ${a})`
+                : `rgb(${r}, ${g}, ${b})`
+        );
+    };
+
+    BaseSerieConfig.prototype._applyRendererType = function (options, serie) {
+        if (serie.type !== 'invalid' &&
+            serie.type !== 'gap' &&
+            serie.type !== 'controlPoints' &&
+            serie.measures.samplingType === 'cumulative') {
+            $.extend(options, {
+                renderer: CumulativeSerieRenderer,
+                rendererOptions: {
+                    barPadding: 0,
+                    barMargin: 0,
+                    fillToZero: true,
+                    timeStep: serie.measures.timeStep,
+                    ahead: serie.measures.ahead,
+                    chroniqueId: serie.measures.id,
+                }
+            });
+        }
+    };
+
+    return BaseSerieConfig;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/multi-graph.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/multi-graph.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b97cf4a4393707dd7bc00474c93467abe075c16
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/multi-graph.js
@@ -0,0 +1,32 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define(['./base'], (BaseSerieConfig) => {
+    'use strict';
+
+    function MultiGraphSerieConfig() {
+        BaseSerieConfig.call(this);
+    }
+
+    const _super = BaseSerieConfig.prototype;
+    MultiGraphSerieConfig.prototype = Object.create(_super);
+
+    MultiGraphSerieConfig.prototype._getColor = function (serie, r, g, b) {
+        if (serie.type === 'invalid' || serie.type === 'gap') {
+            return this._formatColor(r, g, b, 0.6);
+        }
+        return _super._getColor.call(this, serie, r, g, b);
+    };
+
+    MultiGraphSerieConfig.prototype._applySerieType = function (options, serie) {
+        _super._applySerieType.call(this, options, serie);
+
+        // couleurs des lignes (définies avec jqplot.ColorGenerator() dans panel.js)
+        options.color = this._getColor(serie, serie.measures.color[0], serie.measures.color[1], serie.measures.color[2]);
+    };
+
+    return MultiGraphSerieConfig;
+
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/single-graph.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/single-graph.js
new file mode 100644
index 0000000000000000000000000000000000000000..57820ea14a54ded35b63fb8148188e1af47651ff
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/serie-config/single-graph.js
@@ -0,0 +1,51 @@
+/*
+ * © 2017 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define(['./base'], (BaseSerieConfig) => {
+    'use strict';
+
+    function SingleGraphSerieConfig() {
+        BaseSerieConfig.call(this);
+        this.showControlPoints = true;
+    }
+
+    const _super = BaseSerieConfig.prototype;
+    SingleGraphSerieConfig.prototype = Object.create(_super);
+
+    SingleGraphSerieConfig.prototype.shouldDraw = function (serie) {
+        return this.showControlPoints || serie.type !== 'controlPoints';
+    };
+
+    SingleGraphSerieConfig.prototype._applySerieType = function (options, serie) {
+        _super._applySerieType.call(this, options, serie);
+
+        // couleur des lignes (en fonction du style)
+        options.color = this._getColor(serie, serie.style.color[0], serie.style.color[1], serie.style.color[2]);
+
+        // épaisseur des lignes (en fonction du style)
+        options.lineWidth = serie.style.thickness;
+
+        // marqueurs des bornes des plages des discontinues (en fonction du style)
+        if (serie.type !== 'invalid' && serie.type !== 'gap' &&
+            serie.measures.samplingType === 'discontinuous') {
+            options.markerOptions.style =  serie.style.shape;
+            options.markerOptions.lineWidth = serie.style.stroke;
+            options.markerOptions.size = serie.style.size;
+        }
+
+        // points de contrôle (en fonction du style)
+        if (serie.type === 'controlPoints') {
+            options.showLine = false;
+            options.showMarker = true;
+            options.markerOptions.show = true;
+            options.markerOptions.shadow = false;
+            options.markerOptions.style = serie.style.shape;
+            options.markerOptions.lineWidth = serie.style.stroke;
+            options.markerOptions.size = serie.style.size;
+        }
+    };
+
+    return SingleGraphSerieConfig;
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/spinning.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/spinning.css
new file mode 100644
index 0000000000000000000000000000000000000000..2554fd4c926edb21933a57f1e33dea7f9a764c42
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/spinning.css
@@ -0,0 +1,9 @@
+
+.spinning {
+    animation: spinning 1s infinite linear;
+}
+
+@keyframes spinning {
+    from { transform: scale( 1 ) rotate( 0deg );   }
+    to   { transform: scale( 1 ) rotate( 360deg ); }
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/x-axis/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/x-axis/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..01f365128e4d21b118c5f7b8d72ba07571af7b71
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/x-axis/index.js
@@ -0,0 +1,72 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    // --
+    'jquery-ui/ui/widget',
+    '../plot',
+    './style.css'
+], ($) => {
+
+    //noinspection JSDuplicatedDeclaration
+    return $.widget(
+        'viewer.xAxis', {
+            options: {
+                default: {
+                    axes: {
+                        xaxis: {
+                            rendererOptions: {
+                                baselineColor: '#666666'
+                            },
+                            tickOptions: {
+                                showGridline: false,
+                                showMark: true,
+                                showLabel: true,
+                            }
+                        },
+                        yaxis: {
+                            show: false,
+                            tickOptions: {
+                                show: false
+                            }
+                        }
+                    },
+                    title: {
+                        show: false
+                    },
+                    legend: {
+                        show: false
+                    },
+                    grid: {
+                        drawBorder: false,
+                        background: 'transparent',
+                        shadow: false
+                    },
+                    gridPadding: {top: 0, bottom: 120, left: 50, right: 50}
+                }
+            },
+
+            _create() {
+                const plot = this.element.plot({ height: 120, default: this.options.default });
+
+                this._disposables = this.options.config
+                    .subscribe((config) => {
+                        config.showLabel = false;
+                        plot.plot(
+                            'update',
+                            'ok',
+                            {axes: {xaxis: config}},
+                            [[[config.min, null], [config.max, null]]]
+                        )
+                    });
+            },
+
+            _destroy() {
+                this._disposables.dispose();
+            },
+        });
+})
+;
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/x-axis/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/x-axis/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/index.js b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1fe0d8a7eacc0cf40a03906d087403f7ce6ddefd
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/index.js
@@ -0,0 +1,158 @@
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+define([
+    'jquery',
+    'translator',
+    'rx',
+
+    // --
+    'jquery-ui/ui/widget',
+    './style.css'
+], ($, Translator, Rx) => {
+    'use strict';
+
+    let rowTemplate;
+    (function () {
+        const tpl = $('#cv-selection-row');
+        rowTemplate = $(tpl.html());
+        tpl.remove();
+    })();
+
+    // L'axe en entier
+
+    return $.widget('viewer.yAxis', {
+        _create() {
+            const hidden = new Rx.BehaviorSubject({});
+            const selection = this._selection = Rx.Observable
+                .combineLatest(
+                    [this.options.selection, hidden],
+                    this._assignVisibility
+                )
+                .shareValue([]);
+
+            this._tableRows = this.element.find('table.selection tbody');
+
+            this._disposables = new Rx.CompositeDisposable(
+                hidden,
+
+                // Met à jour le tableau de chroniques
+                selection.subscribeOnNext(this._updateTable, this)
+            );
+
+            this._on(this.element, {
+                // Clic sur le bouton d'édition de la liste
+                'click .select'(ev) {
+                    ev.preventDefault();
+                    this._trigger('select', ev, {side: this.options.side});
+                },
+                // Clic sur le toggle d'une chronique
+                'click .toggle'(ev) {
+                    ev.preventDefault();
+                    const id = $(ev.target).closest('.chronique')
+                        .data('item').id;
+                    const flags = hidden.getValue();
+                    flags[id] = !flags[id];
+                    hidden.onNext(flags);
+                }
+            });
+        },
+
+        _destroy() {
+            try {
+                this._disposables.dispose();
+            } catch (e) {
+                // eslint-disable-next-line no-console
+                console.error(e);
+            }
+        },
+
+        _updateTable(selection) {
+            const container = this._tableRows;
+            const rows = container.find('tr');
+            container.closest('table').toggle(selection.length > 0);
+            if (selection.length < rows.length) {
+                rows.slice(selection.length).remove();
+            }
+            let timeStepText = '';
+            for(const item of selection){
+                if(item.samplingType === 'cumulative' && item.timeStep){
+                    let readableTimeStep;
+                    switch(item.timeStep) {
+                        case 3600:
+                            readableTimeStep = Translator.trans('oneHour', {}, 'messages');
+                            break;
+                        case 86400:
+                            readableTimeStep = Translator.trans('oneDay', {}, 'messages');
+                            break;
+                        default:
+                            readableTimeStep = Translator.trans('nSeconds(%n%)', {'n':item.timeStep}, 'messages')
+                    }
+                    timeStepText = Translator.trans('histogramTimeStepsIs(%ts%)', {'ts': readableTimeStep}, 'viewer');
+                    break;
+                }
+            }
+            selection.forEach((item, i) => {
+                let row;
+                if (i < rows.length) {
+                    row = $(rows[i]);
+                } else {
+                    row = rowTemplate.clone().addClass('chronique')
+                        .appendTo(container);
+                    row.find('.toggle').data('index', i);
+                }
+                row.data('item', item);
+                row.find('.infoTimeStep')
+                    .attr('title', timeStepText)
+                    .tooltip({html:true})
+                    .tooltip('fixTitle')
+                    .toggle(item.samplingType === 'cumulative' && !!item.timeStep);
+                row.find('.downSampled')
+                    .attr('title', Translator.trans('subsampledInfo(%num%)', {'num':item.validCount}, 'viewer'))
+                    .tooltip('fixTitle')
+                    .toggle(item.downSampled);
+                row.find('.noDataOnRange')
+                    .attr('title', Translator.trans('timeSeriesNoMeasures', {}, 'viewer'))
+                    .tooltip({html:true})
+                    .tooltip('fixTitle')
+                    .toggle(!item.series || item.series.length === 0);
+                row.find('.title')
+                    .text(item)
+                    .attr('title', Translator.trans('chroniqueTitle(%station%, %typeParam%)',
+                        {'station':item.stationName, 'typeParam':`${item.dataType} [${item.unit}]`}, 'viewer'))
+                    .tooltip({html:true})
+                    .tooltip('fixTitle');
+                row.find('.title').text(`${item} [${item.unit.replace('unite constructeur', 'u.c.')}]`);
+                row.find('.toggle')
+                    .css({
+                        opacity: item.shown ? 1.0 : 0.4,
+                        color: `rgb(${item.color[0]}, ${item.color[1]}, ${item.color[2]})`
+                    })
+                    .tooltip({trigger:'hover'})
+                    .tooltip('fixTitle');
+                const chroniqueLink = row.find('a.chroniqueLink');
+                const chroniqueLinkHref = rowTemplate.find('a.chroniqueLink').attr('href');
+                chroniqueLink.attr('href', chroniqueLinkHref
+                    .replace('_STATION_CODE_', item.stationCode)
+                    .replace('_CHRONIQUE_CODE_', item.chroniqueCode)
+                );
+                row.find('.chroniqueLinkIcon')
+                    .tooltip({trigger:'hover', container:$('body')})
+                    .tooltip('fixTitle');
+            });
+        },
+
+        _assignVisibility(items, hidden) {
+            items.forEach((item) => {
+                item.shown = !hidden[item.id];
+            });
+            return items;
+        },
+
+        observeSelection() {
+            return this._selection;
+        },
+    });
+});
diff --git a/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/style.css b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..9f63a946f9262c5d6bfde73d56fede58000ed74d
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/assets/lib/viewer/widgets/y-axis/style.css
@@ -0,0 +1,11 @@
+
+.selection .toggle {
+    text-decoration: line-through;
+    line-height: 1em;
+    padding: 3px 4px;
+}
+
+.selection .toggle:before {
+    content: "\25AC\25AC";
+    vertical-align: middle;
+}
diff --git a/src/Irstea/BdohConsultBundle/Resources/config/services.yml b/src/Irstea/BdohConsultBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a1c600fda062199de89f96c1e38064d8d8940387
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/config/services.yml
@@ -0,0 +1,17 @@
+parameters:
+    irstea_bdoh_consult.json_schema.cache_lifeTime: 1200
+
+services:
+    irstea_bdoh_consult.json_schema.loader:
+        class: Irstea\BdohConsultBundle\Service\JsonSchema\HttpLoader
+    irstea_bdoh_consult.json_schema.apcucache:
+        class: Doctrine\Common\Cache\ApcuCache
+    irstea_bdoh_consult.json_schema.caching_loader:
+        class: Irstea\BdohConsultBundle\Service\JsonSchema\CachingLoader
+        decorates: irstea_bdoh_consult.json_schema.loader
+        public: false
+        arguments:
+            - '@irstea_bdoh_consult.json_schema.caching_loader.inner'
+            - '@irstea_bdoh_consult.json_schema.apcucache'
+
+            - "%irstea_bdoh_consult.json_schema.cache_lifeTime%"
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/chronique.ep b/src/Irstea/BdohConsultBundle/Resources/doc/chronique.ep
new file mode 100644
index 0000000000000000000000000000000000000000..710a1ec5cb411032e9deadad92097fa551493ee5
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/chronique.ep
@@ -0,0 +1,256 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Fiche Chronique</Property><Property name="id">1343747555439_2581</Property><Property name="width">908</Property><Property name="height">1250</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,1147)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="72eda8205781444397fca844b4528e04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="24edfb6dda434053a1b297406ba78699" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ad8427bd24b1461689fbd43e57091f01">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ad8427bd24b1461689fbd43e57091f01)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="19f683b7fb3e42e5b99f6dea1a6d2f67"/>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="53c80e2ba30b42cbb2395c11242dbc46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="4502ecc4a9d549b8a207719a417eee6d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="ae0f5b0bdc794f918a5e0bf160111dfc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="1d45fbf8a13948aab60e32cf180ee001"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Chronique <span style="font-style: italic;">CA-224</span></span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="208" height="28" p:name="htmlObject" id="9abf7c5b890d4888a327ffb1d3699aac" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="973cd76d9d564af18926311f9fc73732" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Chronique <span style="font-style: italic;">CA-224</span></span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="01ac64217e2a4d5d92cbaca20f5c4d76" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="1eb7fecc18fb4d4688e68ec813cdddb5" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="84b617c6bc0647828e26d6b234d5c9ca" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="385d70f0f489496fa182c89f5d6f50ef" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="3acdb787527845bd9e570a82553c16ba">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#3acdb787527845bd9e570a82553c16ba)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f03a1bb845db4312a20a7a43721eb926"/>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="2be0e67db1284407b3da7fd5865a5385" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4ce30b8309724909bc0643717248bc3d" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="62d760d019b94776ba3f7af8e581b9d3" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6c258d2f87394f0d9dece203c3430962">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6c258d2f87394f0d9dece203c3430962)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="7ba7c2a7435f4752b9b9750a85d986c4"/>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="031a45df67c04df0a4e7b94ddd3f3d76" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="610e2c6c204b4ac28076a58a678e9134" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="37d0f3b368ef4c979629cb0b7669617c">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a59711fc86f647e89709d17492d98aab">
+                    <ellipse p:name="ellipse" id="3968cc6b329c4b26a4bda3a2f2113dab" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#37d0f3b368ef4c979629cb0b7669617c)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1959982575744ae9272b739b811a58c"/>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="25312fe8b33e4fedb0aa1a329be33d54" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4eef4dde0ed74d8baa753ac678a21a01" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7456a8f1b1b44da793d9506e7e852639" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e98f3c848f51437290aa87f3a7f53164"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="29deac56c78f4d35a50491319b4601ee" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="83c1b59032764d13bd7d25722d9164ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bb423d153df47fc8a5c115f81191a74"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="726b685e70c24ee99605b6fe4c13df67" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d01cdd3e6e4f46508cb0a06d7bd761f7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d1fb761440834b208549a3e0d51472bb"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="666ae23733ca483eb94a5fa8e3efa56b" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b523bff85a134877b2f5f7ad1125b9f8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6f52d269248d446abc5261a9744323b6" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b22675b9402047878a0adc3262c1ad02" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="76713801a93742d3ac222377c0da89a8" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f77e54ddf4bc420e921cfdb7421c9df2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3a563687c0dc45a792fe4e482fd46eb8"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="995480f6c1a64828b06175d1eb076b9c" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="a52d7d17917d4c4f939ed4f7af59c4b1" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b02403a035914528aa73b690d2b4ace8" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="b06f7e1c2b094cdfa92a1082cc06e321" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="533a921c393d455c87c3274d528c818b" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="4818e27cd60d4024b7a42a09a982a710" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="c11cb640d4ff45b5b48f62705fd4cc64" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="0071d041f0d84114ae69751c738e81e7" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8f50f551f10c4f978530327aba1c7363" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6408b52adae43b6a2aec0c79ad6fa08" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="16bdca3913b94d51b95e7a75bae31cfa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa98326e39994fbbb623684c8afca91b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="8ea7fe783b5046eaa85e282f7ed9a687" transform="matrix(1,0,0,1,691,119)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Boîte à outils]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="28ee3f54f2cd455e91c16fe1f893b267" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="ef4dd2cf945a4470a1e5b92f6a349c11" transform="translate(0.5,0.5)" d="M 0 0 L 19.53060787441527 0.23196257959266608 L 41.590983267237156 -0.004142894741451575 L 64.28437925623187 0.2646332736849538 L 82.04620008997307 -0.13972561153935914 L 101.15578284333834 0.35244212971550126 L 117.68653740021126 0.4566001002337218 L 140.42111763091685 0.1666907631698894 L 162.20664891463608 0.14827597241828905 L 179.81675003757368 0.17272711798934914 L 200 0 L 200.4769482281945 14.449358644755803 L 200 25 L 182.02065783719374 24.727467068255162 L 161.45415701998627 25.152688331361787 L 137.69582804360172 25.111946290500082 L 119.24984691634066 25.355624181974203 L 99.35338715633827 25.243946160248004 L 80.04352826019253 24.546460363513795 L 57.78769963790393 25.279974161026185 L 35.667894288361786 24.829037728193565 L 13.63734090578218 24.766628008898074 L 0 25 L -0.44129847607032313 14.24689002743212 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b20a814c3e664cc8a50fd2c030712f33" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Boîte à outils</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="2a84ee40374d4ebbba7f23ee1b43cf86" transform="matrix(1,0,0,1,36.453125,179.5625)"><p:metadata><p:property name="box"><![CDATA[410.9375,292.578125]]></p:property><p:property name="textPadding"><![CDATA[20.546875000000004,19.505208333333332]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="d3b8461c70f44e088b9a7aaba64e7031" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="b85c19d021e24cac9d3b6551b0840b3d" transform="translate(0.5,0.5)" d="M 0 0 L 23.326455114778817 -0.43341032582815475 L 43.79870287865258 -0.3549142906306402 L 64.43887200961552 0.10557177468472301 L 83.12655394155735 0.48308839411397553 L 103.91450883555957 -0.25352875534981223 L 126.36932472246673 0.0010031266075077871 L 144.30501718946738 -0.2652872329825441 L 161.066306114942 0.4547667948301287 L 182.64455392808097 -0.14234195650083104 L 201.72668879878682 -0.024844734343708486 L 223.21101008619232 -0.4407650827886028 L 245.16668419455527 -0.08069124598362487 L 264.8303155383583 0.4447276656259235 L 288.4607964791466 0.2781466641010112 L 304.5344276131612 -0.05228503245534266 L 326.91062182944967 -0.36237941298045595 L 350.20591267046757 0.3605289475596688 L 369.4050140035684 0.47511334050460585 L 385.9628518615934 0.422653447073019 L 410.9375 0 L 411.23875758350675 17.785033481531077 L 410.47375015626005 41.023849861222885 L 410.88182085828066 57.53013140808284 L 410.58167586379903 80.78803144095102 L 410.9659830098672 101.86449821844643 L 411.23285930849926 119.75941507282133 L 410.6701854299228 142.67470767619548 L 411.21715947700784 162.68555616434364 L 411.327256572185 181.7380975740839 L 410.52776851362995 205.47567593978934 L 410.9514952339973 224.74961442631673 L 410.6737426522332 244.97226537914642 L 411.3046302621249 262.96568849341713 L 410.9375 292.578125 L 391.39177488227233 292.3743322406707 L 370.05444616614693 292.72499333091946 L 350.06028809505983 293.04751156337903 L 329.62278784046526 292.11702549248776 L 310.6110267783816 293.0427510966653 L 291.351520907426 292.12806850391337 L 270.17433857337323 292.7114489330531 L 248.87949429103483 292.17000560584626 L 231.38211612665268 292.96892566063184 L 213.03566398813902 292.4134721599213 L 194.78163892071146 292.1224975105481 L 177.95020880937565 292.3352143314827 L 157.32591889687959 292.6758425059687 L 133.47548723291965 292.3356006562477 L 112.34008669421989 292.3753602053016 L 90.8227141003458 292.09324108362347 L 71.70421013154868 292.14185292946075 L 50.66081578812862 292.9693326037874 L 27.522938711551742 292.9877703980537 L 0 292.578125 L -0.12203277761670261 269.7400217473006 L 0.1631205955895626 251.1121204978387 L 0.4076114478396412 233.33110517032213 L 0.2955163364108998 212.31949914171776 L -0.162522049333787 193.46300488872404 L 0.39878954995307625 170.8759431505082 L -0.007712708279865144 148.13925811192908 L -0.20718525465562954 129.21375242273513 L 0.39537304927828243 106.47972745925166 L 0.05560825890144572 83.27322516642509 L -0.019847342643439014 64.30821982486474 L 0.08233655362569037 41.13644086059591 L -0.30509428982026066 23.247924484473348 L 0 0 z"/>
+    		</g>
+            <foreignObject x="20.5469" y="146" width="369.844" height="0" p:name="text" id="923bafea971842e4b19b7c7c35840f74" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="b1c9bae7a7ca45be9f61f3140b226e5a" transform="matrix(1,0,0,1,469.203125,179.5625)"><p:metadata><p:property name="box"><![CDATA[416.796875,292.578125]]></p:property><p:property name="textPadding"><![CDATA[20.83984375,19.505208333333332]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="55d5dbd47fcf4cf585054c6ec16584d0" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="d7554c4da37242b8b291ec500285d18f" transform="translate(0.5,0.5)" d="M 0 0 L 17.528701257856046 0.2810799391181976 L 39.90155969101722 0.2566917191631366 L 57.53052106849524 0.39866642993911927 L 80.05141444063959 0.11677738735540377 L 101.67351892118374 0.03126584298306567 L 123.31883239038606 0.44279583410405454 L 141.92435320116317 0.3058124193085513 L 160.43028240423337 -0.33604977062302377 L 179.5732089946556 -0.021711468216988217 L 201.0308717523001 0.1170530990781945 L 219.58056102661635 -0.27672835205967083 L 241.18013674620826 0.16632578464102088 L 263.0783098013178 -0.2037105650957518 L 280.007242996784 0.3688429964952119 L 302.88740432527845 0.10203198339593322 L 320.63679552831553 -0.4661263925600211 L 340.2515783514013 0.17353390231980137 L 359.1416805296307 0.04022636352697917 L 380.41558710741765 0.21424880102794552 L 416.796875 0 L 416.4577243020838 18.443361500957874 L 417.12309783950013 38.314185327536606 L 416.8254061773858 61.25960866012397 L 416.766541300218 78.97003150446538 L 416.5440963239119 97.62884565298158 L 416.32490627524635 116.7239050309444 L 416.7563758718911 138.0843252856918 L 417.02116381446905 157.80185405367524 L 416.9491323739548 176.88824523487182 L 416.7923720265544 199.15668892025283 L 416.4863776305586 217.7977724674414 L 416.588048914501 235.98472323669938 L 417.1013025543913 255.91656662147142 L 416.796875 292.578125 L 395.41973651614205 292.71460968178076 L 374.1815359650919 292.23190332230325 L 352.3098275176087 292.1088709056218 L 331.91023124610325 292.7609128973719 L 315.0074405408546 292.300140819747 L 296.0454111041738 292.6548529044731 L 276.99579621353234 292.3641192817808 L 253.6561529314828 292.22073424295326 L 236.63279490932993 292.7349972040813 L 215.42126411476124 292.08865251975885 L 194.70233851487276 292.14370160049356 L 174.9280257772994 292.70134537865624 L 154.65075244436449 292.3174338393623 L 135.68869171833012 292.8409378306708 L 118.01721134588665 292.1677025301071 L 95.58341639558752 292.3070566535698 L 79.20048310198119 292.23545314462143 L 59.01221736738636 292.39100147987233 L 35.63208996214657 292.7061661396004 L 0 292.578125 L 0.13002799464612358 274.17608535621 L -0.2688506557572703 253.24262845371226 L 0.16055833143947496 236.72073572671698 L -0.015164709065050741 213.70555198960267 L 0.44925138176905965 192.36898438479477 L 0.041724341445096735 172.89875902004215 L 0.37017079931409547 152.28745594869815 L 0.09376711011589567 132.25210227296878 L -0.29112375076501695 113.58814557281838 L -0.03260895833231392 94.66683041685992 L -0.11219171179426024 77.28579161301926 L 0.20329780494770178 57.02931627838127 L -0.41739180518132746 39.81550549815169 L 0 0 z"/>
+    		</g>
+            <foreignObject x="20.8398" y="146" width="375.117" height="0" p:name="text" id="8d072878cd244baca24eb844036fadf8" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="4c7736a59c4a464db7d36d2acf23169a" transform="matrix(1,0,0,1,52.546875,186.046875)"><p:metadata><p:property name="textContent"><![CDATA[<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="0" height="24" p:name="htmlObject" id="287753e608c24354853b04b36af5fccd" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="e603fe7cbd9a4551ac8c2a86214c087d" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="8059f93cdf944532a2469a93cfec1bf6" transform="matrix(1,0,0,1,487.078125,186.453125)"><p:metadata><p:property name="textContent"><![CDATA[Généalogie]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="106" height="24" p:name="htmlObject" id="1416885cb02147dfb9617d0dc4a18cf1" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="f10cbe8880bf4ea9adfa49a86c842c34" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Généalogie</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="c61be67ed1c744b9b2f1f8963d337ec7" transform="matrix(1,0,0,1,33.453125,495.5625)"><p:metadata><p:property name="box"><![CDATA[854.296875,292.578125]]></p:property><p:property name="textPadding"><![CDATA[42.714843750000014,19.505208333333332]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="70de1a69e3ea43c995e51f67b1874489" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="6eea9d589523422f871b15d1728969bf" transform="translate(0.5,0.5)" d="M 0 0 L 18.57136285670838 0.21794929823106768 L 41.67842131300794 0.2654060851334106 L 60.596500178316234 0.31506650146688986 L 79.06576993594442 0.20959324653507383 L 100.21404639856341 0.25637878894308463 L 120.82047610248281 0.2526812308365334 L 139.4766870344864 0.45091917882124677 L 156.0354641431417 0.413838896696876 L 176.80534239841532 0.28605748453749924 L 196.98414715317506 0.03592368628884668 L 214.80376062361367 -0.11273258871434344 L 234.76418241673758 0.3098309326048939 L 252.48322271359996 -0.4552510098633068 L 272.54117756114056 -0.36398734089853946 L 291.3049575835233 -0.44373873608890335 L 310.7593743196569 0.4502391033878368 L 331.9295740133211 -0.011255608970470288 L 351.88468976841625 -0.2490757301043115 L 373.1821592126912 0.4098814097454654 L 394.8554079861043 -0.01685751359345189 L 411.8551156398077 -0.08856933779848186 L 431.9421702653073 -0.327482290511257 L 450.0441307600277 0.15007852836145164 L 472.90096906206236 0.3825466150048963 L 494.57109128900674 -0.1857711338922775 L 513.3642403511517 0.17306073903011876 L 531.125836682389 0.016442890127835175 L 553.3138806031203 -0.14373419721535463 L 575.3503408466474 -0.02457149775292644 L 595.1584694958433 0.43031114208674326 L 612.5975356482307 -0.16281565436768408 L 635.5719173754977 0.17821080399693146 L 656.2852413049777 0.17513911662093362 L 675.5033081088308 -0.028895826755676923 L 693.0056173935858 0.1712732418175581 L 711.0333824088583 0.33762894049818526 L 731.0736384290677 -0.4839736338155416 L 751.4117872873297 0.24327896694330553 L 774.3451501632575 -0.03958734964154731 L 791.2751597821681 0.26210248317529294 L 811.6062742757495 0.2296939889791395 L 854.296875 0 L 854.114827592953 20.774409198494684 L 854.2377417469039 40.66908303088983 L 854.6955273124962 63.95411831526313 L 854.687222408824 81.77751971219288 L 853.8279449718027 101.9431865762443 L 854.5056988311499 124.41922057177389 L 854.7823335497825 143.68278018524893 L 854.0206016052215 164.44244723975623 L 854.6403370540775 183.1754383356453 L 854.7821026775139 201.1231608035416 L 853.8817136637707 218.39274188330336 L 854.4298457615232 236.96468268780723 L 854.684278050099 258.88164272642945 L 854.296875 292.578125 L 835.7388018560213 292.6624243073244 L 818.5808389491773 292.8098236809499 L 796.2025660606039 292.17756357436275 L 775.9116961795089 292.2545642202138 L 754.4567055715305 292.5476169491516 L 736.3465152187653 292.6339059929414 L 712.8807992175848 292.8469390135982 L 692.3175027477474 292.9411383690835 L 671.9988940736451 293.038661928435 L 651.433515571164 292.5270778339979 L 632.3369429269007 292.8207201913903 L 612.2431871850282 292.4044933513331 L 595.3144449369463 292.8422766297233 L 574.2298534474548 292.7661499878171 L 552.5274382811301 292.59233011978745 L 534.7818877219901 292.9375039159324 L 515.5120077819315 292.07880227606034 L 495.4532719018986 292.27727602736684 L 473.2117659768721 292.31635249944895 L 450.95946798243256 292.622280299849 L 433.96891664260266 292.37944020504443 L 417.62592065076603 292.46280678478047 L 397.8354564840214 292.3429993683944 L 378.98819953926 292.2067536313098 L 360.38713804014293 292.30014304939004 L 338.73563762639264 292.3291367135865 L 321.4056967524009 293.0225878111545 L 299.4804711781847 292.4525258323621 L 281.7716098553578 292.9073553018786 L 257.9424471218415 292.11668372611297 L 235.53674919240257 293.0595362568414 L 214.0695159931965 292.18491108760065 L 192.38953434534824 292.6066174763039 L 175.60783182221084 292.1224016753422 L 154.90978116355203 292.27058594185735 L 135.41246742377416 292.2497279630888 L 112.07094667683803 292.4696187553565 L 94.81203146908766 292.1132320706855 L 74.17783636294408 292.64589915994213 L 55.04812580056765 292.2737842056623 L 37.73138709169994 292.46860287011447 L 0 292.578125 L -0.41580888190344323 275.65566033141766 L -0.4453130615003409 252.12438006328452 L -0.2492375681192074 229.5371295766162 L 0.43988912402026126 210.14910284655434 L -0.02649755254569397 193.83204896922106 L -0.3719367393316998 174.47601043914514 L -0.46601661989554444 151.3950338827873 L 0.3916280265081966 132.36280009611536 L 0.1490514042518276 114.17867796643661 L -0.3542340619377148 94.13418692595054 L -0.3723794245527663 74.53628143225944 L 0.08695646248553224 53.74187390796435 L -0.13059345781392284 33.26343089176786 L 0 0 z"/>
+    		</g>
+            <foreignObject x="42.7148" y="146" width="768.867" height="0" p:name="text" id="ebccf272a7a5403b9ae14c83f0d40542" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="3407fee13fa24d2494be382391726659" transform="matrix(1,0,0,1,373.546875,519.046875)"><p:metadata><p:property name="textContent"><![CDATA[Tableau de lacunes<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="182" height="24" p:name="htmlObject" id="ba50842de7114c7ca7e3f773b63635f4" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="603730b23636421fac0a134b838ec71e" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Tableau de lacunes<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="7adbe55294734ebeb54aabdcf95b29ec" transform="matrix(1,0,0,1,67.25,615.25)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[Très similaire à celui de Biche :<br /><br />Tableau de 10 lignes / page : 1 ligne par année.<br />12 colonnes : 1 colonne par mois<br /><br />1 camembert par année.<br />1 camembert par couple [année ; mois]<br /><br />Chaque camembert contient un lien permettant d'afficher, sur le visualisateur, les mesures correspondant à sa période.<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="682" height="135" p:name="htmlObject" id="eb621c2eda3f4ee79f9ea68b41453103" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="8aea67c3792e45d29f495f7ff3892dab" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml">Très similaire à celui de Biche :<br /><br />Tableau de 10 lignes / page : 1 ligne par année.<br />12 colonnes : 1 colonne par mois<br /><br />1 camembert par année.<br />1 camembert par couple [année ; mois]<br /><br />Chaque camembert contient un lien permettant d'afficher, sur le visualisateur, les mesures correspondant à sa période.<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="ab65e3a986094ff3a2169d421e1c12c7" transform="matrix(1,0,0,1,36.453125,834.5625)"><p:metadata><p:property name="box"><![CDATA[854.296875,292.578125]]></p:property><p:property name="textPadding"><![CDATA[42.714843750000014,19.505208333333332]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="5c14df88201a47a5b33ff34a1d505d33" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="f80a21fb1a94493d970c8e9912583be3" transform="translate(0.5,0.5)" d="M 0 0 L 18.57136285670838 0.21794929823106768 L 41.67842131300794 0.2654060851334106 L 60.596500178316234 0.31506650146688986 L 79.06576993594442 0.20959324653507383 L 100.21404639856341 0.25637878894308463 L 120.82047610248281 0.2526812308365334 L 139.4766870344864 0.45091917882124677 L 156.0354641431417 0.413838896696876 L 176.80534239841532 0.28605748453749924 L 196.98414715317506 0.03592368628884668 L 214.80376062361367 -0.11273258871434344 L 234.76418241673758 0.3098309326048939 L 252.48322271359996 -0.4552510098633068 L 272.54117756114056 -0.36398734089853946 L 291.3049575835233 -0.44373873608890335 L 310.7593743196569 0.4502391033878368 L 331.9295740133211 -0.011255608970470288 L 351.88468976841625 -0.2490757301043115 L 373.1821592126912 0.4098814097454654 L 394.8554079861043 -0.01685751359345189 L 411.8551156398077 -0.08856933779848186 L 431.9421702653073 -0.327482290511257 L 450.0441307600277 0.15007852836145164 L 472.90096906206236 0.3825466150048963 L 494.57109128900674 -0.1857711338922775 L 513.3642403511517 0.17306073903011876 L 531.125836682389 0.016442890127835175 L 553.3138806031203 -0.14373419721535463 L 575.3503408466474 -0.02457149775292644 L 595.1584694958433 0.43031114208674326 L 612.5975356482307 -0.16281565436768408 L 635.5719173754977 0.17821080399693146 L 656.2852413049777 0.17513911662093362 L 675.5033081088308 -0.028895826755676923 L 693.0056173935858 0.1712732418175581 L 711.0333824088583 0.33762894049818526 L 731.0736384290677 -0.4839736338155416 L 751.4117872873297 0.24327896694330553 L 774.3451501632575 -0.03958734964154731 L 791.2751597821681 0.26210248317529294 L 811.6062742757495 0.2296939889791395 L 854.296875 0 L 854.114827592953 20.774409198494684 L 854.2377417469039 40.66908303088983 L 854.6955273124962 63.95411831526313 L 854.687222408824 81.77751971219288 L 853.8279449718027 101.9431865762443 L 854.5056988311499 124.41922057177389 L 854.7823335497825 143.68278018524893 L 854.0206016052215 164.44244723975623 L 854.6403370540775 183.1754383356453 L 854.7821026775139 201.1231608035416 L 853.8817136637707 218.39274188330336 L 854.4298457615232 236.96468268780723 L 854.684278050099 258.88164272642945 L 854.296875 292.578125 L 835.7388018560213 292.6624243073244 L 818.5808389491773 292.8098236809499 L 796.2025660606039 292.17756357436275 L 775.9116961795089 292.2545642202138 L 754.4567055715305 292.5476169491516 L 736.3465152187653 292.6339059929414 L 712.8807992175848 292.8469390135982 L 692.3175027477474 292.9411383690835 L 671.9988940736451 293.038661928435 L 651.433515571164 292.5270778339979 L 632.3369429269007 292.8207201913903 L 612.2431871850282 292.4044933513331 L 595.3144449369463 292.8422766297233 L 574.2298534474548 292.7661499878171 L 552.5274382811301 292.59233011978745 L 534.7818877219901 292.9375039159324 L 515.5120077819315 292.07880227606034 L 495.4532719018986 292.27727602736684 L 473.2117659768721 292.31635249944895 L 450.95946798243256 292.622280299849 L 433.96891664260266 292.37944020504443 L 417.62592065076603 292.46280678478047 L 397.8354564840214 292.3429993683944 L 378.98819953926 292.2067536313098 L 360.38713804014293 292.30014304939004 L 338.73563762639264 292.3291367135865 L 321.4056967524009 293.0225878111545 L 299.4804711781847 292.4525258323621 L 281.7716098553578 292.9073553018786 L 257.9424471218415 292.11668372611297 L 235.53674919240257 293.0595362568414 L 214.0695159931965 292.18491108760065 L 192.38953434534824 292.6066174763039 L 175.60783182221084 292.1224016753422 L 154.90978116355203 292.27058594185735 L 135.41246742377416 292.2497279630888 L 112.07094667683803 292.4696187553565 L 94.81203146908766 292.1132320706855 L 74.17783636294408 292.64589915994213 L 55.04812580056765 292.2737842056623 L 37.73138709169994 292.46860287011447 L 0 292.578125 L -0.41580888190344323 275.65566033141766 L -0.4453130615003409 252.12438006328452 L -0.2492375681192074 229.5371295766162 L 0.43988912402026126 210.14910284655434 L -0.02649755254569397 193.83204896922106 L -0.3719367393316998 174.47601043914514 L -0.46601661989554444 151.3950338827873 L 0.3916280265081966 132.36280009611536 L 0.1490514042518276 114.17867796643661 L -0.3542340619377148 94.13418692595054 L -0.3723794245527663 74.53628143225944 L 0.08695646248553224 53.74187390796435 L -0.13059345781392284 33.26343089176786 L 0 0 z"/>
+    		</g>
+            <foreignObject x="42.7148" y="146" width="768.867" height="0" p:name="text" id="083c723dd53f433c911a6763f04ff412" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="61a47143e57c42e1a4e9e817a06f30fe" transform="matrix(1,0,0,1,373.546875,859.046875)"><p:metadata><p:property name="textContent"><![CDATA[Visualisateur]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="122" height="24" p:name="htmlObject" id="9c2a961c3a9147f69c59ffc1a81fd408" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="e5cfea3d10914f10ad793d61fff87301" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Visualisateur</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="496a43d5ad50488d8260fae82da5f3c2" transform="matrix(1,0,0,1,487.75,274)"><p:metadata><p:property name="width"><![CDATA[338,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="textContent"><![CDATA[<span style="font-style: italic;">(pour la généalogie, le champ texte est affiché brut)</span><br /><br /><span style="font-style: italic;">(dans le cas où la généalogie n'est pas affichée - par exemple si réservée aux techniciens - alors le bloc descriptif des données de la signalétique est ramené ici)</span><br style="font-style: italic;" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="338" height="75" p:name="htmlObject" id="8518f9b20f924864b48037e131ffc18a" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="c3f8fc2da8094a6a81af232047c73047" style="display: inline-block; width: 338px; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-style: italic;">(pour la généalogie, le champ texte est affiché brut)</span><br /><br /><span style="font-style: italic;">(dans le cas où la généalogie n'est pas affichée - par exemple si réservée aux techniciens - alors le bloc descriptif des données de la signalétique est ramené ici)</span><br style="font-style: italic;" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e0fadcf598854541af0e272836fb1044" transform="matrix(1,0,0,1,49,195)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Concentration en NH4 prise sous le pont amont]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ea8a947a3c6a4a29a88968ea762834c5" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="b1b3989fa6c24f4f92cd3748edf533d6"><tspan x="0" y="0">Concentration en NH4 prise sous le pont amont</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,50,381)" id="495cd4a2f91743e38a2dcd2fc38a54d8"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="706209b75cc34e52a4fcee0adb710e7c" transform="matrix(1,0,0,1,0,6)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de remplissage :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a3798c87e0e6410d9699338ab65014dd" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="254e2d4610264a649e65b03ffb42a7b4"><tspan x="0" y="0">Taux de remplissage :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="4913738c620b4f20abf85aa9eaaca973" transform="matrix(1,0,0,1,180,0)"><p:metadata><p:property name="box"><![CDATA[21,21]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="15dff6ae24d14d7d87d4557392730483">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="8c1526d6867a4010957ade979342df37">
+                    <ellipse p:name="ellipse" id="772ee6d5d90843a5bf5415d6bf687178" cx="10.5" cy="10.5" rx="10.5" ry="10.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#8c1526d6867a4010957ade979342df37" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#15dff6ae24d14d7d87d4557392730483)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="bc2486cf6fd14cbb91c7f6f93c0f1db9"/>
+            <use xlink:href="#8c1526d6867a4010957ade979342df37" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="3" width="21" height="15" p:name="text" id="c9d8cc3330824c03b5540b44c1ddd9ed" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><br /></div></foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,51,331)" id="7bcc27e7987c4201811512c9bc965a21"><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="1bb875daa8954f82bbfcbe5ac4c0bf16" transform="matrix(1,0,0,1,26.5,4.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1e0c6a4c899d449086919c7b3e435e83" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d335fe7b2cda4033a0be895461f60405"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0af40f6eaa9346cfa71c1c4e19272b04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="eddc513f402e49d89f14491111766779" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0b7a36d7d2dc4210967aaa7b4657adb6"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="86f67666a209454ba03ee0959b52b35c" transform="matrix(1,0,0,1,61,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="72335fb82d8947679bc8d1c9ec33a9ad" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3f815d7e374d4b72a2bb956e4707a14b"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,236,331)" id="929b247797484cae9363ff9081e4dc27"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c58e19535a0c483cad08ba69d9f15d1a" transform="matrix(1,0,0,1,5.684341886080802e-14,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1114177dad1f4316b8703956bc8c833a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="2b25a393779c4f44b562ea0c47b8c55d"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c4784fd5b51e4c5dadeb027134580b19" transform="matrix(1,0,0,1,46,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c8bc0f2630fb4544a86aaeb12ae63d8b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="91d274c8345c471290136a33cf3ccaad"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,53,362)" id="6339e9e6a02c41c8b64348e89d9591fe"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7eda677086fe4483aeba6bac7365090c" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nombre de mesures :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b41f774b8c69476b95a1a147522abdb6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0a7b242b1f344f26937da2df06232a01"><tspan x="0" y="0">Nombre de mesures :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="8d8206f9a3af47a48207c85827e32d5a" transform="matrix(1,0,0,1,167,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[1 237 221]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6df9c5e47c104e7fa7486098d3c0bb7a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="43fe68fd96284ff895803dadfe93426c"><tspan x="0" y="0">1 237 221</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,50,306)" id="3feac232ee6a4c47ad15b6756c371e0a"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="697e960f0916432b87b4f93dbd2bdfeb" transform="matrix(1,0,0,1,28.5,0.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8cb91e2c03b24da7a8e76aca54a9fde4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="871e4ba1d6754fadb6a437d4db801a6e"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a233d09186f541dd8a943ab8e6073b20" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Minimum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ad41182a60da4d3ab94b7050851d9cce" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="943f0b001ab343379c2bae0648ad58f4"><tspan x="0" y="0">Minimum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f0b6afbafbdc496e91f44cb03c4d4cf3" transform="matrix(1,0,0,1,136,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[50.5]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3c8419c28b584a8788f9fc60670692cf" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7e1d0beed1c04343b26fcddc3c58ba9f"><tspan x="0" y="0">50.5</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,237,306)" id="f210c5eedb9345f4b04961654fedee25"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="743fba1611cb4181bfbe97e85b36dcd5" transform="matrix(1,0,0,1,5.684341886080802e-14,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Maximum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="fcae84a2fa81405c934ff4a4a0b9ce38" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="327541bd028a46dab59a63ffc6c4bac1"><tspan x="0" y="0">Maximum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="de9a384468dc4b9b89a0182e2dd10d3c" transform="matrix(1,0,0,1,135,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[5000.85]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="eadc79d883124f6e9ab3d01184768234" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3e822f743926412591e268533373e961"><tspan x="0" y="0">5000.85</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,49,240)" id="362a5b20bb1549a197224dec4b27845d"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="854ea0588e524480b60b478fdac1743c" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Paramètre :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="63526443b075416cb6b9a74e124a3d7e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="21345e62678d4f67a000a287ce96baad"><tspan x="0" y="0">Paramètre :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d9799a2805734157ae940b30921b5469" transform="matrix(1,0,0,1,93,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[Concentration en azote sous forme N-NH4 dissous]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f43b14138879488a927a735bf51b1058" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="83d9f427b98b4cd7954718e07b5e708a"><tspan x="0" y="0">[Concentration en azote sous forme N-NH4 dissous]</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,252,216)" id="c27033431f4b48ef89f11f44264bb070"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="90eabf0f629b429cafabfab330b490c9" transform="matrix(1,0,0,1,28.5,0.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="094befe76d2e46b380556fe6bcfe7e37" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="303bb389012e4376bcaed48c129754a9"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e82a430f1556439e93ac095346215e8d" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Unité :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="730dd6b187a3436a8d33649ae3a8a3b6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f3e149f28e674246b88e0c919e624277"><tspan x="0" y="0">Unité :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7fa96f8ec86d442086f8d2b6b2d16203" transform="matrix(1,0,0,1,72,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[µg/L]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a48c99af441b44f6b8f5fbc43328d594" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8b8e126c23c84a1988ec56c4960fb3f3"><tspan x="0" y="0">µg/L</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="eff5974bd3774794aaec104d11c5bfdf" transform="matrix(1,0,0,1,78.5,340.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="54ff214a2ff84aa28d397a48461874c8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5e6eb7aaa0824ad4a87e21353f2e4324"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,49,216)" id="6157ae51ad65477cb0da33073d4aa1fd"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3cf9e7a28fd7476d908aba06e14b367d" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Station :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c331f9b7c79d49499c5cd901668887e0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="99acf39f1f284ba1b9cadf284bf66120"><tspan x="0" y="0">Station :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="8dc2aecb0fb6403ba0ec8179b3615896" transform="matrix(1,0,0,1,81,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[BABAOU]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0495d365b01040f7afe25a86de43b734" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="818039dfb12b4271a14d91100be6b752"><tspan x="0" y="0">[BABAOU]</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,49,262)" id="0ffad94273364691b913da049bed1322"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a5c81e8693904ba4bf7e0f7887eb1983" transform="matrix(1,0,0,1,0,5.684341886080802e-14)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Producteur :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="67c94ab29a254b04a8235daab4b6aa0f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7ec1bb76b5a240d18a8bb7a091175df0"><tspan x="0" y="0">Producteur :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="84073c07bba546ae8e1be98c195f9337" transform="matrix(1,0,0,1,99,5.684341886080802e-14)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hydrologie-Hydraulique IRSTEA Lyon]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ce748c7b38114e8b9467e66bbfa4fdcb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="45bba207c5c34c70a5ac6dbbc3d23df8"><tspan x="0" y="0">Hydrologie-Hydraulique IRSTEA Lyon</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:tab" id="6467ebf8f68b4d3ea0be272529dbe2fc" transform="matrix(1,0,0,1,37,799)"><p:metadata><p:property name="box"><![CDATA[90,35]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="selected"><![CDATA[true]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Visualisateur]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="d804372bdcc84a7391a1548f836d987e" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 12.801673,0.54494216 c 3.314701,-0.0352053 7.573557,-0.0890949 7.573557,-0.0890949 l 9.303121,0.28181817 8.814904,-0.0695124 7.648939,-0.21610285 10.722374,0.34092343 8.532977,-0.06653 7.912504,-0.13988077 7.482767,0.24608667 c 3.626099,0.54342239 8.567352,3.03702269 8.395326,6.17228789 l 0.09915,3.0270916 0.169651,5.440829 0.320925,4.665193 -0.220173,5.51029 0.05642,4.261539 -0.194682,4.709292 L 78.972906,34.79986 71.358529,34.78491 61.024168,34.622897 51.670695,34.441941 44.075442,34.552909 34.433383,34.74434 27.610762,34.66976 18.987081,34.795183 9.3624747,34.593551 0.50906708,34.619172 0.7793527,29.919697 0.7538155,26.107691 0.62109819,22.175759 0.91240035,18.01618 0.44387272,13.884022 0.50371576,8.4666042 C 1.4978957,3.4882952 3.1208872,3.295014 7.2739642,1.133705 8.3402909,0.57877605 10.899509,1.1741957 12.801673,0.54494216 z" p:name="line1" id="502e5fb12b104a8da56494e8c356504e" transform="scale(1,1)"/>
+
+            </g>
+            <path style="fill: white; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1; visibility: visible;" p:name="line2" id="f74adbd49b9f41f99e7cc2c9b9fd4419" d="M 1.5 31 L 23.722374199486843 31.368205639718198 L 44.121065760577004 31.4426706475998 L 65.41451307376548 30.634205820995298 L 88.5 31 L 88.2318121682345 34.37641703764117 L 88.5 38 L 67.87020322601276 37.97336598992487 L 47.71613736086276 38.34694501198853 L 28.316622779085414 38.06900094054697 L 1.5 38 z"/>
+            <foreignObject x="0" y="10" width="90" height="15" p:name="text" id="c8d12ec54a14487889b5c21c6ba87087" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">Visualisateur</div></foreignObject>
+
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:tab" id="5dc6db8ea9c548b988f0d04e5d8ac115" transform="matrix(1,0,0,1,128,800)"><p:metadata><p:property name="box"><![CDATA[90,35]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="selected"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Tableau]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="761bc40a8da84a369eedcb32073fe30c" style="fill: rgb(229, 229, 229); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 12.801673,0.54494216 c 3.314701,-0.0352053 7.573557,-0.0890949 7.573557,-0.0890949 l 9.303121,0.28181817 8.814904,-0.0695124 7.648939,-0.21610285 10.722374,0.34092343 8.532977,-0.06653 7.912504,-0.13988077 7.482767,0.24608667 c 3.626099,0.54342239 8.567352,3.03702269 8.395326,6.17228789 l 0.09915,3.0270916 0.169651,5.440829 0.320925,4.665193 -0.220173,5.51029 0.05642,4.261539 -0.194682,4.709292 L 78.972906,34.79986 71.358529,34.78491 61.024168,34.622897 51.670695,34.441941 44.075442,34.552909 34.433383,34.74434 27.610762,34.66976 18.987081,34.795183 9.3624747,34.593551 0.50906708,34.619172 0.7793527,29.919697 0.7538155,26.107691 0.62109819,22.175759 0.91240035,18.01618 0.44387272,13.884022 0.50371576,8.4666042 C 1.4978957,3.4882952 3.1208872,3.295014 7.2739642,1.133705 8.3402909,0.57877605 10.899509,1.1741957 12.801673,0.54494216 z" p:name="line1" id="1fba7c3b7bf24bdaa5edb73875527567" transform="scale(1,1)"/>
+
+            </g>
+            <path style="fill: white; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1; visibility: hidden;" p:name="line2" id="c799cec96a6a472e8ef9f7e1ed0338a2" d="M 1.5 31 L 19.874936620980247 31.235760799677855 L 37.11824217161986 31.03069119068948 L 57.8206953097519 30.726888355288196 L 88.5 31 L 88.96041417105675 33.523800091047356 L 88.5 38 L 67.68586465060497 38.39635271013067 L 46.72856566118941 38.237476623536715 L 24.34121210578863 37.59821965007898 L 1.5 38 z"/>
+            <foreignObject x="0" y="10" width="90" height="15" p:name="text" id="6aa08820768b434188eede038e115198" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">Tableau</div></foreignObject>
+
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="7f9388a91dd6429b969af76331fdf7c9" transform="matrix(1,0,0,1,320,933)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[Différentes fonctions :<br /><ul><li>Sélecteur de dates (début et fin) pré rempli par le choix de camembert</li><li>Lacunes en rouge, barêmes de couleurs différentes</li><li>Zoom, export image du graphe</li><li>"Navigation" dans le temps par flèches spécifiques (ex : +1 an, - 1 mois, etc.)</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="487" height="95" p:name="htmlObject" id="c6c82dc4bd404a3187ba38ea46ba7a3e" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="dccdce0ea3154a56b0d80b3fa77ba95b" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml">Différentes fonctions :<br /><ul><li>Sélecteur de dates (début et fin) pré rempli par le choix de camembert</li><li>Lacunes en rouge, barêmes de couleurs différentes</li><li>Zoom, export image du graphe</li><li>"Navigation" dans le temps par flèches spécifiques (ex : +1 an, - 1 mois, etc.)</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="45ea99b08fa247639644d2b6bdcb39a3" transform="matrix(1,0,0,1,221,811)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(les données sous forme de tableau ?)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="afebd0fc672843a6b96dd61093970c3f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="4380e6055cb1412cbdd4cd099c8bfac5"><tspan x="0" y="0">(les données sous forme de tableau ?)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ba1fff8b6b3a475580611a04b6301f53" transform="matrix(1,0,0,1,557.5,100.375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(identique à la boîte à outils Chronique de la fiche Station)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="60ad1559236b4b91ac68d6d87ff52bdc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="cb65b1ce9c2b4f888e3b85e342821f42"><tspan x="0" y="0">(identique à la boîte à outils Chronique de la fiche Station)</tspan></text>
+        </g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/connexion.ep b/src/Irstea/BdohConsultBundle/Resources/doc/connexion.ep
new file mode 100644
index 0000000000000000000000000000000000000000..ca0ebebe66a593dff858c55697bd980745af43c2
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/connexion.ep
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Connexion</Property><Property name="id">1343747555439_2581</Property><Property name="width">908</Property><Property name="height">400</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,310)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="72eda8205781444397fca844b4528e04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="24edfb6dda434053a1b297406ba78699" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ad8427bd24b1461689fbd43e57091f01">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ad8427bd24b1461689fbd43e57091f01)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="19f683b7fb3e42e5b99f6dea1a6d2f67"/>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="53c80e2ba30b42cbb2395c11242dbc46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="4502ecc4a9d549b8a207719a417eee6d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="ae0f5b0bdc794f918a5e0bf160111dfc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="1d45fbf8a13948aab60e32cf180ee001"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="84b617c6bc0647828e26d6b234d5c9ca" transform="matrix(1,0,0,1,126.58433532714844,19)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="385d70f0f489496fa182c89f5d6f50ef" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="3acdb787527845bd9e570a82553c16ba">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#3acdb787527845bd9e570a82553c16ba)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f03a1bb845db4312a20a7a43721eb926"/>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="2be0e67db1284407b3da7fd5865a5385" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="610e2c6c204b4ac28076a58a678e9134" transform="matrix(1,0,0,1,18,19)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="37d0f3b368ef4c979629cb0b7669617c">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a59711fc86f647e89709d17492d98aab">
+                    <ellipse p:name="ellipse" id="3968cc6b329c4b26a4bda3a2f2113dab" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#37d0f3b368ef4c979629cb0b7669617c)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1959982575744ae9272b739b811a58c"/>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="25312fe8b33e4fedb0aa1a329be33d54" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4eef4dde0ed74d8baa753ac678a21a01" transform="matrix(1,0,0,1,134.56024169921875,29)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7456a8f1b1b44da793d9506e7e852639" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e98f3c848f51437290aa87f3a7f53164"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="29deac56c78f4d35a50491319b4601ee" transform="matrix(1,0,0,1,277.56024169921875,29)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="83c1b59032764d13bd7d25722d9164ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bb423d153df47fc8a5c115f81191a74"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="726b685e70c24ee99605b6fe4c13df67" transform="matrix(1,0,0,1,411.56024169921875,28)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d01cdd3e6e4f46508cb0a06d7bd761f7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d1fb761440834b208549a3e0d51472bb"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="666ae23733ca483eb94a5fa8e3efa56b" transform="matrix(1,0,0,1,726,26)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b523bff85a134877b2f5f7ad1125b9f8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6f52d269248d446abc5261a9744323b6" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b22675b9402047878a0adc3262c1ad02" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="76713801a93742d3ac222377c0da89a8" transform="matrix(1,0,0,1,861,24)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f77e54ddf4bc420e921cfdb7421c9df2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3a563687c0dc45a792fe4e482fd46eb8"><tspan x="0" y="0">+</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="995480f6c1a64828b06175d1eb076b9c" transform="matrix(1,0,0,1,264,-25)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="a52d7d17917d4c4f939ed4f7af59c4b1" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b02403a035914528aa73b690d2b4ace8" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="b06f7e1c2b094cdfa92a1082cc06e321" transform="matrix(1,0,0,1,393,-25)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="533a921c393d455c87c3274d528c818b" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="4818e27cd60d4024b7a42a09a982a710" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="c11cb640d4ff45b5b48f62705fd4cc64" transform="matrix(1,0,0,1,468,-25)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="0071d041f0d84114ae69751c738e81e7" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8f50f551f10c4f978530327aba1c7363" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6408b52adae43b6a2aec0c79ad6fa08" transform="matrix(1,0,0,1,479.56024169921875,28)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="16bdca3913b94d51b95e7a75bae31cfa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa98326e39994fbbb623684c8afca91b"><tspan x="0" y="0">Contact</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="bacbcced1a96486b8d8106bcf4e628de" transform="matrix(1,0,0,1,207,105)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<span style="font-style: italic;">La fenêtre de connexion s'ouvre lorsque l'on appuie sur la tête blanche.</span><br style="font-style: italic;" /><span style="font-style: italic;">Elle se referme si l'on appuie partout ailleurs.</span><br style="font-style: italic;" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="409" height="30" p:name="htmlObject" id="afba51a850a3478f96c2d738117d03f8" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="51f85bad20a94be1992d2bd01b15c829" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-style: italic;">La fenêtre de connexion s'ouvre lorsque l'on appuie sur la tête blanche.</span><br style="font-style: italic;" /><span style="font-style: italic;">Elle se referme si l'on appuie partout ailleurs.</span><br style="font-style: italic;" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(644.1600341796875,90.52000427246094)" id="a91b746171d24ec7bf8cef98bc04952f"><g p:type="Shape" p:def="Evolus.Common:RoundedRect" id="83e0dcddd4dd4300af25b481ba1aff39" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[248.56,161.48000000000002]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,20.185000000000002]]></p:property><p:property name="fillColor"><![CDATA[#33CCFF1F]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="248.56" height="161.48" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 0.121569; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="0899ba5fe74742adb2520247deb94f5d" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="912bd56975034d9d9c685a0b2788149d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#0899ba5fe74742adb2520247deb94f5d" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#912bd56975034d9d9c685a0b2788149d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3cd7f6041c0549b2a0a4d841260d9880"/>
+            <use xlink:href="#0899ba5fe74742adb2520247deb94f5d" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="20.185" y="81" width="208.19" height="0" p:name="text" id="bf3e5330d8564f9485f0f25084ce6439" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="93468a1b7a6245b3b7cacacf45abe0a5" transform="matrix(1,0,0,1,24.8399658203125,14.479995727539062)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Email]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9b3b15ea14334a2ca8105473d4aefb65" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="05316a5343d3450b84cd8b30e98e70c1" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="1a1a1979d83044a3bdf4eecb85b29e62" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Email</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="c9a603fc60674d8c8c0ee83592f8d5c7" transform="matrix(1,0,0,1,24.8399658203125,46.47999572753906)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Mot de passe]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="ad40b9b81c82465aac6b3f78774dec9f" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="625342102763453ba13c2cbc72b79a0f" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c5b6aaa1cc214714a1acbf3a92adfcfd" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Mot de passe</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="f98ccab0992a446094cfb21fc9411e00" transform="matrix(1,0,0,1,26.8399658203125,82.47999572753906)"><p:metadata><p:property name="box"><![CDATA[90,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Connexion]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b42a361d6b214c60bca996ff1e2ea7ba" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="785c00b06d1e4b1d9bd31ef68814899e" d="M 0 0 L 21.42930378155543 0.18089789960548197 L 38.7277866599961 0.13781738815714384 L 62.08829914676748 -0.09023208151725559 L 90 0 L 90.26437355908031 12.620271323189959 L 90 25 L 67.29384142601421 24.802258366597155 L 49.79736414474796 24.513788386800034 L 28.245583840368713 25.197889577785805 L 0 25 L -0.1498323151235541 10.623337515605526 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="e008b0c0f7bd4d3aa0e34eb78de1cf07" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="17">Connexion</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="fea3e7033bc94a46b3a5d5cac4073ba5" transform="matrix(1,0,0,1,25.8399658203125,121.47999572753906)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[J'ai oublié mon mot de passe]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a0efe2790d4b4c3892dd28b32ab01da3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e04ad4bcf7f84c67b34da6d028ac8fb2"><tspan x="0" y="0">[J'ai oublié mon mot de passe]</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c6d0c59410b84c398acc4123a3e1c363" transform="matrix(1,0,0,1,25.8399658203125,138.47999572753906)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[je souhaite créer un compte]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5fe3606f0eb64543a0d7fc16ac5cdf6b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="af75cf8983434b6aaccf392954194e2e"><tspan x="0" y="0">[je souhaite créer un compte]</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(126.58433532714844,64)" id="746c3aa31bb34208a3a18a8c8c5f9a0c"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4ce30b8309724909bc0643717248bc3d" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="62d760d019b94776ba3f7af8e581b9d3" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6c258d2f87394f0d9dece203c3430962">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6c258d2f87394f0d9dece203c3430962)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="7ba7c2a7435f4752b9b9750a85d986c4"/>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="031a45df67c04df0a4e7b94ddd3f3d76" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:Bitmap" id="95dcb65fc780478993b35679ed215807" transform="matrix(1,0,0,1,734.4156494140625,6)"><p:metadata><p:property name="box"><![CDATA[19,15]]></p:property><p:property name="imageData"><![CDATA[19,15,data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAYAAAAGRPQsAAAAQ0lEQVQ4jc3R0QkAMAhDQfefOcH+K4K1ofgGOMSY/cpDY4hktJzkDEzSy3V7MQAJAjAfQbamFJP8rEKu0S7UAqXYqg53Nkaq4+Tq8wAAAABJRU5ErkJggg==]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata>
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="cf176e46786e4a0e9f39619a90578911">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="30bd46b18e8c40549c57a1907e93229c">
+                    <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0; fill-opacity: 0;" p:name="bgRect" id="590db5999731435c973bb628c7ee6080" width="19" height="15" transform="translate(0,0)"/>
+                    <g p:name="imageContainer" id="a1f8c70e35d4466b9610c7c150c1d040" transform="scale(1,1)">
+                        <image x="0" y="0" p:name="image" id="db0c3f6fe23540adb93b8bf3646a58f9" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAYAAAAGRPQsAAAAQ0lEQVQ4jc3R0QkAMAhDQfefOcH+K4K1ofgGOMSY/cpDY4hktJzkDEzSy3V7MQAJAjAfQbamFJP8rEKu0S7UAqXYqg53Nkaq4+Tq8wAAAABJRU5ErkJggg==" xmlns:xlink="http://www.w3.org/1999/xlink" width="19" height="15"/>
+                    </g>
+                </g>
+            </defs>
+            <use xlink:href="#30bd46b18e8c40549c57a1907e93229c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#cf176e46786e4a0e9f39619a90578911)" style="opacity: 0.6; visibility: hidden;" p:name="bgCopy" id="ab93cb3f6fd843c9bb4e8533e4390a59"/>
+            <use xlink:href="#30bd46b18e8c40549c57a1907e93229c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+        </g></g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/demande-acces.ep b/src/Irstea/BdohConsultBundle/Resources/doc/demande-acces.ep
new file mode 100644
index 0000000000000000000000000000000000000000..b358686be4e4101899935d0a0028c8fb400fc3f1
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/demande-acces.ep
@@ -0,0 +1,608 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Demande d'accès - création / connexion</Property><Property name="id">1343747555439_2581</Property><Property name="width">908</Property><Property name="height">800</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,703)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="21990af9a7a847aebba75e3e3546f324" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="cd5981d746954d6992902ec41cebe011" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="a925b77d232a40b0be32ea643845cbea">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#cd5981d746954d6992902ec41cebe011" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#a925b77d232a40b0be32ea643845cbea)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="cf1931ebd68a4c4c8abcd3034c0f98f6"/>
+            <use xlink:href="#cd5981d746954d6992902ec41cebe011" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="1730323769e14985ba5bff84bdf54852" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="b6b2e49ae2004c7389485cee5d5f20a8" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="352e5c6d79e1487583d69940c50f3e92" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="4250b6e763c74e3b8797474f74b1c873"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="60da1882e1e34e42a9ce54241cb7e58f" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="545ab1c515e94ea6ab4aeb54afe89a63" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="4a773f9c4dcd451a960f3c4192293c77" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="fffe7eb76a8545acb02d5702d51fab71" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="bde71abffbd64cb392fa08ef541e4b28" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="d6c23c6d25364188bdaffa6ba58b49a4" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6aadc83ea43d41f8b8e47659b428f9a8">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#d6c23c6d25364188bdaffa6ba58b49a4" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6aadc83ea43d41f8b8e47659b428f9a8)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="514e1b48706847f2a162c02460a4b184"/>
+            <use xlink:href="#d6c23c6d25364188bdaffa6ba58b49a4" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="181bc4d9b02347848886aa8c457ab259" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="043b9ff799954e16afab5c4efe9d886b" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="6b29cad34ada43419f5b1ce71ad5b6e6" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="598a24ff649d4c508df816433d14be05">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#6b29cad34ada43419f5b1ce71ad5b6e6" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#598a24ff649d4c508df816433d14be05)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8596f1a00c2f4d56b6929938e7ef30b6"/>
+            <use xlink:href="#6b29cad34ada43419f5b1ce71ad5b6e6" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="c1166b164cb444ce989ac25e475fd913" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="3e5239f414ff4417a40a8841e95b6315" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="bc7bf4758d264c80b8b797db1743749b">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="1784c69dfe684ef493ee32d20f7f4131">
+                    <ellipse p:name="ellipse" id="af18c7f3d87042b79e49c5cf410a119e" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#1784c69dfe684ef493ee32d20f7f4131" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#bc7bf4758d264c80b8b797db1743749b)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="573866ff2775475f9bce2b51f23786a6"/>
+            <use xlink:href="#1784c69dfe684ef493ee32d20f7f4131" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="e61c6ae1d87145e58af93e81f0f919ce" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="666eb10e95ee488bba8ffda61d8671a2" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ba961f2af64c43b9ad1edee9a87fc8c8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9bfbb14fe14743778706b419e40cb1b8"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e468a6a5e9734310bf044e04b29f3a02" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="937954ab570a4ce89e905a038c49d8d8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9bf0bc5e46fa453e8ee9446b2af8ed5b"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="545a108c84174816b645444772f56dbe" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c175f70e69a64f5a9f851a7dc85a833e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6d95483eec014022ba4eebd4714ff0d4"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="1c9ac65069a44a688b381339acfe6cf4" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="0bf15a105dbb4e8fab4f8f3ff4ffc8b9" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="80ff4aaa23104e0d9dc052b5c6546a7f" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="d433da7fe04b4a41b4d9a99359665d09" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="97a48617f2ae4676a43ad69ee599c7e7" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="35d3c60e62604a04be76c05f6d739bb0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7ec4046b8ccd43bb88fa426fcd5cccb0"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="770879b4cba74430b5c1c72538fa80f6" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="b7b10b41b4d444cabf82f5a5907e4824" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="a71e3a8bed0449bb8f018182e1da8ba1" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="f0d716e85fa043d6b9ec50956661bf44" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="d1c0899d836544c2a1587d49cca8f28f" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="809b7108fb224906b939751041ea203e" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="82efce2fd1f547f5affa72af04eb7785" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="8fcc7e1e96254b2da5d937dc90a6180e" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="79b38b7aefbd46fe90513fed650e8565" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="02c2669545984e3693575b245b158f02" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6352ace62a86498281eca54c9cfb3ac4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ccc7992b2ac94946b42061f7c63cda4b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="1104add72f0c4d59b59dba935c08049a" transform="matrix(1,0,0,1,425,189)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[2,488]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="e46fa7a6a6ba49da82d3f2d4bdf2826b" d="M 0 0 L 2 488 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="38c618e1367e4de48ae0df1689bd2349" transform="translate(0,0)" d="M 0 0 L 2 488 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="abbf70f0a035469a935e21d18ca2b178" transform="matrix(1,0,0,1,37,203)"><p:metadata><p:property name="textContent"><![CDATA[Création de compte<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="185" height="24" p:name="htmlObject" id="1e270845e624444c957b96ba757f0aa7" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="5b40cd7e5d2c400a8e0027c247d2a9a7" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Création de compte<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="123a9d557ce24baf879fddd4f6cc9f40" transform="matrix(1,0,0,1,458,203)"><p:metadata><p:property name="textContent"><![CDATA[Connexion]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="101" height="24" p:name="htmlObject" id="72646ac4716b4573b40ba4d893cc6839" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="39c4c856d8744d1db53012470c67adda" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Connexion</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="12793f5d8de14edba3e56964a32bbaaf" transform="matrix(1,0,0,1,37,189)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Je ne possède aucun compte BDOH]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ede2029b737f4e12af7fb06ccd5f8a9b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="127c6cc9b1684fb9b815c1d18efe6b2e"><tspan x="0" y="0">Je ne possède aucun compte BDOH</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="cb172ceb2b0b42578ceb549e86e980f3" transform="matrix(1,0,0,1,458,189)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Je possède déjà un compte sur un observatoire BDOH]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0cb62abcaccc4b89a0c61ac50cf36ed1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d10f066dd35d4943bbe0bb83dc01acd6"><tspan x="0" y="0">Je possède déjà un compte sur un observatoire BDOH</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="31372280d4014664be93db5cb0342332" transform="matrix(1,0,0,1,571,250)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="32d2ae1970ca4a0fbd365bc862dcb71b" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="fe40fb1199de41099e2319f07d8f06d6" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="46c2f4bf82fc48e99978f47b5bbd5477" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2fe950d463cd4f2ab83857e7c2a8c0db" transform="matrix(1,0,0,1,472,256)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Email]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="173f73a70ae84383b2301f60de02d08f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4b2a9d01df094460b44586662cc5623c"><tspan x="0" y="0">Email</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="087bd4f7ce7742b8bf71e7013b42d85f" transform="matrix(1,0,0,1,571,282)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="450b3c1b3573406e912b66887ccefdd1" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="8db2f7463ec94bcfa34f0851b0e22e4c" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="6f797926f1d74793ad0f5253e8cb6dee" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="97212def26ba4875bfc8e094df89a1c0" transform="matrix(1,0,0,1,473,288)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Mot de passe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8f992986ad3f4d068c09cd8bbf5e0de4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c1ed639837fb492fbbf9572206829e5b"><tspan x="0" y="0">Mot de passe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c84ca834382542eeb160a5421e8e1b2e" transform="matrix(1,0,0,1,474,325)"><p:metadata><p:property name="box"><![CDATA[90,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Connexion]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="21034e35a9be41a193a40e554c24321d" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="935eab75e51b49aa90442702e223365a" d="M 0 0 L 21.42930378155543 0.18089789960548197 L 38.7277866599961 0.13781738815714384 L 62.08829914676748 -0.09023208151725559 L 90 0 L 90.26437355908031 12.620271323189959 L 90 25 L 67.29384142601421 24.802258366597155 L 49.79736414474796 24.513788386800034 L 28.245583840368713 25.197889577785805 L 0 25 L -0.1498323151235541 10.623337515605526 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="08ac3290af9d43cab1233ad917ef02b2" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="17">Connexion</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7800e3721b7a46de8b601a46cdcf8516" transform="matrix(1,0,0,1,18,256)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Prénom]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9d5aff129c184f418c18ace7a6e52700" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3f445bfc154949c1912b158038a137c7"><tspan x="0" y="0">Prénom</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c100438be1d147b98718686f3cd74dee" transform="matrix(1,0,0,1,19,288)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nom]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6d1e93873aef49e9992885f211fe8f35" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="86c44545eea949c8b1efced4cad0f0ab"><tspan x="0" y="0">Nom</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1f0ee77799a146ee9f317f563709092b" transform="matrix(1,0,0,1,19,424)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Email]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5b143b499d034ab396137f457e3d76cb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="90e48ec5d13c4268b506de30a8e8b80f"><tspan x="0" y="0">Email</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1e05fe2bb3364ddab61a45654fb50912" transform="matrix(1,0,0,1,18,463)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Mot de passe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a48a8c07fd44414eb3c8351cd0597d86" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="574c61909bed41f3a5794b267f728e05"><tspan x="0" y="0">Mot de passe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="56dbd9ea4f354183b9c50712707ab4d2" transform="matrix(1,0,0,1,19,324)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Organisme]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c43259ae52b7498ba4778323b3862756" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fc4ad1223bc14db1b2d5bb211041812f"><tspan x="0" y="0">Organisme</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c8d99296dc764d8aaf1964d38d7eeefa" transform="matrix(1,0,0,1,19,356)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Catégorie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d5fb95a065cf47c0b9098871dcad9668" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e30f60182139450daf6681c2ab6f3ddd"><tspan x="0" y="0">Catégorie</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="00630a72ae8543aa98fcf7d21ae98137" transform="matrix(1,0,0,1,18,388)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Téléphone]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3bad43ec89d14c3489dff5d2b41cb0b3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6388a5e4e2764677aa70ff2cdaf9052a"><tspan x="0" y="0">Téléphone</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="0a0d85a25ffd46ac9089b79aa9907d28" transform="matrix(1,0,0,1,19,489)"><p:metadata><p:property name="width"><![CDATA[104,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="textContent"><![CDATA[Répétez votre mot de passe]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="104" height="30" p:name="htmlObject" id="fcc229c650ca4f268d7757f4d1867236" style="color: rgb(0, 0, 0); opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="729cc2a66e1c400cb4666a167ba4dfe8" style="display: inline-block; width: 104px; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml">Répétez votre mot de passe</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="52b088fc1d1445ecacd5c33431109313" transform="matrix(1,0,0,1,144,250)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9348facfef0447cbacdccf78f985b176" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="e525feb95ec948b2b3ed1a6fc4bf3166" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="a946a9a0ba654bc98617f0701965e7a3" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2dee43398dc4ef68749164e0d089b76" transform="matrix(1,0,0,1,144,282)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="dfc2bd41a98e409f9d674c5056e69d71" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="fc5f1c9e3aa843e3bdaabcd36313515e" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="32df0a929a0e4cf18c5d920b0ede12ea" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="c2c487635ecd49dc859880edf940c9a9" transform="matrix(1,0,0,1,144,316)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="c77589d338dc4ccf9c855269b4f7a793" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="540d37eceea1423c88b593936b915f55" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="ac1fe959224e463499f809fd139b728a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="3ec7e5dd113b47b9b6d1f53e300bf8fc" transform="matrix(1,0,0,1,145,351)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b14cb169d1b74587b24c750a5b74a5ea" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="eda7ddaa847e471c9d9b4a344a11902a" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="1e723d85059b41f1a954fa0ea3ed6ea5" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="8fdd76e87c254af9bf24596645b90f64" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="9ed6a07a2fa24b1081ae76f096ac2c23"/>
+            <text p:name="text" id="00a83339795e4dd586c0989a4cd38330" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="6294b540cd9f4249ac784467dd361709" transform="matrix(1,0,0,1,144,382)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f7de11aa2bb0411eb0c698bb92fb5f68" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="18abfdf0d2394d8685e13fd56c33e12a" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="54a67986beaa40b9b07f5466790325fe" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="79a2bd5942064cc1b85fa6c620fea8fe" transform="matrix(1,0,0,1,144,423)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f385c0e3fba34c9cb0f37bc7a11aec33" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="da7bd216944d473396ebdf019ae62e7f" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="442d621c0cf84b76853a63dd0a91c809" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="fb363e08e0254c249021ed8c4f311398" transform="matrix(1,0,0,1,144,457)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fa1d75a2748e4021b7292363dbce498d" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6117be53f0484de2970c7f48e09c565b" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c388f90bdc5d454eb8a715f9b6d9a3ef" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2ce458ba65142ceba99f99543a457bb" transform="matrix(1,0,0,1,144,489)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cd95deda1fab4dcab80d06acb88b2164" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="d446008d4eed4ca9b403ac0b0e512cb3" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b131530c49c64caeb12d3329dae9ac89" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="9dee82bf08174f43869866058da5713a" transform="matrix(1,0,0,1,151,588)"><p:metadata><p:property name="box"><![CDATA[112,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="2d0246bbc4a843ebab9d049a39270dcb" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="4456c5f896204e8f9e462b0fec358f45" transform="translate(0.5,0.5)" d="M 0 0 L 21.39915468445833 0.2981248983895023 L 44.046342245343816 -0.039617179254846535 L 66.9081976162151 0.062299921891463717 L 86.44245063934657 0.09180600380200588 L 112 0 L 112.14974310897651 12.7955560071952 L 112 25 L 89.7872880642052 25.37926059263044 L 66.55715507552543 24.82275560000845 L 44.29089247674409 25.281608889456997 L 22.359413861443915 25.374735137934064 L 0 25 L -0.40596671976743515 12.789477224854997 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c6b3ab3525144412a2ff78ecd41ad1cb" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="43"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="133563c7b8dd4c24b00bf37bab43beb1" transform="matrix(1,0,0,1,19,552)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Veuillez recopier le texte suivant]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="61542d64171b4d9f920ddac864c722ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="710617c0541a455f886ee4b79e4d7d39"><tspan x="0" y="0">Veuillez recopier le texte suivant</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(18.9921875,576.609375)" id="0bddfc725b9741319789e29affb9e825"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="59b37ff87f944766bae3639ff698199f" transform="matrix(1,0,0,1,-0.9921875,-0.609375)"><p:metadata><p:property name="box"><![CDATA[126,48]]></p:property><p:property name="textPadding"><![CDATA[6.300000000000001,3.1999999999999997]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="eee1e4ae705e4ee49d3dc300348a7fd0" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="6ac37b83333549969295dfa569ae1f6a" transform="translate(0.5,0.5)" d="M 0 0 L 17.296133417450616 0.23222168172036606 L 38.26978322977777 -0.39217877984642535 L 55.39738861435678 0.16032681775485846 L 75.00542772023077 0.27545314756841044 L 95.48224418575332 -0.09332521460556953 L 126 0 L 126.43509915376892 19.408156041155657 L 126 48 L 106.83595320420373 48.14327020398683 L 86.25359840008443 47.54520480883729 L 65.43009656258664 48.447014702356455 L 41.798946604035535 48.2694171852207 L 18.99588320466084 47.52167444721791 L 0 48 L -0.006845567329393454 31.218991312152394 L 0 0 z"/>
+    		</g>
+            <foreignObject x="6.3" y="24" width="113.4" height="0" p:name="text" id="cda9cf6073db4fcbba00adfcdab53c30" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.BasicWebElements:heading" id="9b7bdbae42cd41a1b10dd14409b2fa3f" transform="matrix(1,0,0,1,18.0078125,11.390625)"><p:metadata><p:property name="textContent"><![CDATA[T  X U Z<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="75" height="24" p:name="htmlObject" id="01bab046ae324399aeac37f5e4954d8f" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="933ce64b2f7a4b7eb82fb51ad03d30b2" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">T  X U Z<br /></div></div>
+            </foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="5387b9fff3b94b1caa96d319e9989986" transform="matrix(1,0,0,1,17.0078125,25.390625)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[34,12]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="497d080043684553becc57f74915402e" d="M 0 0 L 34 12 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="f7946efcbbf048c9bd9da08504c200d2" transform="translate(0,0)" d="M 0 0 L 34 12 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="4af41fdcbb724cd4a67533e2f6a9b0b8" transform="matrix(1,0,0,1,59.0078125,23.390625)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[34,-12]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="42e9e005ed904d4ba383eb617145081c" d="M 0 0 L 34 -12 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="715981358fff446f87524c8407d3a958" transform="translate(0,0)" d="M 0 0 L 34 -12 z"/>
+            </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e728291d872241babbc8073869a6d310" transform="matrix(1,0,0,1,18,437)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[vous servira d'identifiant]]></p:property><p:property name="textColor"><![CDATA[#FF0000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|10px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="07cec5d826db45a2a42b1b8dd3321eeb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 10px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="cf882659b2a14be3a022ffc56c4238e7"><tspan x="0" y="0">vous servira d'identifiant</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="422443bd66ba47c991ed72924c80251b" transform="matrix(1,0,0,1,19,646)"><p:metadata><p:property name="box"><![CDATA[148,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Créer mon compte]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="49fe89f52c6240329dc946e5be950e28" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c3199981f8754a6abbcd667d46615adc" d="M 0 0 L 18.552421213234677 -0.053848351837630926 L 40.856576982237186 0.02313380980625479 L 59.2840753089119 0.21792195158233707 L 77.16251608352663 -0.03017523568619962 L 96.28237883035364 0.3891147037800011 L 116.23392716246076 -0.11892281038950281 L 148 0 L 148.08171516924878 10.912882695404157 L 148 25 L 128.3754643449158 25.17589188407483 L 104.9610073069981 25.148156160615027 L 81.74584090859106 25.13595930119655 L 60.433006625588526 24.793163901649173 L 40.16959852619836 24.9206543427871 L 18.21296193841417 24.83531606483582 L 0 25 L -0.361098727875344 10.717529789981262 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="7c1171e9b3e24f4d93583699ce2e3854" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">Créer mon compte</text>
+        </g></Content></Page><Page><Properties><Property name="name">Demande d'accès - besoins</Property><Property name="id">1343827036958_3750</Property><Property name="width">908</Property><Property name="height">900</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,13,779)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="72eda8205781444397fca844b4528e04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="24edfb6dda434053a1b297406ba78699" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ad8427bd24b1461689fbd43e57091f01">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ad8427bd24b1461689fbd43e57091f01)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="19f683b7fb3e42e5b99f6dea1a6d2f67"/>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="53c80e2ba30b42cbb2395c11242dbc46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="4502ecc4a9d549b8a207719a417eee6d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="ae0f5b0bdc794f918a5e0bf160111dfc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="1d45fbf8a13948aab60e32cf180ee001"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="9abf7c5b890d4888a327ffb1d3699aac" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="973cd76d9d564af18926311f9fc73732" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="01ac64217e2a4d5d92cbaca20f5c4d76" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="1eb7fecc18fb4d4688e68ec813cdddb5" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="84b617c6bc0647828e26d6b234d5c9ca" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="385d70f0f489496fa182c89f5d6f50ef" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="3acdb787527845bd9e570a82553c16ba">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#3acdb787527845bd9e570a82553c16ba)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f03a1bb845db4312a20a7a43721eb926"/>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="2be0e67db1284407b3da7fd5865a5385" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4ce30b8309724909bc0643717248bc3d" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="62d760d019b94776ba3f7af8e581b9d3" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6c258d2f87394f0d9dece203c3430962">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6c258d2f87394f0d9dece203c3430962)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="7ba7c2a7435f4752b9b9750a85d986c4"/>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="031a45df67c04df0a4e7b94ddd3f3d76" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="610e2c6c204b4ac28076a58a678e9134" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="37d0f3b368ef4c979629cb0b7669617c">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a59711fc86f647e89709d17492d98aab">
+                    <ellipse p:name="ellipse" id="3968cc6b329c4b26a4bda3a2f2113dab" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#37d0f3b368ef4c979629cb0b7669617c)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1959982575744ae9272b739b811a58c"/>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="25312fe8b33e4fedb0aa1a329be33d54" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4eef4dde0ed74d8baa753ac678a21a01" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7456a8f1b1b44da793d9506e7e852639" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e98f3c848f51437290aa87f3a7f53164"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="29deac56c78f4d35a50491319b4601ee" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="83c1b59032764d13bd7d25722d9164ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bb423d153df47fc8a5c115f81191a74"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="726b685e70c24ee99605b6fe4c13df67" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d01cdd3e6e4f46508cb0a06d7bd761f7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d1fb761440834b208549a3e0d51472bb"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="666ae23733ca483eb94a5fa8e3efa56b" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b523bff85a134877b2f5f7ad1125b9f8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6f52d269248d446abc5261a9744323b6" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b22675b9402047878a0adc3262c1ad02" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="76713801a93742d3ac222377c0da89a8" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f77e54ddf4bc420e921cfdb7421c9df2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3a563687c0dc45a792fe4e482fd46eb8"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="995480f6c1a64828b06175d1eb076b9c" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="a52d7d17917d4c4f939ed4f7af59c4b1" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b02403a035914528aa73b690d2b4ace8" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="b06f7e1c2b094cdfa92a1082cc06e321" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="533a921c393d455c87c3274d528c818b" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="4818e27cd60d4024b7a42a09a982a710" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="c11cb640d4ff45b5b48f62705fd4cc64" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="0071d041f0d84114ae69751c738e81e7" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8f50f551f10c4f978530327aba1c7363" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6408b52adae43b6a2aec0c79ad6fa08" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="16bdca3913b94d51b95e7a75bae31cfa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa98326e39994fbbb623684c8afca91b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7800e3721b7a46de8b601a46cdcf8516" transform="matrix(1,0,0,1,20,210)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Types de données]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d5fb028de36b448daf7b056c351126ac" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="772a01a9e0664780a55632007c11f496"><tspan x="0" y="0">Types de données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c100438be1d147b98718686f3cd74dee" transform="matrix(1,0,0,1,20,478)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Durée d'accès souhaitée]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e6fa1ac477d84f668e45b2df3c0b78e2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ae00f3db78ee4b5a9db9ea0c0f09bf27"><tspan x="0" y="0">Durée d'accès souhaitée</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c8d99296dc764d8aaf1964d38d7eeefa" transform="matrix(1,0,0,1,18,527)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Objectif / thème de recherche]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="64d6eaeb3fbd45afab2c4fa84957d3ba" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7d59c8608c224268bcf1ae3f1ce94db6"><tspan x="0" y="0">Objectif / thème de recherche</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2dee43398dc4ef68749164e0d089b76" transform="matrix(1,0,0,1,235,472)"><p:metadata><p:property name="box"><![CDATA[160,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[en mois]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="7b49000da18c4934a837736acda7fe8a" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="1774fffb481047f78378f128b35ac849" transform="translate(0.5,0.5)" d="M 0 0 L 18.70802458446006 -0.40405411073974995 L 41.235529064533125 0.28519471260737905 L 63.10554718629752 0.19370018825843438 L 84.19175816332407 0.31331670046659366 L 104.98743132991771 0.25149609170045695 L 127.03446265019724 0.33425876699606016 L 147.46969528961372 -0.36833385003006835 L 160 0 L 159.6748078328943 13.465660567295352 L 160 25 L 139.91000491335095 25.43190930198774 L 118.83500510940824 25.301514523639263 L 98.2540951497037 25.43499044352274 L 79.27890752014551 24.794862228967116 L 58.43824709699772 25.28994123992837 L 38.63987159889793 25.449331294127187 L 21.745817947166007 25.088414054759657 L 0 25 L 0.1883205687574171 11.90784110395294 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="71180bbd5498478781782598a49270b5" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">en mois</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="3ec7e5dd113b47b9b6d1f53e300bf8fc" transform="matrix(1,0,0,1,237,517)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="db0ed13d98484f439ad78f66a2f5548b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="12878f6a95d44ff4b7f2cfe643f4a277" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="e8ad42e744b0405db706f4f272a2cf2d" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="855008c8b45b4e9c804916cb14adcbcf" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="591a3e32fe6a4f38927a9749c04a1429"/>
+            <text p:name="text" id="fd6c780e231b4e058b526747d4ab89a7" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d280e7a309c74e499a9d24596b7422fa" transform="matrix(1,0,0,1,412,210)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Aire géographique]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="485b273b4959488ca874ac0ae49241be" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ee2e009a8108447abcfc09548f28a055"><tspan x="0" y="0">Aire géographique</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="15442b78465c49e39718f63e0c1475c9" transform="matrix(1,0,0,1,19,173)"><p:metadata><p:property name="textContent"><![CDATA[Description de vos besoins<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="257" height="24" p:name="htmlObject" id="22651d086ad84314a887606760bafb8b" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="7103dd34bcc14d69adceaa7df7c08961" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Description de vos besoins<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(149.34765625,210)" id="7fc8bbc0b3d5490a8d85fb3767e0ea0a"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:scrollbar" id="17b9d290b0814da1aef20b08ee5c8e50" transform="matrix(1,0,0,1,199.93359375,0)"><p:metadata><p:property name="box"><![CDATA[18.71875,237.94608940864228]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <rect rx="0" ry="0" style="fill: white; stroke: none;" p:name="bg" id="996c7d94195a4bac9a6319a5cf3a4334" width="18.7188" height="237.946"/>
+            <g style="fill: none; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="scrollbar" id="d31a80508d9047648d92993eca0e575b">
+                <path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line2" id="9ba3f420672d46bbafc5db7d6d03171c" d="M 0 0 L 0.021589864267022696 21.979289971699036 L 0.3811171922400908 39.68121120177902 L -0.4959374334518909 59.03596358762193 L -0.06872577020541781 79.97481706224956 L 0.3753211571254911 102.23528198211629 L 0.3106073429255545 123.76118418008001 L 0.12153583416546132 147.46679032082733 L 0.348817220458022 166.4245139717224 L 0.07767252725862939 188.1209348161678 L -0.49202540176336174 205.1425861294175 L 0 237.94608940864228 L 9.181647379168133 237.452514756846 L 18.71875 237.94608940864228 L 18.711636973177654 219.79067128617226 L 18.45609005355394 197.41649688982852 L 18.54765244993219 180.17815043989233 L 18.48065251259508 157.20541555603785 L 19.136420248722917 133.8442976194927 L 18.29245527972477 112.21871483746243 L 19.08534869510589 93.64078347764709 L 19.038528225829513 74.60946250808901 L 18.53546038818652 56.6170365796735 L 18.771703430362464 34.434405516594566 L 18.71875 0 z M 2 128.97304470432113 L 6.715705276586788 128.8088208492139 L 14.71875 128.97304470432113 M 2 118.97304470432114 L 8.203204533985824 119.4584703231632 L 14.71875 118.97304470432114 M 2 108.97304470432114 L 9.319593357426381 109.37451704510052 L 14.71875 108.97304470432114 M 2 10 L 5.404498339293904 8.164324188895941 L 9.359375 5 L 12.184579439610388 7.8266521455493425 L 14.71875 10 M 2 227.94608940864228 L 5.985253199243492 230.7434229493821 L 9.359375 232.94608940864228 L 12.388540259678862 230.38603778697885 L 14.71875 227.94608940864228"/>
+            </g>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="6e8f72d62d044850922bb5c64c2ac3c1" transform="matrix(1,0,0,1,-0.52734375,-0.016754150390625)"><p:metadata><p:property name="box"><![CDATA[200,235.67006718089078]]></p:property><p:property name="textPadding"><![CDATA[10,15.711337812059385]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="74442fd2eb574a5b868e3673393369c8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="cacce4aa23054ee08d4ba23bbc112bce" transform="translate(0.5,0.5)" d="M 0 0 L 19.332171149415647 0.16289366172134456 L 37.95795014561311 -0.02365217585850743 L 54.56140577684483 0.34065222876201373 L 76.56147446190913 -0.09213764308862915 L 100.06282219473036 -0.41586695342380264 L 117.9433826209737 0.33466360118181615 L 138.27528100353948 -0.0359380039627577 L 161.45831771110423 0.3450024089532707 L 180.26536277102855 -0.443311168966135 L 200 0 L 199.64013263228597 17.449541823923614 L 200.2359935962052 36.753087073699575 L 200.00760617062383 55.05833886955823 L 199.69486554096468 78.390564155983 L 199.62882241404714 95.51509568769761 L 200.4841172761107 116.11138840642657 L 199.76588978083 138.455262758605 L 200.29600766964114 159.36156571443607 L 200.0916169203942 181.14720399699345 L 200.18004111644422 201.5768171503299 L 200 235.67006718089078 L 179.31249328868535 235.5250838377163 L 161.5931950089613 235.87510689916806 L 144.59179077400586 235.9120627064166 L 124.44894173143418 236.1546384925607 L 106.09612518395645 235.68384017972053 L 88.30940525777716 235.81516410909705 L 69.80109196711057 235.38292981272363 L 52.74938068861773 235.76204109425154 L 33.508686995726976 235.8091336994171 L 0 235.67006718089078 L 0.14658050242092135 219.12350420746395 L -0.16741307400943128 198.5048012300401 L -0.150762886334723 180.92133449859486 L -0.21218474395772013 160.14638108297547 L 0.20434558173853734 137.81620704671488 L 0.029053669518705028 114.29459776890883 L 0.14600531834200592 93.48551980613554 L -0.22355447990221966 70.52979134960951 L -0.47347654963339536 49.929866987371916 L -0.03187669766201073 27.525741725662975 L 0 0 z"/>
+    		</g>
+            <foreignObject x="10" y="118" width="180" height="0" p:name="text" id="c1162b9b745045caac1b8b713c8a3143" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="4a2e7867aa7142c89284d97f7dee5e24" transform="matrix(1,0,0,1,10.65234375,5.7709197998046875)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Tous]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="393ee29010f1497bbba41e6e9ed19924" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="5e6dbdfa69d3457dbc569cb15130ce9f"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="4203038b163347d1b3e5367e042096d1"/>
+    		</g>
+    		<text p:name="text" id="df5fce467239432f97f054d9d183ee58" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Tous</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="d28940436cf6418fa814814392be9f39" transform="matrix(1,0,0,1,10.65234375,32.5673828125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 1]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="116d8d18142045ec93e09f3f95f99369" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="c7f88d05d04b45778f626bc274c78728"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="45261b5ed1b042d495b89ef394ce17d6"/>
+    		</g>
+    		<text p:name="text" id="828f5263fb344a64af513941410212d6" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 1</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="7af6ba98a2544299b90f44a934694556" transform="matrix(1,0,0,1,10.65234375,60.639892578125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="007ec3907b6a428ab120c56614ebbe1c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="ca346e59ab304cc79ea337166cacea52"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="778bfa82dc4c40e2b02909d2fae11dd4"/>
+    		</g>
+    		<text p:name="text" id="a59fdf43bb5c4425a6a3653f246a2e2d" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 2</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="07203440ea35411394f77d116a67f587" transform="matrix(1,0,0,1,10.65234375,87.43634033203125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 3]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="0bd3a490a99b4856822a074d1adf528a" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="e2b89380c0ae4e4f8bd7899f34016034"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="a2456b41d094407295767d96d8b41f53"/>
+    		</g>
+    		<text p:name="text" id="5fd23c169a4d4ab78d2e47eac9d68543" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 3</text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(563.390625,210)" id="ef60a26b57ac4304a34938f2ee7b8b8f"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:scrollbar" id="b3c98e4b3b7f49a99d95fc4fdcfeea14" transform="matrix(1,0,0,1,199.890625,0)"><p:metadata><p:property name="box"><![CDATA[20.71875,237.94608940864228]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <rect rx="0" ry="0" style="fill: white; stroke: none;" p:name="bg" id="b694cb432a5144e5b2f24f9d8c7cd9fa" width="20.7188" height="237.946"/>
+            <g style="fill: none; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="scrollbar" id="0c6cc66ca8d147079d7a6e4003a92221">
+                <path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line2" id="747549507bd94f2b9365b6924328d8de" d="M 0 0 L 0.09370420642245059 21.51189672390306 L 0.26930953706210237 40.45047512249332 L -0.27487591650745824 61.180849651282614 L -0.37611468026522565 82.8407345165763 L 0.4936691914986564 103.42416940710602 L -0.22706272011542117 124.3562463850252 L -0.39915917583100047 142.6119456997219 L -0.07947308213492332 164.4405018298335 L -0.0661873358485533 183.30354179610336 L 0.042761441475626216 199.68166458087563 L 0 237.94608940864228 L 8.555448698620946 237.4685026562194 L 20.71875 237.94608940864228 L 20.96866770124247 216.1803262315837 L 20.291656573717866 195.0007328519734 L 20.956140773196214 177.2482424912257 L 20.493263483796486 156.73393957812962 L 20.40966781917222 135.55529572650929 L 20.542678550289637 115.25786077391743 L 20.911556037545925 95.3352790592577 L 20.414469708210106 74.42913319653027 L 20.980401932045712 53.91985483941797 L 20.693989229883364 37.384946413312065 L 20.71875 0 z M 2 128.97304470432113 L 9.813315784669339 129.3429941088062 L 16.71875 128.97304470432113 M 2 118.97304470432114 L 10.472802723196907 118.79663350262894 L 16.71875 118.97304470432114 M 2 108.97304470432114 L 9.64262658196039 108.90024701702367 L 16.71875 108.97304470432114 M 2 10 L 6.0002661947441025 7.820788293558486 L 10.359375 5 L 13.256067967894971 7.441610148456751 L 16.71875 10 M 2 227.94608940864228 L 6.696636927952565 230.42847044638822 L 10.359375 232.94608940864228 L 13.681608138219852 230.55192308172377 L 16.71875 227.94608940864228"/>
+            </g>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="01534938e672422aabf992bc0b09b042" transform="matrix(1,0,0,1,-0.5703125,-0.016754150390625)"><p:metadata><p:property name="box"><![CDATA[200,235.67006718089078]]></p:property><p:property name="textPadding"><![CDATA[10,15.711337812059385]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="56bbe1c979974ef59a72cb99ec93c9d2" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="2f6997865e5f4f88b06b4c5c21affb14" transform="translate(0.5,0.5)" d="M 0 0 L 18.303465508318812 0.2529488613173343 L 40.444109174106174 -0.28952583322785974 L 61.90085172198669 0.09177554438723712 L 81.09330630842149 0.30557580397249196 L 103.78646806703388 -0.3259559800709988 L 121.83508378920085 0.21088440258724872 L 140.37272107715836 0.38612503233356477 L 162.29944882237731 0.15050835472419477 L 183.678571297313 0.3648606857289588 L 200 0 L 199.61547633603615 18.625401550733283 L 199.95751322724132 36.19899125658823 L 200.07606251668767 58.53870546602642 L 199.86609752961195 78.64429550132222 L 200.48302523704723 95.66311507207645 L 200.4335352772436 115.19093207421838 L 200.2525806053532 132.73075956120087 L 199.94551231509666 156.47023079907748 L 199.77591882176358 176.08006828260199 L 200.2728118369389 196.0431340415898 L 200 235.67006718089078 L 182.36512978409172 236.149817807442 L 163.0219491513793 235.99076500726892 L 141.32129284796312 235.9079279222149 L 121.50940202994789 236.0050442287024 L 99.79870853565676 235.91889554533904 L 80.04617608807771 235.69212604976784 L 57.625964719605605 235.39264049314352 L 38.43276409230875 235.84323496864542 L 20.609111068572993 235.62108310861478 L 0 235.67006718089078 L 0.20779549856894008 219.10928342296532 L -0.02763820260894556 196.97652329463156 L -0.14703687861350545 176.45292785819152 L -0.015472700690770447 156.09587160068975 L 0.35266448958688446 132.38343219504466 L -0.168765348948979 112.81133219011535 L -0.25591207712557185 91.69613490793337 L -0.11024272006329328 68.25299448854541 L 0.31146817648139713 50.39213042723511 L -0.42987131829935055 31.817394558716593 L 0 0 z"/>
+    		</g>
+            <foreignObject x="10" y="118" width="180" height="0" p:name="text" id="8e65946568754d21b26cdb0208e4a824" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="58926b8d1e2d4f9891b89aa5bde3b0db" transform="matrix(1,0,0,1,10.609375,5.7709197998046875)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Tous]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="f57c0996042c49dd8fc1fb27efbfc0e8" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="b8476b037ca14a3fb9f959a22a6d162b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="b0e847cb80044d5aa15387581b51dc7b"/>
+    		</g>
+    		<text p:name="text" id="81a2436741e542098588d094edc04411" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Tous</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="7baa06acd72c436a8c45163b33c77c27" transform="matrix(1,0,0,1,10.609375,32.5673828125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Site expérimental 1]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="caa44e20f8d0441d81fdf7f38bcc200c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="8ef3aae6683745c4be25f56c87910aee"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="52afd350f2d9479e95aa1051a5604bb9"/>
+    		</g>
+    		<text p:name="text" id="0dedfd25eda44e3ab32f5ff395748228" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Site expérimental 1</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="42a1a5402c7b4ba38faa186e879167d6" transform="matrix(1,0,0,1,10.609375,146.639892578125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Site expérimental 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="a7eb6fd20bdf43a085eff36ca5d7ff2b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="8baf37fbf38247ba8ebf1d6eb0776041"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="004370ad104b42948b4bc898aa5b6139"/>
+    		</g>
+    		<text p:name="text" id="cfca71044f584746843fff3dfeb742dc" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Site expérimental 2</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="b16f6a11f37149e7a0626afb057fa65a" transform="matrix(1,0,0,1,31.609375,53.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Babaou]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="99bc50b487ae4fb7a15b0c2ef917851b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="263017c345764ed9adfdea21c2805788"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="37e334a5ff4e421a9687e12ab67174c5"/>
+    		</g>
+    		<text p:name="text" id="8d9d7633930745c0b617dad38a3e5952" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Babaou</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="d051cce6de8741c2afbfeb3ecd720084" transform="matrix(1,0,0,1,31.609375,74.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Machin]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="72d66847e3a740bb8662fa2cf9880e72" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="2c7f7027abff49ff8ee845b643d97f8a"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="153a0a3a046b4126b03e40b1ce96e924"/>
+    		</g>
+    		<text p:name="text" id="e1cef54789d847d6b4e95874ac9a0be3" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Machin</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="23d82bf91f26421aa0f865a60b6cd55d" transform="matrix(1,0,0,1,31.609375,96.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Chose]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="46cdde820f764672a4a8ffbd84b6c040" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="cb7233cc8fab462297a2cba6b40404ce"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="3989d386a2d94861803a634b809fb1b4"/>
+    		</g>
+    		<text p:name="text" id="4c0d65bb87d8474e8faf0fb3d3d1244a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Chose</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="bc5a03c7a175480e84e9e9b15e4148c2" transform="matrix(1,0,0,1,32.609375,117.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[STX48789665]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="e4156ab8d21445fcaa1953d61e781d7c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="da338ecd2add4dc8a41b860389eddd9b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="2673336545304d6786d30602dda40c2c"/>
+    		</g>
+    		<text p:name="text" id="f266464cb42443739a0bfcd9791b4062" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">STX48789665</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="c92228976b55475a8e5f96c6e4db6ee3" transform="matrix(1,0,0,1,31.609375,166.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Babaou 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="4a8fd5fbe20f450ab16213561d16e4e7" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="69bfb48e4a5c4ed9b201989a74582452"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="c2a4bd6432c049938c8258501e4105bd"/>
+    		</g>
+    		<text p:name="text" id="3c4434ff9fde469fb961260a5771a59a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Babaou 2</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="eeed8fe1c79943639d3bd7fb4d308e48" transform="matrix(1,0,0,1,31.609375,187.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Truc]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="48e80c1e1e064e92ad287119ab1974af" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="39577b1033ce41189ce9a9493b66ce8c"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="9f7bf43c73234a4eb3cf5d48217cc36c"/>
+    		</g>
+    		<text p:name="text" id="2160d08c07b149a8982bb7da82d711ff" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Truc</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="638c64c5ff6744ed852968a99e3efb3b" transform="matrix(1,0,0,1,31.609375,209.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[...]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="bc354771e34a4b83b10336a3e5bbfc2e" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="f5f53ab25436436899ca9b91dee09da3"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="1a52555619d54d429ba4cf45e9326263"/>
+    		</g>
+    		<text p:name="text" id="753e8b10c3034a84a6b824d7a0ba9d06" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">...</text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="eef17d9f5f304b0788a39054376951f5" transform="matrix(1,0,0,1,478,182)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(widget potentiellement difficile à utiliser et prenant beaucoup de place)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2eb2e916eb4a41a6850b026a33faffa0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="98937cff8c984b11bddb0d5e828efe17"><tspan x="0" y="0">(widget potentiellement difficile à utiliser et prenant beaucoup de place)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a6a1409adbad4333b4d6f2a246aad130" transform="matrix(1,0,0,1,31,492)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(peut-être automatisé)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b8f8e42309bd4c808a724cb859f7f617" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="d49648bdca2649df9a450beaff64ebeb"><tspan x="0" y="0">(peut-être automatisé)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0fed078b88c94a458e243552c58966db" transform="matrix(1,0,0,1,493,527)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Type de travaux]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5f5641af511e4e1dac30ef1b8d381e49" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="47499190034347579e4b15c6cfaa86f9"><tspan x="0" y="0">Type de travaux</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="f73750573e7c4a9ca29d1a061bb29062" transform="matrix(1,0,0,1,625,522)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cb45f878e6f342c19a956632fbe2024f" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="8b2895de4c744e96bb351dc7d6891265" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="6685fc2e1d57479d80e72ce196695201" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="5b2662f700c34214be6b7d4a7b71f980" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="d3a41ef830c144788e94898670dc3693"/>
+            <text p:name="text" id="e8cf7df67cd44a5e86b890697d3baf59" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9cf43da02c7a401398b52ff307f8768f" transform="matrix(1,0,0,1,18,573)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Détails]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ff4397351b16436283ad7bd294a0a1d2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8af21241711e44bab69f9cf842afda37"><tspan x="0" y="0">Détails</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="ca48237488654ea7bc43ffdb44577958" transform="matrix(1,0,0,1,235,567)"><p:metadata><p:property name="box"><![CDATA[589,118]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="19eef555cd824052b9d0d14d8eb0a723" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="56800681b5c14e928a83a933c10a0e98" transform="translate(0.5,0.5)" d="M 0 0 L 21.118865810917676 0.05328663220893548 L 38.41581018293946 -0.1393842321362525 L 55.34929282504191 -0.44981104879210265 L 76.68814654636955 0.4130540608355082 L 98.15185374216468 -0.4016563801314085 L 119.71843737720233 0.1112252281477325 L 142.20006173021943 -0.3657501485687562 L 165.21991200499295 0.12097057551352197 L 184.227801125343 0.04475827082111139 L 201.89004268730466 -0.06073353065580367 L 220.28824712644732 -0.38848764702224625 L 239.83013104957746 -0.3749342283751347 L 259.9230674089338 0.20075193069959973 L 279.5034731398228 -0.06370595198489304 L 300.25020135634173 0.3067172525280024 L 317.00557593527327 0.17734017748117004 L 336.7351087838339 0.38419767698218754 L 354.03779072981814 0.24680874314079548 L 371.68668901469135 0.27183081628010386 L 394.83062232571075 -0.33557031612100474 L 418.01138527236304 0.0229292161073259 L 435.4808409661606 -0.023614815815651724 L 455.5854700265468 0.03211777970525487 L 476.9202209205273 -0.46066864997252543 L 493.55619410329115 -0.0719906391715418 L 514.4929800129784 0.08634974869240719 L 530.6692909048307 -0.45449768206510954 L 550.9004010470769 -0.07387324584747335 L 589 0 L 589.2270440778624 18.693906451411177 L 588.8881545447648 41.034866126438196 L 588.8134190271118 60.99371746060804 L 589.3648647556003 81.5057044400006 L 589 118 L 572.458162488314 117.90706749237701 L 552.8066945050365 117.83151201620079 L 533.34970563096 118.1731560687103 L 514.5262687531159 117.74458486349388 L 496.61845286488096 118.16566440134153 L 476.16609110761186 117.92340731691169 L 457.5907658449439 118.49650184245898 L 440.1645806681627 117.82680267911984 L 423.4246980272216 118.328330106609 L 402.7816977236016 118.42568103281809 L 380.2682140818089 117.95313170302869 L 359.9524350453302 118.290402565997 L 342.28802988307405 117.91848927878101 L 322.94870509202093 117.64753953180303 L 305.78299639273666 118.3069462638548 L 282.80870403423717 117.85545689851112 L 265.4726634669588 118.21342835143315 L 245.26990571003236 117.64742714310594 L 224.2137115093445 118.33469783849992 L 202.59653601019355 118.25961435959923 L 180.29062006511768 118.24353783905185 L 160.1006776247846 117.67674484359505 L 141.9204148562552 118.02605036449626 L 121.2409049807261 118.0900410266054 L 104.24463984511068 117.71719965792481 L 85.16328034955926 117.84132044246198 L 67.31675080816366 118.37851959713929 L 45.19325286491767 117.61721619228001 L 0 118 L 0.06371185034875704 99.77058069415017 L -0.34302906019029045 78.12330022432519 L -0.03763984369881246 55.72610546544693 L 0.1170950595730631 34.49639734618753 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="4b2c0d2e59ea49dc978e4a9d561060a5" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="251"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="32fde558276349149681e415dfa22826" transform="matrix(1,0,0,1,19,730)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Envoyer votre demande]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cf6ca7ccdd2b47a7b756e57f2e38d4c0" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="6bb42d1ad0c74c0eb7b9369856d2703d" d="M 0 0 L 20.592098553440287 0.000023303442897915083 L 40.225105361877226 -0.31098818217185686 L 59.371755074329975 0.2638788438847499 L 80.89074764495682 0.07795535433389733 L 102.91529460119787 0.10713910527796211 L 124.46641450571684 -0.15251126727582953 L 144.52950319379002 0.24399210729263454 L 165.82918697375993 -0.2836813414708059 L 185.69122735600266 -0.03570094564767101 L 200 0 L 199.5255077785371 13.449724991109052 L 200 25 L 181.958688957317 24.78995448433606 L 164.16603778336795 25.138144977625632 L 142.4882809712783 24.83102438197899 L 121.94802272831164 24.634838715651295 L 98.6601632851882 24.688134283810275 L 81.46894570353935 25.113559276925077 L 63.85715025312898 24.97103397074358 L 43.18359887414324 24.68203787352045 L 25.28693584347532 24.905611658634967 L 0 25 L -0.2106102836403434 14.584724673844208 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="cd91ca4a2d0d4ddbba15452110090305" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="19" y="17">Envoyer votre demande</text>
+        </g></Content></Page><Page><Properties><Property name="name">Demande d'accès - conditions d'utilisation</Property><Property name="id">1343830361479_9489</Property><Property name="width">908</Property><Property name="height">800</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,692)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="45703e0b5a1e402ca0eb97bce02bd50e" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="10ae976f11d248f59d7e5cd54cb8796c" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ed3e79c035a1439e9e859680c65324a5">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#10ae976f11d248f59d7e5cd54cb8796c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ed3e79c035a1439e9e859680c65324a5)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8933c26960af43859981d2a8ea77e93f"/>
+            <use xlink:href="#10ae976f11d248f59d7e5cd54cb8796c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="379cd925cece457cade8abb9ca3aa29e" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="d500558312784de3b1af95e0c010cfc4" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="2fd3f1bd7da84bd498b36a71ad045320" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="6d9a3d1f917e460d88bd10b9f21412d4"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="5b57016245d7495d8de8a4b0dda9ee47" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="021ab2278b834f7e85a35748ea2e4548" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="6ee027414584431dba2515d21d1a26dd" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="db992ee9fa0b4c0c86bd1a728e766bb9" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="adc4bedd05b34f26abea044d6ac4be18" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="cdf99ebe15c54b74831be806b56ac651" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="dcfda962e11c4853bde138c37f74293d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#cdf99ebe15c54b74831be806b56ac651" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#dcfda962e11c4853bde138c37f74293d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c12b0329099b4bab884746a5e6b0dbc9"/>
+            <use xlink:href="#cdf99ebe15c54b74831be806b56ac651" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="cfee9a2474df41a4a83196b58cfae632" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="69cf96eaabb94bdf9911167b53bef849" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="1238aa29f25d4616ae9d153c2d45f9cb" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="902e2aeef6ee4da79541c3ab7127ba27">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#1238aa29f25d4616ae9d153c2d45f9cb" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#902e2aeef6ee4da79541c3ab7127ba27)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="9a6e8a7fe52a4de8882ad676e1708ace"/>
+            <use xlink:href="#1238aa29f25d4616ae9d153c2d45f9cb" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="06a53bf3790b4e9d9997adcd37a12e29" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="216195c9fe384292aca831fb324e79e5" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="5c5391f2b1f84df79708b8c1f90dee25">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="e8f648d41c3841b5877bf60b29fcc726">
+                    <ellipse p:name="ellipse" id="a84b18a2368643c0a68ad693d35cada2" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#e8f648d41c3841b5877bf60b29fcc726" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#5c5391f2b1f84df79708b8c1f90dee25)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c6b8455852984fa8aaf593515e4620df"/>
+            <use xlink:href="#e8f648d41c3841b5877bf60b29fcc726" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="27d1dd1e81dc490096b0dffdd00d7d33" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c222a096d09f4f8f828dbe39ca579288" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9e4a21b288a046708c6773511a97949a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="bc12ec8ddfaf49428b4e90b947867315"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9feaa4f02bcb4edc8a98c494955f7d3a" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b36d85774f3c4161ad777e44641c4d31" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa94c5aa6fbc4ef3ba390597877ba9be"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3a8752c2f39d475c9532d993a1104576" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2f685bcc57fd4e338a0f65737d8d117a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6d2bcb24fc324019a900ca3605f790ae"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="7c620f3afe7c4c62b59c300ff3fa42c6" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9e395fcdd7c045c0b2c12e34d7c56e47" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="99c1557ff6184e818fdb1cd7ccf18923" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="98817b52f24d4c52ac85890ba7b265cf" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="cc091dff917d4c3cba187e32cc47c841" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="07d93dc72a574fbd8a293acfa38739b0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="701252ef72e74b4ea4af28c53116a726"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="b02179f6686b49bf897868718c883f8b" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="de06679bc103492486ed63f3638dcccb" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="62f1edbcd5ab4997bdf8a9ec7a290864" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="41785d39e167486baff68c026aa1b00e" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="59cfb7a6c2f4477e9cf5a274081d88b0" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="ff88541ba9964960abda1d9277ff1aec" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="1225d966216745caac8ae2abffca142d" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="bb979e5506b84e8f8eedd714b362f30a" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="ec5a59516bbf4f4bb8bc31cae24c6eb6" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="887391ca3e04450fab48d98f7da7b218" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="985336f83afb49179d59007f7319cd8e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d9ea5245f2f24fa09910a81663d59e9f"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c84ca834382542eeb160a5421e8e1b2e" transform="matrix(1,0,0,1,19,640)"><p:metadata><p:property name="box"><![CDATA[195,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[J'accepte ces conditions]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cdf7761a1ce246949e29ea098e243f01" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7b1d4f8b68df458d848c2463e3fd82b5" d="M 0 0 L 16.698352953573643 -0.30939306784534093 L 37.686750846790154 -0.32331459721129907 L 56.36713632755396 -0.36184269165168303 L 75.17070707931698 0.30919668267259803 L 92.68991508247562 0.16505787201507605 L 113.14508336365053 0.07650899537275346 L 129.5236389634624 -0.3524251497953873 L 153.25283067493007 0.15903848139661714 L 195 0 L 195.30582567498536 14.386064533236791 L 195 25 L 176.07728372158576 24.63754814386435 L 159.40790710600245 24.868124981582007 L 137.7183424053661 24.846854549918085 L 119.01644678792206 25.40273918716941 L 99.39050307337061 24.80291184338434 L 79.40526287212406 24.61104647135766 L 57.54007566547613 24.60411094571313 L 39.34708378075691 25.365827527241944 L 0 25 L -0.3686684512238195 11.376550071822194 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="36215d70e35b45a98255b120bb84b514" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="15" y="17">J'accepte ces conditions</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="1fa74118828a482e9210371616fcc5ca" transform="matrix(1,0,0,1,19,173)"><p:metadata><p:property name="textContent"><![CDATA[Conditions d'utilisation<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="217" height="24" p:name="htmlObject" id="61bd5bd706c049169c43756b07b26bb6" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="ddad9e8113034494a3eafd0bb157af93" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Conditions d'utilisation<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="a2b7d52f82334db188116b309346a147" transform="matrix(1,0,0,1,19,212)"><p:metadata><p:property name="box"><![CDATA[863,367]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,45.875]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="863" height="367" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 0; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="9d8a1218b4db43a9ac2f016e419e4e77" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="c5ee1f29dd4f41e39e6be795cf14c780">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#9d8a1218b4db43a9ac2f016e419e4e77" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#c5ee1f29dd4f41e39e6be795cf14c780)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d45187929e844f389db440c8f429e63a"/>
+            <use xlink:href="#9d8a1218b4db43a9ac2f016e419e4e77" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="45.875" y="184" width="771.25" height="0" p:name="text" id="451049e364004450b0f6fee627c81e90" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="64973878ecf74a0da5ec1b8d5064fdc0" transform="matrix(1,0,0,1,327,294)"><p:metadata><p:property name="textContent"><![CDATA[<div style="text-align: center;">Tout le blabla<br />spécifique par observatoire<br /></div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="259" height="48" p:name="htmlObject" id="622aedf22e7144d89f9626530b99b349" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="3a46aa64ae664930a2d75db6c84eda1c" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">Tout le blabla<br />spécifique par observatoire<br /></div></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="8a99a0625857491eb1050872459fcb3d" transform="matrix(1,0,0,1,17,613)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Je reconnais avoir lu les conditions d'utilisation ci-dessus]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="e37c37b846b5431eb643accd3905260f" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="2abacbf32b6644b3822c418af23e053b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="58f269c78dde4cc3a23a7e8ac13bb258"/>
+    		</g>
+    		<text p:name="text" id="7ddf9a736fbb4bba82d4d39f2f69d095" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Je reconnais avoir lu les conditions d'utilisation ci-dessus</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="0572fa29c1634fc497f75e4762202694" transform="matrix(1,0,0,1,233,640)"><p:metadata><p:property name="box"><![CDATA[127,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Je n'accepte pas]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b95eb6c3077d48ff963a0c3f7c28c78d" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="05e8d5556bce4ff3ae711bf0f378e9e5" d="M 0 0 L 22.13771510203776 -0.2607838674622719 L 44.26104603751432 -0.16304448106512281 L 65.95252615442554 0.19828310845328645 L 88.12838551519984 -0.3775721393882294 L 108.30379142788175 0.49132834920757806 L 127 0 L 126.73646639185225 12.924804035860866 L 127 25 L 108.40444293026421 24.731606849277757 L 90.47442370489048 25.071266809906874 L 72.22526116532379 25.27702632907016 L 53.18607647543955 24.82217734901724 L 31.5867305480717 24.792630208056867 L 0 25 L -0.40909795410983074 14.394920778457582 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="2c57afb7b00b4f629b4f6b0c14f2fb53" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="8" y="17">Je n'accepte pas</text>
+        </g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/index.rst b/src/Irstea/BdohConsultBundle/Resources/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/observatoire.ep b/src/Irstea/BdohConsultBundle/Resources/doc/observatoire.ep
new file mode 100644
index 0000000000000000000000000000000000000000..ef0b953c685dd35fefa1b9585415d6bb65403bcb
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/observatoire.ep
@@ -0,0 +1,443 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Présentation</Property><Property name="id">1343726449601_9468</Property><Property name="width">908</Property><Property name="height">900</Property><Property name="dimBackground"/><Property name="transparentBackground">false</Property><Property name="backgroundColor">#FFFFFFFF</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,17,757)" id="3c120ddc0ed44ef5aa81f7c2def0bf4b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="841cc8677fb942aa9626ef130e491590" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="01aca6fb15b04fef8ed3e5de2d9f2683" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="d0c6c709e3e546ae8553b0d1d41a265b">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#01aca6fb15b04fef8ed3e5de2d9f2683" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#d0c6c709e3e546ae8553b0d1d41a265b)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="9b78008c45f14208a335ac126a9a8dfc"/>
+            <use xlink:href="#01aca6fb15b04fef8ed3e5de2d9f2683" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="25876686f3ea4431b676048fffbf6f42" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="67abfbb78c884ac680614e828d77a0d4" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="8854eef14d1e43d5abe1ce635c042c02" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="651c0764f2cb48d2b612fe61b97bc4a6"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="1b6e0afc28924567b0fb05da55ca989b" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Bienvenue sur <span style="font-style: italic;">Real Collobrier</span></span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="341" height="28" p:name="htmlObject" id="4526b76e3c7c4541a276394a7a284fab" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="00f26272d68f49d0a3a366a8779365d0" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Bienvenue sur <span style="font-style: italic;">Real Collobrier</span></span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="50c5d911f647499bb36cfb7f0189da7f" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="2e2947e5118f42379fabe22990dd93c4" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="813fc67fe8cc484d8d545a6b629b4ca9" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="93f523cece804d73b7911b1924ba61ef" transform="matrix(1,0,0,1,472,458)"><p:metadata><p:property name="box"><![CDATA[409,271.5]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,33.9375]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="409" height="271.5" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="c7bd8d5668a2480eac28a6f3d9a0cac7" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="474fd9cff158400cad10fff1bd913b86">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#c7bd8d5668a2480eac28a6f3d9a0cac7" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#474fd9cff158400cad10fff1bd913b86)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3021bebc2df44787938c6845d35ad6fe"/>
+            <use xlink:href="#c7bd8d5668a2480eac28a6f3d9a0cac7" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="33.9375" y="136" width="341.125" height="0" p:name="text" id="b9d8d25cffa24a2c8a93c4f8648529bc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="ae4d39e334984bf7a288daccbe94ad31" transform="matrix(1,1.7958637354986706e-10,-1.7958637354986706e-10,1,34,169)"><p:metadata><p:property name="width"><![CDATA[410,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: justify">
+    <p>Le site expérimental du <a href="https://gisoracle.cemagref.fr/"><b>GIS ORACLE</b></a>
+ est constitué des bassins versants du Grand et du Petit Morin. <br />Ces deux
+ bassins versants, d'une superficie totale de 1675 km2, sont 
+représentatifs des grands ensembles sédimentaires à dominante <br />rurale et 
+fortement anthropisés du Bassin Parisien, sous climat océanique tempéré.</p>
+    <p>La disponibilité de longues chroniques hydrologiques et 
+climatiques sur ce domaine géographique en fait un <br />site d’exception et 
+doit permettre une approche statistique des phénomènes et des évolutions
+ du paysage,<br /> souvent difficile à obtenir. Actuellement, sur le bassin 
+versant de l’Orgeval (affluent du Grand Morin, 104 km²), <br />près de 50 
+années de chroniques de débit et plus de 30 années de chroniques de 
+qualité de l’eau sont disponibles, <br />et de nombreuses campagnes de mesure 
+ponctuelles ont été réalisées (état hydrique, biomasse, rugosité….).</p>
+    <p>Le dispositif expérimental de l’Orgeval suivi par le Cemagref 
+permet d’ores et déjà d’accéder à différentes échelles <br />de bassins 
+versants emboîtés. Un réseau hydro météorologique suivi par la DIREN Île
+ de France et Météo France<br /> sur l’ensemble des deux bassins versants du 
+Grand et du Petit Morin vient compléter ce dispositif.</p>
+    <p>Pour plus d'information, vous pouvez visiter le site du <a href="https://gisoracle.cemagref.fr/">GIS ORACLE</a>.</p>
+    <p>Vous pouvez également télécharger le <a href="http://gis-oracle-dev.lyon.cemagref.fr/resource.php/module/cemagref/fr/gisoracle-ihm/docs/Metadata-BD_ORACLE.pdf">descriptif complet de BD_ORACLE©</a>.</p>
+    </div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="410" height="414" p:name="htmlObject" id="e4b92e58694b443e86a5b6c638a6d4a0" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="8f00434e92334267bc5c9b2cb7d98541" style="display: inline-block; width: 410px; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: justify">
+    <p>Le site expérimental du <a href="https://gisoracle.cemagref.fr/"><b>GIS ORACLE</b></a>
+ est constitué des bassins versants du Grand et du Petit Morin. <br />Ces deux
+ bassins versants, d'une superficie totale de 1675 km2, sont 
+représentatifs des grands ensembles sédimentaires à dominante <br />rurale et 
+fortement anthropisés du Bassin Parisien, sous climat océanique tempéré.</p>
+    <p>La disponibilité de longues chroniques hydrologiques et 
+climatiques sur ce domaine géographique en fait un <br />site d’exception et 
+doit permettre une approche statistique des phénomènes et des évolutions
+ du paysage,<br /> souvent difficile à obtenir. Actuellement, sur le bassin 
+versant de l’Orgeval (affluent du Grand Morin, 104 km²), <br />près de 50 
+années de chroniques de débit et plus de 30 années de chroniques de 
+qualité de l’eau sont disponibles, <br />et de nombreuses campagnes de mesure 
+ponctuelles ont été réalisées (état hydrique, biomasse, rugosité….).</p>
+    <p>Le dispositif expérimental de l’Orgeval suivi par le Cemagref 
+permet d’ores et déjà d’accéder à différentes échelles <br />de bassins 
+versants emboîtés. Un réseau hydro météorologique suivi par la DIREN Île
+ de France et Météo France<br /> sur l’ensemble des deux bassins versants du 
+Grand et du Petit Morin vient compléter ce dispositif.</p>
+    <p>Pour plus d'information, vous pouvez visiter le site du <a href="https://gisoracle.cemagref.fr/">GIS ORACLE</a>.</p>
+    <p>Vous pouvez également télécharger le <a href="http://gis-oracle-dev.lyon.cemagref.fr/resource.php/module/cemagref/fr/gisoracle-ihm/docs/Metadata-BD_ORACLE.pdf">descriptif complet de BD_ORACLE©</a>.</p>
+    </div></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3343d8f41cb64ddea81640cdf262f222" transform="matrix(1,0,0,1,188,617)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[real-collobrier.science.gouv.-tv.fr]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="861d6f24d5b34b88b830bf4a97b2c746" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="53c737b7e9714176a13e3f1adfd92e49"><tspan x="0" y="0">[real-collobrier.science.gouv.-tv.fr]</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2a1bf9ae166c43cfa2a412d6a060b66c" transform="matrix(1,0,0,1,19,617)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pour en savoir plus : ]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3cd2da3c07ac4f02b768049dcf700067" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="27fb0c25b99f404b8a63e041cc558083"><tspan x="0" y="0">Pour en savoir plus : </tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d322ab1d510c49d8b880f1de1917acd9" transform="matrix(1,0,0,1,563,467)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[PHOTO 1]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1ad5500380994a12b16b62d17734adca" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9b9815accaa347508c342150cb6215e7"><tspan x="0" y="0">PHOTO 1</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="88369afa3f9f44f884336730dc2594f3" transform="matrix(1,0,0,1,721,467)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[PHOTO 2]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8243be7adc9a4b3abdf04f65c0d9f61a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fc5d3c3ac9b34156b43ccb5465b86625"><tspan x="0" y="0">PHOTO 2</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="aeb09ba67498491cb1fd55fc35c39704" transform="matrix(1,0,0,1,691,130)"><p:metadata><p:property name="box"><![CDATA[97,17]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Présentation]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="8a75dfa361c4414daeee3f00eda4a319" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="f05f467278f44034af8480505b574aab" d="M 0 0 L 20.686674415824704 -0.16934598208276874 L 42.13473402328785 0.48018065947279653 L 64.9818901045494 0.33534660002939365 L 97 0 L 97.400369474739 8.603934396651844 L 97 17 L 74.61655413608878 17.47772788984406 L 55.816177772163876 16.62055136728074 L 37.867976696312255 17.345306207586624 L 0 17 L -0.27105557997434593 8.713119727904052 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="07c7944ee26d4846a79f5b143c8e3211" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; dominant-baseline: auto;" x="4" y="13">Présentation</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="284f9aabaf3341a7bef2542b14f126dd" transform="matrix(1,0,0,1,796,130)"><p:metadata><p:property name="box"><![CDATA[96,17]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Partenaires]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b628d586764c459499c1c026a79cdb54" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="e15385db38d843519931f7871da48db6" d="M 0 0 L 19.75408510529814 -0.31749008142308144 L 42.12062282811217 0.3294587789864939 L 61.225637035920506 -0.21848744572324297 L 96 0 L 95.74695282552337 6.780986421961556 L 96 17 L 75.69563814286875 17.269374066479237 L 55.60402113033372 17.082210859824915 L 36.74643285292665 16.952545358634037 L 0 17 L 0.2938457244351017 9.679544987894607 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c1bcd95603834040a2a35aabafc3032d" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; dominant-baseline: auto;" x="7" y="13">Partenaires</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,472,169)" id="a8493a285d524aa7a2414c775c4d90c4"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="0f50586a198f428d8de97032f23c79ef" transform="matrix(1,0,0,1,0,-5.684341886080802e-14)"><p:metadata><p:property name="box"><![CDATA[409,271.265625]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,33.908203125]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="409" height="271.266" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ddf9a8322a8d46ad8b73b477da42d384" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="722f70b618f84de89170123e1fc5c4ca">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ddf9a8322a8d46ad8b73b477da42d384" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#722f70b618f84de89170123e1fc5c4ca)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="ec125cf55e3e44369a1123d40643e975"/>
+            <use xlink:href="#ddf9a8322a8d46ad8b73b477da42d384" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="33.9082" y="136" width="341.184" height="0" p:name="text" id="db020bece0b041e3a7618544d8ba770e" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="42bf2536c8134f1dbdc3270c2c84fa0f" transform="matrix(1,0,0,1,14,145)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Paramètres étudiés]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5e4048b3f42c49eca1607fcbd1e06bc6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="87e6c4e49b5145398dcce277f763d958"><tspan x="0" y="0">Paramètres étudiés</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="ece1ed97ebc04944b0cd913cfee3bf4a" transform="matrix(1,0,0,1,14,176)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Concentration en azote sous forme NH4]</li><li>[Hauteur d'eau]</li><li>[Pluviométrie]</li><li>[Température du sol]</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="279" height="80" p:name="htmlObject" id="ea701e42c1ef4d26ba2540174b7506fe" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="82baf033c59a4b40ba502f7845c2d16c" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Concentration en azote sous forme NH4]</li><li>[Hauteur d'eau]</li><li>[Pluviométrie]</li><li>[Température du sol]</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f8aeab5f120a4bcaa84bb50f598add9b" transform="matrix(1,0,0,1,14,15)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Sites expérimentaux]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3d440212c44f4e22af4b47910a323c19" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a1a351a31e1f4306b5e79a136eb15a04"><tspan x="0" y="0">Sites expérimentaux</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="b06d2732cacf46eeb65864a7d50fe23a" transform="matrix(1,0,0,1,14,42)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Real Collobrier]<br />Description détaillée qui prend de la place, si si je vous jure <br />lsdihfkjsdh lkcjfhkjfkh  fnj sdgdfh jfk jdf gfdk fk jlkdfjkl <br />gjfdkj kfd kjdfkj gkdfj kgjdfk jfk jgdfkj kgdf kdf k !!</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="382" height="68" p:name="htmlObject" id="08595c569d0046bc829667d3582f1501" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="b747f703c3da43faa6cdb2b00290d353" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Real Collobrier]<br />Description détaillée qui prend de la place, si si je vous jure <br />lsdihfkjsdh lkcjfhkjfkh  fnj sdgdfh jfk jdf gfdk fk jlkdfjkl <br />gjfdkj kfd kjdfkj gkdfj kgjdfk jfk jgdfkj kgdf kdf k !!</li></ul></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(18,19)" id="81140ff833e14bc1bbbb58b04d4d4c43"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="975c90b034ca4cfd966f420f861334a6" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="211a31bd630a4a1dbef1a109a68ab379" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="f4a6469c7b1e4e80abe28e0d937a8fbc">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#211a31bd630a4a1dbef1a109a68ab379" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#f4a6469c7b1e4e80abe28e0d937a8fbc)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="1a8a39f3b850497394877fe3db10df1a"/>
+            <use xlink:href="#211a31bd630a4a1dbef1a109a68ab379" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="b6339edc32964efba82d724de78dba18" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="12066628b05f40a0a925c35c82a1bf27" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="3dcdfde3776746d9ba234eb0e1c12289" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="9e3643503cf344aaa06d2d358f954650">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#3dcdfde3776746d9ba234eb0e1c12289" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#9e3643503cf344aaa06d2d358f954650)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="2b7e6ee6ecdc4e458f671daa0d6bfad8"/>
+            <use xlink:href="#3dcdfde3776746d9ba234eb0e1c12289" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="00085a2384a548f29796e3dc882468cd" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="4c9a8ab9ac384ccdbf59abc371fb084f" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="648d09b09bc34083a9ab08769135e96a">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="74ecabc4b73345a89b9dd26697816789">
+                    <ellipse p:name="ellipse" id="e7e4bd269dc44b27bad1b1c554f2d2b6" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#74ecabc4b73345a89b9dd26697816789" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#648d09b09bc34083a9ab08769135e96a)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3b5a312151614ce1ae66cf69a27efbee"/>
+            <use xlink:href="#74ecabc4b73345a89b9dd26697816789" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="c508e83f03d84ceead3151605cbce076" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="503ad2b921c346cfbf3919c2c36aece4" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0c96caff6dc644dab182dbffb8cee36b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7c2379edd07a4ddf91957fbe194d3776"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a83b10307c2c445682772a079dde9307" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="407c471e1c0a445d9645027711bce1b2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="32b852fb3bed47edbbdc7fe699bca58f"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="af4d8c29d25d4b52827f60d02788d9f0" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d80f17caaea44f54bab854bc09f60eb0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="08d1b62fa5c141bd8909db828b9ca575"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="7a67fbe5251d4be5ac41d9ac2164ac2f" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="781d3575c9164af1bd54c36e0d96870a" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="2b27d2cb03dd424a9028a77e70df7a5b" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="6ba86dda33324b8eaec7952347b21927" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="018d8d7228424a478bcc1ce1713c180a" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="119a3c5628ca4cff82abbb14c91ee508" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f86ff75bb6d44411b718f93802b0399c"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="e97edebb8dd64f50bf02c9cab6f36ec1" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="77e5c98d56e54714a67e1463cba8c521" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="9617ac89ed7b4a4cb1d34ee8bf226cbc" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="456675a81f6944d7a9e01e4183c1d261" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="999aad2f14904c279fbdf8886126386e" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b71d00e4d262487fa2e3ad5f621ee748" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="331b1fc3746f469e809ab4c4138eb521" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="beb150eb57154c41befcb4a8d60e9043" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="6445b59875d841ba8eacccabe2ecd885" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="20776d9019ec44c3952e8477baa0ded6" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6b9979cdf099461c8119048b3fe8d8db" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6ef76dd57395497482fc09972b8efcd5"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g></Content></Page><Page><Properties><Property name="name">Partenaires</Property><Property name="id">1343808128120_95</Property><Property name="width">908</Property><Property name="height">900</Property><Property name="dimBackground"/><Property name="transparentBackground">false</Property><Property name="backgroundColor">#FFFFFFFF</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,17,757)" id="3c120ddc0ed44ef5aa81f7c2def0bf4b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="6afdb667724842d3ae7126d457df2009" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="521b3075b77b48a9b61d418e1a299576" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="8ab290f422c04748a33db9e0e16b60b5">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#521b3075b77b48a9b61d418e1a299576" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#8ab290f422c04748a33db9e0e16b60b5)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="6ca439095e4543eeb1d8282dd33cee29"/>
+            <use xlink:href="#521b3075b77b48a9b61d418e1a299576" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="81aaeb667fcf472ab2fe83019176fd1e" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="f8e2890bfb2c4e89a8deab906953cfe0" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="de480ae8ea8349328091b3befbc4784c" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="effbbb082b5542d6b850e29e2c0f0cb7"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="1b6e0afc28924567b0fb05da55ca989b" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Bienvenue sur <span style="font-style: italic;">Real Collobrier</span></span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="341" height="28" p:name="htmlObject" id="3530a505b0484423b7f4b8e10e71ddf6" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="74c8591d885c4078a547d0fa72e08909" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Bienvenue sur <span style="font-style: italic;">Real Collobrier</span></span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="50c5d911f647499bb36cfb7f0189da7f" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="7df126666c6944019eefc4595c15fd6a" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="44e342cf45204b4898013c24d5d30343" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="93f523cece804d73b7911b1924ba61ef" transform="matrix(1,0,0,1,472,458)"><p:metadata><p:property name="box"><![CDATA[409,271.5]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,33.9375]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="409" height="271.5" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ddfa5e4dff8e4633bc2441f32e719e5f" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="334c8fdbcf164d95b8ff230427cfb0a3">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ddfa5e4dff8e4633bc2441f32e719e5f" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#334c8fdbcf164d95b8ff230427cfb0a3)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="44a9f4f579284b179e6d95cf8cf87389"/>
+            <use xlink:href="#ddfa5e4dff8e4633bc2441f32e719e5f" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="33.9375" y="136" width="341.125" height="0" p:name="text" id="f2f2ac76651e45069477f010e1e3be62" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d322ab1d510c49d8b880f1de1917acd9" transform="matrix(1,0,0,1,563,467)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[PHOTO 1]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="65188045fd2548978071a4a2c5b84bcc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="acaea5eba4034042a2940c3bc82ca89f"><tspan x="0" y="0">PHOTO 1</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="88369afa3f9f44f884336730dc2594f3" transform="matrix(1,0,0,1,721,467)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[PHOTO 2]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="cc1e7b971e964b5f815f7680b502c8dc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a604b68e5872469c8b223bd79d78d05c"><tspan x="0" y="0">PHOTO 2</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="aeb09ba67498491cb1fd55fc35c39704" transform="matrix(1,0,0,1,691,130)"><p:metadata><p:property name="box"><![CDATA[97,17]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Présentation]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="0d9e6390817e4c448cb31216c74a6a36" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="8c3344f5cb094d788cbe1dc91dacdc10" d="M 0 0 L 20.686674415824704 -0.16934598208276874 L 42.13473402328785 0.48018065947279653 L 64.9818901045494 0.33534660002939365 L 97 0 L 97.400369474739 8.603934396651844 L 97 17 L 74.61655413608878 17.47772788984406 L 55.816177772163876 16.62055136728074 L 37.867976696312255 17.345306207586624 L 0 17 L -0.27105557997434593 8.713119727904052 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="8172f7333be849b6bc2a49ee25e2ce77" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; dominant-baseline: auto;" x="4" y="13">Présentation</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="284f9aabaf3341a7bef2542b14f126dd" transform="matrix(1,0,0,1,796,130)"><p:metadata><p:property name="box"><![CDATA[96,17]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Partenaires]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="45d4371da9ae4749a19cd892fbc327fd" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7291d76317144d588c5877aa0d74854d" d="M 0 0 L 19.75408510529814 -0.31749008142308144 L 42.12062282811217 0.3294587789864939 L 61.225637035920506 -0.21848744572324297 L 96 0 L 95.74695282552337 6.780986421961556 L 96 17 L 75.69563814286875 17.269374066479237 L 55.60402113033372 17.082210859824915 L 36.74643285292665 16.952545358634037 L 0 17 L 0.2938457244351017 9.679544987894607 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="da14bfd4553443179aff705b84d637bd" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(255, 255, 255); fill-opacity: 1; dominant-baseline: auto;" x="7" y="13">Partenaires</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,472,169)" id="a8493a285d524aa7a2414c775c4d90c4"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="d72b3ad1f89b4c2fa09e61cea5618d91" transform="matrix(1,0,0,1,0,-5.684341886080802e-14)"><p:metadata><p:property name="box"><![CDATA[409,271.265625]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,33.908203125]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="409" height="271.266" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="8395a0c46c794f308506b755c9ca5be2" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="9bd133118d9b470f822acd8cd288175a">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#8395a0c46c794f308506b755c9ca5be2" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#9bd133118d9b470f822acd8cd288175a)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8188d17f55714bc182ad6cdefbaa634c"/>
+            <use xlink:href="#8395a0c46c794f308506b755c9ca5be2" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="33.9082" y="136" width="341.184" height="0" p:name="text" id="8981ea7484b44494b7c62d8b5e43051e" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4e6551c08ea04894a67e9c0a82868500" transform="matrix(1,0,0,1,14,145)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Paramètres étudiés]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8301984e7d1847ba9928063acaec5e9f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c4e85cc9eba440d39fc9f0b060f55258"><tspan x="0" y="0">Paramètres étudiés</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="4d51d9a28bfc46a8adebc8e0a85191c0" transform="matrix(1,0,0,1,14,176)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Concentration en azote sous forme NH4]</li><li>[Hauteur d'eau]</li><li>[Pluviométrie]</li><li>[Température du sol]</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="279" height="80" p:name="htmlObject" id="5a388e1dad554e21842f76aa060691a6" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="c6aecac3f65745f48b5753d545f40076" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Concentration en azote sous forme NH4]</li><li>[Hauteur d'eau]</li><li>[Pluviométrie]</li><li>[Température du sol]</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="93d52b57028c44f98e1193eebc923cc3" transform="matrix(1,0,0,1,14,15)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Sites expérimentaux]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="85e91fb124ef4687988400494fe0d5e8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f19a2add27b94835b7858187dd8208de"><tspan x="0" y="0">Sites expérimentaux</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="fab8c14541104f38b6671f3d2987eb3e" transform="matrix(1,0,0,1,14,42)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Real Collobrier]<br />Description détaillée qui prend de la place, si si je vous jure <br />lsdihfkjsdh lkcjfhkjfkh  fnj sdgdfh jfk jdf gfdk fk jlkdfjkl <br />gjfdkj kfd kjdfkj gkdfj kgjdfk jfk jgdfkj kgdf kdf k !!</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="382" height="68" p:name="htmlObject" id="ecb9f50d9a514d05bd016bc544a56f4a" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="9b56677744d04ddd81717c64ad633399" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Real Collobrier]<br />Description détaillée qui prend de la place, si si je vous jure <br />lsdihfkjsdh lkcjfhkjfkh  fnj sdgdfh jfk jdf gfdk fk jlkdfjkl <br />gjfdkj kfd kjdfkj gkdfj kgjdfk jfk jgdfkj kgdf kdf k !!</li></ul></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9c92fad548dc479d9b368d5c2c95ea1c" transform="matrix(1,0,0,1,29,172)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Partenaires institutionnels]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="82ae19e14071420cbc17c0fae2938287" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="05c9dd808c524bcca579341211792f10"><tspan x="0" y="0">Partenaires institutionnels</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="28f4b14ca6a04ca285d16bdf24c71bd3" transform="matrix(1,0,0,1,24,193)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Partenaire 1]</li><li>[INSERM]</li><li>[Lyon1]</li><li>[INRA]</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="118" height="80" p:name="htmlObject" id="145db52181d14d97a19320f8337d34d4" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="08e228a9c7784e70b646e0fd3f05249d" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Partenaire 1]</li><li>[INSERM]</li><li>[Lyon1]</li><li>[INRA]</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="20a03063d21f451fa26f221d38dfcc02" transform="matrix(1,0,0,1,33,317)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Partenaires scientifiques]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b838e6f696bc4b07b0c3225e31f1a818" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7e4d9cd39da244418776f9124f0e7d65"><tspan x="0" y="0">Partenaires scientifiques</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="70b30849dac34c79a4e0555403e4d2ad" transform="matrix(1,0,0,1,19,341)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<ul><li>[Partenaire 1]</li><li>[INSERM]</li><li>[Lyon1]</li><li>[INRA]</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="118" height="80" p:name="htmlObject" id="ad0277b4b50c41b5a02476f9f3ecb2f4" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="56db09c1531d461596e10efdc63f704d" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>[Partenaire 1]</li><li>[INSERM]</li><li>[Lyon1]</li><li>[INRA]</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(18,19)" id="1cb4814722ad456ea1e591d35fc491bc"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="975c90b034ca4cfd966f420f861334a6" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="cb0836af4c93480b8c468f883c38efd1" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="276613129dde447dbc554308bcead845">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#cb0836af4c93480b8c468f883c38efd1" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#276613129dde447dbc554308bcead845)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="53ad7bf4f76648118354c76eb2dc77c6"/>
+            <use xlink:href="#cb0836af4c93480b8c468f883c38efd1" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="403f6d307c934d6ca3cc638b62ce5309" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="12066628b05f40a0a925c35c82a1bf27" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="31ac85ccc7d847f2a9d76df97767502f" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="89920ea8b67a4e56b625b3cedebdbe12">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#31ac85ccc7d847f2a9d76df97767502f" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#89920ea8b67a4e56b625b3cedebdbe12)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d3b3846b6c394f65877cecb62701db18"/>
+            <use xlink:href="#31ac85ccc7d847f2a9d76df97767502f" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="578257431a6e4f58bbaf34a623d2a5bb" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="4c9a8ab9ac384ccdbf59abc371fb084f" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="3d20df80b58146808773a7ca15efaef7">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="bd63a7a240fd48818ef8859ae3b00f5f">
+                    <ellipse p:name="ellipse" id="4eaa4f0bc3354032b9707eb1ca217a59" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#bd63a7a240fd48818ef8859ae3b00f5f" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#3d20df80b58146808773a7ca15efaef7)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="0d308a88fc794fb0aee1292cbdada2d4"/>
+            <use xlink:href="#bd63a7a240fd48818ef8859ae3b00f5f" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="767b979c3d384a208069647bcfe30091" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="503ad2b921c346cfbf3919c2c36aece4" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6599c731501243a1afb2ef275d98ea84" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6874d61194e749d28144f62dd965469d"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a83b10307c2c445682772a079dde9307" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="97d18e1a234a4b6dab7c7670dffb8c93" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="57fcb8308acc436e875f608624dd36cc"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="af4d8c29d25d4b52827f60d02788d9f0" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="41de9f86ab164487b9f36a8abe8c1b67" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ee239c8618444cbe91f55feb4da59ee2"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="7a67fbe5251d4be5ac41d9ac2164ac2f" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="4b1d2585f65d4d71bd4352ee40bde1be" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="01f65c2510264477b67d61e5cbe47e82" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="7d1a4a0ca1154c7887397cf52612a01a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="018d8d7228424a478bcc1ce1713c180a" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1a284e101b64446c8d7766ff0e0f22a0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="b87b5f29314a42a293b20316732e98ac"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="e97edebb8dd64f50bf02c9cab6f36ec1" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="251ed75f6f804515accb3bac9ce66e23" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="c526ae6cea454edbbf0e717a7749004e" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="456675a81f6944d7a9e01e4183c1d261" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="bd62fa2d56ba494aa99e55f40db9c6ff" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="80f497ac44cb4b2087801fdfce3c0250" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="331b1fc3746f469e809ab4c4138eb521" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="40ded7fb188842dfa9466188dfdd0cec" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8b6d8c450175476cb56607b50b95e03a" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="20776d9019ec44c3952e8477baa0ded6" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b64a5c50bd784b17a32fef73fcd945f6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="41643b1bb3664e81b2875299a76d688d"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g></Content></Page><Page><Properties><Property name="name">Nos données</Property><Property name="id">1343739116313_8127</Property><Property name="width">908</Property><Property name="height">1200</Property><Property name="dimBackground"/><Property name="transparentBackground">false</Property><Property name="backgroundColor">#FFFFFFFF</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,348)" id="3c120ddc0ed44ef5aa81f7c2def0bf4b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="50e69222f8a74b76906f94cf28778806" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="4a19cb711e5d49d081b5cf2981624af4" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="0b47fd810d4d407ea9d697c211efaee1">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#4a19cb711e5d49d081b5cf2981624af4" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#0b47fd810d4d407ea9d697c211efaee1)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="4187f528bab849b5ab40e1b52104b5c1"/>
+            <use xlink:href="#4a19cb711e5d49d081b5cf2981624af4" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="54f64e6613e74497b2a85aafc76417ca" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="e9e2dc4ffdf6451b9bc5e772588bcd43" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="c9b268cce756498d829c82b37e26110f" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="009df2905924491a990f73c7d6bb1b2c"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="1b6e0afc28924567b0fb05da55ca989b" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Nos données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="151" height="28" p:name="htmlObject" id="ff9158f0a3b0406d83a5d23c3f92598e" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="a694db664fe04be28cfe8f874e3bffa9" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Nos données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="50c5d911f647499bb36cfb7f0189da7f" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="9d6a5dc8e2174792a1e3d24563ff54ea" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="2fa9bf26076849b396b4082ccbeaba32" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d0088e1d5c89424da9d7cf8f9075af02" transform="matrix(1,0,0,1,39.8125,181.4375)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Voir les plugins Javascript de tableau (avec filtre, tris...)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ef05e9703228429cb1785573cc93b0e2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="cc79e6e8307d4fbbba1896def2c416bc"><tspan x="0" y="0">Voir les plugins Javascript de tableau (avec filtre, tris...)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e8732431b8f84bd0877bba4c70a68539"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="68ddcfff99b648ba97c05b59230f4a07" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="6af95903fe90432486718e1a4f22d283" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="c4be5f2d34024e9d840748bf6fe79594">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#6af95903fe90432486718e1a4f22d283" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#c4be5f2d34024e9d840748bf6fe79594)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="1a98578562fc4281a32033895276e1d2"/>
+            <use xlink:href="#6af95903fe90432486718e1a4f22d283" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="84683667549a4fba8837526fff54a12a" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="fed2c9717f244c92a72b226abe80d8b5" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="c24dc833d1d94c1fb0571b543368ec6e" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="61ec32daaac74132b677c1f0680f6aa1">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#c24dc833d1d94c1fb0571b543368ec6e" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#61ec32daaac74132b677c1f0680f6aa1)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="ed5d220c026644bbaf8d44000d9a8b0e"/>
+            <use xlink:href="#c24dc833d1d94c1fb0571b543368ec6e" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="75cfcb5ff3d04592a5194b58ac226391" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="1d66714335ec4f8f86d54d0e490ea04d" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="7c00398aedd64a0fb0a9b5f0d3f14143">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="adb354172e2449a48749f5a925e61e0c">
+                    <ellipse p:name="ellipse" id="31367dea7c084ffab4a60226be4c7c07" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#adb354172e2449a48749f5a925e61e0c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#7c00398aedd64a0fb0a9b5f0d3f14143)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="1ef6fdb44c184a7cb346931c3763a429"/>
+            <use xlink:href="#adb354172e2449a48749f5a925e61e0c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="7be37dd70ad449468c668d295022198f" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="db481db3195b4e0b9ac3873884110ade" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9c155a06bd65448c8aaaf39ce55a67b1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d08e9cb69dd842e2a5b0ac8276dbc3a0"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2a0256b8bad947bead34d175706cd7f6" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="474c6e5dbaea4f719da4f758ad77e4c1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="60058f332c954d9c8f3ffd9f231d6521"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="297c5d1d7a7744bd97a9e186d36a17a2" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8ab04c5aa60748729c3cbf553ab428e8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f2777edd2b0a4d129a9b56e527dca082"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="84f79191ed4a43c9ad02a11428424676" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="5c4ad2c44bd140d7be60609a9bceebfa" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="b8f3ff81682b45249d3e040b620deff7" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="bc8963e19f5947819b539ca5f918f5bc" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="d685b03c6c9746aeaf4e9d2071ee51d5" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0392f6d149804d5abd9a3ac005215e82" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c9d1f611a8f340de8fe846102a544379"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="abb3b4e237534b32a3069ad1ea574294" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="cb06e9fecbbb4250b17f41e21e587149" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="5ae64d3bf708431f93ea6315a9a51791" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="7ae556bfaa9c4194ae1994a214d76a99" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="25a6139c3ccd4663b57a64f50d144d8d" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="f03083f400c84e38b026cfd3f662d222" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="f46627bad94c41edbe0ada97748ebb0c" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="afbea554a1db4266a7730852993fb70f" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="59375a049c964489a9982b66722a3f9e" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0ef31e32e53e48c39095042989a2dad1" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7da23f220b2645c19e5acd52a3f5deb7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5d45b37d451d45ac8a6a550467f7dc20"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/recherche-avancee.ep b/src/Irstea/BdohConsultBundle/Resources/doc/recherche-avancee.ep
new file mode 100644
index 0000000000000000000000000000000000000000..460ec5e943db4e2ab8186d7c1b4736fd469b60e9
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/recherche-avancee.ep
@@ -0,0 +1,575 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Recherche avancée</Property><Property name="id">1347629251899_590</Property><Property name="width">908</Property><Property name="height">850</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,17,1207)" id="a22eb900329c4267ac615e6061a221ad"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="08320bf8e3d344049b0a8a7cdb833000" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="2b483b8d77e84c5d983eed686c902d42" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="9ff0dc2c9c034cb1bf8ff21b64efa77d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#2b483b8d77e84c5d983eed686c902d42" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#9ff0dc2c9c034cb1bf8ff21b64efa77d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="652264cf8c974fcd9fcdfcc30424dc4e"/>
+            <use xlink:href="#2b483b8d77e84c5d983eed686c902d42" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="045df9c40add43f0a62b3c8a653b6b52" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="5eb4d4d89d47495aacdc18d068d11935" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="f57036dc620c4560943ad3c833facacc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="6049407cbbd6496c9e2e0d89efc8d7d0"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="bf6a79abfa2d40359278398a8c2abe39" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);"><span style="font-style: italic;">Nos données</span></span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="149" height="28" p:name="htmlObject" id="50fe60c71c24413db9b724a57c60a6a3" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="546d8b095b3544018263c419314e2b69" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);"><span style="font-style: italic;">Nos données</span></span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="0df681989b85425fbef8264b47586492" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="c4cd5cc5ad9842f2843196ebf2a536e2" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="9db1bf01a11f49a196367f0415592b2d" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="cabdc4860fce4c95929a3edfbb673f12"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="0c40c8d6d9274529b47f7fdb5a802ccd" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="7741e57073214be6a3574b2e39d0b569" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="9a47cbeeb0144da5aee80cfc25acc4fe">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#7741e57073214be6a3574b2e39d0b569" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#9a47cbeeb0144da5aee80cfc25acc4fe)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="ffcf9236c54e4268b4cf5571490dcfdd"/>
+            <use xlink:href="#7741e57073214be6a3574b2e39d0b569" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="d0b567ec8cd14ea7968164486a106c63" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4048eb93acd94d6faebd107dbf5888c9" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="3057a08aca3e4f418e713cbb8789f87a" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="76056dda40554414b47f0bb45e623c39">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#3057a08aca3e4f418e713cbb8789f87a" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#76056dda40554414b47f0bb45e623c39)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="94b3327e0bf44f39bee624e8634a7d82"/>
+            <use xlink:href="#3057a08aca3e4f418e713cbb8789f87a" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="4f6e74c332b24e529a6a9304d1167bbc" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="64da19cdc40247fcb23dc788211341bc" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="ac63f50698b34eec854744b21df05373">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="f7b663c1595d4de9bed5976a77690d47">
+                    <ellipse p:name="ellipse" id="f5e3780fc09b44db8648a721dbc0a83e" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#f7b663c1595d4de9bed5976a77690d47" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#ac63f50698b34eec854744b21df05373)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="9e2ee3ca1735418eb61df2c808c91b5f"/>
+            <use xlink:href="#f7b663c1595d4de9bed5976a77690d47" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="d6cf10d9f5e24ac3b5d6088213aa7ee5" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="19bd5992e29f41918f7ee8c261e394ae" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="22c100f14b474fa5bcdb6efff8deb51c" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="077a3f22995745118afe03014ffebaec"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1905133ce9e24b8a8acad43b36d4b293" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="10edad2981e547699ced8763e6ed037c" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="781a75d2c1474095bd63176af62f84f6"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e70da91145304b199eb6980ac29f4411" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e514f1d3bede4118ade4e6dfe3e2bf67" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="1f539cd1c4f64180925b88deeaca00b7"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="13853ceeee784ac78657d421000052ad" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="d23d15d36c7540258c69f63a358dd61b" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="46cdba5fe43641029578c5abfdceeec5" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="d03faf8903c04faa98a1f06cb4a7e38d" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="85553008374448ac9d895127e1cc1596" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="cfac47409b094baa8d0722b327debcaa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fabdeab4f9f3417d8bd9fa8963ea34b2"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="c3da3af402a444f986f6ab6f3b6aaef6" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="c549bcbbee1944c6b865ace2660a5b7a" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="6f3b7ef2b03a4100939f4759f88bd7e1" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="3877db3583d347b084dfe6843ff536d7" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="f3e3f28af4df49d2bb0774afccda7e35" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="c05182b9591548f8b2b2c7d7b6c1c834" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="724cdba8127e4cf98f6eb0c5d72af55f" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="ca222ce930a941ce9ae9edb569f189c6" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="9e5f7bca01cc40feb67a13a47eb3863d" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="08a589526aa64630a124f3a00f1a1afc" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c8d147596b9c46bcb95240047b644373" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="23e5a386904046e5957f20b592f055bc"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="739fb0800f164598bfc889cdd8c750b1" transform="matrix(1,0,0,1,85,166)"><p:metadata><p:property name="box"><![CDATA[53,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[10]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="ced3cc0962b241798d57a260f9e14457" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="3ddcbdc852714948ad65b141190865b6" d="M 0 0 L 15.991777365270892 -0.1611268002122217 L 28 0 L 27.51315495485838 11.793174800600271 L 28 25 L 14.613051235200729 25.444296621521445 L 0 25 L -0.09836377188339018 11.680907986677221 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="de59738cb62f42cb8b6386dfa0732047" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="faf804c17fc84a7fb434894f9e13a1df" d="M 28 0 L 41.99177736527089 -0.1611268002122217 L 53 0 L 52.51315495485838 11.793174800600271 L 53 25 L 40.61305123520073 25.444296621521445 L 28 25 L 27.901636228116608 11.680907986677221 L 28 0 z"/>
+            </g>
+            <path d="M 31.85 5 L 42.01132176109161 5.409170615747387 L 49.16 5 L 45.54647504179462 11.530045600365419 L 40.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="db847bfac2f74a2fa1e737bc4aeafd92"/>
+            <text p:name="text" id="539f45afd1b64261a828272daa58325a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">10</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f748e36b7e20455eb0038948c0aa4b37" transform="matrix(1,0,0,1,19,171)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Afficher]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b8cbd2ee55cb45a39f1dbd2d9f0312ed" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4f335cb0b1494641ae11af9b7770deeb"><tspan x="0" y="0">Afficher</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="565254c3e8d044839a14428669688da4" transform="matrix(1,0,0,1,148,171)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[lignes par page]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="aebe284cca874c72a21f3e1f111c3fed" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3f01fd61a0964d7986e9b42b1906ddd6"><tspan x="0" y="0">lignes par page</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="f6e1cd8665064312af0d7a8a30986be3" transform="matrix(1,0,0,1,693,165)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9f16842c60cd44ce8aa5711d88828ce7" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="4b00897cded74b3d90ff1d9b5f1965a6" transform="translate(0.5,0.5)" d="M 0 0 L 18.562055712245822 -0.31230770328427526 L 35.916097471343946 0.2648647826174896 L 53.50446373879298 -0.4294808894668418 L 76.14168186706549 0.4959551260621138 L 95.71449366730424 -0.1626125762424595 L 116.91586884121868 -0.07480561061232638 L 138.8149949173784 0.3862539720006112 L 161.45165771866345 0.11936520374461379 L 179.5491515720255 -0.33437226512791485 L 200 0 L 200.41267762000203 12.312316339200168 L 200 25 L 178.14267777701258 24.646166895599425 L 160.3120672471266 25.3746258194872 L 141.98364232168052 24.86761391865389 L 123.3677908899884 25.02973063020058 L 101.91085858962931 25.406126346783545 L 84.53516147704237 24.67016485922599 L 65.7641761019911 25.403206520120047 L 44.252103041092944 25.46858668508479 L 24.685737638303006 25.011732521250117 L 0 25 L -0.19084575074412613 13.767248471920098 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="19ecf2a334904f60acae982f314eebde" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="602753beb596455185d066966d104081" transform="matrix(1,0,0,1,517,171)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Recherche multi-colonnes :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="89f3259c1c1f46b19bd9d043893db710" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="2c21e480a4304029b4e0a38edac8d35b"><tspan x="0" y="0">Recherche multi-colonnes :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="7b2debf2d3ce4e3d9c922bf50930452e" transform="matrix(1,0,0,1,694,207)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Yzeron]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fd112d8675fe4f89b9a725c0cf7dabc6" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="078ab3d65d2c4fa0878e6171f0e06953" d="M 0 0 L 16.923819625081702 -0.07333692605880748 L 36.46082436486892 -0.42321154593451193 L 58.844137554878394 -0.48139908686103505 L 77.69793189428304 0.08084103063029635 L 100.87745050489383 0.058910869428561385 L 117.95631722039036 -0.36836943678344836 L 136.60379393712046 -0.2672372171305817 L 175 0 L 175.4028796184553 11.046156864165676 L 175 25 L 154.81597431679998 24.79615446297573 L 136.9960907740022 25.17997845446482 L 118.9408483514554 24.513491284222575 L 95.53774808226967 25.24997955971283 L 75.48069072882647 24.599791490193336 L 52.2977618962639 24.511506136796704 L 29.260248735815175 25.287563735963133 L 0 25 L -0.4068417485161301 13.638511004361296 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="ea0f4ccf36b54b86b13c68510d3bf899" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="8b674c8499be476a812dc7325a47800b" d="M 175 0 L 186.2492005533851 -0.26589370124560585 L 200 0 L 200.17407460404905 14.313168359836595 L 200 25 L 186.67005683497294 24.611490172717666 L 175 25 L 174.71130834404988 12.581976056959146 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.26874496410696 5.304403714714003 L 196.16 5 L 191.20828311104543 12.782602607924627 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="aa3e5243176d485fada202f577c77769"/>
+            <text p:name="text" id="fe6d0fa288f44466932befa6a51a4936" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Yzeron</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="6b2b5bdeb538494a841b9ac7fd63aa54" transform="matrix(1,0,0,1,549,212)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Sites expérimentaux :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="094db7797e4b43b4a6d81f3bab4d732b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4e58b541e05d4029a7a849ec794c87cf"><tspan x="0" y="0">Sites expérimentaux :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,28,252)" id="795a081473834334b94f0c3131f430e4"><g p:type="Group" transform="matrix(1,0,0,1,0,27.25)" id="97255ad318744123bfb588a86acb7f57"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="d4ba50ae08c547f5baba1aa7fb87bb4e" transform="matrix(1,0,0,1,0.5,0)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="8b6da5b262bd4665aef2838424b8d1f2" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="21aef9f61d104ffbb63910d4cceaaa4a">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#8b6da5b262bd4665aef2838424b8d1f2" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#21aef9f61d104ffbb63910d4cceaaa4a)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d7ac9bf36d73479bb105a01e28104060"/>
+            <use xlink:href="#8b6da5b262bd4665aef2838424b8d1f2" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="6dc6139a392c49fcb98ccc7247afcbd0" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f6e2a17585ff4da4bc6a895db01a2d9f" transform="matrix(1,0,0,1,10.75,5.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Babaou]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="627dd6b89ac0432a9a1e1dec54441f4e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4be54210ce3e4b70890b921b844ea23c"><tspan x="0" y="0">Babaou</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="77be71554eea4a13a1f1982f7d8a6d3c" transform="matrix(1,0,0,1,0.5,29)"><p:metadata><p:property name="box"><![CDATA[856.25,456]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,56.99999999999999]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCC82]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="456" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(204, 204, 204); fill-opacity: 0.509804; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="1799bf51339e46a99a4d5953a46aa6f1" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="1946a11d890c45e7acc1ae428395e697">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#1799bf51339e46a99a4d5953a46aa6f1" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#1946a11d890c45e7acc1ae428395e697)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="3bfa4461646c40f9b48b97145989504e"/>
+            <use xlink:href="#1799bf51339e46a99a4d5953a46aa6f1" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="57" y="228" width="742.25" height="0" p:name="text" id="6900a2da35cb4399a14abe09755d511d" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="cebc111bc3e84696bfb27b9292c62765" transform="matrix(1,0,0,1,0.5,127)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="b721b79ef9704b90b48c788d44ec609a" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="c1220ebc82e44fe79d27b9138ab2993d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#b721b79ef9704b90b48c788d44ec609a" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#c1220ebc82e44fe79d27b9138ab2993d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="eeec9dc3fd8c4a6bb87e217093c0bec2"/>
+            <use xlink:href="#b721b79ef9704b90b48c788d44ec609a" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="c4410cf1e1d84a5ab5ed900297a0af42" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="f41cbab8f4794fe0bb121c0370260e6e" transform="matrix(1,0,0,1,0.5,359)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="874a69af1afa49b9b80e9c1485fe842c" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="c07880f8605b4262abd0f2d96763b416">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#874a69af1afa49b9b80e9c1485fe842c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#c07880f8605b4262abd0f2d96763b416)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1fa253b286748bbab6a30fc95c6914e"/>
+            <use xlink:href="#874a69af1afa49b9b80e9c1485fe842c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="9baddc31fc6645d0b9aa39cbb1302cd9" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="60bd00c6c62d4c2da9ce41bc2ffcc29a" transform="matrix(1,0,0,1,85,8.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Savenay (44260)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|italic|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e51776195ca64b2ca48fff23bc191a3a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="f9634ed474ac4c9c9ee535275ba4c8dc"><tspan x="0" y="0">Savenay (44260)</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:button" id="eba1726b1e2f42148abcbff8c2bb7293" transform="matrix(1,0,0,1,807,4.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fb9ae0fb91ad40cabe975d39e0e3b825" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="a723507475e442858da17c0c752632b4" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="cea7fe3b8f054f40ba569adf8e6710bb" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7b7bd3ec45a542f5be2c2ef8779e2e1c" transform="matrix(1,0,0,1,8.75,132.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pont d'Yzeron]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3404b5fd74ea41a598160d2282e5b5e9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f8a216d3d01d463ea2c6d6dbbf30e23f"><tspan x="0" y="0">Pont d'Yzeron</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="99701ea096a2424f9789b9382cb0581d" transform="matrix(1,0,0,1,135,135.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pontchateau (44160)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|italic|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7c9be90dca4849e19f1fea2568e5f4c3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="55a6be8470b94c3ea27a112581e768b6"><tspan x="0" y="0">Pontchateau (44160)</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:Line" id="08134db21f0243238df069b5821344a4" transform="matrix(1,0,0,1,0,78.75)"><p:metadata><p:property name="box"><![CDATA[856,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="cec8dea17db64bbd84f0e01f5770b6e9" width="856" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 856 5" p:name="line1" id="64d6fd0d52594466a7efd6b6844378ce" transform="translate(0,0)"/>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="2f5963ca6ac94444ad4f2fd50557c04a" transform="matrix(1,0,0,1,74,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hauteur d'eau]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8125227fd10f437d8885ffb029608f6a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="41b8be004ef440ab8aca2b4426739b42"><tspan x="0" y="0">Hauteur d'eau</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="209212e6a61b471cb72ad7bf704a7b22" transform="matrix(1,0,0,1,9,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="07c842119ece465c928e25118ccd4f85" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8cdf15f8088b4ac7b1a496a956b74ced"><tspan x="0" y="0">CA-224</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="775db273a74543ad939029d5a21c671d" transform="matrix(1,0,0,1,429,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="662a9cde7b60481d883a83bdf5858ca9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="eddfc9bf6b9b4136a18604519132158c"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="4a9cf73c44e140eb99e9ea30da0a1a8d" transform="matrix(1,0,0,1,574,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="562c9fb3f8dd46ffa5d067759060b6f4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="500dfd79962a48e29daf1eafd62ee773"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="c13d10ff0d21481198fe4722918982a1" transform="matrix(1,0,0,1,723,34.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="0b9404f3908742f1a4d55d71baa53fc8">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="f663e948dc9c43129033bafddf870dec">
+                    <ellipse p:name="ellipse" id="e5fea7c04db040789264482d72aee9da" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#f663e948dc9c43129033bafddf870dec" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#0b9404f3908742f1a4d55d71baa53fc8)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="955908310630424cbb7342eafb6ad95a"/>
+            <use xlink:href="#f663e948dc9c43129033bafddf870dec" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="fa49bd2d167b461ca93e15a2f8c338ad" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="32a4809058c2482b93ac860d71d7fa23" transform="matrix(1,0,0,1,365,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mg/L]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="fd9db3979e71422eb30fb4af61bacba1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="92cd39ea24c24136a3369c4805050f31"><tspan x="0" y="0">mg/L</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="bfe0446e9d8c4c3c8f999cb36b13abad" transform="matrix(1,0,0,1,189,36.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[Concentration en NH4 prise sous le pont amont]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="ff6f243833814812b766b6620e36e373" width="140" height="45"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f83ff707b06f4505a73d68232e0cf90a"><tspan x="0" y="0">Concentration en NH4</tspan><tspan x="0" y="15">prise sous le pont</tspan><tspan x="0" y="30">amont</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="9e623f05e8564f45856b4f8863aec408" transform="matrix(1,0,0,1,807,44.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="13fbc3a135754a128b31477e3252bda8" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="acc8ddb641a3491cb83d9d5773bee7b7" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b78e70d9f85f44f49da81dc817899c09" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="81e33b515c4d461281ed3649724994d7" transform="matrix(1,0,0,1,75,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ea3c1d00e23940a287b15917a879b5d7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6db744c53a484caebbeca48c4521cab7"><tspan x="0" y="0">Pluie</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c61f57458f924875b04badf3624d0d71" transform="matrix(1,0,0,1,10,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[TU-42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b6afc1c555a14d46acf63564fe0a3bc3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="50b5333e1e464344b65009b73d7d67b7"><tspan x="0" y="0">TU-42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3d8a8527a39a46a1acc9e591eef3ba49" transform="matrix(1,0,0,1,430,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1999 12:42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b3557aa1723848b79c4f07d19fddfefc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e482d3061e344cc2b67cbb3330e21125"><tspan x="0" y="0">12/12/1999 12:42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f53b5dedc1a34bdb99332b28ebd925da" transform="matrix(1,0,0,1,575,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="29c240f6db0d4d2ab23ba4b879169267" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a04350f21c9b44a4bd9337b06a81ae92"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="0bd297dd03fc4145aa94402f5a03d5e4" transform="matrix(1,0,0,1,724,87.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="61560a9057d643c88753670cdd918bf8">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="cad01178c6ef49ed9b535de9fd1aefd8">
+                    <ellipse p:name="ellipse" id="f33db42db15b41019c5751b02e006a7a" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#cad01178c6ef49ed9b535de9fd1aefd8" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#61560a9057d643c88753670cdd918bf8)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="208a6bbead51431b8b622008b4885d85"/>
+            <use xlink:href="#cad01178c6ef49ed9b535de9fd1aefd8" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="9140c8f430204090bd39aaeb25615fea" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b595691db56b4a4baae65c5d08d3c128" transform="matrix(1,0,0,1,366,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mL]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="803732de91e44bf2bcccacd2d4417bef" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="019400a4b8f642e39da6613059476911"><tspan x="0" y="0">mL</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="175ed920f3b34432b43beca97ad3fbe6" transform="matrix(1,0,0,1,190,89.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[La pluie qui tombe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="6ea380c03c9c4d77825011a1a846289c" width="140" height="15"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c573a53bbdaf4a5197860f9eab0c1b5a"><tspan x="0" y="0">La pluie qui tombe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="8a540baf523f41daaaa1f7d056ec24ae" transform="matrix(1,0,0,1,808,97.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fa3cfe91b8ec49b09f74615aa04ee909" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c1e1c48548274420bcb77816fc13f29a" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="bda8b59d95944409b414136b0da636b1" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g p:type="Group" transform="matrix(1,0,0,1,0,164.75)" id="5f85851e83d846b0a7ff50374fbc658b"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="b447099f9a264b2c99a5347c02d0a1ff" transform="matrix(1,0,0,1,0,44)"><p:metadata><p:property name="box"><![CDATA[856,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="74668e26ed94443fbde2d66826e1f106" width="856" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 856 5" p:name="line1" id="50be888485c74ceeb3410ad81daea6de" transform="translate(0,0)"/>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d8d0392ff4f3472281a8436b6f5b3983" transform="matrix(1,0,0,1,74,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hauteur d'eau]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c33ff1acd66c44a4b3a597c3658b7250" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="054a3914b9954c04bb410424aac93507"><tspan x="0" y="0">Hauteur d'eau</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d047ac409c57407b8a809085b22e05a1" transform="matrix(1,0,0,1,9,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="36989486c3b748f18274910c77c19b0f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a7e3e8536bfa4ae79e75cfe54f3ed756"><tspan x="0" y="0">CA-224</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="fb4ee7f9172f4319ad9dcc02a0c7da7f" transform="matrix(1,0,0,1,429,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b5e421ee250043849af29d5ff604492e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="367ce9f990b144feac75ca87b64116b1"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3d848c16aed64ae7b5081507b167bb5f" transform="matrix(1,0,0,1,574,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="04304c179f504706bcfe764e7a1f8555" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="73a5fd54d4074550ab6df0d310d4d6f1"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="fe746eecbaf54da6ab7082cef1931a9c" transform="matrix(1,0,0,1,723,0)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="ea5e5f9e977d43d2849d948a5f481f89">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="76bbf84ea3d44bc6893513b17ee9aa77">
+                    <ellipse p:name="ellipse" id="9541ef94db35437ca49ac63e93ac29f6" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#76bbf84ea3d44bc6893513b17ee9aa77" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#ea5e5f9e977d43d2849d948a5f481f89)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="e712dbefcfa94a69bd4021fe549aa379"/>
+            <use xlink:href="#76bbf84ea3d44bc6893513b17ee9aa77" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="41c42e31180944788fd73bafb18be669" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="50e34e7344eb4653814512a8ed7fcfb3" transform="matrix(1,0,0,1,365,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mg/L]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3b8317ce8b7843298494f30c708b3ca7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0552370c7e7b423c8a88ca369f41bdcf"><tspan x="0" y="0">mg/L</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="8fa07d7ed01d48b684e737decf3ece0a" transform="matrix(1,0,0,1,189,2)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[Concentration en NH4 prise sous le pont amont]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="00f2c660926d4c4bbfd84ac2d7a841fd" width="140" height="45"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4aac634124f7434dab95f92d8f09cd3a"><tspan x="0" y="0">Concentration en NH4</tspan><tspan x="0" y="15">prise sous le pont</tspan><tspan x="0" y="30">amont</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="5eced84850214b7586718b13f2145de5" transform="matrix(1,0,0,1,807,10)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fe032818af4b41ea8154facd8616e68a" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="04c27923869441198ed9a186ebcb64e8" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="4cee64e357924ce8af2f316e24dd19bf" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="66d4892cc6404d099579cc7ffb39f498" transform="matrix(1,0,0,1,75,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="43fa8fb3c31247f6b328cb00b49dd6e9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="cc43920dd9c548e7bff8d30420c0a76e"><tspan x="0" y="0">Pluie</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="438357826a394372ac9bf8d11cdbf05e" transform="matrix(1,0,0,1,10,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[TU-42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ffeed883df3f41aaa86b259e2e714dce" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5a8f1b2a21fa4f34883308a5d3c6a12f"><tspan x="0" y="0">TU-42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="8687fecb9c564b72bfc216bbae219d26" transform="matrix(1,0,0,1,430,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1999 12:42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="bc4b43abe0b34ef2b092bc8ab487e512" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="36b04c0068df485582736f5cd1d73a71"><tspan x="0" y="0">12/12/1999 12:42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="546d5ed129b04371927be0d5bfd5c79f" transform="matrix(1,0,0,1,575,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e9583f4956f04efa817edea01cf9fbcd" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e7ddb7ad83f74c54bf20a3dda90e3f02"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="54b42c468a5241bebd397b64e70e1572" transform="matrix(1,0,0,1,724,53)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="e7bc8a4bc55a48a88ca1d27e5aca2179">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="2b31f6128f2940cdb08359c4a609658c">
+                    <ellipse p:name="ellipse" id="f0a42e23bd4847758f1dfda56e275e91" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#2b31f6128f2940cdb08359c4a609658c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#e7bc8a4bc55a48a88ca1d27e5aca2179)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="1b4992ea3bdf48798f3e7f893b821922"/>
+            <use xlink:href="#2b31f6128f2940cdb08359c4a609658c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="82668d41cdae497798ff4e24bb29325e" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="06c79872eeb44345b31ac1d3a7866da0" transform="matrix(1,0,0,1,366,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mL]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ba1ac1949f7c46cba461728b3dd66372" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="60c3f8ee08044962866370537d01aed0"><tspan x="0" y="0">mL</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="68dee0f5f7944feba06e49eea6138127" transform="matrix(1,0,0,1,190,55)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[La pluie qui tombe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="e73cc090e7a040a987078a15e7ef0b64" width="140" height="15"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="59036265d3884e6aa8ab95b67349a712"><tspan x="0" y="0">La pluie qui tombe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="078b934bc20b41ccb516baef697d4d09" transform="matrix(1,0,0,1,808,63)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="57b8ea8811764c6aa1ea633fbae664e7" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="af2404ba43c7424f87a684441d1132f6" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="ae7e86cd6ed146ddaf763786b55b84c4" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="7232605149974e11a4386a49429dcc57" transform="matrix(1,0,0,1,0,93)"><p:metadata><p:property name="box"><![CDATA[856,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="b992b2ded1f54d268c37412dc34d2b16" width="856" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 856 5" p:name="line1" id="6f3d21d5d2784b4c8c4c35bf5c002e91" transform="translate(0,0)"/>
+        </g></g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="f87bf4a88f8548b492f45f0844bb4e10" transform="matrix(1,0,0,1,0,311.75)"><p:metadata><p:property name="box"><![CDATA[856,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="6258f185d440416f8435388061910bbe" width="856" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 856 5" p:name="line1" id="cae14dc0a13e4577b7f706e727c706fb" transform="translate(0,0)"/>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2ad37f0cf8fa40d097928e093e8b0fdd" transform="matrix(1,0,0,1,74,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hauteur d'eau]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a90c3b5bb5e043c98edcdde03a1329eb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e2e0ce21a5074de3b0d536b3d667ad28"><tspan x="0" y="0">Hauteur d'eau</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5bb39fe50659498a9354e137919186ec" transform="matrix(1,0,0,1,9,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5121df1267df49b68089349949e64ede" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="55272f8522654b08805530fee7f32b46"><tspan x="0" y="0">CA-224</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4267a133382f46ef85fc34f61f0d1929" transform="matrix(1,0,0,1,429,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="40d72ce7f9db420c93cbaa471512ade2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa06e3f360b1433e877d5d9a4e9398cf"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="60396869ba724420b520b279e9a65369" transform="matrix(1,0,0,1,574,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6ec0c2fe7ad64fbea706ce00c40679a6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f750644ce0a742e88b3bdb55f3dcd607"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="da846564ae094b479e70f757a5b4f55c" transform="matrix(1,0,0,1,723,267.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="98d8f153fc984f56ab91446016f696a4">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="7f6e2960d05e4504be80ede39f104aee">
+                    <ellipse p:name="ellipse" id="9da897ea0ad3425c8da8a78fa3a10b20" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#7f6e2960d05e4504be80ede39f104aee" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#98d8f153fc984f56ab91446016f696a4)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="efa2ab4e5c054117a737deed2ae1b10a"/>
+            <use xlink:href="#7f6e2960d05e4504be80ede39f104aee" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="8f521e3e364647e5ab8639b0ff3d8e8a" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="52bb66e2672f45239e394627e373c739" transform="matrix(1,0,0,1,365,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mg/L]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="432bb8dd359d49b885e29deac48a1958" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="aefd29d0c2224df59a2c8c8a56ca5199"><tspan x="0" y="0">mg/L</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a590f54df475458882640678dc53e2b3" transform="matrix(1,0,0,1,189,269.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[Concentration en NH4 prise sous le pont amont]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="1a35f46f34724d42aa54eca1a0abe441" width="140" height="45"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="830398dea0124a949f01de61bc58c777"><tspan x="0" y="0">Concentration en NH4</tspan><tspan x="0" y="15">prise sous le pont</tspan><tspan x="0" y="30">amont</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="9957193af3114bbb9cf3b21c7bafdd7f" transform="matrix(1,0,0,1,807,277.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="4b2c5d4bdad9492db840db4678656583" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c56cfad9f65a4928be6220ef29616e04" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="98232715a4554f1f9557748dec4146bf" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="cb85ff9849da4d429a2cbae5ccb8abfe" transform="matrix(1,0,0,1,75,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="070ce8a402d24798945fb469fa841f13" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="45e00ade4be2405f8d0b841885bd92d7"><tspan x="0" y="0">Pluie</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5fa2c78effb8409ca8b78021c1d8eec5" transform="matrix(1,0,0,1,10,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[TU-42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d6828dbb11ff475ebbda0c182d749f4a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c592379a257344158bdc74acf22d0be2"><tspan x="0" y="0">TU-42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="968e0adb18164ee9ba73b262f5ca81e3" transform="matrix(1,0,0,1,430,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1999 12:42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d315098661d54628a5e539a2de597aad" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6c94cfbc1d214c0cb858c07d23a23ecd"><tspan x="0" y="0">12/12/1999 12:42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="dfd5121ec12f44a3b97cb9d0b93cd9d0" transform="matrix(1,0,0,1,575,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5312a2c66b744c96bddc669e30e91788" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bd5e3bea5f4411ea1a732107ea60813"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="046a068a1db041e684b2bc0feae9bfc4" transform="matrix(1,0,0,1,724,320.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="a648305f54b94d309c6c5c80ff79d254">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="1da76139a78c4f339cdd65e0994578ec">
+                    <ellipse p:name="ellipse" id="5fb8dead8ae84040a043cbb63b4f2970" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#1da76139a78c4f339cdd65e0994578ec" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#a648305f54b94d309c6c5c80ff79d254)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f9bfe5cbff324d7b9ee916e1a0650ff9"/>
+            <use xlink:href="#1da76139a78c4f339cdd65e0994578ec" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="2a8412fc796c43fd85e2e488dc2889e7" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3c0810a6d159478e99d75da4a8b5518d" transform="matrix(1,0,0,1,366,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mL]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e17f4d2bf9164daa935e6c1bbe7cd943" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6c90c84a925b4ba2968a9871af2649de"><tspan x="0" y="0">mL</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7b6a51fa090c4dd7bf75ff086423ea78" transform="matrix(1,0,0,1,190,322.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[La pluie qui tombe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="61b0536e6e364fa2886c5775431bf77f" width="140" height="15"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="eafa4553ff2b41bba2e1ecd3c189a363"><tspan x="0" y="0">La pluie qui tombe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="ec800e6e22d64e44ad18bcd34a433e03" transform="matrix(1,0,0,1,808,330.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="949faf5bcf0b466f99fe8af61fa4401e" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="1976b5dcaaf64999abb313f68ff5b3fe" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="fd84d72b6448435f83ce068d69a0d9a2" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5525ddd92ede4903bf6508e05defafa2" transform="matrix(1,0,0,1,10.75,364.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pont du Besançon]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c83dbcb3e5674caf8eec47be775ec8d4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="2a7d167032504655a588f00a4b98b5d4"><tspan x="0" y="0">Pont du Besançon</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4c7d5312246541d581168cbcb16d0432" transform="matrix(1,0,0,1,178,366.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Besonçonville (380101)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|italic|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="64a397b8422a48fa976784b251720071" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="c1bd0e3b7d88479b9191e462497988e7"><tspan x="0" y="0">Besonçonville (380101)</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="5558953d942141fb8ad94ceae605f744" transform="matrix(1,0,0,1,0,438.75)"><p:metadata><p:property name="box"><![CDATA[856,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="4c319cc09198434cb4324a14e1656c63" width="856" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 856 5" p:name="line1" id="b4e3a40a860f466a9e1ea646ff0d623c" transform="translate(0,0)"/>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="caa82fa510df4921aa781e2e6a63c11c" transform="matrix(1,0,0,1,74,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hauteur d'eau]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3cb87afc23884ecf8fe5018508b61ce9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4551fb1f754b433fbb1a7d9c1e985f25"><tspan x="0" y="0">Hauteur d'eau</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="de6f785e9134417183aa5ba4117fa552" transform="matrix(1,0,0,1,9,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1b8e0a0e89234706b678d0ac39c9cf05" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="de12aeb477f844cfa9d6f73c5617a639"><tspan x="0" y="0">CA-224</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="52e837f25e9240758dc206b83894e37d" transform="matrix(1,0,0,1,429,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="575ee8ab358f41c39feaeb99720cd2e1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d0cbf51041844ec09081968f7be0e5d1"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="89bf9dd473ea40ecbfdab47501bb2025" transform="matrix(1,0,0,1,574,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b58dd9e03369430387afdeb68b617059" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7ea146e958994cab8b5e37af40a010e3"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="ebd9dddc6f88403ba49fcf79d67409ad" transform="matrix(1,0,0,1,723,394.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="e6795980d569417db840180a670065f8">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="3b405611249e4c8192fdb6ff16539a82">
+                    <ellipse p:name="ellipse" id="f68ee122282c4138a6250496a50bdfc3" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#3b405611249e4c8192fdb6ff16539a82" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#e6795980d569417db840180a670065f8)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8e433e7e80524c41af2a0b4fed892f81"/>
+            <use xlink:href="#3b405611249e4c8192fdb6ff16539a82" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="c93e6c0d0967456daf485c6368378343" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e85a58f5fc9044298e73da9229a90690" transform="matrix(1,0,0,1,365,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mg/L]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3ab13c6b46ff42cc98ed884338b646e2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5af6906fd59742d89aa701dd809b6b7d"><tspan x="0" y="0">mg/L</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="fe33d46baed9410cb9ac40e328e5fdf9" transform="matrix(1,0,0,1,189,396.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[Concentration en NH4 prise sous le pont amont]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="36a34d2e3c5142c2b29be2d27ead9f2a" width="140" height="45"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="740becdefa064b12b207611ae7e08c3b"><tspan x="0" y="0">Concentration en NH4</tspan><tspan x="0" y="15">prise sous le pont</tspan><tspan x="0" y="30">amont</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="528dd5973e1d43768063e8253fa681ae" transform="matrix(1,0,0,1,807,404.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="af584e45783641089c1de1b256385588" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c1ec7f9b890c4687b7a770a66e4d6caf" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="9c8feba00f9a4ce5b162ce82377de264" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="15f8e88cee6a40d88b9e936b1ccb08bf" transform="matrix(1,0,0,1,75,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b3e4e7da96a04f1195503ba51789bc51" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5cac44fe14d74c008f06e6887ab8c756"><tspan x="0" y="0">Pluie</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="15d1228fb4384118ae1639c8bca85a86" transform="matrix(1,0,0,1,10,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[TU-42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5cbd34c5ea944922aaab81eebe626d59" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4abf7c0f664b406ebae77c8ae8ded18a"><tspan x="0" y="0">TU-42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c2e25ea6b6c64c3d9ab75d7812025c54" transform="matrix(1,0,0,1,430,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1999 12:42]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1090030808474cb1ab08df1f172d912b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a604f35f624f4d40a7771473bc882afc"><tspan x="0" y="0">12/12/1999 12:42</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="814d82fde7bd4a58ac1f8c372c3fd616" transform="matrix(1,0,0,1,575,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3b04127895bb486080e602bf22382048" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c882be7002964e0b89ad1add80f47a1d"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="88f400020af7472eadb3bc1f91d62a45" transform="matrix(1,0,0,1,724,447.75)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="f01331de2fc943eba11edfba67dea2a7">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="64bd351af0614a28b3721faa83ed2755">
+                    <ellipse p:name="ellipse" id="fb046c882bff44909fe804c5e102ebb3" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#64bd351af0614a28b3721faa83ed2755" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#f01331de2fc943eba11edfba67dea2a7)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="51577c306dc1437b823bbaa0fedb4afb"/>
+            <use xlink:href="#64bd351af0614a28b3721faa83ed2755" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="0045fa593edc4f84878781f3b3985e15" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="913235cc71ca4005a2b739d3afa92c6c" transform="matrix(1,0,0,1,366,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[mL]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c99ec65ee9de4fd0b58610523bfe9353" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c3db99db986a4d4e896cdefaab6f5d2f"><tspan x="0" y="0">mL</tspan></text>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="dc3a5b1fb4eb4180a29a6e7c17a6557e" transform="matrix(1,0,0,1,190,449.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[140,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="label"><![CDATA[La pluie qui tombe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: visible;" p:name="bgRect" id="703976969ba0497fac1a7601f7218f32" width="140" height="15"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c3f44c2fc1574cc4bc34ec167a919473"><tspan x="0" y="0">La pluie qui tombe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="d8dc6aa03357453d93704a925f688578" transform="matrix(1,0,0,1,808,457.75)"><p:metadata><p:property name="box"><![CDATA[42,20]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Voir]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="3a7017c361024e3cbf11e579a6e05be7" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c56eb540963b49c391c046d160aa12db" d="M 0 0 L 20.620460406480614 -0.11327062627878037 L 42 0 L 42.366903151963584 8.857801634735813 L 42 20 L 22.420324385961656 20.15317872824319 L 0 20 L -0.322598377859318 12.47951421458278 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="f67eb43e4c20404b83bdfd6a10974d43" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="15">Voir</text>
+        </g></g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="eb635124a9084f7db9731ae5a8929876" transform="matrix(1,0,0,1,366,34)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[2 chroniques]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6a810719fba843e4b2d0be28741ceb5b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e4faa90c64d144aba7a7a4045d574280"><tspan x="0" y="0">2 chroniques</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5f9ff685493342068b697ad230f2717a" transform="matrix(1,0,0,1,366,162)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[4 chroniques]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3c1208c46c9b405f9b6f0d39e33f71bc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="07f9c3efd49140a7866c63b37aabb950"><tspan x="0" y="0">4 chroniques</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="6d9261305a1841718937f39dd6922ca1" transform="matrix(1,0,0,1,366,393)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[2 chroniques]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9a94a1b13e9b4edda81022f00aa977c0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f98df9cc716c4fc7ae74dad466d02441"><tspan x="0" y="0">2 chroniques</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="e0423d53a84d4708ac4f3cc8179265b5" transform="matrix(1,0,0,1,9,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Code]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a38574f71a854dc4aebea4f31760ef2a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="db1b7fffa3ad4373ad99bbed757b23ef"><tspan x="0" y="0">Code</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="4ef2b5879f084a2e97900c9f9d446746" transform="matrix(1,0,0,1,189,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Libellé]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a3ebdb355fea42e7b8fa58da618f53fe" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="61eda7246f0f40d98b985a9bfaca5c4e"><tspan x="0" y="0">Libellé</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="02c9fe6dc9ba44f889064986a99368f3" transform="matrix(1,0,0,1,76,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Paramètre]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="acc691aea95c4379a361150b91686144" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="020e545902e344db834b071153f7ea55"><tspan x="0" y="0">Paramètre</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="445d6150754049218c4876664b89fbcb" transform="matrix(1,0,0,1,366,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Unité]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d144416280d04c38b3dbb46733e68bc9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8cce951f9a3a47cc97fa2912d741ab1f"><tspan x="0" y="0">Unité</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="0848457455e8498c8c964e14505ebcd7" transform="matrix(1,0,0,1,424,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c4671d88b01246b185c0291a9fc717e4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="be2e9e89e65c4770ab55f645b886f847"><tspan x="0" y="0">Début</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="91188638f49c477f80e92c1e51c60e1e" transform="matrix(1,0,0,1,566,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="dbafb9ce3d644bdcbe3e81db305b8394" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a5b28a86cba04a9d8d12d4fe3befdfed"><tspan x="0" y="0">Fin</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="fe6abaf816f949f0aa95e53710ce152b" transform="matrix(1,0,0,1,716,0)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="825bc5eabb0742ee8f695ddc6b34d93f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3974bc8788ee4e1a9b6378f3786f644b"><tspan x="0" y="0">Taux de</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="de91070e4ff9406aa77068fe708f8c6e" transform="matrix(1,0,0,1,716,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[remplissage]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="82462e42adf44d44a58ce34f1627d422" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0362519524d743f1b8483ed9cd0b5b9f"><tspan x="0" y="0">remplissage</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7a98a36662e04f08959a5612c9ec933a" transform="matrix(1,0,0,1,28,780)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Lignes 1 à 10 sur 187]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7ffeeeaf4fc94df8b91e40ef8f91ed73" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9210b9c8109843d79cba62f466d8088f"><tspan x="0" y="0">Lignes 1 à 10 sur 187</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,594,774.58984375)" id="5248af1258334c14afef6876a6cd2257"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:button" id="30d33269370241e18e574e3086917ac0" transform="matrix(1,0,0,1,60,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCCFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[1]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="75c9c889acbc442287617c262f1fa188" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="95c8f7f039c24d02b2f8f6de30194ccc" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="ae25ea32ecae409d834712e4c917e535" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">1</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="89d93f2377a84cf4bc2e6246aa42a098" transform="matrix(1,0,0,1,85,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="be38cf4c707f42849a0d9a3c80bfbebb" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="42b5dba396b54b62bed7ce893fa7cad6" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="760d46ba27ce4a2faf3a79c51699c1b9" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">2</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="d28a0bd414e94b52a6e5eaaf9f971742" transform="matrix(1,0,0,1,109,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[3]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="275860ac53014625b58d1226de516409" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="d3c05c2e316c47f19ffd2bc07b355b86" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="843000facf9a4ee69538651d923105d0" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">3</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="633b9ae0f6eb46c383057171f0fd1ca1" transform="matrix(1,0,0,1,135,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[4]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="1fe1ec0fdd5a4575980074811c869df0" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="17a0cd86cd874574836c2cf64fecea06" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="3020173d90fe419bb6dca9f51db5c199" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">4</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="6ab95e07c8b7456a8903fc910815b621" transform="matrix(1,0,0,1,159,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[5]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="e982319ff1af4b859f6268c5ee206375" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="fd6cf103450c43949978e645fe80c6b1" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="847a1168674e40c884dcd67df17a5d17" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">5</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="b40adaa340c74cc1b22826ea163006af" transform="matrix(1,0,0,1,184,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[6]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="19e66f9d73214aad9a3213c09207b9ab" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="fa373ce333184a2f88abed7bd7efb020" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b9ab8ac237bd474ea30a266c372db559" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">6</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="4eee76708dd24d6a833f7e39d04cb07f" transform="matrix(1,0,0,1,208,0.41015625)"><p:metadata><p:property name="box"><![CDATA[27,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[7]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="733a9b17bb274b3383d8672d9b4da549" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="388355888bbd4c63bc35501e6ad04bf5" d="M 0 0 L 11.332883539462394 -0.40940518125679515 L 27 0 L 26.69911904529492 11.870516246894617 L 27 25 L 13.889084563547785 25.294107631870702 L 0 25 L 0.015167711219580271 13.196974941123697 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="4d7fcbe0830d4cefa80f9648f8fafec6" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">7</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="8c6fb6c1793b4e49bff5c1b265a3a6e4" transform="matrix(1,0,0,1,230,0.41015625)"><p:metadata><p:property name="box"><![CDATA[60,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Suiv. ->]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="edfbfd3e29f8491cb0a159b822494887" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="022dbd96c81546d4bf863ad611ab10cd" d="M 0 0 L 20.334653563004586 0.2105533800733329 L 39.825038920905726 0.3197388807935422 L 60 0 L 59.79044581301481 15.30651209743935 L 60 25 L 40.29288288057204 24.75267665181767 L 19.452043189323604 24.715493337243267 L 0 25 L 0.20054286349011663 12.452008171632295 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="412fa74c7f864788a9ccd1c0c038924d" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="7" y="17">Suiv. -&gt;</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="3bf6973f35d8441885a5f1acad7b7477" transform="matrix(1,0,0,1,5.684341886080802e-14,0.41015625)"><p:metadata><p:property name="box"><![CDATA[60,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[<- Préc.]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="c08725ed7c9c4d8d80fb36c4bd3d1e46" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="93e1d6cd46984847800b51e8c3736380" d="M 0 0 L 20.334653563004586 0.2105533800733329 L 39.825038920905726 0.3197388807935422 L 60 0 L 59.79044581301481 15.30651209743935 L 60 25 L 40.29288288057204 24.75267665181767 L 19.452043189323604 24.715493337243267 L 0 25 L 0.20054286349011663 12.452008171632295 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="34b272d3f07040d5962ecced2ea04c4c" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">&lt;- Préc.</text>
+        </g></g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/doc/station.ep b/src/Irstea/BdohConsultBundle/Resources/doc/station.ep
new file mode 100644
index 0000000000000000000000000000000000000000..92030c279bca9d9ce3c1314eba3f312e7afbe2ad
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/doc/station.ep
@@ -0,0 +1,500 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Fiche station</Property><Property name="id">1343747555439_2581</Property><Property name="width">908</Property><Property name="height">1400</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,17,1207)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="72eda8205781444397fca844b4528e04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="24edfb6dda434053a1b297406ba78699" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ad8427bd24b1461689fbd43e57091f01">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ad8427bd24b1461689fbd43e57091f01)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="19f683b7fb3e42e5b99f6dea1a6d2f67"/>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="53c80e2ba30b42cbb2395c11242dbc46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="4502ecc4a9d549b8a207719a417eee6d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="ae0f5b0bdc794f918a5e0bf160111dfc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="1d45fbf8a13948aab60e32cf180ee001"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Station <span style="font-style: italic;">BABAOU</span></span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="189" height="28" p:name="htmlObject" id="9abf7c5b890d4888a327ffb1d3699aac" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="973cd76d9d564af18926311f9fc73732" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Station <span style="font-style: italic;">BABAOU</span></span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="01ac64217e2a4d5d92cbaca20f5c4d76" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="1eb7fecc18fb4d4688e68ec813cdddb5" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a908fd1cca804197bb1ba275ed151698" transform="matrix(1,0,0,1,36,166.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Code :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="770f50a66d25419dbb40d34ca81d62da" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="be8dcb6e8bfd4b82832a0ea3f425ebcf"><tspan x="0" y="0">Code :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="fbfdad1f00df4b82bcb73e7916827670" transform="matrix(1,0,0,1,36,190.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Code(s) alternatif(s) :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="bc44174f85d246e7bfec28fffca5d28f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6a8dc0c76071424ead494cd1957f0342"><tspan x="0" y="0">Code(s) alternatif(s) :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="162a92c4db364c1ebd47eea6cd745435" transform="matrix(1,0,0,1,36,262.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Commune :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1d395fb7988c40f1b99ef63809b597ee" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d09aab2e25754858ac7c5d8819c2f6ed"><tspan x="0" y="0">Commune :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b61ae2b5b0f04c13b8d35e58fdde57e0" transform="matrix(1,0,0,1,36,314.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Altitude (m) :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b40c5d08913e4cfda5fa2d465235ca07" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8052a4e864e047d7a2408dbffc3dedf1"><tspan x="0" y="0">Altitude (m) :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="80f190a46fd24aefabb7fc295331c8ec" transform="matrix(1,0,0,1,36,286.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Latitude / Longitude :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5cb6dd97d48e48a095954adc56bc1af2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3e996c9c6d614e738473047c7eee2c6f"><tspan x="0" y="0">Latitude / Longitude :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="756710b84b53446cae671e7afe678b17" transform="matrix(1,0,0,1,36,215.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Bassin / Sous-bassin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6dd5f603d4a54653ae92cb749f639922" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="77ca34ea569d446791c8ea804e578b98"><tspan x="0" y="0">Bassin / Sous-bassin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c4591a4d6ea242da84a080c7576ee379" transform="matrix(1,0,0,1,36,239.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Cours d'eau :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="419600c3ada343f0b42a85a7098e2e3e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6ae68fc2451b45b29293d2c990167687"><tspan x="0" y="0">Cours d'eau :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2cc58dab89734fd0bf85d009ccf35027" transform="matrix(1,0,0,1,36,336.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Site expérimental :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8fe776fee6f4416890eeba1bb9798e71" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7bdb562c75094adb83de3b6e0fdc3e6b"><tspan x="0" y="0">Site expérimental :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:box" id="4e686e7b187146e58bc7693d3f132447" transform="matrix(1,0,0,1,573.5,165.5)"><p:metadata><p:property name="box"><![CDATA[296.25,187.5]]></p:property><p:property name="textPadding"><![CDATA[14.8125,12.5]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="91bdfcf4cc574fb2865c3e0e8012e86c" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="ac8d0dcdc36842e78aa8f8508ba431f6" transform="translate(0.5,0.5)" d="M 0 0 L 18.425967865285415 0.28444678474894824 L 37.98621121959201 0.4460127300457588 L 57.520732211973225 -0.03360280857223674 L 80.92472306518329 0.3192192877316177 L 99.9947888457617 -0.007158101484043278 L 120.12752971600774 -0.1105984091207991 L 141.52606818228588 -0.3993289405166319 L 160.60390109464524 0.1354819526460418 L 182.2808335323559 -0.02522372112374016 L 201.3132434740787 0.11358572014142432 L 223.08502063964178 0.33085696162558553 L 239.69361835137838 0.2195346785340322 L 259.34417931488264 0.2415924043720462 L 296.25 0 L 296.13122944066856 20.350106632940548 L 296.17085834353725 37.26767209728854 L 296.7307674319767 58.06923363752749 L 295.94776388109204 76.39413030454358 L 295.8053899491876 93.57044969566303 L 296.025621916551 115.67177287670847 L 296.0312253042282 134.06432062894208 L 295.82970663937436 153.67184602458704 L 296.25 187.5 L 276.8813826190458 187.76886265622912 L 259.5911542039656 187.96248942339872 L 235.92965888347868 187.36102983252252 L 216.10053580676725 187.87531740432613 L 198.28996432593075 187.58654088462782 L 181.53316091468182 187.15144612201365 L 161.2138240549718 187.11132250835973 L 141.85904035290085 187.92455795144042 L 123.56941280646805 187.62773491372997 L 103.57555548746568 187.93467979593433 L 85.42007545167523 187.55896517710306 L 66.54722464145487 187.8751295809171 L 48.04118487962081 187.4013432887105 L 0 187.5 L -0.476523614577228 169.59581309932233 L 0.028874871201831964 151.13204947526577 L -0.03964984175457076 133.2423656939172 L -0.03558453613134449 111.6233120136825 L -0.2667535158411233 90.26053590553408 L -0.06009344003494799 70.93768524707353 L 0.44230798719123443 47.48108591505374 L 0.395056990801151 29.635669133907637 L 0 0 z"/>
+    		</g>
+            <foreignObject x="14.8125" y="94" width="266.625" height="0" p:name="text" id="f18afa130a3f4d70bed7f806a7afc4c2" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ef55476432cc4076ad7e643d0dd0412d" transform="matrix(1,0,0,1,205,166.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d90eeda7551b409e953a05a5f5e2e7d3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fad6bdd6db934372aa7014627886fc2f"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e2382a30cbb44516baa6baa560190923" transform="matrix(1,0,0,1,198.75,166.5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[ST_01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="fdec8f1c98954abf87bb9f41379b3db5" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0d28a18e145941af8a00d5527e6d7627"><tspan x="0" y="0">ST_01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="249011a331fa4f6ea4223ba744c8b165" transform="matrix(1,0,0,1,198.25,190)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Vigilance=TR02 ; HYDRO=P54]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7ac7cd93ce6d45e8a5429f127b422166" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ab59f769596c4848a7801cd45127ffa8"><tspan x="0" y="0">Vigilance=TR02 ; HYDRO=P54</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="71172be2ed6643bdb3ca51bcb4050038" transform="matrix(1,0,0,1,198.25,215)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Orgeval / Sous-Orgeval]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1dd7e53059fd42e3ae782dbf9d192e34" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="41af8f20be2b44599f8f6e146366659d"><tspan x="0" y="0">Orgeval / Sous-Orgeval</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="729d63d1f9424e258f2a88fc01b10d88" transform="matrix(1,0,0,1,198,239.5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[L'Orgeval]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="deba4cc3f64e46758980a06da8a0b229" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d94236b98a854946a39c397051b349e4"><tspan x="0" y="0">L'Orgeval</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0d808324049041fab6497110371801fb" transform="matrix(1,0,0,1,198,262.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[Boissy-le-Châtel]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6677c45c471b45b5b6d16ac1e7bbb45e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="a00b16faf6f24c37b340c0ae3c2c6788"><tspan x="0" y="0">[Boissy-le-Châtel]</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3fda069013ee4f20bd81b7c36a0dbc2c" transform="matrix(1,0,0,1,198.25,286)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[39.2 ; 87.2]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="be2f85dbce734d9f8112d262ff337ddc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="23dfd19afdb749e9ad9513566d280e21"><tspan x="0" y="0">39.2 ; 87.2</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="6007aacb767c4647b0ebd9c4e1333ab2" transform="matrix(1,0,0,1,198.75,314.25)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[78]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8ec0b74503be447993e48402a0906678" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3aab7ec046624f9b8eaa0859cf759c08"><tspan x="0" y="0">78</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9a17b4cabe794520ba114b8885538301" transform="matrix(1,0,0,1,197.75,336.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[[Real Collobrier]]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="80483035afc24016bbaec41b6547b2b6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="256c8d265dc642f0a8c10cbbcfceb6c0"><tspan x="0" y="0">[Real Collobrier]</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="952f36a36a1441698cca2b2b18cf2e5b" transform="matrix(1,0,0,1,582.75,166.75)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[MAP]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|28px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2f24d955137a46fbaa0e5ee70458f6f8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 28px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="61f226c869be4e9a81b6f20c784b96d5"><tspan x="0" y="0">MAP</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="7d4e08f2a0a8447db534910e72d5adf3" transform="matrix(1,0,0,1,36.5,391.25)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="412eea336f7f4d979aa8eee53b2d3a51" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="453254465df949608f62f438905deec0">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#412eea336f7f4d979aa8eee53b2d3a51" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#453254465df949608f62f438905deec0)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="1fe12d0be1b24f68be08251d53b5a1f4"/>
+            <use xlink:href="#412eea336f7f4d979aa8eee53b2d3a51" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="a6f9cf0fc4b24e3782c561a6acbeb49c" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="53396ff0669d4855921d2e16a471dd07" transform="matrix(1,0,0,1,76.75,399)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Hauteur d'eau (XX chroniques)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ab3bd0eba9bc4f4cb4c3749f91c0965c" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="28d49149ff24434ea75bb6a89bce72cc"><tspan x="0" y="0">Hauteur d'eau (XX chroniques)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="10b1addbe35f405990e8a759a8ec7e8a" transform="matrix(1,0,0,1,35.5,420.25)"><p:metadata><p:property name="box"><![CDATA[856.25,227]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,28.375]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCC82]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="227" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(204, 204, 204); fill-opacity: 0.509804; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="83ec9b03847449f09cbfe72b6c875ddf" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="654bff497d9940ed96554b57634fda8e">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#83ec9b03847449f09cbfe72b6c875ddf" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#654bff497d9940ed96554b57634fda8e)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="b03c72c9b59e4f45972c131341d5086e"/>
+            <use xlink:href="#83ec9b03847449f09cbfe72b6c875ddf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="28.375" y="114" width="799.5" height="0" p:name="text" id="b54de550544843ca8425df7ed3d5b3f7" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="84b617c6bc0647828e26d6b234d5c9ca" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="385d70f0f489496fa182c89f5d6f50ef" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="3acdb787527845bd9e570a82553c16ba">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#3acdb787527845bd9e570a82553c16ba)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f03a1bb845db4312a20a7a43721eb926"/>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="2be0e67db1284407b3da7fd5865a5385" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4ce30b8309724909bc0643717248bc3d" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="62d760d019b94776ba3f7af8e581b9d3" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6c258d2f87394f0d9dece203c3430962">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6c258d2f87394f0d9dece203c3430962)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="7ba7c2a7435f4752b9b9750a85d986c4"/>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="031a45df67c04df0a4e7b94ddd3f3d76" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="610e2c6c204b4ac28076a58a678e9134" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="37d0f3b368ef4c979629cb0b7669617c">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a59711fc86f647e89709d17492d98aab">
+                    <ellipse p:name="ellipse" id="3968cc6b329c4b26a4bda3a2f2113dab" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#37d0f3b368ef4c979629cb0b7669617c)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1959982575744ae9272b739b811a58c"/>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="25312fe8b33e4fedb0aa1a329be33d54" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4eef4dde0ed74d8baa753ac678a21a01" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7456a8f1b1b44da793d9506e7e852639" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e98f3c848f51437290aa87f3a7f53164"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="29deac56c78f4d35a50491319b4601ee" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="83c1b59032764d13bd7d25722d9164ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bb423d153df47fc8a5c115f81191a74"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="726b685e70c24ee99605b6fe4c13df67" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d01cdd3e6e4f46508cb0a06d7bd761f7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d1fb761440834b208549a3e0d51472bb"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="666ae23733ca483eb94a5fa8e3efa56b" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b523bff85a134877b2f5f7ad1125b9f8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6f52d269248d446abc5261a9744323b6" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b22675b9402047878a0adc3262c1ad02" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="76713801a93742d3ac222377c0da89a8" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f77e54ddf4bc420e921cfdb7421c9df2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3a563687c0dc45a792fe4e482fd46eb8"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="995480f6c1a64828b06175d1eb076b9c" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="a52d7d17917d4c4f939ed4f7af59c4b1" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b02403a035914528aa73b690d2b4ace8" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="b06f7e1c2b094cdfa92a1082cc06e321" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="533a921c393d455c87c3274d528c818b" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="4818e27cd60d4024b7a42a09a982a710" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="c11cb640d4ff45b5b48f62705fd4cc64" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="0071d041f0d84114ae69751c738e81e7" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8f50f551f10c4f978530327aba1c7363" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6408b52adae43b6a2aec0c79ad6fa08" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="16bdca3913b94d51b95e7a75bae31cfa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa98326e39994fbbb623684c8afca91b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="5ed01c2f95924c17b73e1417a25f2f3b" transform="matrix(1,0,0,1,574,201)"><p:metadata><p:property name="width"><![CDATA[280,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="textContent"><![CDATA[<ul><li>Carte dynamique (zoomable et déplaçable).</li><li>Seulement la station d'affichée !</li><li>Lien vers carte avancée, qui proposera des multi-couches (stations, bassins...)</li></ul>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="280" height="91" p:name="htmlObject" id="097193f47f0d4f628ac531d5c803aaea" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="29983e3498eb4a8abaa79507b2bad9fa" style="display: inline-block; width: 280px; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><ul><li>Carte dynamique (zoomable et déplaçable).</li><li>Seulement la station d'affichée !</li><li>Lien vers carte avancée, qui proposera des multi-couches (stations, bassins...)</li></ul></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="ef4aaa0b13374ab2ae271fd72ceadd02" transform="matrix(1,0,0,1,36.5,674.25)"><p:metadata><p:property name="box"><![CDATA[856.25,227]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,28.375]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCC82]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="227" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(204, 204, 204); fill-opacity: 0.509804; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="85b4678f8ec64ea58afeddd2960c126f" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="644d62c0406d4316a174728effc2e568">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#85b4678f8ec64ea58afeddd2960c126f" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#644d62c0406d4316a174728effc2e568)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="364233d2872247d4aee51b603078bd18"/>
+            <use xlink:href="#85b4678f8ec64ea58afeddd2960c126f" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="28.375" y="114" width="799.5" height="0" p:name="text" id="13f53e92bcf24736b50176696bc41062" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="98e4bc31e94a4086a2b6c763b806974b" transform="matrix(1,0,0,1,36.5,928.25)"><p:metadata><p:property name="box"><![CDATA[856.25,227]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,28.375]]></p:property><p:property name="fillColor"><![CDATA[#CCCCCC82]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="227" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(204, 204, 204); fill-opacity: 0.509804; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="ba797fe5bb2049bc9d9b69761407b12a" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6359646bab474913a2e6fc4ad5d6907c">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#ba797fe5bb2049bc9d9b69761407b12a" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6359646bab474913a2e6fc4ad5d6907c)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="93be5e461b8846fd8b30be0c88925294"/>
+            <use xlink:href="#ba797fe5bb2049bc9d9b69761407b12a" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="28.375" y="114" width="799.5" height="0" p:name="text" id="14b0d563cb9d443d9a05cece68845e2c" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d7e6fedd26814dada8c06a705f2c1cee" transform="matrix(1,0,0,1,86,774)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(icône spécial pour chronique non-visible)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e37724e09daf4c948daaa5437385384f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="3f2680512bab4adba8be8c46c2cf7141"><tspan x="0" y="0">(icône spécial pour chronique non-visible)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2a4ee152bd4e46468fe6fd9bd4f300b9" transform="matrix(1,0,0,1,86,793)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(icône spécial pour chronique calculée)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="258cfc36277446f8b41117b5e3006eba" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="e4f1a353039e428abfe7d6c2a71b84f6"><tspan x="0" y="0">(icône spécial pour chronique calculée)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="d5d56bf768c84b25afd409de1daa5a70" transform="matrix(1,0,0,1,375,774)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="textContent"><![CDATA[<span style="font-weight: bold; font-style: italic;">Boîte à outils :<br /></span><ul style="font-style: italic;"><li>Aller à la fiche (un oeil)</li><li>Visualiser sur graphe (petit graphe)</li><li>Exporter (symbole de téléchargement)</li><li>Ajouter au panier (petit chariot avec un +)</li><li>Modifier dans le cas d'un admin (petit crayon)</li></ul><strong style="font-style: italic;"></strong>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="301" height="113" p:name="htmlObject" id="b61704c8a37847289b325f4425ca4bc2" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="69bcac740dc046daa7f6fa0a9a8dd708" style="display: inline-block; white-space: nowrap; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-weight: bold; font-style: italic;">Boîte à outils :<br /></span><ul style="font-style: italic;"><li>Aller à la fiche (un oeil)</li><li>Visualiser sur graphe (petit graphe)</li><li>Exporter (symbole de téléchargement)</li><li>Ajouter au panier (petit chariot avec un +)</li><li>Modifier dans le cas d'un admin (petit crayon)</li></ul><strong style="font-style: italic;"></strong></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:line" id="c05628ac8ffd490eaf7cff7efc0c99d1" transform="matrix(1,0,0,1,52,487)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[804,8]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <g p:name="rect" id="493b8f7b881c46ee80a3f69001860f7e" transform="translate(0.5,0.5)" style="stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="888b38e39c5b406fac607215df389ab9" transform="translate(0.5,0.5)" d="M 0 0 L 21.984176360106844 0.5485336557327578 L 40.12173005786295 0.8579534763708421 L 59.103195201955906 0.32485168540814535 L 78.56008864301438 0.9239188770603035 L 101.59054241598535 0.7661666533310414 L 122.19599387974073 1.4211680989693398 L 140.32955476550913 1.8429217619770561 L 157.92246242109638 1.3742707161174277 L 176.25064476375962 1.301645159020791 L 194.29996398499117 1.5434188037238332 L 216.0096842806251 2.47476142395007 L 237.5198849934052 2.2939391228943693 L 254.6064722402258 2.958736372785541 L 278.42807314395276 3.232510702627568 L 299.91864769640387 2.6708703943038206 L 320.08183226115807 3.5771087378378397 L 340.59494026767317 3.132650619419867 L 360.34582777829365 4.079665181112261 L 379.77761688879013 4.257726588271989 L 399.40287979732733 3.942917941297468 L 420.02989728132917 4.676164098356363 L 441.80241981972125 4.559699786827467 L 458.6129614187151 4.8988923386807715 L 476.61797756324125 4.699350022282992 L 495.9201737804246 5.136615599550077 L 518.410671947481 4.992694922664938 L 535.6627121536685 4.937984435864869 L 558.3412683715426 5.297683827812122 L 577.0346411672101 5.464057267984778 L 598.8296996783216 6.19770180558067 L 619.0223974626845 6.208593261556406 L 640.4796393846825 6.766600935643025 L 658.7156349220754 6.326441233742838 L 681.4176162739658 6.723972111419584 L 702.5865160964354 6.750931873868688 L 720.037425139694 7.558093835107915 L 737.4087582717378 7.409709500230724 L 755.2507165111327 7.706961177913598 L 777.6605726088692 7.833871896824723 L 804 8"/>
+    		</g>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:line" id="2dd00098308c43388b80c867382db929" transform="matrix(1,0,0,1,52,562)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[804,8]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <g p:name="rect" id="002019c8760e4977ba7a4dd5652ca252" transform="translate(0.5,0.5)" style="stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="a8108d0c8df84ec8b1b1f0acb50be0a9" transform="translate(0.5,0.5)" d="M 0 0 L 21.984176360106844 0.5485336557327578 L 40.12173005786295 0.8579534763708421 L 59.103195201955906 0.32485168540814535 L 78.56008864301438 0.9239188770603035 L 101.59054241598535 0.7661666533310414 L 122.19599387974073 1.4211680989693398 L 140.32955476550913 1.8429217619770561 L 157.92246242109638 1.3742707161174277 L 176.25064476375962 1.301645159020791 L 194.29996398499117 1.5434188037238332 L 216.0096842806251 2.47476142395007 L 237.5198849934052 2.2939391228943693 L 254.6064722402258 2.958736372785541 L 278.42807314395276 3.232510702627568 L 299.91864769640387 2.6708703943038206 L 320.08183226115807 3.5771087378378397 L 340.59494026767317 3.132650619419867 L 360.34582777829365 4.079665181112261 L 379.77761688879013 4.257726588271989 L 399.40287979732733 3.942917941297468 L 420.02989728132917 4.676164098356363 L 441.80241981972125 4.559699786827467 L 458.6129614187151 4.8988923386807715 L 476.61797756324125 4.699350022282992 L 495.9201737804246 5.136615599550077 L 518.410671947481 4.992694922664938 L 535.6627121536685 4.937984435864869 L 558.3412683715426 5.297683827812122 L 577.0346411672101 5.464057267984778 L 598.8296996783216 6.19770180558067 L 619.0223974626845 6.208593261556406 L 640.4796393846825 6.766600935643025 L 658.7156349220754 6.326441233742838 L 681.4176162739658 6.723972111419584 L 702.5865160964354 6.750931873868688 L 720.037425139694 7.558093835107915 L 737.4087582717378 7.409709500230724 L 755.2507165111327 7.706961177913598 L 777.6605726088692 7.833871896824723 L 804 8"/>
+    		</g>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="25a20a1c778842d7bf215ca926c45041" transform="matrix(1,0,0,1,605,132)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(icône spécial pour modifier la station, si admin)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a073abae99fa4a17bbeb1085733210bc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="01ecb739d83b41cdb822b27f74fd36e6"><tspan x="0" y="0">(icône spécial pour modifier la station, si admin)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="ec51a2fb513a486ab23c8c6e4ebea591" transform="matrix(1,0,0,1,47,390)"><p:metadata><p:property name="textContent"><![CDATA[<font size="6" style="font-family: FreeMono;">-</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="19" height="33" p:name="htmlObject" id="c468312aede84360ad33aff4e0461f05" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="7a2821141637427bb0de41ac62aa3c65" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><font size="6" style="font-family: FreeMono;">-</font></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="fdb73a05987c43bea751a92bc1f1374f" transform="matrix(1,0,0,1,36.5,644.25)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="0af7d2ad0c834878bdfb051f6539b513" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="561787c7eea94466961d30ea73d7040a">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#0af7d2ad0c834878bdfb051f6539b513" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#561787c7eea94466961d30ea73d7040a)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="07573124cf32481d8dce284e3a590328"/>
+            <use xlink:href="#0af7d2ad0c834878bdfb051f6539b513" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="e4da6e6ac5af488aaf30f2d23ad6fd9c" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3f106943b5104199a5019df791b9e05a" transform="matrix(1,0,0,1,76.75,652)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Concentration en azote sous forme de N-NH4 dissous (XX chroniques)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3e759151d88c4665a9c9a9f23a92f7ca" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="01e290dc0f1a49208d4215391e4af993"><tspan x="0" y="0">Concentration en azote sous forme de N-NH4 dissous (XX chroniques)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="dd5d15c10d4b4559bd670d6da75cc7e7" transform="matrix(1,0,0,1,46,643)"><p:metadata><p:property name="textContent"><![CDATA[<font size="6" style="font-family: FreeMono;">-</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="19" height="33" p:name="htmlObject" id="561253ce5ebc456ea80a0a7562a2e96a" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="2f4171f9a4b9493f87972ec9a83be158" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><font size="6" style="font-family: FreeMono;">-</font></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="ee7896b85c6d42339d5198ddef0a54c4" transform="matrix(1,0,0,1,36.5,899.25)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="407a8bacc99c4802961102240946bc3c" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="e582b1db9ed6443e9dfc0ad027ecd75c">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#407a8bacc99c4802961102240946bc3c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#e582b1db9ed6443e9dfc0ad027ecd75c)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="73223b8f44f7499fa72a9e43dd6abfb0"/>
+            <use xlink:href="#407a8bacc99c4802961102240946bc3c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="6f6859fffba4402bbeb8c5528bb6a7d6" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="433b07ac204d42c4a7df59d894e5fdb3" transform="matrix(1,0,0,1,80.75,907)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Pluviométrie (XX chroniques)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="405665a3787149f484a5fdac51739cfd" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="2dfb27e21f2546e39f206c582930ef0a"><tspan x="0" y="0">Pluviométrie (XX chroniques)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d7b49c04bd2347f49d5e01f23e312a9c" transform="matrix(1,0,0,1,46,899)"><p:metadata><p:property name="textContent"><![CDATA[<font size="6" style="font-family: FreeMono;">-</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="19" height="33" p:name="htmlObject" id="0c947d453c8540f284b492bc168fb154" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="0ffb871ef3014c83925d0043a72fbc2b" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><font size="6" style="font-family: FreeMono;">-</font></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="b8aefa7c116b4a7ebc1b0456e209555b" transform="matrix(1,0,0,1,36.5,1151.25)"><p:metadata><p:property name="box"><![CDATA[856.25,30]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.75]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="856.25" height="30" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="e19bb1cbbd6349cab7f6715a9a291055" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="466536cc4b314d98bf9069cc258b232c">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#e19bb1cbbd6349cab7f6715a9a291055" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#466536cc4b314d98bf9069cc258b232c)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c887a74479f0446db638810c6dee26be"/>
+            <use xlink:href="#e19bb1cbbd6349cab7f6715a9a291055" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.75" y="15" width="848.75" height="0" p:name="text" id="4f4da13522164cebb118982d6f827a14" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ece57b23297c48cdb2a155e207817faf" transform="matrix(1,0,0,1,76.75,1159)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Concentration en azote sous forme de N-NO-NH3 dissous (XX chroniques)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d39e9afc1b32469184c68456c9a4752b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="96b6251bdadb4171a0b312362645a796"><tspan x="0" y="0">Concentration en azote sous forme de N-NO-NH3 dissous (XX chroniques)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="3c8cc271ae834f2598d5d782ad300002" transform="matrix(1,0,0,1,46,1153)"><p:metadata><p:property name="textContent"><![CDATA[+]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="14" height="28" p:name="htmlObject" id="a6620bdb2bdc4a82b3fd27f84c5dc604" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="a12a35205ce94b769c3b90865855a2d0" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">+</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,46,687.51953125)" id="d7ebf56e1b1a41eebe9647007546e8a4"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b95b105cc6ac4d2f905c26e912eda5e6" transform="matrix(1,0,0,1,0.75,2.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="4f7eaf25e7c84b5988ef824c23bad3b7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5d6dcc2308004602ab8a7cddaaeb1030"><tspan x="0" y="0">CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2bd68b900fe04b249607ee62d544e99f" transform="matrix(1,0,0,1,0,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="69375c83168e43da89deffd40c5a1450" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e0b9967131a94b3ba0034c18f1eee561"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="93793c6fadf641b9b44a508271f682c5" transform="matrix(1,0,0,1,0,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e2dde59a3c8c45a5bad530fee5d85497" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="75efe1362b6444c2b05a4cc67c528e97"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="deece454d4334314be16f91c38809a90" transform="matrix(1,0,0,1,63,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ef958c9a85eb4265be53ce89393c08d6" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d3926a18e62145b9bdbdafcca852e49e"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d0f246caf5c546248e30b9b023947f5e" transform="matrix(1,0,0,1,62,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3bf2220611fe4431bdbf1770f9addeda" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4d42e65ecb924ab8b5721941648be8f1"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e1b7e6221f8f46429e47ac061149d066" transform="matrix(1,0,0,1,424,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de remplissage :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="185daea5c26b48a1b0d6d29ad782329a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="35bc49b0756948e89a69f4b1a782b64c"><tspan x="0" y="0">Taux de remplissage :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="639d7ca6506c42319f8ddf9053a02f6c" transform="matrix(1,0,0,1,589,24.48046875)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="bdfd0192f2f042e7b3f033df3ad6c126">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="07c4fb373153489db99e40f60fc7e902">
+                    <ellipse p:name="ellipse" id="8954cf1b4b6b4d8a887aedd245064c58" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#07c4fb373153489db99e40f60fc7e902" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#bdfd0192f2f042e7b3f033df3ad6c126)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="682154eb6b2b4fccba7327322cd9ba16"/>
+            <use xlink:href="#07c4fb373153489db99e40f60fc7e902" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="8a757cd319bd4010bb693b2ed16a5374" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="70dd0b46f4b64a1098ba988276faafd2" transform="matrix(1,0,0,1,196,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Minimum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="771d49cd6b1f45649eb1b3f4c170d48e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="1ccfc15ad4a940ba9d09dd2cbfe0b52b"><tspan x="0" y="0">Minimum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e2280a1e3a854ef18fd81a05eb6267b0" transform="matrix(1,0,0,1,330,27.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[0.253]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="4fbbb049d62e4b258a5a7ad409c7589c" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d6aab42c76104513a69009c987c46ad5"><tspan x="0" y="0">0.253</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="087961b76b664067af4ca4ddb0f05ea6" transform="matrix(1,0,0,1,572,-0.51953125)"><p:metadata><p:property name="box"><![CDATA[251,19]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Boîte à outils (sous forme d'icônes)]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="899185552fe347c6901782f92bdc4217" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="856272aede30489d9769d7f2d88b2d35" transform="translate(0.5,0.5)" d="M 0 0 L 22.34696232369622 0.15733873329721348 L 39.548703359635496 -0.17635758968367887 L 62.07092999529279 0.047631273551168474 L 81.15668901326674 0.25232264507570534 L 100.0071641767115 -0.12586704540411386 L 122.98053391435943 0.05131868386495575 L 145.03395978502166 -0.48094212089550503 L 163.48300624622954 -0.3829589238282596 L 181.62334015226475 0.16783447549550146 L 201.188290785725 -0.3475581587784975 L 218.6192659750067 -0.4495857344061074 L 251 0 L 250.6327940159807 8.861395919912749 L 251 19 L 230.36834430921377 18.688768659496738 L 212.9262387309198 19.408268607302528 L 190.5964859364649 19.191069506485597 L 172.02779456944592 18.792304853418187 L 155.2860784669952 19.01336279304513 L 137.04072554548102 19.413341754256535 L 119.8311640800855 18.698049801573468 L 102.7701403178645 19.14987485455096 L 81.44944016252441 19.138349953501372 L 62.85569518613566 18.53055256069996 L 42.52311051260798 19.324172920842653 L 0 19 L -0.20981103199212991 9.650458827749402 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="e4f13d08a2bd4720868c41f37be217f2" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Boîte à outils (sous forme d'icônes)</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c842631ac898460795967db6a5ea67ed" transform="matrix(1,0,0,1,196,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Maximum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="780d432d5d7b492aa823105a7549e7df" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="076a545e615442148a3f86ca1a0510e4"><tspan x="0" y="0">Maximum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="154ccfdf9ee04692a7e6d521ab5d5537" transform="matrix(1,0,0,1,330,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[1.250]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d8041fd362a04cb0acfd78acfbb0bc25" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5a8e61dc27054a2cb5f09358998bf146"><tspan x="0" y="0">1.250</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="6bc9661a178e4e4aaeacecf0516439f5" transform="matrix(1,0,0,1,424,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Producteur :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="24805de43d844ccda6944a6d21fde9c8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fe4180b9785e432289e60a77eef2d0bb"><tspan x="0" y="0">Producteur :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="22670ed1c4614228949e2bcdb6ab3149" transform="matrix(1,0,0,1,529,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[HBAN]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6feff966732c4e47b689cc395537ea36" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="82752b44a6d14bf995af0ab31959015e"><tspan x="0" y="0">HBAN</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,47,429.51953125)" id="0c8c00b471084a40aa39e7e47bea62d8"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="32c77e36daa8480395c52bfd9ccfef09" transform="matrix(1,0,0,1,0.75,2.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0a76dc91dbc54ee1a480eeb4a00cdc56" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7f24ac24daa34532a5389607a6e84f97"><tspan x="0" y="0">CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="03d4b7a20ccf4941be8daa4859215f9a" transform="matrix(1,0,0,1,0,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0dbdf692eb2243a6a9d210284709d021" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7d2d2faa97874653a7adc78242b394ef"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d48c6bb70b8f4af9b2982ab1547ec099" transform="matrix(1,0,0,1,0,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="78be2feee52a4b18a92175a3b1c0ecbf" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="539ac6b8c17842c286f94f19e0220a1c"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="72d21b93c81946299039effb442af070" transform="matrix(1,0,0,1,63,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ef88ad5a1d5946eeb8ad13f09c21a030" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5347499c2c8d4a049895447aebb7dd58"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="da894c2e9be742d1be47f772fb5c3f82" transform="matrix(1,0,0,1,62,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b3ac8b06da234bd5acc8edf2ad73f3b5" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="409871e4c58f4828be0e18297a7ec16c"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d489c77e4a2b4c5b8c6cfe81823f3af8" transform="matrix(1,0,0,1,424,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de remplissage :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="1e0ee89d81894b4b98a162a7b4cdfb37" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e2005afa85194b1192cb7d3e2911f80c"><tspan x="0" y="0">Taux de remplissage :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="2f69614da49c4bbfab22bd55f889976c" transform="matrix(1,0,0,1,589,24.48046875)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="dc4c3bd72ffb4eada4ffd30aea135927">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="69b9966ce2db48fbb0c7b285d5d9647d">
+                    <ellipse p:name="ellipse" id="72f1f0bf73c2419cac0bbc8a14251b50" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#69b9966ce2db48fbb0c7b285d5d9647d" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#dc4c3bd72ffb4eada4ffd30aea135927)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="0e013f421b804932ad53aa13d9fd595c"/>
+            <use xlink:href="#69b9966ce2db48fbb0c7b285d5d9647d" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="2665725fc35f468b891e5e91481c1983" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1fb0bd8b65584c609138ac951f2c704a" transform="matrix(1,0,0,1,196,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Minimum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8b3c195f29c24bb38d5ab22c5275af89" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="12578ad8a16647fba674ec031d222c0f"><tspan x="0" y="0">Minimum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5fac1bc42d614d1d9cf664d9b20b41f6" transform="matrix(1,0,0,1,330,27.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[0.253]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="11febf52a67e4a1cbadeb5c82fdc3764" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ba2a3661e8994e84b8c1b2bbf2457ea3"><tspan x="0" y="0">0.253</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="51a6430cba5f4d2e92bfae73ac11e780" transform="matrix(1,0,0,1,572,-0.51953125)"><p:metadata><p:property name="box"><![CDATA[251,19]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Boîte à outils (sous forme d'icônes)]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="84a5f4483e9c4892a344fc4bf88842af" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="bc0d2953eea44c0ebc71d6e9b209c8c0" transform="translate(0.5,0.5)" d="M 0 0 L 22.34696232369622 0.15733873329721348 L 39.548703359635496 -0.17635758968367887 L 62.07092999529279 0.047631273551168474 L 81.15668901326674 0.25232264507570534 L 100.0071641767115 -0.12586704540411386 L 122.98053391435943 0.05131868386495575 L 145.03395978502166 -0.48094212089550503 L 163.48300624622954 -0.3829589238282596 L 181.62334015226475 0.16783447549550146 L 201.188290785725 -0.3475581587784975 L 218.6192659750067 -0.4495857344061074 L 251 0 L 250.6327940159807 8.861395919912749 L 251 19 L 230.36834430921377 18.688768659496738 L 212.9262387309198 19.408268607302528 L 190.5964859364649 19.191069506485597 L 172.02779456944592 18.792304853418187 L 155.2860784669952 19.01336279304513 L 137.04072554548102 19.413341754256535 L 119.8311640800855 18.698049801573468 L 102.7701403178645 19.14987485455096 L 81.44944016252441 19.138349953501372 L 62.85569518613566 18.53055256069996 L 42.52311051260798 19.324172920842653 L 0 19 L -0.20981103199212991 9.650458827749402 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="05208167c6c945d1a4848b1ae37e8f01" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Boîte à outils (sous forme d'icônes)</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="442db1e8b9b54bbb846c30a6066875ae" transform="matrix(1,0,0,1,196,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Maximum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="128edb0f1bab40ffbd3d48a1d1598fab" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="1a632abe354e4f2fa35073c65e4a8127"><tspan x="0" y="0">Maximum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="b155de008e734ce3940eaa12224a7896" transform="matrix(1,0,0,1,330,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[1.250]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8a1081cf98cb4f9ba3a0d7b40e57b37e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="f69109a1e10843c2ac5dd555633987c8"><tspan x="0" y="0">1.250</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7298e70b161446dabd0a5896b05cb7ac" transform="matrix(1,0,0,1,424,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Producteur :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6e7adab61a874ec682e5f99dbefae024" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="be03a20d36d84cd591f0ee57cd8249f8"><tspan x="0" y="0">Producteur :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9c7445865a044282a22165573cdc0e90" transform="matrix(1,0,0,1,529,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[HBAN]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="deca039f9fe54286b76257f63bbbf5e9" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4698132a8ea2405c94057a5550fa240c"><tspan x="0" y="0">HBAN</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,47,497.51953125)" id="70c386680da54f60a1ea6866910a659c"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="31bca27a2f0e417a9001e5f3936525b5" transform="matrix(1,0,0,1,0.75,2.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="bdb260eabd784efb9446f186c2f2124c" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7312de52b52d4e5299cc52b9ea76d93e"><tspan x="0" y="0">CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="8540c20501194e3798fc09fff688ba21" transform="matrix(1,0,0,1,0,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5e06d4c07e0f43918020a4684978e422" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c3d94fbca11a4c539437e1e9c4ff94e6"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="aff02dec47604aa4b6e81c85f551ce66" transform="matrix(1,0,0,1,0,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="483f0634e1304adabf86c49814839ac4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="193051c5db454b4a99fc4f09154fda40"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d57bae1de123439e92aeb1fbf5c749e7" transform="matrix(1,0,0,1,63,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b2e0bfd1231746ab9724dcf4e9f80c6f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d52e5e0bfd26471eb4af5825bd438214"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="f12f4615c149495ca3ef60ee780e5a70" transform="matrix(1,0,0,1,62,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3d86f2b48a60418a99fe9d2039b0939f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5774d23e0f5e447594dc154705100b6a"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6fdd1c4ebcf441c816fa855fbabe005" transform="matrix(1,0,0,1,424,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de remplissage :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="06427ede0f0a43db8bfdb576b5623498" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ca793f1163a8418a8f6df85cba095202"><tspan x="0" y="0">Taux de remplissage :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="6edb34ddd8fc403fb367b6346c9af978" transform="matrix(1,0,0,1,589,24.48046875)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="aa6887076e6c4ecf967c7b7d8682b5d5">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="4adc37e6b3544eab8d030c5eb9fc08a6">
+                    <ellipse p:name="ellipse" id="98ecd9084b7b44acbde3cc789531c261" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#4adc37e6b3544eab8d030c5eb9fc08a6" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#aa6887076e6c4ecf967c7b7d8682b5d5)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="a687047c3b70402c95068656136998e6"/>
+            <use xlink:href="#4adc37e6b3544eab8d030c5eb9fc08a6" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="f0801608739d4654804706345854a8c0" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5f7ba6bf10db4d6aa88fa5d2db568ef0" transform="matrix(1,0,0,1,196,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Minimum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c134b4646a8e443b910f9382c49ac8f4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="cdb11db6b5734c8ca562b2eeb0402e21"><tspan x="0" y="0">Minimum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2c60a9c4b5454ec7a3f0493632cb0bda" transform="matrix(1,0,0,1,330,27.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[0.253]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3a5df3d68be145cbaf2a9a5e81e7bf23" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4158daea3b8e4582a85488c1d0330e5d"><tspan x="0" y="0">0.253</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="34dfb84442e84b1ea17f3cb1437bc5e3" transform="matrix(1,0,0,1,572,-0.51953125)"><p:metadata><p:property name="box"><![CDATA[251,19]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Boîte à outils (sous forme d'icônes)]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f98bbd74769849b09f00bab15c4b6560" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="2099e822c5f54f8d83e986bd103ffcbf" transform="translate(0.5,0.5)" d="M 0 0 L 22.34696232369622 0.15733873329721348 L 39.548703359635496 -0.17635758968367887 L 62.07092999529279 0.047631273551168474 L 81.15668901326674 0.25232264507570534 L 100.0071641767115 -0.12586704540411386 L 122.98053391435943 0.05131868386495575 L 145.03395978502166 -0.48094212089550503 L 163.48300624622954 -0.3829589238282596 L 181.62334015226475 0.16783447549550146 L 201.188290785725 -0.3475581587784975 L 218.6192659750067 -0.4495857344061074 L 251 0 L 250.6327940159807 8.861395919912749 L 251 19 L 230.36834430921377 18.688768659496738 L 212.9262387309198 19.408268607302528 L 190.5964859364649 19.191069506485597 L 172.02779456944592 18.792304853418187 L 155.2860784669952 19.01336279304513 L 137.04072554548102 19.413341754256535 L 119.8311640800855 18.698049801573468 L 102.7701403178645 19.14987485455096 L 81.44944016252441 19.138349953501372 L 62.85569518613566 18.53055256069996 L 42.52311051260798 19.324172920842653 L 0 19 L -0.20981103199212991 9.650458827749402 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="e6798ec45a324bfa9a8f34a910cdb87b" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Boîte à outils (sous forme d'icônes)</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="fa812eb211a741bc9634046a4e30d38c" transform="matrix(1,0,0,1,196,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Maximum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="92e13091b2e84dc0a7afebc212256404" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="866d4192efe241fda3420bcd869ca159"><tspan x="0" y="0">Maximum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a85b15a33b8442798e30659e920bf989" transform="matrix(1,0,0,1,330,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[1.250]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="56ed7fef729a446fa5e97bc8e5ce1b7f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="97635f659cfd4979af21d139cb0107c7"><tspan x="0" y="0">1.250</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5c1e76aee832425ab56e04460b1eab6c" transform="matrix(1,0,0,1,424,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Producteur :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9e330d72185f49f28970af96e06ae578" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="835f9cc940804b21a7437feeb3e5deb3"><tspan x="0" y="0">Producteur :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a379a0cccc654109923cf55e8ce194ee" transform="matrix(1,0,0,1,529,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[HBAN]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f1fd16bbf8404d858b35e0ac13123250" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c12fd9fc508841acba56bc652f8d96b7"><tspan x="0" y="0">HBAN</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,47,571.51953125)" id="eb7c5601280646108f0a074f27fc869c"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e23d86f88412488e9c7d04c917f330a1" transform="matrix(1,0,0,1,0.75,2.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="145b83cd60cd43629f7935d66a89c691" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="2dfc0530c64d4b33bf86343ae1fa4f45"><tspan x="0" y="0">CA-224 : Concentration en NH4 prise sous le pont amont (mg/L)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0e5dcebc052f4c219f75e9c15c6e213f" transform="matrix(1,0,0,1,0,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Début :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5d04e9e29dc4492ab5f24f1467cbec51" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="5fb8978f2a524834801d2055dc56f34b"><tspan x="0" y="0">Début :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a923babe4eda485f9220de42221025ca" transform="matrix(1,0,0,1,0,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Fin :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="53f88eb121154ef79fe5d977d9495bd8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="95576f2ab91848e7b44bebf60a027b43"><tspan x="0" y="0">Fin :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="ed44cd8b7feb4ba1b3b5b6badf3b9408" transform="matrix(1,0,0,1,63,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[12/12/1992 12:12]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6eb79c074cd349688b3b94388bf3a144" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="49ea7f86c5ae4aee8de637fd698c0810"><tspan x="0" y="0">12/12/1992 12:12</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1bd679b0011b406393a7087600f5783c" transform="matrix(1,0,0,1,62,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[01/01/2011 11:01]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2a65927fd06442d1a7664b5a764fc7dc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="017072aa0c1d40c9a24b5e24b6d3c6a8"><tspan x="0" y="0">01/01/2011 11:01</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="bdc515537e6f401783bb1e90f803b7a2" transform="matrix(1,0,0,1,424,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Taux de remplissage :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7f4e7f00a18341ecabeeb95b65bb9e55" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="158e04fe75354970b56265e1bc3deb70"><tspan x="0" y="0">Taux de remplissage :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="3b900f9e50d0429bbe70d2f7a21bab11" transform="matrix(1,0,0,1,589,24.48046875)"><p:metadata><p:property name="box"><![CDATA[19,19]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[<font size="1">100%</font>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="4cda974c1b8e4f129115483d97ec3fc8">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="ea3434bd0501428697d4f477a620957e">
+                    <ellipse p:name="ellipse" id="a65da877e39f49fdaf630a0994593f62" cx="9.5" cy="9.5" rx="9.5" ry="9.5" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#ea3434bd0501428697d4f477a620957e" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#4cda974c1b8e4f129115483d97ec3fc8)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="92bcf8b8cd5e4a7783290272f4c3ae33"/>
+            <use xlink:href="#ea3434bd0501428697d4f477a620957e" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="2" width="19" height="15" p:name="text" id="93a000993ed3486fbf34639e03a63611" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"><font size="1">100%</font></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4f641545113d425d8657e43564854ef4" transform="matrix(1,0,0,1,196,26.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Minimum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="21ce872082ba40de8ba699e5f6aefa84" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6db3b0245857412a83224a23d06161be"><tspan x="0" y="0">Minimum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="88319f841e5a495190fc29b5b15c9045" transform="matrix(1,0,0,1,330,27.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[0.253]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="4b23f22f305d40d8be9e8ae37fc0cedb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c54e3eaf32d5442a860c81d41cba688e"><tspan x="0" y="0">0.253</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="3c9ab000374143b097dfe065e2da1ca6" transform="matrix(1,0,0,1,572,-0.51953125)"><p:metadata><p:property name="box"><![CDATA[251,19]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Boîte à outils (sous forme d'icônes)]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="07c63263d08b4a13aa8e230a29d5f3e3" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="ad8d6e4c2574466baa9d17dea99eda1d" transform="translate(0.5,0.5)" d="M 0 0 L 22.34696232369622 0.15733873329721348 L 39.548703359635496 -0.17635758968367887 L 62.07092999529279 0.047631273551168474 L 81.15668901326674 0.25232264507570534 L 100.0071641767115 -0.12586704540411386 L 122.98053391435943 0.05131868386495575 L 145.03395978502166 -0.48094212089550503 L 163.48300624622954 -0.3829589238282596 L 181.62334015226475 0.16783447549550146 L 201.188290785725 -0.3475581587784975 L 218.6192659750067 -0.4495857344061074 L 251 0 L 250.6327940159807 8.861395919912749 L 251 19 L 230.36834430921377 18.688768659496738 L 212.9262387309198 19.408268607302528 L 190.5964859364649 19.191069506485597 L 172.02779456944592 18.792304853418187 L 155.2860784669952 19.01336279304513 L 137.04072554548102 19.413341754256535 L 119.8311640800855 18.698049801573468 L 102.7701403178645 19.14987485455096 L 81.44944016252441 19.138349953501372 L 62.85569518613566 18.53055256069996 L 42.52311051260798 19.324172920842653 L 0 19 L -0.20981103199212991 9.650458827749402 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="d9dd84e3fe904068aabbc51b771be2e7" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="14">Boîte à outils (sous forme d'icônes)</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2790ac97305a46acacc1d01633db04c9" transform="matrix(1,0,0,1,196,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Maximum valide :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="34eb7a509f8b42058c00de42136c05e8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7694f0a6cb9e47efb9b95a3f04c2d518"><tspan x="0" y="0">Maximum valide :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="514b269c633041c593074d75ee47416f" transform="matrix(1,0,0,1,330,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[1.250]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d12fd0241ecc4148ac8cb01a8d923abf" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="24d45174cb3f46e6be20c8c0e50fe21a"><tspan x="0" y="0">1.250</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3515f8e9cd8a4d4ea3ef6aa235681061" transform="matrix(1,0,0,1,424,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Producteur :]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="db4bb7d7a55847d7b4c68fc594b3e4dc" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="30333cde2fda4a2dada35ec63827a51b"><tspan x="0" y="0">Producteur :</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="5c341f12d4f74eed8d5a70a0e9a7ef7a" transform="matrix(1,0,0,1,529,45.48046875)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[HBAN]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5deedd1ac3f9409e9300a46d7dc18483" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="67f1461a9aba4ab98268731456253dee"><tspan x="0" y="0">HBAN</tspan></text>
+        </g></g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/export.en.yml b/src/Irstea/BdohConsultBundle/Resources/translations/export.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1cf55bbb6c105cc67b74d7fc62e94e670d4bd6e3
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/export.en.yml
@@ -0,0 +1,18 @@
+validation:
+    select-a-date: Please selact a date.
+    end-after-start: The end date must be posterior to the start date.
+    out-of-valid-range: The selected period is out of bounds.
+    invalid-time-step: This time step is out of bounds.
+    invalid-time-span: The time step is too with regard to the selected period.
+    check-term-of-uses: Please accept the terms of use before downloading.
+    select-a-chronique: Please select at least one time series.
+    start:
+        required: 'Please enter the start date.'
+        invalid: 'The start date is not valid.'
+        beforeMinDate: 'The start date is after the end date and/or after the end of the time series.'
+        afterMaxDate: 'The start date is before the begining of the time series.'
+    end:
+        required: 'Please enter the end date.'
+        invalid: 'The end date is not valid.'
+        beforeMinDate: 'The end date is after the end of the time series.'
+        afterMaxDate: 'The end date is before the start date and/or before the begining of the time series.'
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/export.fr.yml b/src/Irstea/BdohConsultBundle/Resources/translations/export.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7a227b2a5d16766e06675cbe0e64b473bb3fa791
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/export.fr.yml
@@ -0,0 +1,18 @@
+validation:
+    select-a-date: Veuillez sélectionner une date.
+    end-after-start: La date de fin doit être après la date de début.
+    out-of-valid-range: La période sélectionnée dépasse celle de la chronique.
+    invalid-time-step: Ce pas de temps est trop élevé ou trop faible.
+    invalid-time-span: Le pas de temps est trop faible par rapport à la période sélectionnée.
+    check-term-of-uses: Veuillez accepter les conditions d'utilisation pour pouvoir exporter des mesures.
+    select-a-chronique: Veuillez sélectionner au moins une chronique.
+    start:
+        required: 'Veuillez renseigner la date de début.'
+        invalid: "La date de début n'est pas valide."
+        beforeMinDate: 'La date de début est après la date de fin et/ou après la fin de la chronique.'
+        afterMaxDate: 'La date de début est avant le début de la chronique '
+    end:
+        required: 'Veuillez renseigner la date de fin.'
+        invalid: "La date de fin n'est pas valide."
+        beforeMinDate: 'La date de fin est après la fin de la chronique.'
+        afterMaxDate: 'La date de fin est avant la date de début et/ou avant le début de la chronique'
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/messages.en.yml b/src/Irstea/BdohConsultBundle/Resources/translations/messages.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dfef3a2394830fd49dd494cc0e2a0a356e8fc99f
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/messages.en.yml
@@ -0,0 +1,93 @@
+recalculate: Update data Completeness statistics
+recalculationInProgress: Calculation in progress
+canTakeAWhile: This operation can take several minutes
+pleaseWait: Please wait...
+continue: Continuous
+discontinue: Discontinuous
+calculee: Calculated
+convertie: Converted
+notCalculatedYet: This time series has not been calculated yet.
+notConvertedYet: This time series has not been converted yet.
+dataCountByMonth: Number of data values starting in the month
+emptyChronique: Delete data
+emptyChroniqueContinueInfo: >+
+    For a continuous time series the removal period is inclusive, all the data points over the
+    period will be replaced by gap values unless the removal period includes a bondary of the time series,
+    in which case the data points are removed.
+emptyChroniqueDiscontinueInfo: >+
+    For a discontinuous time series, the removal period includes all the data range that overlap
+    the removal period except for the data that overlap the period
+    only on one bondary and which are not a point. The data range are removed
+    entierly they are not truncated.
+empty: Empty
+doEmpty: Empty
+removedMeasures(%removed%): >+
+    {0}No data points have been removed.
+    |{1}One data point has been removed.
+    |]1,Inf]%removed% data points have been removed.
+changedMeasures(%changed%): >+
+    {0}No data points have been altered.
+    |{1}One data point has been changed into a gap value.
+    |]1,Inf]%changed% data points have been changed into gap values.
+consult:
+    help:
+        chronique:
+            noGenealogie: Empty
+            notVisible: This time series is not public
+            selectionOfDatesRange: >+
+                <b>Warning</b>: due to performance limitations please select
+                a maximum time span of <b>5 years</b>
+            double-clic-unzoom: To unzoom please double-click on the graph.
+            display-checkpoints: Display checkpoints
+            time-step-depends-on-span: >+
+                To change the time step of the histogram please select
+                other beginning / end dates.
+            no-data-to-plot: No data on this time span
+            checkpointsOnCumulative: Checkpoints are not displayed on cumulative representations.
+        station:
+            notActive: This station is closed
+            noCommentaire: Empty
+    buttons:
+        view: View
+        export-image: Display as image
+        add-pane: Add a panel
+        ok: OK
+        cancel: Cancel
+    fillingRateMesure: value|values
+chroniqueCalculee:
+    baremes(%chronique%): "Scale sets history for “ %chronique% ”"
+    baremesChroniqueMere: "Scale sets used for the time series:"
+chroniqueConvertie:
+    seeConversionLogs: See the gap threshold history
+    conversions(%chronique%): Gap threshold history of “ %chronique% ”
+    conversionDu: Gap threshold as of
+    paramConversion: "Gap threshold:"
+activeJobsInfo(%jobPageLink%): >+
+    <b>Warning:</b> at least one job directly about this time series is in progress,
+    the displayed information may not be not up to date.
+    You may check the end of this(these) job(s) from <a href="%jobPageLink%">the job page</a>.
+checkpointStats(%num%, %first%, %last%): >+
+    %num% point<br/>
+    <span style="padding:0 0 0 15px">on the %first% <sup>UTC</sup></span>
+    |%num% points<br/>
+    <span style="padding:0 0 0 15px">from the %first% <sup>UTC</sup></span><br/>
+    <span style="padding:0 0 0 15px">to the %last% <sup>UTC</sup></span>
+checkpointsInfo: >+
+    Checpoints are one-time data, collected in situ, that can be
+    superimposed on the time series to check the validity of the data.
+searchInfo: >+
+    The search also includes, for each time series, all the information of the station including
+    the comment, the town, the experimental sites and the close rivers and close basins.
+advancedSearch:
+    stations: Stations
+    enActivite: Active stations
+    communes: Towns
+    sites: Experimental sites
+    producteurs: Producers
+    typesChroniques: Types of time series
+    famillesParametres: Parameters categories
+    typesParametres: Parameters
+    bassins: Basins
+    courseau: Rivers
+    dataset: Datasets
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/messages.fr.yml b/src/Irstea/BdohConsultBundle/Resources/translations/messages.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..19fa37a67d5440755de27838dc23a515d0bad5e6
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/messages.fr.yml
@@ -0,0 +1,92 @@
+recalculate: Recalcul des taux
+recalculationInProgress: Calcul des taux de remplissage en cours
+canTakeAWhile: Cette opération peut prendre plusieurs minutes
+pleaseWait: Veuillez patienter...
+continue: Continue
+discontinue: Discontinue
+calculee: Calculée
+convertie: Convertie
+notCalculatedYet: Cette chronique n'a pas encore été calculée.
+notConvertedYet: Cette chronique n'a pas encore été convertie.
+dataCountByMonth: Nombre de mesures commençant dans le mois
+emptyChronique: Supprimer des mesures
+emptyChroniqueContinueInfo: >+
+    Pour une chronique continue la période de suppression est inclusive, tous les points de mesure contenus dans la
+    période seront remplacés par des points en lacune sauf si la période de suppression inclut une borne de la chronique,
+    dans ce cas, les points de mesure sont supprimés.
+emptyChroniqueDiscontinueInfo: >+
+    Pour une chronique discontinue la periode de suppression inclut toutes les plages de mesures qui chevauchent
+    entièrement ou en partie la période de suppression à l'exception des plages qui ne chevauchent la période de
+    suppression que sur une borne et qui ne sont pas des points. Les plages de mesures concernées sont entièrement
+    supprimées, elles ne sont pas tronquées.
+empty: Vide
+doEmpty: Vider
+removedMeasures(%removed%): >+
+    {0}Aucune mesure n'a été supprimée.
+    |{1}Une mesure a été supprimée.
+    |]1,Inf]%removed% mesures ont été supprimées.
+changedMeasures(%changed%): >+
+    {0}Aucune mesure n'a été modifiée.
+    |{1}Une mesure a été changée en lacune.
+    |]1,Inf]%changed% mesures ont été changées en lacune.
+consult:
+    help:
+        chronique:
+            noGenealogie: Aucune généalogie
+            notVisible: Cette chronique n'est pas publique
+            selectionOfDatesRange: >+
+                <b>Attention</b> : pour des raisons de performance vous ne pouvez sélectionner
+                qu'un intervalle de dates de <b>5 ans maximum</b>.
+            double-clic-unzoom: Pour revenir au niveau de zoom initial, double-cliquez sur le graphe.
+            display-checkpoints: Afficher les points de contrôle
+            time-step-depends-on-span: >+
+                Pour changer le pas de temps de l'histogramme veuillez modifier
+                les dates de début et fin sélectionnées ci-dessus.
+            no-data-to-plot: Pas de mesure à afficher dans cet intervalle de dates
+            checkpointsOnCumulative: Les points de contrôle ne sont pas affichés sur les représentations en cumuls.
+        station:
+            notActive: Cette station n'est pas active
+            noCommentaire: Aucun commentaire
+    buttons:
+        view: Visualiser
+        export-image: Afficher en tant qu'image
+        add-pane: Ajouter un panneau
+        ok: OK
+        cancel: Annuler
+    fillingRateMesure: mesure|mesures
+chroniqueCalculee:
+    baremes(%chronique%): "Historique des jeux de barèmes de « %chronique% »"
+    baremesChroniqueMere: "Jeux de barèmes pour la chronique mère :"
+chroniqueConvertie:
+    seeConversionLogs: Voir l'historique du seuil de lacune
+    conversions(%chronique%): Historique du seuil de lacune de « %chronique% »
+    conversionDu: Seuil de lacune du
+    paramConversion: "Seuil de lacune :"
+activeJobsInfo(%jobPageLink%): >+
+    <b>Attention :</b> au moins un job concernant directement cette chronique est en cours,
+    les informations affichées peuvent ne pas être à jour.
+    Vous pouvez vérifier la fin de ce(s) job(s) depuis <a href="%jobPageLink%">la page des jobs</a>.
+checkpointStats(%num%, %first%, %last%): >+
+    %num% point<br/>
+    <span style="padding:0 0 0 15px">le %first% <sup>UTC</sup></span>
+    |%num% points<br/>
+    <span style="padding:0 0 0 15px">du %first% <sup>UTC</sup></span><br/>
+    <span style="padding:0 0 0 15px">au %last% <sup>UTC</sup></span>
+checkpointsInfo: >+
+    Les points de contrôle sont des mesures ponctuelles effectuées in-situ et que l’on
+    peut superposer à une chronique pour vérifier la bonne adéquation des mesures.
+searchInfo: >+
+    La recherche par mot-clé prend aussi en compte, pour chaque chronique, toutes les informations de la station dont
+    le contenu du commentaire, la commune, les sites expérimentaux et les cours d'eau et bassins proches.
+advancedSearch:
+    stations: Stations
+    enActivite: Stations en activité
+    communes: Communes
+    sites: Sites expérimentaux
+    producteurs: Producteurs
+    typesChroniques: Types de chroniques
+    famillesParametres: Familles de paramètres
+    typesParametres: Paramètres étudiés
+    bassins: Bassins
+    courseau: Cours d'eau
+    dataset: Jeu de données
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/viewer.en.yml b/src/Irstea/BdohConsultBundle/Resources/translations/viewer.en.yml
new file mode 100644
index 0000000000000000000000000000000000000000..734c195dabaa50c4d31969da8e4d50e2b98efef1
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/viewer.en.yml
@@ -0,0 +1,62 @@
+site: Site
+station: Station
+select-station-to-see-chronicles: Please select a station to see the list of available time series.
+select-and-drag-chronicles: |
+    To add time series, please select them in the list and drag and drop them to the window on the right.
+click-cross-remove-chronicle: To remove a time series, please click on the corresponding close button icon.
+chronicles-must-be-compatible: |
+    Warning: only time series of the same parameter and
+    same unit can be displayed together.
+available-chronicles: Available time series
+selected-chronicles: Selected time series
+select-at-least-one-chronicle: Please select at least one time series
+chart-loading: Loading...
+chronicle: Time series
+left-axis: Left axis
+right-axis: Right axis
+edit-selection: Choose time series
+closeThisPane: Close this panel
+time-series-hidden-at-date-range: |
+    The following time series are no longer displayed because
+    they have no data in the newly selected time range:
+time-series-has-no-measure: |
+    This time series cannot be displayed because it contains
+    no data in the selected time range.
+toggle-checkpoints: Show/hide checkpoints
+graph:
+    state:
+        processing: Processing...
+        empty: Please select one or more time series.
+        all-hidden: All the time series are hidden.
+        no-measures: No data on the selected time range.
+        error: "Error: %message%"
+selector:
+    graph: Graph
+    chroniques:
+        emptySelection: Please select a station.
+        noChronicles: Those stations hove no time series.
+        noMoreChronicles: No time series have data on the selected time range.
+        noCompatibleChronicles: No time series left to display on this axis.
+consult.help.range:
+    too-small: Please select at least a one-day-long time range.
+    too-big: Please select a time range less than 5 years.
+subsampledInfo(%num%): >+
+    Due to the high number of non-gap data (%num%), the data set has been subsampled.
+    Please select a narrower date range in order to avoid subsampling.
+subsampledInfoHelp(%num%): >+
+    Due to the high number of non-gap data (<span class="subsampledHelp">%num%</span>), the data set has been subsampled.
+    Please select a narrower date range in order to avoid subsampling.
+subsampledHelp: >+
+    The limit before subsampling is 50,000 points for instantaneous representations and 25,000 points for mean representations.
+chroniqueTitle(%station%, %typeParam%): >+
+    Station: %station%<br/>Parameter: %typeParam%
+hideDisplayButton: Show/hide this time series
+histogramTimeStepsIs(%ts%): Given the span of the currently<br>selected time range, the time<br>step for the histogram is %ts%.
+timeSeriesNoMeasures: This time series does not have any<br>data on the selected time range.
+titleDataType:
+    discontinuous:
+    instantaneous: Instantaneous data sampling.
+    meanPast: Mean data sampling on previous time step.
+    meanNext: Mean data sampling on next time step.
+    cumulativePast: Cumulative data sampling on previous time step.
+    cumulativeNext: Cumulative data sampling on next time step.
diff --git a/src/Irstea/BdohConsultBundle/Resources/translations/viewer.fr.yml b/src/Irstea/BdohConsultBundle/Resources/translations/viewer.fr.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27cb3ca5472981205e6f9e3b718d280d8c4a3fa0
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/translations/viewer.fr.yml
@@ -0,0 +1,62 @@
+site: Site
+station: Station
+select-station-to-see-chronicles: Veuillez sélectionner une station pour voir la liste des chroniques disponibles.
+select-and-drag-chronicles: |
+    Pour ajouter des chroniques à afficher, sélectionnez-les dans la liste de gauche et glissez-les vers celle de droite.
+click-cross-remove-chronicle: Pour retirer une chronique, cliquez sur la croix correspondante dans la liste de droite.
+chronicles-must-be-compatible: |
+    Attention : l'axe ne peut comporter que des chroniques de même unité physique et s'affichant avec
+    la même orientation de l'axe Y.
+available-chronicles: Chroniques disponibles
+selected-chronicles: Chroniques sélectionnées
+select-at-least-one-chronicle: Veuillez sélectionner au moins une chronique
+chart-loading: Chargement en cours...
+chronicle: Chronique
+left-axis: Axe de gauche
+right-axis: Axe de droite
+edit-selection: Choisir les chroniques
+closeThisPane: Fermer ce panneau
+time-series-hidden-at-date-range: |
+    Les chroniques suivantes ne sont plus affichées car elles ne contienne
+    pas de mesures dans la plage de temps nouvellement sélectionnée :
+time-series-has-no-measure: |
+    Cette chronique ne peut être affichée car elle
+    ne contient aucune mesure dans la plage de temps sélectionnée.
+toggle-checkpoints: Afficher/masquer les points de contrôle
+graph:
+    state:
+        processing: Rafraîchissement en cours...
+        empty: Veuillez sélectionner une ou plusieurs chroniques.
+        all-hidden: Toutes les chroniques sont cachées.
+        no-measures: Aucune mesure sur la période sélectionnée.
+        error: "Erreur : %message%"
+selector:
+    graph: Graphe
+    chroniques:
+        emptySelection: Veuillez sélectionner une station.
+        noChronicles: Ces stations n'ont pas de chroniques.
+        noMoreChronicles: Aucune chronique ne contient de mesures sur l'intervalle de temps sélectionné.
+        noCompatibleChronicles: Aucune autre chronique à afficher sur le même axe.
+consult.help.range:
+    too-small: Veuillez sélectionnez un intervalle d'un jour minimum.
+    too-big: Veuillez sélectionnez un intervalle de moins de 5 ans.
+subsampledInfo(%num%): >+
+    En raison du nombre élevé de mesures non lacunaires (%num%), la chronique a été sous-échantillonnée.
+    Veuillez sélectionner un intervalle de temps plus court pour éviter un sous-échantillonnage.
+subsampledInfoHelp(%num%): >+
+    En raison du nombre élevé de mesures non lacunaires (<span class="subsampledHelp">%num%</span>), la chronique a été sous-échantillonnée.
+    Veuillez sélectionner un intervalle de temps plus court pour éviter un sous-échantillonnage.
+subsampledHelp: >+
+    La limite de sous échantillonnage est de 50 000 points pour une représentation instantanée et de 25 000 points pour une représentation en moyennes.
+chroniqueTitle(%station%, %typeParam%): >+
+    Station : %station%<br/>Paramètre : %typeParam%
+hideDisplayButton: Afficher/masquer la chronique
+histogramTimeStepsIs(%ts%): Etant donnée la longueur de la plage<br>de temps sélectionnée, le pas de temps<br>de l'histogramme est de %ts%.
+timeSeriesNoMeasures: Cette chronique n'a pas de mesure<br>sur la période sélectionnée.
+titleDataType:
+    discontinuous:
+    instantaneous: Données de type instantané.
+    meanPast: Données de type moyenne sur pas de temps précédent.
+    meanNext: Données de type moyenne sur pas de temps suivant.
+    cumulativePast: Données de type cumul sur pas de temps précédent.
+    cumulativeNext: Données de type cumul sur pas de temps suivant.
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chronique-mere.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chronique-mere.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..37f859b827b8512ae2c2a8bbcb6ecdd637004606
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chronique-mere.html.twig
@@ -0,0 +1,24 @@
+{%- import 'IrsteaBdohConsultBundle::macros.html.twig' as macros -%}
+{% set chronique_mere = chronique.conversion.entree %}
+<div class="col-sm-12">
+    <div class="span">
+        <strong>{{ 'bareme.parentChronicle'|trans }}{{ 'deux_points'|trans }}</strong>
+        {% if is_granted('CONSULT_TIMESERIES', chronique_mere)  %}
+            <a href="{{ path('bdoh_consult_chronique', {station: chronique_mere.station.code, chronique: chronique_mere.code}) }}"
+               class="viewChroniqueMere"
+               title="{{ 'viewChronique'|trans }}">
+                {{- chronique_mere -}}
+            </a>
+        {% else %}
+            {{- chronique_mere -}}
+        {% endif %}
+        {{- macros.chronique_isVisible(chronique_mere) -}}
+    </div>
+</div>
+<div class="col-sm-24" style="margin-top:15px;">
+    <a class="btn btn-info btn-open-modal" href="#" data-toggle="modal" data-target="#detail-conversions">
+        {{ 'chroniqueConvertie.seeConversionLogs'|trans }}
+    </a>
+</div>
+{% include 'IrsteaBdohConsultBundle:Chronique:_detail-conversions.html.twig' %}
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chroniques-meres.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chroniques-meres.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8eebc7659e300edf37823f601a4bdc0d7f7c80b7
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-chroniques-meres.html.twig
@@ -0,0 +1,37 @@
+{%- import 'IrsteaBdohConsultBundle::macros.html.twig' as macros -%}
+{% if chronique.secondeEntree %}
+    {% set transformations = {
+    'bareme.firstParentChronicle': chronique.premiereEntree,
+    'bareme.secondParentChronicle': chronique.secondeEntree
+    } %}
+{% else %}
+    {% set transformations = {
+    'bareme.parentChronicle': chronique.premiereEntree
+    } %}
+{% endif %}
+
+{% for label, transformation in transformations %}
+    {% set chronique_mere = transformation.entree %}
+    <div class="col-sm-12">
+        <div class="span">
+            <strong>{{ label|trans }}{{ 'deux_points'|trans }}</strong>{% if chronique.secondeEntree %}<br>{% endif %}
+            {% if is_granted('CONSULT_TIMESERIES', chronique_mere)  %}
+                <a href="{{ path('bdoh_consult_chronique', {station: chronique_mere.station.code, chronique: chronique_mere.code}) }}"
+                   class="viewChroniqueMere"
+                   title="{{ 'viewChronique'|trans }}">
+                    {{- chronique_mere -}}
+                </a>
+            {% else %}
+                {{- chronique_mere -}}
+            {% endif %}
+            {{- macros.chronique_isVisible(chronique_mere) -}}
+        </div>
+    </div>
+{% endfor %}
+<div class="col-sm-24" style="margin-top:15px;">
+    <a class="btn btn-info btn-open-modal" href="#" data-toggle="modal" data-target="#detail-jeux-baremes">
+        {{ 'bareme.seeBaremeLogs'|trans }}
+    </a>
+</div>
+{% include 'IrsteaBdohConsultBundle:Chronique:_detail-jeux-baremes.html.twig' %}
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-conversions.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-conversions.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..659023d0156ae6aac3b4aa18ae5e803e0376b90a
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-conversions.html.twig
@@ -0,0 +1,41 @@
+<div class="modal fade" id="detail-conversions" tabindex="-1" role="dialog" aria-hidden="true">
+
+    <div class="modal-dialog modal-lg" role="document">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                <h1 class="modal-title" style="margin-bottom:0;">
+                    {{ 'chroniqueConvertie.conversions(%chronique%)'|trans({'%chronique%' : chronique}) }}
+                </h1>
+            </div>
+
+            <div class="modal-body">
+                {% for conversion in conversions %}
+                    <div class="panel panel-default">
+                        <div class="panel-heading">
+                            <strong>
+                                {{ 'chroniqueConvertie.conversionDu'|trans }}
+                                {{ conversion.dateCreation|date('transformation.bareme.dateBareme'|trans, false) }}
+                                {{ 'UTC'|trans }}{{ 'deux_points'|trans }}
+                            </strong>
+                            {% set paramConversionMinuntes = conversion.paramConversion // 60 %}
+                            {{ paramConversionMinuntes }} {{ 'minute'|transchoice(paramConversionMinuntes) }}
+                            {% if paramConversionMinuntes >= 60 %}
+                                ({{ conversion.paramConversion|durationFormat }})
+                            {% endif %}
+                        </div>
+                    </div>
+                {% endfor %}
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+            </div>
+
+        </div>
+
+    </div>
+
+</div>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-jeux-baremes.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-jeux-baremes.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c152d29244ef7247528d2a87a35ba8dcfc984dfd
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_detail-jeux-baremes.html.twig
@@ -0,0 +1,122 @@
+{% set nJeuxBaremes = (jeuxBaremes|length == 1 or jeuxBaremes[1] is null or jeuxBaremes[1]|length == 0) ? 1 : 2 %}
+<div class="modal fade" id="detail-jeux-baremes" tabindex="-1"
+     role="dialog" aria-hidden="true">
+
+    <div class="modal-dialog modal-lg" role="document">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                <h1 class="modal-title" style="margin-bottom:0;">{{ 'chroniqueCalculee.baremes(%chronique%)'|trans({'%chronique%' : chronique}) }}</h1>
+            </div>
+
+            <div class="modal-body">
+                {% for i in 0..nJeuxBaremes - 1 %}
+                    <div class="alert alert-info">
+                        <strong>{{ 'chroniqueCalculee.baremesChroniqueMere'|trans }}
+                            <span style="font-weight:normal;">
+                                {% set chroniqueMere = (i == 0) ? chronique.premiereentree.entree : chronique.secondeentree.entree %}
+                                {{ chroniqueMere }}
+                            </span>
+                        </strong>
+                    </div>
+                    {% for jeuBareme in jeuxBaremes[i] %}
+                        {% set jeuBaremeId = 'jeuBaremeId' ~ jeuBareme.id %}
+                        <div class="panel panel-default">
+                            <div class="panel-heading">
+                                <table class="table-jeux-baremes-infos">
+                                    <tr>
+                                        <td>
+                                            <a data-toggle="collapse" class="dropdown-toggle collapse-title collapsed pannel-heading" href="#{{- jeuBaremeId -}}">
+                                                <strong>
+                                                    <b class="caret"></b>
+                                                    {{ 'transformation.jeu-baremes-du(%date%)'|trans({'%date%':
+                                                        jeuBareme.dateCreation|date('transformation.bareme.dateBareme'|trans, false)}) }} {{ 'UTC'|trans }}
+                                                    {% set additional_info = [] %}
+
+                                                    {% if nJeuxBaremes > 1 %}
+                                                        {% set additional_info = additional_info|merge([
+                                                            ('transformation.delaiPropagation'|trans)~' : '~(jeuBareme.delaiPropagation|default(0))
+                                                        ]) %}
+                                                    {% endif %}
+
+                                                    {% if jeuBareme.valueLimitTransformationType is not empty %}
+                                                        {% set additional_info = additional_info|merge([
+                                                            ('bareme.limitTransfoAbbr.'~(jeuBareme.valueLimitTransformationType))|trans({
+                                                                '%placeholder%': jeuBareme.valueLimitPlaceholder
+                                                            })
+                                                        ]) %}
+                                                    {% endif %}
+
+                                                    {% if additional_info|length > 0 %}
+                                                        <br/>
+                                                        {{ additional_info|join(' — ')|raw }}
+                                                    {% endif %}
+                                                </strong>
+                                            </a>
+                                        </td>
+                                        <td style="text-align:right;">
+                                            {% if is_granted('DOWNLOAD', jeuBareme) %}
+                                                <form style="margin:0" method="POST"
+                                                      action="{{ path('bdoh_admin_jeu_bareme_export', {
+                                                          'jeu-bareme-id': jeuBareme.id,
+                                                          'child-chronicle-name': chronique.__toString,
+                                                          'parent-chronicle-id': chroniqueMere.id
+                                                          }) }}">
+                                                    <input type="submit" class='btn btn-info'
+                                                           value="{{ 'exporter'|trans }}"/>
+                                                </form>
+                                            {% endif %}
+                                        </td>
+                                    </tr>
+                                </table>
+                            </div>
+                            <div class="panel-body panel-collapse collapse" id="{{ jeuBaremeId }}">
+                                <table class="table table-jeux-baremes">
+                                    <thead>
+                                        <tr>
+                                            <th>{{ 'bareme.bareme'|trans }}</th>
+                                            <th class="col-md-4">{{ 'bareme.dateCreation'|trans }} [{{ 'UTC'|trans }}]</th>
+                                            <th class="col-md-3">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+                                            <th class="col-md-3">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        {% for bjb in jeuBareme.baremeJeuBaremes %}
+                                            {% set bareme = bjb.bareme %}
+                                            <tr>
+                                                <td class="col-md-4">{{ bareme.observatoire ? bareme.nom :
+                                                    (('transformation.bareme.baremeTechnique.'~bareme.nom)|trans) }}</td>
+                                                <td class="col-md-3">
+                                                    {% if bareme.observatoire %}
+                                                        {{ bareme.dateCreation|date('transformation.bareme.dateBareme'|trans, false)|raw }}
+                                                    {% else %}
+                                                        &mdash;
+                                                    {% endif %}
+                                                </td>
+                                                <td class="col-md-2">
+                                                    {{ bjb.debutValidite|date('transformation.bareme.dateBareme'|trans, false)|raw }}
+                                                </td>
+                                                <td class="col-md-2">
+                                                    {% if bjb.finValidite %}
+                                                        {{ bjb.finValidite|date('transformation.bareme.dateBareme'|trans, false)|raw }}
+                                                    {% else %}
+                                                        &mdash;
+                                                    {% endif %}
+                                                </td>
+                                            </tr>
+                                        {% endfor %}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    {% endfor %}
+                {% endfor %}
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_export-help.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_export-help.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ab0cda25dfe4dbc0029e89e1d640812dbad8a013
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/_export-help.html.twig
@@ -0,0 +1,17 @@
+<div id="chronique-export-help" class="modal fade" tabindex="-1" role="dialog" style="z-index: 5000">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                <h1 class="modal-title" style="margin-bottom:0;">{{ 'measure.export.help-title'|trans }}</h1>
+            </div>
+            <div class="modal-body">
+                <div class="export-help-content">{{ 'measure.export.help-content'|trans|raw }}</div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn" data-dismiss="modal"
+                        aria-hidden="true">{{ 'close'|trans }}</button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Chronique/show.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/show.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..226aa473943fa286ab599d8c3dd353e38cd39888
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Chronique/show.html.twig
@@ -0,0 +1,354 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+
+{%- from '::macros.html.twig' import submit, reset, button, pageTitle, i18nEntityLabel, loadJsI18N -%}
+{%- import 'IrsteaBdohConsultBundle::macros.html.twig' as macros -%}
+{%- from '::macros.html.twig' import richLink -%}
+
+{%- use 'IrsteaBdohConsultBundle:Viewer:date-range-picker.html.twig' -%}
+
+{% if dateFirst is not empty %}
+    {%- set dateFirst = dateFirst ~ 'Z' -%}
+{%- endif -%}
+{% if dateLast is not empty %}
+    {%- set dateLast = dateLast ~ 'Z' -%}
+{%- endif -%}
+
+{%- set canDownload = dateFirst and dateLast and is_granted('DOWNLOAD', chronique) -%}
+
+{% block viewerDateRangePickerButtons %}
+    {{ parent() }}
+    {% if canDownload %}
+        <button class="graph-export-button btn btn-info validated">
+            <i class="glyphicon glyphicon-download"></i>&nbsp;
+            {{- 'export'|trans -}}
+        </button>
+    {% endif %}
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/chronique.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/chronique.css') }}"/>
+{% endblock %}
+
+{% block title %}
+    {{ pageTitle(('Chronique'|trans)~' '~('open_quote'|trans)~chronique~('close_quote'|trans)) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li><a href="{{ path('bdoh_consult_advancedSearch') }}">{{ 'advancedSearch'|trans }}</a></li>
+        <li>{{ macros.station_view(chronique.station, chronique.station.nom, 'text') }}</li>
+        <li class="active">{{ chronique.code }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+
+    <div id="consult-chronique">
+
+        <div class="toolbox-btns pull-right">
+            {% if is_granted('EDIT', chronique) %}
+                {{ macros.chronique_edit(chronique) }}
+            {% endif %}
+
+            {% if is_granted('REMOVE_DATA', chronique) %}
+                {{ macros.chronique_cut(chronique, dateFirst, dateLast, chroniqueContinue, hasChildren, childrenList, childrenCount, true, 'both') }}
+            {% endif %}
+
+            {% if canDownload %}
+                {{ macros.chroniques_export([chronique], dateFirst, dateLast, exportSamplings, exportTimeSteps, displayStartField, true, 'both') }}
+            {% endif %}
+        </div>
+
+        <h1>{{ 'Chronique' | trans }} <em>{{ 'open_quote'|trans }}{{ chronique }}{{ 'close_quote'|trans }}</em></h1>
+
+        {% if hasActiveJobs and is_granted('JOB_LIST', currentObservatoire()) %}
+            <div class="col-md-24 alert alert-info">
+                {{ 'activeJobsInfo(%jobPageLink%)'|trans({'%jobPageLink%':jobPage})|raw }}
+            </div>
+        {% endif %}
+
+        <div class="row">
+
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i
+                            class="fam-application-view-list"></i> {{ 'identification'|trans }}
+                        </h3>
+                    </div>
+                    <div class="panel-body" id="identification" style="margin-bottom:5px;">
+                        <div class="row">
+
+                            <div class="col-sm-24">
+                                <div class="info-high">
+                                    [ {{ ('chronique.type.' ~ chronique.dtype)|trans }} ]
+                                    {{ macros.chronique_isVisible(chronique) }}
+                                </div>
+                            </div>
+
+                            <div class="col-sm-24 info-high">
+                                <span style="font-size:larger">{{ i18nEntityLabel(chronique, 'libelle') }}</span>
+                            </div>
+
+                            <div class="col-sm-24">
+
+                                <div class="col-sm-12">
+                                    <span class="info-high ">{{ 'station'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {{ macros.station_view(chronique.station, chronique.station.nom, 'text') }}
+                                </div>
+
+                                <div class="col-sm-12">
+                                    <span class="info-high ">{{ 'producteur'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {{ (chronique.producteur.nom is defined) ? macros.advancedSearch_link('producteur', chronique.producteur.nom) : 'none'|trans }}
+                                </div>
+
+                            </div>
+
+                            <div class="col-sm-24">
+
+                                <div class="col-sm-12">
+                                    <span class="info-high ">{{ 'parametre'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {{ macros.advancedSearch_link('parametre', i18nEntityLabel(chronique.parametre, 'nom', '')) }}
+                                </div>
+
+                                <div class="col-sm-12">
+                                    <span class="info-high ">{{ 'unite'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {{ i18nEntityLabel(chronique.unite, 'libelle') | default('none'|trans) }}
+                                </div>
+
+                            </div>
+
+                                {% if is_granted('ROLE_ADMIN') %}
+                                    <div class="col-sm-24">
+
+                                        <div class="col-sm-12">
+                                            <span class="info-high">{{ 'minimumValide'|trans }}{{ 'deux_points'|trans }} </span>
+                                            {{ chronique.minimumValide | default('none'|trans) }}
+                                        </div>
+
+                                        <div class="col-sm-12">
+                                            <span class="info-high">{{ 'maximumValide'|trans }}{{ 'deux_points'|trans }} </span>
+                                            {{ chronique.maximumValide | default('none'|trans) }}
+                                        </div>
+
+                                    </div>
+                                {% endif %}
+
+                            <div class="col-sm-24">
+
+                                <div class="col-sm-12">
+                                    <span class="info-high">{{ 'begin'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {% if dateFirst is empty %}
+                                        {{ 'none'|trans }}
+                                    {% else %}
+                                        {{ dateFirst|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                                    {% endif %}
+                                </div>
+
+                                <div class="col-sm-12">
+                                    <span class="info-high">{{ 'end'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {% if dateLast is empty %}
+                                        {{ 'none'|trans }}
+                                    {% else %}
+                                        {{ dateLast|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                                    {% endif %}
+                                </div>
+
+                            </div>
+
+                            <div class="col-sm-24">
+
+                                <div class="col-sm-12">
+                                    <span class="info-high">{{ 'measuresNumber'|trans }}{{ 'deux_points'|trans }} </span>
+                                    {{ measuresNumber | number_format(0, '', ' ') }}
+                                </div>
+
+                                <div class="col-sm-12">
+                                    {% if checkpointStats is defined and is_granted('CONSULT_CHECKPOINTS', chronique) %}
+                                        <span class="info-high">{{ 'checkpoints'|trans }}
+                                            <sup class="checkpointsInfo" title="{{ 'checkpointsInfo'|trans }}" >(?)</sup>{{ 'deux_points'|trans }} </span>
+                                        {% if checkpointStats.number > 0 %}
+                                            {{ 'checkpointStats(%num%, %first%, %last%)'|transchoice(checkpointStats.number, {
+                                                '%num%': checkpointStats.number,
+                                                '%first%': checkpointStats.first|date('transformation.bareme.dateBareme'|trans, false),
+                                                '%last%': checkpointStats.last|date('transformation.bareme.dateBareme'|trans, false)
+                                            })|raw }}
+                                        {% else %}
+                                            {{ 'none'|trans }}
+                                        {% endif %}
+                                    {% endif %}
+                                </div>
+
+                            </div>
+
+                            {% if chronique.dtype == 'calculee' %}
+                                <div class="col-sm-24">
+                                    <hr/>
+                                    {% if chronique.premiereentree %}
+                                        {% include 'IrsteaBdohConsultBundle:Chronique:_detail-chroniques-meres.html.twig' %}
+                                    {% else %}
+                                        <div class="col-sm-24">
+                                            <em><strong>{{ 'notCalculatedYet'|trans }}</strong></em>
+                                        </div>
+                                    {% endif %}
+                                </div>
+                            {% endif %}
+
+                            {% if chronique.dtype == 'convertie' %}
+                                <div class="col-sm-24">
+                                    <hr/>
+                                    {% if chronique.conversion %}
+                                        {% include 'IrsteaBdohConsultBundle:Chronique:_detail-chronique-mere.html.twig' %}
+                                    {% else %}
+                                        <div class="col-sm-24">
+                                            <em><strong>{{ 'notConvertedYet'|trans }}</strong></em>
+                                        </div>
+                                    {% endif %}
+                                </div>
+                            {% endif %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-book-open"></i> {{ 'genealogie'|trans }}</h3>
+                    </div>
+                    <div class="panel-body" id="genealogy">
+                        <div style="overflow:auto;">
+                            {% autoescape false %}
+                                {{ i18nEntityLabel(chronique, 'genealogie', 'noGenalogy') }}
+                            {% endautoescape %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        {% if fillingRates is not empty %}
+            {% set discontinue = chronique.dtype == 'discontinue' %}
+            {% set panelTitle = chronique.dtype == 'discontinue' ? 'dataCountByMonth' : 'TauxRemplissage' %}
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title"><i class="fam-chart-pie"></i> {{ panelTitle|trans }}
+                    </h3>
+                </div>
+                <div class="panel-body">
+                    <table id="fillingRates" class="table">
+                        <thead>
+                        <tr class="highlight">
+                            <th style="width:110px">{{ 'Year'|trans }} / {{ 'Month'|trans }}</th>
+                            {% for month in ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] %}
+                                <th{% if discontinue|default(false) %} class="discontinue"{% endif %}>{{ month|trans }}</th>
+                            {% endfor %}
+                        </tr>
+                        </thead>
+
+                        <tbody>
+                        {% for year, info in fillingRates %}
+                            <tr>
+                                {%- set startDate = date(year~'-01-01T00:00:00Z', 'UTC') %}
+                                {%- set endDate = date((year+1)~'-01-01T00:00:00Z', 'UTC') %}
+                                <td data-order="{{ year }}">
+                                    {{- macros.display_linkedDatedRate(
+                                        info.totalTaux / info.totalPoids,
+                                        startDate,
+                                        endDate,
+                                        'measures-display',
+                                        year,
+                                        discontinue,
+                                        info.overlap
+                                    ) -}}
+                                </td>
+                                {% for month in 1..12 %}
+                                    {%- set startDate = date(year~'-'~month~'-01T00:00:00Z', 'UTC') %}
+                                    {%- set endDate = date(year~'-'~month~'-01T00:00:00Z', 'UTC')|date_modify("+1 month") %}
+                                    <td>
+                                        {{- macros.display_linkedDatedRate(
+                                            info.month[month].taux|default(null),
+                                            startDate,
+                                            endDate,
+                                            'measures-display',
+                                            '',
+                                            discontinue,
+                                            info.month[month].overlap|default(false)
+                                        ) -}}
+                                    </td>
+                                {% endfor %}
+                            </tr>
+                        {% endfor %}
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        {% endif %}
+
+        {% if dateFirst and dateLast %}
+
+            <div id="measures-display" class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title"><i class="fam-chart-curve"></i> {{ 'displayData'|trans }}</h3>
+                </div>
+                <div class="panel-body">
+
+                    <div id="viewer"
+                        data-chronique-id="{{ chronique.id | e('html_attr') }}"
+                        data-min-date="{{ dateFirst | default(null) | e('html_attr') }}"
+                        data-max-date="{{ dateLast | default(null) | e('html_attr') }}"
+                        data-measure-url="{{ url('bdoh_data_chronique_measures', {id: '-ID-'}) | e('html_attr') }}"
+                    >
+                        {{ block('viewerDateRangePicker') }}
+
+                        <div class="graph-infos" style="display:none;">
+                            <div class="graph-flex">
+                                <div>
+                                    <div class="divTitleDataType" style="font-weight:bold;"></div>
+                                    <div class="form-group divControlPoints" style="display:none;margin-top:5px;">
+                                        <input id="controlPointsId" class="controlPoints" type="checkbox" checked="checked" style="vertical-align:-3px;"/>
+                                        <label for="controlPointsId">{{ 'consult.help.chronique.display-checkpoints'|trans }}
+                                            <sup class="checkpointsInfo" title="{{ 'checkpointsInfo'|trans }}">(?)</sup></label>
+                                    </div>
+                                    <div class="divCheckpointsOnCumulative" style="display:none;margin-top:5px;">
+                                        {{ 'consult.help.chronique.checkpointsOnCumulative'|trans }}
+                                    </div>
+                                    <div class="divDummyFillerCheckpoints" style="display:none;margin-top:5px;">&nbsp;</div>
+                                </div>
+                                <div style="text-align:right;">
+                                    <div>{{ 'consult.help.chronique.double-clic-unzoom'|trans }}</div>
+                                    <div class="divNoticeTimeStep" style="display:none;margin-top:5px;">
+                                        {{ 'consult.help.chronique.time-step-depends-on-span'|trans }}
+                                    </div>
+                                    <div class="divDummyFillerTitle" style="display:none;margin-top:5px;">&nbsp;</div>
+                                </div>
+                            </div>
+                            <div class="divNoticeSubsampled" style="display:none;margin-top:5px;">
+                                <i class="fam-error" style="margin-right:5px;"></i><span
+                                    class="divNoticeSubsampledText" style="font-style:italic;"></span>
+                            </div>
+
+                        </div>
+                        <label style="color: #0e90d2; font-size: 10px" ><br>{{ 'astuceDate'|trans }}</label>
+
+
+                        <div class="graph" style="display:none;"></div>
+                    </div>
+
+                </div>
+
+            </div>
+
+        {% endif %}
+
+    </div>
+
+    {% include 'IrsteaBdohConsultBundle:Chronique:_export-help.html.twig' %}
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Dataset/_chronique-inList.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Dataset/_chronique-inList.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b7308f7bea199610b74696d7a882aa59e69a9c6f
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Dataset/_chronique-inList.html.twig
@@ -0,0 +1,125 @@
+{% import '::macros.html.twig' as app_macros %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+<div class="row">
+    {# Toolbox #}
+    <div class="toolbox-btns pull-right">
+        <div class="toolbox-btns pull-right">
+            {{ macros.station_view(chronique.station) }}
+        </div>
+    </div>
+<br>
+    {# 'Chronique' description #}
+    <div class="col-md-10">
+        <i class="fam-house"></i>
+        <strong>
+            {{ 'station'|trans }} {{ 'open_quote'|trans }}{{ chronique.station.nom }}{{ 'close_quote'|trans }}
+            ({{ chronique.station.code }})
+        </strong>
+        {% if not chronique.station.estActive %}
+            <em>({{ 'notActive'|trans }})</em>
+        {% endif %}
+    </div>
+    <div class="col-md-6">{{ chronique.station.commune }}</div>
+</div>
+<br>
+<div class="row">
+    {# Toolbox #}
+    <div class="toolbox-btns pull-right">
+        {# 'Chronique' is visible ? #}
+        <span class="isvisible">{{ macros.chronique_isVisible(chronique) }}</span>
+        {% if is_granted('CONSULT_TIMESERIES', chronique) %}
+            {{ macros.chronique_view(chronique) }}
+        {% endif %}
+
+        {% if is_granted('EDIT', chronique) %}
+            {{ macros.chronique_edit(chronique) }}
+        {% endif %}
+
+        {# désactivation de l'export de chroniques au niveau de la station pour la première mise en prod TODO #}
+        {% if false and dates.first is defined and dates.last is defined %}
+            {% if is_granted('DOWNLOAD', chronique) %}
+                {{ macros.chroniques_export([chronique], dates.first, dates.last) }}
+            {% endif %}
+        {% endif %}
+    </div>
+
+    {# 'Chronique' description #}
+    <h3>
+        {{ chronique.code }}{{ 'deux_points'|trans }} {{ app_macros.i18nEntityLabel(chronique, 'libelle') }}
+    </h3>
+</div>
+<br>
+
+{# Various information #}
+<div class="row">
+    <div class="col-sm-6">
+        {# Unité #}
+        <div>
+            <div class="col-md-8">{{ 'unite'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">{{ chronique.unite.libelle | default('') }}</div>
+        </div>
+
+        {# Type of 'chronique' #}
+        <div>
+            <div class="col-md-8">{{ 'type'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">{{ ('type.' ~ chronique.dtype)|trans }}</div>
+        </div>
+    </div>
+
+    <div class="col-sm-6">
+        {# First date #}
+        <div>
+            <div class="col-md-8">{{ 'begin'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if dates.first is defined %}
+                    {{ dates.first|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+
+        {# Last date #}
+        <div>
+            <div class="col-md-8">{{ 'end'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if dates.last is defined %}
+                    {{ dates.last|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+    </div>
+
+    {% if is_granted('ROLE_ADMIN') %}
+        <div class="col-sm-6">
+            {# Minimum valide #}
+            <div>
+                <div class="col-md-12">{{ 'minimumValide'|trans }}{{ 'deux_points'|trans }}</div>
+                <div class="col-md-12 info-high">{{ chronique.minimumValide | default('none'|trans) }}</div>
+            </div>
+
+            {# Maximum valide #}
+            <div>
+                <div class="col-md-12">{{ 'maximumValide'|trans }}{{ 'deux_points'|trans }}</div>
+                <div class="col-md-12 info-high">{{ chronique.maximumValide | default('none'|trans) }}</div>
+            </div>
+        </div>
+    {% endif %}
+
+    <div class="col-sm-6">
+        {# Producteur #}
+        <div>
+            <div class="col-md-16">{{ 'producteur'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if chronique.producteur.nom is defined %}
+                    {{ macros.advancedSearch_link('producteur', chronique.producteur.nom) }}
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+    </div>
+</div>
+{# END_Various information #}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Dataset/show.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Dataset/show.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4f9e8f74d955497ca0bc200a561eda9fc4b98ccb
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Dataset/show.html.twig
@@ -0,0 +1,360 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% import '::macros.html.twig' as app_macros %}
+{% from 'IrsteaBdohConsultBundle::macros.html.twig' import advancedSearch_link%}
+{% from '::macros.html.twig' import i18nEntityLabel %}
+
+
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/station.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/station.css') }}"/>
+{% endblock %}
+
+{# Build the families / types / times series boxes #}
+{% macro familyTreeDataset(familyTable, families, chroniquesByParam, dates) %}
+    {% import _self as self %}
+    {% for family in families %}
+        <div class="panel panel-default panel-famille">
+            {% set idGroupFamille = 'famille-' ~ family %}
+            {# Family Header #}
+            <div class="panel-heading">
+                <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroupFamille }}">
+                    <h3 class="panel-title">
+                        <b class="caret"></b>
+                        <i class="fam-bricks"></i>
+                        {{ familyTable[family]['nom'] }}
+                    </h3>
+                </a>
+            </div>
+            {# Family content (sub-family and/or types) #}
+            <div id="{{ idGroupFamille }}" class="panel-collapse collapse in">
+                <div class="panel-body">
+                    {{ self.familyTreeDataset(familyTable, familyTable[family]['children'], chroniquesByParam, dates) }}
+                    {% for parameter in familyTable[family]['types'] %}
+                        {% set chroniques = chroniquesByParam[parameter] %}
+                        <div class="panel panel-default panel-param">
+                            {% set idGroup = 'param-' ~ family ~ '-' ~ loop.index %}
+                            {# Type Header #}
+                            <div class="panel-heading">
+                                <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroup }}">
+                                    <h3 class="panel-title">
+                                        <b class="caret"></b>
+                                        <i class="fam-brick"></i>
+                                        {{ parameter }}
+                                        <small> &nbsp;&nbsp;&#8210;&nbsp;&nbsp; {{ chroniques|length }} {{ 'chronique(s)'|transchoice(chroniques|length)|lower }}</small>
+                                    </h3>
+                                </a>
+                            </div>
+                            {# 'Chroniques' list for the current 'TypeParametre' #}
+                            <div id="{{ idGroup }}" class="panel-collapse collapse in">
+                                <div class="panel-body">
+                                    {% for chronique in chroniques %}
+                                        <div class="{{ loop.index0 is even ? 'even' : 'odd' }}">
+                                            {% include 'IrsteaBdohConsultBundle:Dataset:_chronique-inList.html.twig'
+                                                with {'dates': dates[chronique.id] | default('')} %}
+                                        </div>
+                                    {% endfor %}
+                                </div>
+                            </div>
+                        </div>
+                    {% endfor %}
+                </div>
+            </div>
+        </div>
+    {% endfor %}
+{% endmacro %}
+
+{% import _self as selfmacros %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Advanced search #}
+        <li><a href="{{ path('bdoh_consult_advancedSearch') }}">{{ 'advancedSearch'|trans }}</a></li>
+        {# Station #}
+        <li class="active">{{ dataset.titre }}</li>
+    </ul>
+{% endblock %}
+
+{% block title %}
+    {{ app_macros.pageTitle(('dataset'|trans)~' '~('open_quote'|trans)~dataset.titre~('close_quote'|trans)) }}
+{% endblock %}
+
+{% block main %}
+    <div id="consult-dataset">
+
+        <!-- One "Terms of Uses" modal for all export modal -->
+        {% include 'IrsteaBdohConsultBundle:Modal:terms-of-uses.html.twig' %}
+
+        <!-- 'Help' window for time series export -->
+        {% include 'IrsteaBdohConsultBundle:Chronique:_export-help.html.twig' %}
+
+        <!-- Toolbox for 'station' -->
+        <div class="toolbox-btns pull-right">
+            {% if is_granted('EDIT', dataset) %}
+                {{ macros.dataset_edit(dataset) }}
+            {% endif %}
+
+            {# désactivation de l'export de chroniques au niveau de la station pour la première mise en prod TODO #}
+            {% if false and datasetFirstDate and datasetLastDate and is_granted('DOWNLOAD', dataset) %}
+                {{ macros.chroniques_export(chroniquesHavingMeasures, datasetFirstDate, datasetLastDate, null, null, null, false, 'both') }}
+            {% endif %}
+        </div>
+        {% from '::macros.html.twig' import i18nEntityLabel %}
+        <!-- Title -->
+        <h1>{{ 'dataSet' | trans }} <em>{{ 'open_quote'|trans }}{{ i18nEntityLabel(dataset, 'titre', 'noDescription') }}{{ 'close_quote'|trans }}</em></h1>
+
+        <!-- First section : identification / map -->
+        <div class="row">
+
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-information"></i> {{ 'info'|trans }}
+                        </h3>
+                    </div>
+                    <div class="panel-body" id="identification">
+
+                        <div class="row">
+
+                            <div class="col-sm-24">
+
+                                <!-- Titre -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'titre'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ i18nEntityLabel(dataset, 'titre', 'noDescription') }}</div>
+                                </div>
+
+                                <!-- Description -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'description'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ i18nEntityLabel(dataset, 'description', 'noDescription') }}</div>
+                                </div>
+
+                                <!-- Généalogie -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'genealogie'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ i18nEntityLabel(dataset, 'genealogie', 'noDescription') }}</div>
+                                </div>
+
+                                <!-- DataCOnstraints -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'dataConstraint'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ dataset.dataConstraint }}</div>
+                                </div>
+
+                                <!-- doi  -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'doi'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ dataset.doi | default('none'|trans) }}</div>
+                                </div>
+
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'stations'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">
+                                        <ul>
+                                            {% set newArray = [] %}
+                                            {% for chroniques in dataset.chroniques %}
+                                                {% if chroniques.station not in newArray %}
+                                                <li>
+                                                    {{ macros.station_view(chroniques.station, chroniques.station.nom, 'text') }}
+                                                </li>
+
+                                                    {% set newArray = newArray|merge([chroniques.station]) %}
+                                                {% endif %}
+                                            {% endfor %}
+                                        </ul>
+                                    </div>
+                                </div>
+
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'SiteExperimental'|trans({}, 'entitiesPlurals') }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">
+                                        <ul>
+                                            {% set newArray = [] %}
+                                            {% for chroniques in dataset.chroniques %}
+                                                {% for sites in chroniques.station.sites %}
+                                                    {% if sites not in newArray %}
+                                            <li><strong>{{ macros.advancedSearch_link('site', sites.nom) }}</strong> {{ 'deux_points'|trans }} {{ sites.description }}</li>
+
+
+                                                        {% set newArray = newArray|merge([sites]) %}
+                                                    {% endif %}
+                                                {% endfor %}
+
+                                            {% endfor %}
+                                        </ul>
+                                    </div>
+                                </div>
+
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!-- END_Identification box -->
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-user-green"></i> {{ 'contact'|trans }}</h3>
+                    </div>
+                    <div class="panel-body" id="comment">
+                        <!-- principalInvestigator -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'principalInvestigators'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% for principalInvestigator in dataset.principalInvestigators %}
+                                        <li><strong>{{ principalInvestigator }}</strong></li>
+                                    {% endfor %}
+                                </ul>
+                            </div>
+                        </div>
+                        <!-- dataManager -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'dataManagers'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% if dataset.dataManagers is empty %}
+                                        {{ 'none'|trans }}
+                                    {% else %}
+                                        {% for dataManager in dataset.dataManagers %}
+                                            <li>{{ dataManager }} </li>
+                                        {% endfor %}
+                                    {% endif %}
+                                </ul>
+                            </div>
+                        </div>
+                        <!-- projectMember -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'projectMembers'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% if dataset.projectMembers is empty %}
+                                        {{ 'none'|trans }}
+                                    {% else %}
+                                        {% for projectMember in dataset.projectMembers %}
+                                            <li>{{ projectMember }} </li>
+                                        {% endfor %}
+                                    {% endif %}
+                                </ul>
+                            </div>
+                        </div>
+                        <!-- dataCollector -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'dataCollectors'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% if dataset.dataCollectors is empty %}
+                                        {{ 'none'|trans }}
+                                    {% else %}
+                                        {% for dataCollector in dataset.dataCollectors %}
+                                            <li>{{ dataCollector }} </li>
+                                        {% endfor %}
+                                    {% endif %}
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-book-open"></i> {{ 'keywords'|trans }}</h3>
+                    </div>
+                    <div class="panel-body" id="comment">
+                        <!-- portailSearchCriteriaGeology -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'portailSearchCriteriaGeology'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% for portailSearchCriteriaGeology in dataset.portailSearchCriteriaGeology %}
+                                        <li>{{ portailSearchCriteriaGeology }} </li>
+                                    {% endfor %}
+                                </ul>
+                            </div>
+                        </div>
+
+                        <!-- portailSearchCriteriaClimat -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'portailSearchCriteriaClimat'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% for portailSearchCriteriaClimat in dataset.portailSearchCriteriaClimat %}
+                                        <li>{{ portailSearchCriteriaClimat }} </li>
+                                    {% endfor %}
+                                </ul>
+                            </div>
+                        </div>
+
+                        <!-- themeInpire  -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'inspireTheme'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    <li>{{ dataset.inspireTheme | default('none'|trans) }}</li>
+                                </ul>
+                            </div>
+                        </div>
+
+                        <!-- topicCat  -->
+                        <div class="row">
+                            <div class="info-high col-sm-12">{{ 'topicCategories'|trans }}{{ 'deux_points'|trans }}</div>
+                            <div class="span col-sm-12">
+                                <ul>
+                                    {% for topicCat in dataset.topicCategories %}
+                                        <li>{{ topicCat }} </li>
+                                    {% endfor %}
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <!-- END_First section : identification / map -->
+
+        <!-- 'Chroniques' list -->
+        {# les types sans famille pour la transition vers les familles de paramètres #}
+        {% for parameter, chroniques in chroniquesByParam %}
+            {% if parameter in typesWithoutFamily %}
+                <div class="panel panel-default panel-param">
+                    {% set idGroup = 'param-0-' ~ loop.index %}
+                    {# Type Header #}
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroup }}">
+                            <h3 class="panel-title">
+                                <b class="caret"></b>
+                                <i class="fam-brick"></i>
+                                {{ parameter }}
+                                <small> &nbsp;&nbsp;&#8210;&nbsp;&nbsp; {{ chroniques|length }} {{ 'chronique(s)'|transchoice(chroniques|length)|lower }}</small>
+                            </h3>
+                        </a>
+                    </div>
+                    {# 'Chroniques' list for the current 'TypeParametre' #}
+                    <div id="{{ idGroup }}" class="panel-collapse collapse in">
+                        <div class="panel-body">
+                            {% for chronique in chroniques %}
+                                <div class="{{ loop.index0 is even ? 'even' : 'odd' }}">
+                                    {% include 'IrsteaBdohConsultBundle:Dataset:_chronique-inList.html.twig'
+                                        with {'dates': dates[chronique.id] | default('')} %}
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+        {% endfor %}
+        {# les types dans des familles #}
+        {{ selfmacros.familyTreeDataset(familyTable, rootFamilies, chroniquesByParam, dates) }}
+        <!-- END_'Chronique' list -->
+
+    </div>
+    <!-- END_consult-station -->
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/JsonValidator/report.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/JsonValidator/report.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..041d961c74c931a59ae663bf8590cf4adeeaf16b
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/JsonValidator/report.html.twig
@@ -0,0 +1,64 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit%}
+
+{% block main %}
+
+    {% if is_granted('ROLE_ADMIN') %}
+    <h2>{{ 'admin.sendJson.result'|trans }}</h2>
+    {% if result.valid %}
+        <p style="color:#44bb01; font-size: 20px">{{ 'admin.sendJson.resultMessage'|trans }}</p>
+        <button type="button" class="btn btn-success">
+            <a href="{{ path('bdoh_admin_observatoire_edit_envoieJson', {'id' :app.request.attributes.get('_route_params')['id']}) }}" style="color: mintcream">
+                <strong>{{ 'admin.sendJson.send'|trans }}</strong></a></button>
+
+    {% if miseajourAutomatique == false and is_granted('ROLE_ADMIN')%}
+        <br><br>
+<form class="form-horizontal" name="main" action="{{ path('bdoh_admin_observatoire_save_miseajour', {'id' :app.request.attributes.get('_route_params')['id']}) }}"
+      method="post" enctype="multipart/form-data" id="miseajourAutomatiqueId">
+            <fieldset>
+                <input id="miseajourAutomatiqueId" name="miseajourAutomatique" value="miseajourAutomatique" type="checkbox" >
+                <label>{{ 'admin.sendJson.saveMessage'|trans }}</label>
+                <br>
+            </fieldset>
+
+        {#  attribution des role pour le bouton#}
+
+        <button type="submit" class="btn btn-success" >
+            <strong>{{ 'admin.sendJson.save'|trans }}</strong></button>
+    {% endif %}
+
+
+        </form>
+    {% else %}
+        <p style="color:#bb0117; font-size: 20px">{{ 'admin.sendJson.resultMessageFail'|trans }}</p>
+        <p>{{ result.totalErrors }} erreur(s) de validation. Voici les {{ result.errors | length }} premières:</p>
+        <table>
+            <thead>
+                <th>Type</th>
+                <th>Chemin</th>
+                <th>Valeur</th>
+                <th>Détails</th>
+                <th>Sous-erreurs</th>
+            </thead>
+            <tbody>
+            {% for error in result.errors %}
+                <tr>
+                    <td>{{ error.keyword }}</td>
+                    <td><code>{{ error.dataPointer | join('.') }}</code></td>
+                    <td><code>{{ error.data | json_encode }}</code></td>
+                    <td><code>{{ error.keywordArgs | json_encode }}</code></td>
+                </tr>
+            {% endfor %}
+            </tbody>
+        </table>
+        </ul>
+    {% endif %}
+    <br><br>
+    <h2>{{ 'admin.sendJson.schema'|trans }}</h2>
+    <li><a href="{{ schemas }}">{{ schemas }}</a></li>
+    <br><br>
+    <h2>JSON</h2>
+    <div><code><pre>{{ json }}</pre></code></div>
+    {% endif %}
+{% endblock %}
+
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Mail/export.txt.twig b/src/Irstea/BdohConsultBundle/Resources/views/Mail/export.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1ace064ff292d7235f1c0059a0c2ae66d06345b0
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Mail/export.txt.twig
@@ -0,0 +1,2 @@
+{{ 'export.exportMail.body'|trans }}
+{{ 'export.exportMail.footer'|trans }}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Modal/_date-range-selector.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Modal/_date-range-selector.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5b930dcd80c6cb7911cb11f1392ef5136fa30548
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Modal/_date-range-selector.html.twig
@@ -0,0 +1,24 @@
+<!-- The date range -->
+<div class="form-group row daterangeselector">
+    <input name="beginDate" type="hidden" required/>
+    <input name="endDate" type="hidden" required/>
+    <div class="col-md-6">
+        <label for="{{ modalId }}dateRange">{{ 'period'|trans }}</label>
+    </div>
+
+    <div class="col-md-18 daterange">
+        <div class="input-group">
+            <input required id="{{ modalId }}dateRange" type="text" class="form-control start" data-alt-input="beginDate"/>
+        </div>
+        <div class="input-group">
+            <input required type="text" class="form-control end" data-alt-input="endDate"/>
+        </div>
+    </div>
+
+    <div class="col-md-24 has-error">
+        <div class="col-md-6"></div>
+        <div class="error-report help-block col-md-18" style="margin-bottom:0;">
+            <div class="errors"></div>
+        </div>
+    </div>
+</div>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Modal/cut.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Modal/cut.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c4e9a82be054666cc7cc105d958cb46b8c2b189d
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Modal/cut.html.twig
@@ -0,0 +1,64 @@
+{% from '::macros.html.twig' import submit, richLink %}
+
+{% if dateFirst is empty or dateLast is empty %}
+{% else %}
+    {% set modalId  = 'empty-' ~ random() %}
+
+    {{ richLink('#', 'emptyChronique', 'cut-red', null, null, 'data-toggle="modal" data-target="#'~modalId~'"') }}
+
+<div id="{{ modalId }}" class="modal fade cut-modal" tabindex="-1" role="dialog" aria-hidden="true"
+     data-cut-modal="true"
+     data-debut="{{ (dateFirst is defined ? dateFirst|date('c', 'UTC') : '') | e('html_attr') }}"
+     data-fin="{{ (dateLast is defined ? dateLast|date('c', 'UTC') : '') | e('html_attr') }}"
+>
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
+                        aria-hidden="true">&times;</span></button>
+                <h1 class="modal-title" style="margin-bottom:0;">{{ 'emptyChronique'|trans }}</h1>
+            </div>
+
+            <form class="form-horizontal" method="POST"
+                  action="{{ path('bdoh_empty_chronique', {'station': chronique.station.code, 'chronique': chronique.code}) }}">
+
+                <div class="modal-body">
+                    {% include 'IrsteaBdohConsultBundle:Modal:_date-range-selector.html.twig' %}
+
+                    <div>
+                        <div class="col-md-24 alert alert-info">
+                            <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+                            {% if chroniqueContinue %}
+                                {{ 'emptyChroniqueContinueInfo'|trans|raw }}
+                            {% else %}
+                                {{ 'emptyChroniqueDiscontinueInfo'|trans|raw }}
+                            {% endif %}
+                        </div>
+                    </div>
+
+                    {% if hasChildren %}
+                        <div class="form-group row" style="margin-bottom:0;">
+                            <div class="col-md-24">
+                                <input id="{{ modalId }}_propagateid" name="propagate" value="propagate" type="checkbox" checked="checked" style="vertical-align:-3px;">
+                                <label for="{{ modalId }}_propagateid">
+                                    {{ 'measure.import.question.computeChildren'|transchoice(childrenCount) }}
+                                    <i class="childrenHelp fam-help" data-original-title="{{ 'measure.import.help.children'|transchoice(childrenCount) }}"
+                                       data-content="{{ childrenList }}" style="vertical-align:-3px;"></i>
+                                </label>
+                            </div>
+                        </div>
+                    {% endif %}
+                </div>
+
+                <div class="modal-footer" style="clear:both;">
+                    <img src="{{ asset('/images/loader.gif') }}" class="loader hide" style="margin-right:20px;"/>
+                    {{ submit('doEmpty'|trans) }}
+                    <button type="button" class="btn" data-dismiss="modal"
+                            aria-hidden="true">{{ 'close'|trans }}</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+{% endif %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Modal/export.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Modal/export.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e0d2f8757216c3e573c073f9ac096341cf1c4a77
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Modal/export.html.twig
@@ -0,0 +1,228 @@
+{% from '::macros.html.twig' import submit, richLink %}
+
+{% set modalId     = 'export-' ~ random() %}
+{% set exportTitle = 'measure.export.title'|transchoice(chroniques|length) %}
+{% set nbChroniques = chroniques|length %}
+{% set allowVigilance = false %}
+{% set hasWithValueLimits = false %}
+{% set hasDiscontChronique = false %}
+{% for chronique in chroniques %}
+    {% set hasDiscontChronique = hasDiscontChronique or not chronique.continue %}
+    {% set allowVigilance = allowVigilance and chronique.station.oneCodeAlternatif('vigilance') %}
+    {% set hasWithValueLimits = hasWithValueLimits or chronique.allowValueLimits %}
+{% endfor %}
+
+{% if hasDiscontChronique or hasWithValueLimits %}
+    {% set allowedExportFormats = ['Bdoh'] %}
+{% else %}
+    {% set allowedExportFormats = ['Bdoh', 'Qtvar'] %}
+    {% if allowVigilance %}
+        {% set allowedExportFormats = allowedExportFormats|merge(['Vigilance']) %}
+    {% endif %}
+{% endif %}
+
+{% if termsOfUses is defined %}
+    {% include 'IrsteaBdohConsultBundle:Modal:terms-of-uses.html.twig' %}
+{% endif %}
+
+<!-- Link which triggers the modal for export -->
+{{ richLink('#', exportTitle, 'database-save', display, tooltip_placement, 'data-toggle="modal" data-target="#'~ modalId ~'"') }}
+
+<!-- The modal for export -->
+<div id="{{ modalId }}" data-export-modal="true"
+    {%- if dateFirst is defined %}
+        data-min-date="{{ dateFirst | date('c', 'UTC') | e('html_attr') }}"
+    {%- endif %}
+    {%- if dateLast is defined %}
+        data-max-date="{{ dateLast | date('c', 'UTC') | e('html_attr') }}"
+    {%- endif %}
+     class="modal fade export-modal" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+
+            <!-- Modal header -->
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
+                        aria-hidden="true">&times;</span></button>
+                <a class="btn pull-right" data-toggle="modal" href="#chronique-export-help">
+                    {{ 'measure.export.help'|trans }}
+                </a>
+                <h1 class="modal-title" style="margin-bottom:0;">{{ exportTitle }}</h1>
+            </div>
+
+            <!-- Form allowing to export 'chroniques' data -->
+            <form method="POST" action="{{ path('bdoh_data_measure_export') }}">
+
+                <!-- Modal body -->
+                <div class="modal-body">
+                    {% include 'IrsteaBdohConsultBundle:Modal:_date-range-selector.html.twig' %}
+
+                    <!-- Format -->
+                    <div class="form-group row">
+                        <div class="col-md-6">
+                            <label class="control-label" for="{{ modalId }}format">{{ 'format'|trans }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <select id="{{ modalId }}format" name="exportFormat" class="form-control">
+                                {% for format in allowedExportFormats %}
+                                    <option value="{{ format }}">
+                                        {{ ('export.'~format)|trans }}
+                                    </option>
+                                {% endfor %}
+                            </select>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                    <!-- Sampling at export -->
+                    <div class="form-group row">
+                        <div class="col-md-6">
+                            <label class="control-label" for="{{ modalId }}exportType">{{ 'exportTypeShort'|trans }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <select id="{{ modalId }}exportType" name="exportType" class="form-control"
+                                {%- if not exportSamplings %} readonly="true"{% endif -%}
+                            >
+                                <option value="identical" selected="selected">{{ 'identical'|trans }}</option>
+                                {% if exportSamplings -%}
+                                    {% for exportKey, sampling in exportSamplings -%}
+                                        <option value="{{ exportKey }}">{{ sampling.label }}</option>
+                                    {% endfor -%}
+                                {% endif -%}
+                            </select>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                    <!-- Time step for instantaneous sampling at regular time step -->
+                    <div class="form-group row time-step" style="display:none;">
+                        <div class="col-md-6">
+                            <label class="control-label" for="{{ modalId }}instant-step">{{ 'step'|trans }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <div class="input-group">
+                                <input name="instantStep" type="number" value="5" min="1" max="1440"
+                                       class="form-control"
+                                       id="{{ modalId }}instant-step"/>
+                                <span class="input-group-addon">{{ 'minutes'|trans }}</span>
+                            </div>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                    <!-- Time step for mean/cumulative sampling at regular time step -->
+                    <div class="form-group row time-step" style="display:none;">
+                        <div class="col-md-6">
+                            <label class="control-label" for="{{ modalId }}mean-cumul-step">{{ 'step'|trans }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <select name="meanCumulStep" class="form-control" id="{{ modalId }}mean-cumul-step">
+                                {% if exportTimeSteps %}
+                                    {% for key, ets in exportTimeSteps %}
+                                        <option value="{{ key }}" data-time-step="{{ ets.approxSeconds }}">
+                                            {{ ets.label }}
+                                        </option>
+                                    {% endfor %}
+                                {% endif %}
+                            </select>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                    <!-- Timezone -->
+                    <div class="form-group row">
+                        <div class="col-md-6">
+                            <label class="control-label" for="{{ modalId }}timezone">{{ 'timezone'|trans }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <div class="input-group">
+                                <span class="input-group-addon">UTC</span>
+
+                                <select name="timezone" class="form-control" id="{{ modalId }}timezone">
+                                    {% for hour in 0..12 %}
+                                        <option value="{{ hour }}" {{ loop.first ? 'selected' : '' }}>+{{ "%02d"|format(hour) }}</option>
+                                    {% endfor %}
+                                    {% for hour in 1..12 %}
+                                        <option value="-{{ hour }}">&minus;{{ "%02d"|format(hour) }}</option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+                            <div style="margin-top:0.5em">
+                                <span>{{ 'downloadedRangeInTimezone'|trans }}</span>
+                                <span class="range-in-timezone"></span>
+                            </div>
+                        </div>
+                    </div>
+
+                    <!-- List of chroniques -->
+                    <div class="form-group row" style="margin-bottom:0;">
+                        <div class="col-md-6">
+                            <label class="control-label"
+                                   for="{{ modalId }}chroniques">{{ 'chronique(s)'|transchoice(chroniques|length) }}</label>
+                        </div>
+
+                        <div class="col-md-18">
+                            <select name="chroniques[]" class="form-control" id="{{ modalId }}chroniques" multiple>
+                                {% for chronique in chroniques %}
+                                    <option value="{{ chronique.id }}" selected>{{ chronique }}</option>
+                                {% endfor %}
+                            </select>
+                            <div class="error-report help-block" style="margin-bottom:0;">
+                                <div class="errors"></div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END_Modal body -->
+
+                <!-- Modal footer -->
+                <div class="modal-footer">
+                    <!-- Link which triggers the modal for Terms of Uses -->
+                    <div class="pull-left form-group" style="text-align:left;">
+                        <div>
+                            <input id="{{ modalId }}_termsofuseid" type="checkbox" name="termsOfUses" value="agreed" required="required"
+                                {%- if is_granted('ROLE_ADMIN') %} checked="checked"{% endif %}
+                                   style="vertical-align:-3px;">
+                            <label for="{{ modalId }}_termsofuseid" style="margin-bottom:0;">{{ 'IAgreeWith'|trans }}
+                                <a href="{{ path('bdoh_data_observatoire_conditions_export') }}">{{ 'TermsOfUses(the)'|trans }}</a>.
+                            </label>
+                        </div>
+                        <div class="error-report help-block" style="margin-top:0;margin-bottom:0;">
+                            <div class="errors"></div>
+                        </div>
+                    </div>
+
+                    <!-- Submit and close buttons -->
+                    {{ submit('export'|trans) }}
+                    <button type="button" class="btn" data-dismiss="modal"
+                            aria-hidden="true">{{ 'close'|trans }}</button>
+                </div>
+
+            </form>
+            <!-- END_Form allowing to export 'chroniques' data -->
+
+        </div>
+    </div>
+</div>
+
+<!-- END_The modal for export -->
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Modal/terms-of-uses.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Modal/terms-of-uses.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a229ab80cfa0cfd6fa43b3204620bdb09934ec87
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Modal/terms-of-uses.html.twig
@@ -0,0 +1,28 @@
+{% from '::macros.html.twig' import submit %}
+
+<!-- The modal for Terms Of Uses -->
+<div class="modal hide fade" id="TermsOfUses" tabindex="-1" role="dialog" aria-hidden="true"
+     data-width="800px" data-max-height="500px">
+
+    <!-- Modal header -->
+    <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h1>
+            {{ 'TermsOfUses'|trans }}<br/>
+            <small>{{ 'Observatoire'|trans }} {{ 'open_quote'|trans }}{{ currentObservatoire() }}{{ 'close_quote'|trans }}</small>
+        </h1>
+    </div>
+
+    <!-- Modal body -->
+    <div class="modal-body">
+        {{ currentObservatoire().conditionsUtilisation | default('TermsOfUses.none'|trans) | raw }}
+    </div>
+    <!-- END_Modal body -->
+
+    <!-- Modal footer -->
+    <div class="modal-footer">
+        <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">{{ 'close'|trans }}</button>
+    </div>
+
+</div>
+<!-- END_The modal for Terms Of Uses -->
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/advancedSearch.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/advancedSearch.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..556dcee0902a66b51eb4a4b47566903569142406
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/advancedSearch.html.twig
@@ -0,0 +1,382 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% from '::macros.html.twig' import pageTitle, i18nEntityLabel, attachTooltip %}
+
+{% macro dateField(date) %}
+    {%- if date %}
+        {%- set ts = date|date('U', false) %}
+        <td data-type="num" data-order="{{ ts }}" data-search="{{ ts }}"> {{ date|date('formatDate'|trans, false) }}</td>
+    {%- else %}
+        <td data-order="0" data-search="">-</td>
+    {%- endif %}
+{%- endmacro %}
+
+{% macro textField(value, defaultLabel) %}
+    <td>{{ value | default(defaultLabel | default('none') | trans) }}</td>
+{% endmacro %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/advanced-search.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/advanced-search.css') }}" />
+    <style type="text/css">
+        #main-table.table tr.group{
+            padding:0;
+        }
+        #main-table.table tr.group td div.row{
+            margin:0;
+        }
+        #main-table.table tr.group td div.row > div:first-of-type{
+            padding-left:0;
+        }
+        #main-table.table tr.group td div.row div.toolbox-btns.pull-right{
+            margin:-5px 1px -5px 0;
+            background:transparent;
+        }
+        #main-table.table tr td div.toolbox-btns.pull-right{
+            background:transparent;
+            margin-top:-5px;
+            margin-bottom:-7px;
+        }
+        #main-table.table tr td div.toolbox-btns.pull-right span.isvisible{
+            display:inline-block;
+            padding:6px 0;
+            margin:0;
+            border:0;
+            font-size:11px;
+            line-height:1;
+            vertical-align:top;
+        }
+        a.tooltipCommentaire{
+            cursor:default;
+            text-decoration:none;
+        }
+        #main-table div.tooltip-inner{
+            max-width:270px;
+        }
+    </style>
+{% endblock %}
+
+{% block title %}
+    {{ pageTitle('advancedSearch'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'advancedSearch'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    {% from _self import dateField, textField %}
+    <div id="consult-advancedSearch">
+
+        <h1>{{ 'complexViewer'|trans }}</h1>
+        <h2>
+            <i class="fam-chart-curve"></i>
+            <a href="{{ path('bdoh_consult_complexViewer') }}">{{ 'TextLinkToCV'|trans|raw }}</a>
+        </h2>
+        <br/>
+
+        <h1>{{ 'advancedSearch'|trans }}</h1>
+
+        <div class="async">
+            <div class="waiting"><span class="glyphicon glyphicon-hourglass"></span></div>
+            <div class="result">
+                <fieldset class="box">
+                    <legend>{{ 'searchPeriod'|trans }}</legend>
+
+                    <div class="row form-inline">
+                        <div id="filter-date-range" class="form-group">
+                            <label>{{ 'displayOnlyInPeriod'|trans }}</label>
+
+                            <div class="input-group">
+                                <span class="input-group-addon">{{ 'from'|trans }}</span>
+                                <input class="form-control start" data-set-buttons="false"/>
+                            </div>
+
+                            <div class="input-group">
+                                <span class="input-group-addon">{{ 'to'|trans }}</span>
+                                <input class="form-control end" data-set-buttons="false"/>
+                            </div>
+
+                            <label style="color: #0e90d2; font-size: 10px" ><br>{{ 'astuceDate'|trans }}</label>
+                        </div>
+                    </div>
+                </fieldset>
+
+                <fieldset id="column-filters" class="box">
+
+                    <div class="row form-inline" style="margin-bottom:5px">
+
+                        <div class="form-group col-md-5">
+                            {# N.B. : le style="width:100%" est obligatoire pour être pris en compte par select2 #}
+                            <select id="station-filter" name="station"
+                                    data-placeholder="{{ 'advancedSearch.stations'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-4">
+                            <select id="active-station-filter" name="estActive"
+                                    data-placeholder="{{ 'advancedSearch.enActivite'|trans }}"
+                                    class="column-filter form-control" style="width:100%">
+                                <option value="" selected>-</option>
+                                <option>{% trans %}yes{% endtrans %}</option>
+                                <option>{% trans %}no{% endtrans %}</option>
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="commune-filter" name="commune"
+                                    data-placeholder="{{ 'advancedSearch.communes'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="sites-filter" name="site"
+                                    data-placeholder="{{ 'advancedSearch.sites'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="producteur-filter" name="producteur"
+                                    data-placeholder="{{ 'advancedSearch.producteurs'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                    </div>
+                    <div class="row form-inline" style="margin-bottom:5px">
+
+                        <div class="form-group col-md-5">
+                            <select id="famille-filter" name="famille"
+                                    data-placeholder="{{ 'advancedSearch.famillesParametres'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="parametersStudied-filter" name="parametre"
+                                    data-placeholder="{{ 'advancedSearch.typesParametres'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-4">
+                            <select id="type-filter" name="type"
+                                    data-placeholder="{{ 'advancedSearch.typesChroniques'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="onBassin-filter" name="bassin"
+                                    data-placeholder="{{ 'advancedSearch.bassins'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                        <div class="form-group col-md-5">
+                            <select id="onCoursEau-filter" name="coursEau"
+                                    data-placeholder="{{ 'advancedSearch.courseau'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                    </div>
+                    <div class="row form-inline" style="margin-bottom:5px">
+
+                        <div class="form-group col-md-24">
+                            <select id="dataset-filter" name="dataset"
+                                    data-placeholder="{{ 'advancedSearch.dataset'|trans }}"
+                                    class="column-filter form-control" multiple style="width:100%">
+                            </select>
+                        </div>
+
+                    </div>
+
+
+                </fieldset>
+
+                <table id="main-table" class="table" data-group-by="0" style="width:100%">
+                    <!-- Columns header -->
+                    <thead>
+                    <tr>
+                        {# colonne 0 la station #}
+                        <th data-group-order="17">
+                            {{ 'station'|trans }}
+                        </th>
+                        {# colonne 1 #}
+                        <th data-visible="false" data-filter-with="#active-station-filter">
+                            {{ 'station.estActive'|trans }}
+                        </th>
+                        {# colonne 2 #}
+                        <th data-visible="false"  data-filter-with="#commune-filter">>
+                            {{ 'commune'|trans }}
+                        </th>
+                        {# colonne 3 #}
+                        <th data-visible="false" data-filter-with="#sites-filter" data-value-separator="##">
+                            {{ 'sites'|trans }}
+                        </th>
+                        {# colonne 4 #}
+                        <th class="col-md-3">
+                            {{ 'chronique.code'|trans }}
+                        </th>
+                        {# colonne 5 #}
+                        <th data-visible="false" data-filter-with="#famille-filter" data-value-separator="##">
+                            {{ 'FamilleParametres'|trans }}
+                        </th>
+                        {# colonne 6 #}
+                        <th class="col-md-5" data-filter-with="#parametersStudied-filter">
+                            {{ 'parametersStudied'|trans }}
+                        </th>
+                        {# colonne 7 #}
+                        <th>
+                            {{ 'unite'|trans }}
+                        </th>
+                        {# colonne 8 #}
+                        <th data-filter-with="#producteur-filter">
+                            {{ 'producteur'|trans }}
+                        </th>
+                        {# colonne 9 #}
+                        <th data-filter-with="#type-filter">
+                            {{ 'type'|trans }}
+                        </th>
+                        {# colonne 10 #}
+                        <th style="white-space:nowrap">
+                            {{ 'begin'|trans }} [{{ 'UTC'|trans }}]
+                        </th>
+                        {# colonne 11 #}
+                        <th style="white-space:nowrap">
+                            {{ 'end'|trans }} [{{ 'UTC'|trans }}]
+                        </th>
+                        {# colonne 12 #}
+                        <th data-type="num">
+                            {{ 'measuresShort'|trans }}
+                        </th>
+                        {# colonne 12,5 #}
+
+                        <th class="col-md-3" data-filter-with="#dataset-filter">
+                            {{ 'dataset'|trans }}
+                        </th>
+
+                        {# colonne 13 #}
+                        <th class="col-md-2" data-searchable="false" data-orderable="false">
+                            {# Toolbox column #}
+                        </th>
+                        {# colonne 14 #}
+                        <th data-visible="false" data-filter-with="#onBassin-filter" data-value-separator="##">
+                            {{ 'onBassin'|trans }}
+                        </th>
+                        {# colonne 15 #}
+                        <th data-visible="false" data-filter-with="#onCoursEau-filter" data-value-separator="##">
+                            {{ 'onCoursEau'|trans }}
+                        </th>
+                        {# colonne 16 #}
+                        <th data-visible="false">
+                            {{ 'commentaire'|trans }}
+                        </th>
+                        {# colonne 17 #}
+                        <th data-visible="false" data-filter-with="#station-filter">
+                            {{ 'station'|trans }}
+                        </th>
+                    </tr>
+                    </thead>
+
+                    <tbody>
+                    {% for chronique in chroniques %}
+                        <tr>
+                            {# colonne 0 la station #}
+                            <td data-order="{{ chronique.station.nom }}">
+                                <div class="row">
+                                    <div class="col-md-10">
+                                        <strong>
+                                            {{ 'station'|trans }} {{ 'open_quote'|trans }}{{ chronique.station.nom }}{{ 'close_quote'|trans }}
+                                            ({{ chronique.station.code }})
+                                        </strong>
+                                        {% if not chronique.station.estActive %}
+                                            <em>({{ 'notActive'|trans }})</em>
+                                        {% endif %}
+                                    </div>
+                                    <div class="col-md-6">{{ chronique.station.commune }}</div>
+                                    <div class="col-md-3"><em>
+                                            {{ chroniquesNumber[chronique.station.id] }}
+                                            {{ 'chronique(s)'|transchoice(chroniquesNumber[chronique.station.id])|lower }}
+                                        </em></div>
+                                    {% if chronique.station.commentaire %}
+                                        <div class="col-md-3"><em><a class="tooltipCommentaire" {{ attachTooltip(chronique.station.commentaire) }}>
+                                                    {{- 'commentaire'|trans -}}
+                                                </a></em></div>
+                                    {% endif %}
+                                    <div class="toolbox-btns pull-right">
+                                        {{ macros.station_view(chronique.station) }}
+                                    </div>
+                                </div>
+                            </td>
+                            {# colonne 1 #}
+                            <td>{{ chronique.station.estActive ? 'yes'|trans : 'no'|trans }}</td>
+                            {# colonne 2 #}
+                            {{ textField(chronique.station.commune | default(false), 'noneFeminine') }}
+                            {# colonne 3 #}
+                            <td>
+                                {% spaceless %}
+                                    {%- for site in chronique.station.sites -%}
+                                        {{- site.nom -}}
+                                        {{- loop.last ? '' : '##' -}}
+                                    {%- endfor -%}
+                                {% endspaceless %}
+                            </td>
+                            {# colonne 4 #}
+                            <td>{{ chronique.code }}</td>
+                            {# colonne 5 #}
+                            {{ textField(chronique.familles | default(false), 'noneFeminine') }}
+                            {# colonne 6 #}
+                            <td>{{ i18nEntityLabel(chronique.parametre, 'nom', '') }}</td>
+                            {# colonne 7 #}
+                            <td>{{ chronique.unite.libelle | default('') }}</td>
+                            {# colonne 8 #}
+                            {{ textField(chronique.producteur.nom | default(false)) }}
+                            {# colonne 9 #}
+                            <td>{{ chronique.dType | trans }}</td>
+                            {# colonne 10 #}
+                            {{ dateField(chronique.dateDebutMesures) }}
+                            {# colonne 11 #}
+                            {{ dateField(chronique.dateFinMesures) }}
+                            {# colonne 12 #}
+                            <td class="text-right">{{ chronique.nbMesures | default('0') }}</td>
+                            {# colonne 12,5 #}
+                            <td>{{ chronique.dataset | default('Aucun') }}</td>
+                            {# colonne 13 #}
+                            <td>
+                                <div class="toolbox-btns pull-right">
+                                    <span class="isvisible">{{ macros.chronique_isVisible(chronique) }}</span>
+                                    {% if is_granted('CONSULT_TIMESERIES', chronique) %}
+                                        {{ macros.chronique_view(chronique) }}
+                                    {% endif %}
+                                </div>
+                            </td>
+                            {# colonne 14 #}
+                            {{ textField(chronique.bassins | default(false)) }}
+                            {# colonne 15 #}
+                            {{ textField(chronique.coursEaux | default(false)) }}
+                            {# colonne 16 #}
+                            <td>{{ chronique.station.commentaire }}</td>
+                            {# colonne 17 #}
+                            <td data-order="chronique.station.nom">{{ chronique.station.nom }} ({{ chronique.station.code }})</td>
+                        </tr>
+                    {% endfor %}
+                    </tbody>
+                </table>
+            </div>
+        </div>
+
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/complexViewer.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/complexViewer.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7fc601e0721b467c36915a2eeb97c2a571512264
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/complexViewer.html.twig
@@ -0,0 +1,67 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+
+{% from '::macros.html.twig' import submit, reset, button, pageTitle, loadJsI18N %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+{% use '@IrsteaBdohConsult/Viewer/date-range-picker.html.twig' %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/complex-viewer.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/complex-viewer.css') }}"/>
+{% endblock %}
+
+{% block title %}
+    {{ pageTitle('complexViewer'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li><a href="{{ path('bdoh_consult_advancedSearch') }}">{{ 'advancedSearch'|trans }}</a></li>
+        <li class="active">{{ 'complexViewer'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+
+    <div id="complex-viewer"
+         {%- if minDate is not empty %}data-min-date="{{ minDate | e('html_attr') }}"{% endif %}
+        {%- if maxDate is not empty %}data-max-date="{{ maxDate | e('html_attr') }}"{% endif %}
+         data-metadata-url="{{ path('bdoh_consult_loadComplexViewerData') | e('html_attr') }}"
+         data-measure-url="{{ path('bdoh_data_chronique_measures', {id: '-ID-'})| e('html_attr') }}"
+    >
+        {{ block('viewerDateRangePicker') }}
+
+        <div class="panels">
+            <div class="panel-container">
+            </div>
+            <div class="row">
+                <div class="col-md-17">
+                    <div class="x-axis"></div>
+                </div>
+            </div>
+            <div class="row panel-buttons" style="display:none";>
+                <button class="add-pane btn">
+                    <i class="glyphicon glyphicon-plus"></i>
+                    {{ 'consult.buttons.add-pane'|trans }}
+                </button><!-- TODO export du graphe en image
+                <button class="export-to-image btn" disabled="disabled">
+                    <i class="glyphicon glyphicon-picture"></i>
+                    {{ 'consult.buttons.export-image'|trans }}
+                </button>-->
+            </div>
+        </div>
+    </div>
+
+{% endblock %}
+
+{% block body_tail -%}
+    {{ parent() }}
+    {% include '@IrsteaBdohConsult/Viewer/selector-template.html.twig' %}
+    {% include '@IrsteaBdohConsult/Viewer/panel-template.html.twig' %}
+{% endblock body_tail -%}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/contact.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/contact.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fd184999edf6c4fc5575d47302a4c6016ed75f0e
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/contact.html.twig
@@ -0,0 +1,39 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('contactHelp'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ 'contactHelp'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <div class="well">
+        <h2>{{ 'contactGestionnaire'|trans }}</h2>
+        <br/>
+        <table style="width:50%;margin:0 0 0 100px;">
+            {% for gestionnaire in dataToShow %}
+                <tr>
+                    <td>{{ gestionnaire['firstName'] }}</td>
+                    <td>{{ gestionnaire['lastName'] }}</td>
+                    <td>
+                        {%- if is_granted('ROLE_USER') -%}
+                            <a href="mailto:{{ gestionnaire['email'] }}">{{ gestionnaire['email'] }}</a>
+                        {%- endif -%}
+                    </td>
+                </tr>
+            {% endfor %}
+        </table>
+        <br/>
+    </div>
+    <div class="alert alert-info" style="margin-bottom:14px;">
+        <p>{{ 'userManual(%link%)'|trans({'%link%':path('bdoh_user_manual')})|raw }}</p>
+        <p>{{ 'technicalContact'|trans|raw }}</p>
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/show.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/show.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4f1667c59c3ce673c534157142578ef9e47d1fed
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Observatoire/show.html.twig
@@ -0,0 +1,209 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+
+{% set observatoire = currentObservatoire() %}
+
+{% from '::macros.html.twig' import richLink, i18nEntityLabel, doi_list %}
+{% from 'IrsteaBdohConsultBundle::macros.html.twig' import advancedSearch_link, edit, dataset_view %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/observatoire.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/observatoire.css') }}"/>
+{% endblock %}
+
+{# Makes 'partenaires' list #}
+{% macro makePartenaires(partenaires) %}
+    <ul>
+        {% for partenaire in partenaires %}
+            <li>
+
+                {% if partenaire.lien and partenaire.lien != 'http://' %}
+                    <a href="{{ partenaire.lien }}">{{ partenaire.nom }}</a>
+                {% else %}
+                    {{ partenaire.nom }}
+                {% endif %}
+
+            </li>
+        {% else %}
+            {{ 'noOne'|trans }}
+        {% endfor %}
+    </ul>
+{% endmacro %}
+
+{# Makes 'dataset' list #}
+{% macro makeDatasets(datasets) %}
+    {% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+    {% from '::macros.html.twig' import i18nEntityLabel %}
+
+
+    <ul>
+        {% for dataset in datasets %}
+            <li>
+                <a class='datasetLinkView' href="{{ path('bdoh_consult_dataset', {'dataset': dataset.uuid}) }}">
+                    <strong>{{ i18nEntityLabel(dataset, 'titre', 'noDescription') }}</strong>
+                </a>
+                <br>
+                {{ i18nEntityLabel(dataset, 'description', 'noDescription') }}
+            </li>
+
+        {% else %}
+            {{ 'noOne'|trans }}
+        {% endfor %}
+    </ul>
+{% endmacro %}
+
+{# Displays 'photo' #}
+{% macro displaysPhoto(pathPhoto, active) %}
+    {% if pathPhoto %}
+        <div class="item {{ active|default(false) ? 'active' : '' }}">
+            <img src="{{ asset(pathPhoto) }}" alt="{{ 'illustration'|trans }}"/>
+        </div>
+    {% endif %}
+{% endmacro %}
+
+{# Build the families / types tree #}
+{% macro familyTree(familyTable, families, collapsed) %}
+    {% import _self as self %}
+    {% from 'IrsteaBdohConsultBundle::macros.html.twig' import advancedSearch_link %}
+    {% set class_collapsed_link = collapsed ? 'collapsed' : '' %}
+    {% set class_collapsed_block = collapsed ? '' : 'in' %}
+    {% for family in families %}
+        <li class="famille">
+            <span class="famille"><a class="dropdown-toggle {{ class_collapsed_link }}" data-toggle="collapse" href="#family{{ family }}"><b class="caret"></b></a>{{- advancedSearch_link('famille', familyTable[family]['nom']) }}</span>
+            <ul class="collapse {{ class_collapsed_block }}" id="family{{ family }}">
+                {{ self.familyTree(familyTable, familyTable[family]['children'], collapsed) }}
+                {% for parameter in familyTable[family]['types'] %}
+                    <li>{{- advancedSearch_link('parametre', parameter) -}}</li>
+                {% endfor %}
+            </ul>
+        </li>
+    {% endfor %}
+{% endmacro %}
+
+{% import _self as macros %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li class="active">{{ 'home'|trans }}</li>
+    </ul>
+{% endblock %}
+
+
+{% block main %}
+<div id="consult-observatoire">
+
+    {% set partenaireTab = ((not observatoire.partenaires is empty)) %}
+
+
+    <!-- Menu for variable part -->
+    <ul class="nav nav-pills pull-right">
+        <li class="active"><a href="#description" data-toggle="pill">{{ 'presentation'|trans }}</a></li>
+        {% if partenaireTab %}
+            <li><a href="#partners" data-toggle="pill">{{ 'partners'|trans }}</a></li>
+        {% endif %}
+
+        <li><a href="{{ path('bdoh_cgu_observatoires') }}">{{ 'cgu'|trans }}</a></li>
+    </ul>
+
+    <!-- Toolbox for 'observatoire' -->
+    <div class="toolbox-btns pull-left">
+        {% if is_granted('EDIT', observatoire) %}
+            {{ edit(
+            path('bdoh_admin_observatoire_edit', {'id': observatoire.id}),
+            'editObservatoire'|trans
+            ) }}
+        {% endif %}
+    </div>
+
+    <!-- Title -->
+    <h1>{{ 'open_quote'|trans }}{{ observatoire.nom }}{{ 'close_quote'|trans }}
+        <small>{{ 'welcome'|trans }}</small>
+    </h1>
+
+    <!-- Variable part : presentation / partnership -->
+    <div class="col-md-11 tab-content">
+
+        <!-- First pill : presentation -->
+        <div id="description" class="tab-pane active">
+            <h2>{{ i18nEntityLabel(observatoire, 'titre', 'noDescription') }}</h2>
+            {{ i18nEntityLabel(observatoire, 'description', 'noDescription') }}
+
+            {{ doi_list(observatoire.dois) }}
+
+            {% if observatoire.lien and observatoire.lien != 'http://' %}
+                <div>
+                    <strong>{{ 'toLearnMore'|trans }}{{ 'deux_points'|trans }}</strong>
+                    <a href="{{ observatoire.lien }}">{{ observatoire.lien }}</a>
+                </div>
+            {% endif %}
+        </div>
+
+        {% if partenaireTab %}
+            <!-- Second pill : partnership -->
+            <div id="partners" class="tab-pane">
+                {% if not observatoire.partenaires is empty %}
+                    <h2>{{ 'partenaires'|trans }}</h2>
+                    {{ macros.makePartenaires(observatoire.partenaires) }}
+                {% endif %}
+            </div>
+        {% endif %}
+
+    </div>
+
+    <!-- Permanent part : lists -->
+    <div class="col-md-11 pull-right">
+        <div class="box">
+            <!--  Sites experimentaux -->
+            <h2>{{ 'SiteExperimental'|trans({}, 'entitiesPlurals') }}</h2>
+            <ul>
+                {% for site in sites %}
+                    <li>
+                        <strong>
+                            {{ countChroniquesBySite[site.id] != 0 ? advancedSearch_link('site', site.nom) : site.nom }}
+                        </strong><br/>
+                        {{ i18nEntityLabel(site, 'description', 'noDescription') }}
+                    </li>
+                {% endfor %}
+            </ul>
+
+            <!--  Types parametres -->
+            <h2>{{ 'parametersStudied'|trans }}</h2>
+            <ul>
+                {# les types sans famille pour la transition vers les familles de paramètres #}
+                {% for parametre in parametres %}
+                    <li>{{- advancedSearch_link('parametre', i18nEntityLabel(parametre, 'nom', '')) -}}</li>
+                {% endfor %}
+                {# l'arbre des familles et des types #}
+                {{ macros.familyTree(familyTable, rootFamilies, false) }}
+            </ul>
+
+            <!-- Jeu de données-->
+            <h2>{{ 'dataSet'|trans }}</h2>
+            {{ macros.makeDatasets(observatoire.datasets) }}
+
+            <!-- Advanced search -->
+            <div class="clearfix">
+                {{ richLink(path('bdoh_consult_advancedSearch'), 'advancedSearch'|trans, 'zoom', 'both') }}
+            </div>
+        </div>
+
+        <!--  Photos -->
+        {% if observatoire.pathPhotoPrincipale or observatoire.pathPhotoSecondaire %}
+            <div id="photos" class="box carousel slide" data-ride="carousel" data-interval="false">
+                <div class="carousel-inner">
+                    {{ macros.displaysPhoto(observatoire.pathPhotoPrincipale, true) }}
+                    {{ macros.displaysPhoto(observatoire.pathPhotoSecondaire) }}
+                </div>
+                <!-- Carousel nav -->
+                <a class="carousel-control left" href="#photos" data-slide="prev"><span class="glyphicon glyphicon-chevron-left carousel-control-button" aria-hidden="true"></span></a>
+                <a class="carousel-control right" href="#photos" data-slide="next"><span class="glyphicon glyphicon-chevron-right carousel-control-button" aria-hidden="true"></span></a>
+            </div>
+        {% endif %}
+    </div>
+</div>
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Station/_chronique-inList.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Station/_chronique-inList.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3f43a69fcdf735848db399f93d24bf31ea6a0761
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Station/_chronique-inList.html.twig
@@ -0,0 +1,104 @@
+{% import '::macros.html.twig' as app_macros %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+
+<div class="row">
+    {# Toolbox #}
+    <div class="toolbox-btns pull-right">
+        {# 'Chronique' is visible ? #}
+        <span class="isvisible">{{ macros.chronique_isVisible(chronique) }}</span>
+        {% if is_granted('CONSULT_TIMESERIES', chronique) %}
+            {{ macros.chronique_view(chronique) }}
+        {% endif %}
+
+        {% if is_granted('EDIT', chronique) %}
+            {{ macros.chronique_edit(chronique) }}
+        {% endif %}
+
+        {# désactivation de l'export de chroniques au niveau de la station pour la première mise en prod TODO #}
+        {% if false and dates.first is defined and dates.last is defined %}
+            {% if is_granted('DOWNLOAD', chronique) %}
+                {{ macros.chroniques_export([chronique], dates.first, dates.last) }}
+            {% endif %}
+        {% endif %}
+    </div>
+
+    {# 'Chronique' description #}
+    <h3>
+        {{ chronique.code }}{{ 'deux_points'|trans }} {{ app_macros.i18nEntityLabel(chronique, 'libelle') }}
+    </h3>
+</div>
+
+
+{# Various information #}
+<div class="row">
+    <div class="col-sm-6">
+        {# Unité #}
+        <div>
+            <div class="col-md-8">{{ 'unite'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">{{ chronique.unite.libelle | default('') }}</div>
+        </div>
+
+        {# Type of 'chronique' #}
+        <div>
+            <div class="col-md-8">{{ 'type'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">{{ ('type.' ~ chronique.dtype)|trans }}</div>
+        </div>
+    </div>
+
+    <div class="col-sm-6">
+        {# First date #}
+        <div>
+            <div class="col-md-8">{{ 'begin'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if dates.first is defined %}
+                    {{ dates.first|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+
+        {# Last date #}
+        <div>
+            <div class="col-md-8">{{ 'end'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if dates.last is defined %}
+                    {{ dates.last|date('transformation.bareme.dateBareme'|trans, false) }} <sup>{{ 'UTC'|trans }}</sup>
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+    </div>
+
+    {% if is_granted('ROLE_ADMIN') %}
+        <div class="col-sm-6">
+            {# Minimum valide #}
+            <div>
+                <div class="col-md-12">{{ 'minimumValide'|trans }}{{ 'deux_points'|trans }}</div>
+                <div class="col-md-12 info-high">{{ chronique.minimumValide | default('none'|trans) }}</div>
+            </div>
+
+            {# Maximum valide #}
+            <div>
+                <div class="col-md-12">{{ 'maximumValide'|trans }}{{ 'deux_points'|trans }}</div>
+                <div class="col-md-12 info-high">{{ chronique.maximumValide | default('none'|trans) }}</div>
+            </div>
+        </div>
+    {% endif %}
+
+    <div class="col-sm-6">
+        {# Producteur #}
+        <div>
+            <div class="col-md-16">{{ 'producteur'|trans }}{{ 'deux_points'|trans }}</div>
+            <div class="col-md-16 info-high">
+                {% if chronique.producteur.nom is defined %}
+                    {{ macros.advancedSearch_link('producteur', chronique.producteur.nom) }}
+                {% else %}
+                    {{ 'none'|trans }}
+                {% endif %}
+            </div>
+        </div>
+    </div>
+</div>
+{# END_Various information #}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Station/show.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Station/show.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fbe900e285420d902f0c77f722282eef598a359a
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Station/show.html.twig
@@ -0,0 +1,248 @@
+{% extends 'IrsteaBdohConsultBundle::layout.html.twig' %}
+{% import 'IrsteaBdohConsultBundle::macros.html.twig' as macros %}
+{% import '::macros.html.twig' as app_macros %}
+{% from '::macros.html.twig' import i18nEntityLabel %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/consult/station.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/consult/station.css') }}"/>
+{% endblock %}
+
+{# Build the families / types / times series boxes #}
+{% macro familyTreeStation(familyTable, families, chroniquesByParam, dates) %}
+    {% import _self as self %}
+    {% for family in families %}
+        <div class="panel panel-default panel-famille">
+            {% set idGroupFamille = 'famille-' ~ family %}
+            {# Family Header #}
+            <div class="panel-heading">
+                <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroupFamille }}">
+                    <h3 class="panel-title">
+                        <b class="caret"></b>
+                        <i class="fam-bricks"></i>
+                        {{ familyTable[family]['nom'] }}
+                    </h3>
+                </a>
+            </div>
+            {# Family content (sub-family and/or types) #}
+            <div id="{{ idGroupFamille }}" class="panel-collapse collapse in">
+                <div class="panel-body">
+                    {{ self.familyTreeStation(familyTable, familyTable[family]['children'], chroniquesByParam, dates) }}
+                    {% for parameter in familyTable[family]['types'] %}
+                        {% set chroniques = chroniquesByParam[parameter] %}
+                        <div class="panel panel-default panel-param">
+                            {% set idGroup = 'param-' ~ family ~ '-' ~ loop.index %}
+                            {# Type Header #}
+                            <div class="panel-heading">
+                                <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroup }}">
+                                    <h3 class="panel-title">
+                                        <b class="caret"></b>
+                                        <i class="fam-brick"></i>
+                                        {{ parameter }}
+                                        <small> &nbsp;&nbsp;&#8210;&nbsp;&nbsp; {{ chroniques|length }} {{ 'chronique(s)'|transchoice(chroniques|length)|lower }}</small>
+                                    </h3>
+                                </a>
+                            </div>
+                            {# 'Chroniques' list for the current 'TypeParametre' #}
+                            <div id="{{ idGroup }}" class="panel-collapse collapse in">
+                                <div class="panel-body">
+                                    {% for chronique in chroniques %}
+                                        <div class="{{ loop.index0 is even ? 'even' : 'odd' }}">
+                                            {% include 'IrsteaBdohConsultBundle:Station:_chronique-inList.html.twig'
+                                                with {'dates': dates[chronique.id] | default('')} %}
+                                        </div>
+                                    {% endfor %}
+                                </div>
+                            </div>
+                        </div>
+                    {% endfor %}
+                </div>
+            </div>
+        </div>
+    {% endfor %}
+{% endmacro %}
+
+{% import _self as selfmacros %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Advanced search #}
+        <li><a href="{{ path('bdoh_consult_advancedSearch') }}">{{ 'advancedSearch'|trans }}</a></li>
+        {# Station #}
+        <li class="active">{{ station.nom }}</li>
+    </ul>
+{% endblock %}
+
+{% block title %}
+    {{ app_macros.pageTitle(('Station'|trans)~' '~('open_quote'|trans)~station.nom~('close_quote'|trans)) }}
+{% endblock %}
+
+{% block main %}
+    <div id="consult-station">
+
+        <!-- One "Terms of Uses" modal for all export modal -->
+        {% include 'IrsteaBdohConsultBundle:Modal:terms-of-uses.html.twig' %}
+
+        <!-- 'Help' window for time series export -->
+        {% include 'IrsteaBdohConsultBundle:Chronique:_export-help.html.twig' %}
+
+        <!-- Toolbox for 'station' -->
+        <div class="toolbox-btns pull-right">
+            {% if is_granted('EDIT', station) %}
+                {{ macros.station_edit(station) }}
+            {% endif %}
+
+            {# désactivation de l'export de chroniques au niveau de la station pour la première mise en prod TODO #}
+            {% if false and stationFirstDate and stationLastDate and is_granted('DOWNLOAD', station) %}
+                {{ macros.chroniques_export(chroniquesHavingMeasures, stationFirstDate, stationLastDate, null, null, null, false, 'both') }}
+            {% endif %}
+        </div>
+
+        <!-- Title -->
+        <h1>{{ 'Station' | trans }} <em>{{ 'open_quote'|trans }}{{ station.nom }}{{ 'close_quote'|trans }}</em></h1>
+
+        <!-- First section : identification / map -->
+        <div class="row">
+
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-application-view-list"></i> {{ 'identification'|trans }}
+                        </h3>
+                    </div>
+                    <div class="panel-body" id="identification">
+                        <div class="row">
+
+                            <div class="col-sm-24">
+
+                                <!-- Code -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'code'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ station.code }}</div>
+                                </div>
+
+                                <!-- Codes alternatifs -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'codeAlternatif'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ station.codeAlternatif | default('none'|trans) }}</div>
+                                </div>
+
+                                <!-- Commune -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'commune'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">
+                                        {% if station.commune is empty %}
+                                            {{ 'none'|trans }}
+                                        {% else %}
+                                            {{ macros.advancedSearch_link('commune', ('' ~ station.commune)) }}
+                                        {% endif %}
+                                    </div>
+                                </div>
+
+                                <!-- Latitude / Longitude -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'latitude'|trans }} / {{ 'longitude'|trans }}{{ 'deux_points'|trans }}
+                                    </div>
+                                    <div class="span col-sm-12">
+                                        {{ station.latitude  | default('none'|trans) }} /
+                                        {{ station.longitude | default('none'|trans) }}
+                                        <br/>{{ 'admin.help.station.latlong'|trans }}
+                                    </div>
+                                </div>
+
+                                <!-- Altitude -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'altitude'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">{{ station.altitude | default('none'|trans) }}</div>
+                                </div>
+
+                                <!-- Sites experimentaux -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'sites'|trans }}{{ 'deux_points'|trans }}</div>
+                                    <div class="span col-sm-12">
+                                        <ul>
+                                            {% for site in station.sites %}
+                                                <li>{{ macros.advancedSearch_link('site', site.nom) }}</li>
+                                            {% endfor %}
+                                        </ul>
+                                    </div>
+                                </div>
+
+                                <!-- 'Station' is active ? -->
+                                <div class="row">
+                                    <div class="info-high col-sm-12">{{ 'estActive'|trans }}</div>
+                                    <div class="span col-sm-12">
+                                        {% set estActive = station.estActive ? 'yes'|trans : 'no'|trans %}
+                                        {{ macros.advancedSearch_link('estActive', estActive) }}
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!-- END_Identification box -->
+
+            <!-- Comment box -->
+            <div class="col-md-12">
+                <div class="panel panel-default">
+                    <div class="panel-heading">
+                        <h3 class="panel-title"><i class="fam-book-open"></i> {{ 'commentaire'|trans }}</h3>
+                    </div>
+                    <div class="panel-body" id="comment">
+                        <div style="overflow:auto;">
+                            {% autoescape false %}
+                                {{ i18nEntityLabel(station, 'commentaire', 'consult.help.station.noCommentaire'|trans) }}
+                            {% endautoescape %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!-- END_First section : identification / map -->
+
+        <!-- 'Chroniques' list -->
+        {# les types sans famille pour la transition vers les familles de paramètres #}
+        {% for parameter, chroniques in chroniquesByParam %}
+            {% if parameter in typesWithoutFamily %}
+                <div class="panel panel-default panel-param">
+                    {% set idGroup = 'param-0-' ~ loop.index %}
+                    {# Type Header #}
+                    <div class="panel-heading">
+                        <a class="dropdown-toggle collapse-title" data-toggle="collapse" href="#{{ idGroup }}">
+                            <h3 class="panel-title">
+                                <b class="caret"></b>
+                                <i class="fam-brick"></i>
+                                {{ parameter }}
+                                <small> &nbsp;&nbsp;&#8210;&nbsp;&nbsp; {{ chroniques|length }} {{ 'chronique(s)'|transchoice(chroniques|length)|lower }}</small>
+                            </h3>
+                        </a>
+                    </div>
+                    {# 'Chroniques' list for the current 'TypeParametre' #}
+                    <div id="{{ idGroup }}" class="panel-collapse collapse in">
+                        <div class="panel-body">
+                            {% for chronique in chroniques %}
+                                <div class="{{ loop.index0 is even ? 'even' : 'odd' }}">
+                                    {% include 'IrsteaBdohConsultBundle:Station:_chronique-inList.html.twig'
+                                        with {'dates': dates[chronique.id] | default('')} %}
+                                </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            {% endif %}
+        {% endfor %}
+        {# les types dans des familles #}
+        {{ selfmacros.familyTreeStation(familyTable, rootFamilies, chroniquesByParam, dates) }}
+        <!-- END_'Chronique' list -->
+
+    </div>
+    <!-- END_consult-station -->
+{% endblock main %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Viewer/date-range-picker.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/date-range-picker.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..20a3bd82843c42c8322efe61c104787e176f1f16
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/date-range-picker.html.twig
@@ -0,0 +1,35 @@
+{% block viewerDateRangePicker %}
+    <fieldset class="row box date-range-picker">
+        <legend>{{ 'selectStartEndDates'|trans }}</legend>
+
+        <div class="alert alert-info">
+            {{ 'consult.help.chronique.selectionOfDatesRange'|trans|raw }}
+        </div>
+
+        <div class="form-inline">
+
+            <label>{{ 'period'|trans }}&nbsp;:</label>
+
+            <div class="input-group col-md-8">
+                <span class="input-group-addon">{{ 'from'|trans }}</span>
+                <input type="text" required class="form-control start"/>
+            </div>
+            <div class="input-group col-md-8">
+                <span class="input-group-addon">{{ 'to'|trans }}</span>
+                <input type="text" required class="form-control end"/>
+            </div>
+
+            {% block viewerDateRangePickerButtons %}
+                <a href="javascript:void(0);" class="submit btn btn-success validated">
+                    <i class="glyphicon glyphicon-search"></i>&nbsp;
+                    {{- 'consult.buttons.view'|trans -}}
+                </a>
+            {% endblock %}
+        </div>
+
+        <div class="alert alert-danger feedback" style="display:none; margin-top: 1em">
+            <i class="glyphicon glyphicon-remove"></i>
+            <span class="msg">...</span>
+        </div>
+    </fieldset>
+{% endblock viewerDateRangePicker %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Viewer/panel-template.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/panel-template.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4890c5cd9f59e1034daa0e5b02945bd8285cf80d
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/panel-template.html.twig
@@ -0,0 +1,55 @@
+<template id="cv-panel-template">
+    <div class="panel row">
+        <div class="col-md-17">
+            <div class="graph"></div>
+        </div>
+        <div class="col-md-7">
+            <div class="pull-right" style="margin:-10px 0 5px;">
+                <button type="button" title="{% trans from "viewer" %}closeThisPane{% endtrans %}"
+                        class="close remove-pane">&times;</button>
+            </div>
+            {% for side in ['left', 'right'] %}
+                <div class="{{ side }}-axis" style="clear:both;">
+                    <button class="pull-right btn btn-xs select">
+                        <i class="glyphicon glyphicon-list"></i>&nbsp;
+                        {% trans from "viewer" %}edit-selection{% endtrans %}
+                    </button>
+                    <h3>{{ (side~'-axis')|trans({}, "viewer") }}</h3>
+                    <table class="table table-condensed selection">
+                        <thead>
+                            <th class="th-toggle-chronicle text-center" width="1%"><i
+                                    class="glyphicon glyphicon-eye-open"></i></th>
+                            <th width="98%">{{ 'chronicle'|trans({}, 'viewer') }}</th>
+                            <th width="1%"></th>
+                        </thead>
+                        <tbody>
+                        </tbody>
+                    </table>
+                </div>
+            {% endfor %}
+        </div>
+    </div>
+</template>
+
+<template id="cv-selection-row">
+    <tr>
+        <td class="text-center">
+            <button class="btn btm-xs toggle" title="{{ 'hideDisplayButton'|trans({}, 'viewer') }}"></button>
+        </td>
+        <td>
+            <i class="fam-information infoTimeStep" style="display:none;margin-right:5px;"></i><i
+                class="fam-error downSampled" style="display:none;margin-right:5px;"></i><i
+                class="fam-exclamation noDataOnRange" style="display:none;margin-right:5px;"></i><span
+                class="title" style="cursor:default;"></span>
+        </td>
+        <td>
+            <div class="toolbox-btns">
+                <a class="iconText chroniqueLink" href="{{- path('bdoh_consult_chronique',
+                    {'station': '_STATION_CODE_', 'chronique': '_CHRONIQUE_CODE_'}) -}}"><i
+                        class="fam-magnifier chroniqueLinkIcon" data-toggle="tooltip"
+                        title="{{ 'viewChronique'|trans|trim }}"></i>
+                </a>
+            </div>
+        </td>
+    </tr>
+</template>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/Viewer/selector-template.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/selector-template.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c4ada56d09f282d9898fb99855fb791b7469c347
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/Viewer/selector-template.html.twig
@@ -0,0 +1,55 @@
+<template id="cv-selector">
+    <div class="selector modal container">
+        <div class="modal-dialog">
+            <div class="modal-content">
+
+                <div class="modal-header" id="main">
+                    <h1 class="title modal-title" style="margin-bottom:0;"></h1>
+                </div>
+
+                <div class="modal-body">
+
+                    <div class="row">
+                        <div class="col-md-24">
+                            <div><em>{% trans from "viewer" %}select-station-to-see-chronicles{% endtrans %}</em>
+                            </div>
+                            <div class="stations">
+                                <h4>{% trans from "viewer" %}station{% endtrans %}</h4>
+                                <ul class="list" style="margin-bottom:9px;">
+                                    <div class="loading"><span class="glyphicon glyphicon-hourglass spinning"></span></div>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="row">
+                        <div class="col-md-24">
+                            <em>{% trans from "viewer" %}select-and-drag-chronicles{% endtrans %}</em><br/>
+                            <em>{% trans from "viewer" %}click-cross-remove-chronicle{% endtrans %}</em><br/>
+                            <em>{% trans from "viewer" %}chronicles-must-be-compatible{% endtrans %}</em>
+                        </div>
+                    </div>
+
+                    <div class="row">
+                        <div class="chroniques col-md-12">
+                            <h4>{% trans from "viewer" %}available-chronicles{% endtrans %}</h4>
+                            <ul class="list"></ul>
+                        </div>
+                        <div class="selection col-md-12">
+                            <h4>{% trans from "viewer" %}selected-chronicles{% endtrans %}</h4>
+                            <ul class="list"></ul>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="modal-footer">
+                    <button class="confirm btn btn-margin"
+                            data-dismiss="modal">{{ 'consult.buttons.ok'|trans }}</button>
+                    <button class="cancel btn btn-margin"
+                            data-dismiss="modal">{{ 'consult.buttons.cancel'|trans }}</button>
+                </div>
+
+            </div>
+        </div>
+    </div>
+</template>
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/layout.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..75d971ab0fe2e7482f6d129ebbc26e371512bda6
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/layout.html.twig
@@ -0,0 +1,21 @@
+{% extends '::layout.html.twig' %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <style type="text/css">
+        .a-little-right-margin {
+            margin-right: 18px;
+        }
+        div.export-help-content {
+            margin-right: 1em;
+        }
+        div.export-help-content > ul > li {
+            margin-top: 0.75em;
+        }
+        a.btn-export-help {
+            float: right;
+            margin-right: 3em;
+            color: blue;
+        }
+    </style>
+{% endblock %}
diff --git a/src/Irstea/BdohConsultBundle/Resources/views/macros.html.twig b/src/Irstea/BdohConsultBundle/Resources/views/macros.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d044fa7301fe058246d34fe47b962bdd7cb54681
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Resources/views/macros.html.twig
@@ -0,0 +1,269 @@
+{###############################################################################
+ #
+ # Some useful Twig macros for consultation.
+ #
+ ##############################################################################}
+
+
+
+{##
+ # Generic macros to edit, view and display icon, with tooltip.
+ #}
+
+{% macro edit(href, title, display, tooltip_placement) %}
+    {% from '::macros.html.twig' import richLink %}
+    {{ richLink(href, title, 'pencil', display, tooltip_placement) }}
+{% endmacro %}
+
+{% macro view(href, title, display, tooltip_placement) %}
+    {% from '::macros.html.twig' import richLink %}
+    {{ richLink(href, title, 'magnifier', display, tooltip_placement) }}
+{% endmacro %}
+
+
+{##############################################################################}
+
+
+
+{##
+ # Displays a rate.
+ #}
+{%- macro display_rate(rate, label, discontinue, overlap) -%}
+    {%- spaceless -%}
+
+        {%- if discontinue -%}
+
+            {%- if label -%}
+                {{- label -}}
+            {%- endif -%}
+
+            {%- if not rate and not overlap -%}
+                <span style="color:#999;">
+            {%- endif -%}
+
+            {%- if label -%}
+                &nbsp;&nbsp;-&nbsp;&nbsp;
+            {%- endif -%}
+
+            {%- if rate is null -%}
+                {{- 'noneSmall'|trans -}}
+            {%- elseif rate or overlap -%}
+                <b>{{- rate -}}</b>
+            {% else %}
+                {{- rate -}}
+            {%- endif -%}
+
+            {%- if label -%}
+                &nbsp;{{ 'consult.fillingRateMesure'|transchoice(rate|default(0)) }}
+            {%- endif -%}
+
+            {%- if not rate and not overlap -%}
+                </span>
+            {%- endif -%}
+
+        {%- else -%}
+
+            {%- if rate is null -%}
+                {{- 'noneSmall'|trans -}}
+            {%- else -%}
+                {%- set roundedRate = 10 * round(rate / 10) -%}
+                {%- set imageRate = asset('images/consult/rate' ~ roundedRate ~ '.png') -%}
+                {%- if label -%}
+                    {{- label -}}&nbsp;
+                {%- endif -%}
+                <img src="{{ imageRate }}"/>
+                <sub style="margin-left:0.3em;">{{ round(rate) | number_format(0) }}%</sub>
+            {%- endif -%}
+
+        {%- endif -%}
+
+    {%- endspaceless -%}
+{%-endmacro -%}
+
+{##############################################################################}
+
+
+
+{##
+ # Displays a dated rate, with a link towards a given anchor.
+ #
+ # @param float|null  rate
+ # @param string      beginDate A textual date usable by the javascript "Date" class
+ # @param string      endDate   A textual date usable by the javascript "Date" class
+ # @param string      anchorId
+ # @param string      label
+ # @param bool        discontinue
+ # @param bool        overlap
+ #}
+{%- macro display_linkedDatedRate(rate, beginDate, endDate, anchorId, label, discontinue, overlap) -%}
+    {%- from _self import display_rate -%}
+    {%- spaceless -%}
+        {%- if rate is not null and not (discontinue|default(false) and not overlap|default(false)) -%}
+            <a{%- if anchorId is not null %} href="#{{ anchorId }}" {% endif -%}
+                class="fillingRate{% if discontinue|default(false) %} discontinue{% endif %}{% if label|default('') %} textLabel{% endif %}"
+                data-begin="{{ beginDate|date('Y-m-d\\TH:i:s\\Z', 'UTC') }}"
+                data-end="{{ endDate|date('Y-m-d\\TH:i:s\\Z', 'UTC') }}">
+        {%- else -%}
+            <div class="fillingRate{% if discontinue|default(false) %} discontinue{% endif %}{% if label|default('') %} textLabel{% endif %}">
+        {%- endif -%}
+        {{ display_rate(rate, label|default(''), discontinue|default(false), overlap|default(false)) }}
+        {%- if rate is not null and not (discontinue|default(false) and not overlap|default(false)) -%}
+            </a>
+        {%- else -%}
+            </div>
+        {%- endif -%}
+    {%- endspaceless -%}
+{%- endmacro -%}
+
+{##############################################################################}
+
+
+
+{##
+ # Some information and actions for 'Avanced search'.
+ #}
+{%- macro advancedSearch_link(type, value) -%}
+    {%- spaceless -%}
+        {%- set value = value|trim -%}
+        <a class='advancedSearchLink' href="{{ path('bdoh_consult_advancedSearch', {(type): value}) }}">{{ value }}</a>
+    {%- endspaceless -%}
+{%- endmacro -%}
+
+{##############################################################################}
+
+{# ######################################################################### #}
+
+{##
+ # Some information and actions for 'Dataset'.
+#}
+{# Action : view #}
+
+{% macro dataset_view(dataset, title, display, tooltip_placement) %}
+    {% from _self import view %}
+    {{ view(
+        path('bdoh_consult_dataset', {'dataset': dataset.uuid}),
+        title | default('viewDataset'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+{# Action : edit #}
+{% macro dataset_edit(dataset, title, display, tooltip_placement) %}
+    {%- from _self import edit %}
+    {{ edit(
+        path('bdoh_admin_dataset_edit', {'id': dataset.id}),
+        title | default('editDataset'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+
+{##############################################################################}
+
+{##
+ # Some information and actions for 'Station'.
+ #}
+
+{# Info : 'station' is active ? #}
+{% macro station_isActive(station, divider_left, divider_right, tooltip_placement) %}
+    {% spaceless %}
+        {% if not station.estActive %}
+
+            {% from '::macros.html.twig' import tooltipedIcon %}
+
+            {% if divider_left | default(false) %}
+                <div class="divider-vertical"></div>{% endif %}
+
+            {{ tooltipedIcon('cog-error', 'consult.help.station.notActive'|trans, tooltip_placement) }}
+
+            {% if divider_right | default(false) %}
+                <div class="divider-vertical"></div>{% endif %}
+
+        {% endif %}
+    {% endspaceless %}
+{% endmacro %}
+
+{# Action : edit #}
+{% macro station_edit(station, title, display, tooltip_placement) %}
+    {%- from _self import edit %}
+    {{ edit(
+        path('bdoh_admin_station_edit', {'id': station.id}),
+        title | default('editStation'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+{# Action : view #}
+{% macro station_view(station, title, display, tooltip_placement) %}
+    {% from _self import view %}
+    {{ view(
+        path('bdoh_consult_station', {'station': station.code}),
+        title | default('viewStation'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+
+
+
+
+{##
+ # Some information and actions for 'Chronique'.
+ #}
+
+{# Info : 'chronique' is visible ? #}
+{% macro chronique_isVisible(chronique, divider_left, divider_right, tooltip_placement) %}
+    {% spaceless %}
+        {% if not chronique.estVisible %}
+
+            {% from '::macros.html.twig' import tooltipedIcon %}
+
+            {% if divider_left | default(false) %}
+                <div class="divider-vertical"></div>{% endif %}
+
+            {{ tooltipedIcon('lock', 'consult.help.chronique.notVisible'|trans, tooltip_placement) }}
+
+            {% if divider_right | default(false) %}
+                <div class="divider-vertical"></div>{% endif %}
+
+        {% endif %}
+    {% endspaceless %}
+{% endmacro %}
+
+{# Action : edit #}
+{% macro chronique_edit(chronique, title, display, tooltip_placement) %}
+    {% from _self import edit %}
+    {{ edit(
+        path('bdoh_admin_chronique' ~ chronique.dtype ~ '_edit', {'id': chronique.id}),
+        title | default('editChronique'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+{# Action : view #}
+{% macro chronique_view(chronique, title, display, tooltip_placement) %}
+    {% from _self import view %}
+    {{ view(
+        path('bdoh_consult_chronique', {'station': chronique.station.code, 'chronique': chronique.code}),
+        title | default('viewChronique'),
+        display,
+        tooltip_placement
+    ) }}
+{% endmacro %}
+
+{# Action : export #}
+{% macro chroniques_export(chroniques, dateFirst, dateLast, exportSamplings, exportTimeSteps, displayStartField,
+    termsOfUses, display, tooltip_placement) %}
+    {% include 'IrsteaBdohConsultBundle:Modal:export.html.twig' %}
+{% endmacro %}
+
+{# Action : cut #}
+{% macro chronique_cut(chronique, dateFirst, dateLast, chroniqueContinue, hasChildren, childrenList, childrenCount,
+    display, tooltip_placement) %}
+    {% include 'IrsteaBdohConsultBundle:Modal:cut.html.twig' %}
+{% endmacro %}
diff --git a/src/Irstea/BdohConsultBundle/Service/JsonSchema/CachingLoader.php b/src/Irstea/BdohConsultBundle/Service/JsonSchema/CachingLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..8727ab0ff2046c52e6c29a81d7221256d5dfca1c
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Service/JsonSchema/CachingLoader.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Service\JsonSchema;
+
+use Doctrine\Common\Cache\ApcuCache;
+use Doctrine\Common\Cache\ArrayCache;
+use Opis\JsonSchema\ISchemaLoader;
+
+final class CachingLoader implements ISchemaLoader
+{
+    /** @var ISchemaLoader */
+    private $decorated;
+
+    /** @var int */
+    private $lifeTime;
+
+    /** @var ApcuCache */
+    private $apcuCache;
+
+    public function __construct(ISchemaLoader $decorated, ApcuCache $apcuCache = null, int $lifeTime = 0)
+    {
+        $this->decorated = $decorated;
+        $this->apcuCache = $apcuCache ?: new ArrayCache();
+        $this->lifeTime = $lifeTime;
+        // $this->apcuCache = $apcuCache;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadSchema(string $uri)
+    {
+        if ($this->apcuCache->contains($uri)) {
+            return $this->apcuCache->fetch($uri);
+        }
+
+        $schema = $this->decorated->loadSchema($uri);
+        if ($schema !== null) {
+            $this->apcuCache->save($uri, $schema, $this->lifeTime);
+        }
+
+        return $schema;
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Service/JsonSchema/HttpLoader.php b/src/Irstea/BdohConsultBundle/Service/JsonSchema/HttpLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f64a63c9279962c81bf4920731b6ff16a2cc6d1
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Service/JsonSchema/HttpLoader.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Service\JsonSchema;
+
+use Irstea\BdohConsultBundle\Exception\InvalidJsonSchemaURIException;
+use Opis\JsonSchema\ISchemaLoader;
+use Opis\JsonSchema\Schema;
+
+final class HttpLoader implements ISchemaLoader
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function loadSchema(string $uri)
+    {
+        $scheme = parse_url($uri, PHP_URL_SCHEME);
+        if ($scheme !== 'http' && $scheme !== 'https') {
+            throw new InvalidJsonSchemaURIException('Expected a http(s) URL, not ' . $scheme);
+        }
+
+        $content = file_get_contents($uri);
+        if ($content === false) {
+            throw new \RuntimeException('could not fetch ' . $uri);
+        }
+
+        return Schema::fromJsonString($content);
+    }
+}
diff --git a/src/Irstea/BdohConsultBundle/Service/JsonSchema/SpyingLoader.php b/src/Irstea/BdohConsultBundle/Service/JsonSchema/SpyingLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..016e8091f61009b65729dbf9a73a5bf9432b2e58
--- /dev/null
+++ b/src/Irstea/BdohConsultBundle/Service/JsonSchema/SpyingLoader.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohConsultBundle\Service\JsonSchema;
+
+use Opis\JsonSchema\ISchemaLoader;
+
+final class SpyingLoader implements ISchemaLoader
+{
+    /** @var ISchemaLoader */
+    private $decorated;
+
+    /** @var string[] */
+    private $schemas = [];
+
+    public function __construct(ISchemaLoader $decorated)
+    {
+        $this->decorated = $decorated;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadSchema(string $uri)
+    {
+        $this->schemas[$uri] = true;
+
+        return $this->decorated->loadSchema($uri);
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getSchemas(): array
+    {
+        return array_keys($this->schemas);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/AbstractExportCommand.php b/src/Irstea/BdohDataBundle/Command/AbstractExportCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..8094afbfdffd903fa3e8369f0d2df8723342625e
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/AbstractExportCommand.php
@@ -0,0 +1,323 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Exporter\Measure\Archiver\ConsoleArchiver;
+use Irstea\BdohDataBundle\Exporter\Measure\Archiver\ZipArchiver;
+use Irstea\BdohDataBundle\Exporter\Measure\ArchiverInterface;
+use Irstea\BdohDataBundle\Exporter\Measure\ExporterBuilder;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Bridge\Twig\TwigEngine;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class AbstractExportCommand.
+ */
+abstract class AbstractExportCommand extends Command
+{
+    const COMMAND_NAME_PREFIX = 'bdoh:export:';
+    //const EXTRACTOR_TYPE = 'abstract';
+    const DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX";
+
+    /**
+     * @var ExporterBuilder
+     * @DI\Inject("irstea_bdoh.export.builder")
+     */
+    public $exporterBuilder;
+
+    /**
+     * @var TranslatorInterface
+     * @DI\Inject
+     */
+    public $translator;
+
+    /**
+     * @var TwigEngine
+     * @DI\Inject
+     */
+    public $templating;
+
+    /**
+     * @var \Swift_Mailer
+     * @DI\Inject
+     */
+    public $mailer;
+
+    /**
+     * @var RegistryInterface
+     * @DI\Inject
+     */
+    public $doctrine;
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws InvalidArgumentException
+     */
+    protected function configure()
+    {
+        $this
+            ->setName(self::COMMAND_NAME_PREFIX . static::EXTRACTOR_TYPE)
+            ->setDescription('Export de chroniques')
+            ->addOption('jms-job-id', null, InputOption::VALUE_REQUIRED, 'Identifiant du job')
+            ->addOption('locale', 'l', InputOption::VALUE_REQUIRED, 'Localisation', 'fr')
+            ->addOption('send-to', 'm', InputOption::VALUE_REQUIRED, "E-mail d'un utilisateur à qui envoyer l'archive")
+            ->addOption('write-to', 'o', InputOption::VALUE_REQUIRED, 'Chemin du fichier de sortie')
+            ->addOption('timezone', 't', InputOption::VALUE_REQUIRED, 'Fuseau horaire cible', 'UTC')
+            ->addOption('format', 'f', InputOption::VALUE_REQUIRED, "Format d'export", 'bdoh')
+            ->addArgument('begin', InputArgument::REQUIRED, 'Date de début')
+            ->addArgument('end', InputArgument::REQUIRED, 'Date de fin')
+            ->addArgument(
+                'chroniques',
+                InputArgument::REQUIRED | InputArgument::IS_ARRAY,
+                'Identifiants des chroniques à exporter'
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \Symfony\Component\Console\Exception\InvalidArgumentException
+     * @throws \Symfony\Component\Form\Exception\AlreadySubmittedException
+     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
+     * @throws \Doctrine\ORM\EntityNotFoundException
+     *
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $arguments = array_merge($input->getArguments(), $input->getOptions());
+        $parameters = $this->validateParameters($arguments);
+
+        $parameters['date'] = new \DateTime('now', new \DateTimeZone('UTC'));
+
+        $this->setLocale($parameters['locale']);
+        unset($parameters['locale']);
+
+        $user = $parameters['user'] = $parameters['send-to'] ?? null;
+
+        $archiver = $this->createArchiver($parameters, $output);
+        unset($parameters['send-to'], $parameters['write-to']);
+
+        $chroniques = $parameters['chroniques'];
+        unset($parameters['chroniques']);
+
+        $parameters['observatoire']->defineAsCurrent();
+
+        $this->exporterBuilder
+            ->getExporter($parameters, $archiver)
+            ->export($chroniques);
+
+        if ($user !== null) {
+            return 1 - $this->sendArchive($archiver->getArchivePath(), $user, $chroniques);
+        }
+
+        return 0;
+    }
+
+    /**
+     * @param array $arguments
+     *
+     * @return array
+     */
+    private function validateParameters(array $arguments)
+    {
+        $resolver = new OptionsResolver();
+        $this->configureParameterResolver($resolver);
+
+        $values = array_intersect_key($arguments, array_fill_keys($resolver->getDefinedOptions(), true));
+        $parameters = $resolver->resolve($values);
+
+        unset($parameters['command']);
+
+        return $parameters;
+    }
+
+    /**
+     * @param array           $parameters
+     * @param OutputInterface $output
+     *
+     * @return ArchiverInterface
+     */
+    private function createArchiver(array $parameters, OutputInterface $output)
+    {
+        if (isset($parameters['send-to'])) {
+            $archiver = new ZipArchiver();
+            $filePath = $archiver->getArchivePath();
+            register_shutdown_function(
+                function () use ($filePath) {
+                    @unlink($filePath);
+                }
+            );
+
+            return $archiver;
+        }
+
+        if (isset($parameters['write-to'])) {
+            return new ZipArchiver($parameters['write-to']);
+        }
+
+        return new ConsoleArchiver($output);
+    }
+
+    /**
+     * @param OptionsResolverInterface $resolver
+     *
+     * @return mixed
+     */
+    protected function configureParameterResolver(OptionsResolverInterface $resolver)
+    {
+        $resolver->setDefaults(
+            [
+                'send-to'      => null,
+                'write-to'     => null,
+                'extractor'    => static::EXTRACTOR_TYPE,
+                'observatoire' => null,
+                'locale'       => 'fr',
+            ]
+        );
+
+        $resolver->setRequired(
+            [
+                'command',
+                'format',
+                'chroniques',
+                'timezone',
+                'begin',
+                'end',
+            ]
+        );
+
+        $resolver->addAllowedTypes(
+            [
+                'send-to'    => ['string', 'null'],
+                'write-to'   => ['string', 'null'],
+                'chroniques' => ['array'],
+                'format'     => ['string'],
+                'timezone'   => ['string'],
+                'begin'      => ['string'],
+                'end'        => ['string'],
+            ]
+        );
+
+        $resolver->setNormalizers(
+            [
+                'send-to'      => function (Options $options, $value) {
+                    if (!$value) {
+                        return null;
+                    }
+
+                    return $this->doctrine
+                        ->getRepository(Utilisateur::class)
+                        ->findOneByEmail($value);
+                },
+                'chroniques'   => function (Options $options, $value) {
+                    if (!$value) {
+                        return [];
+                    }
+
+                    return array_map(
+                        function ($id) {
+                            return $this->doctrine
+                                ->getRepository(Chronique::class)
+                                ->findOneById($id);
+                        },
+                        $value
+                    );
+                },
+                'timezone'     => function (Options $options, $value) {
+                    return new \DateTimeZone(str_replace(':', '', trim($value, "'")));
+                },
+                'begin'        => function (Options $options, $value) {
+                    return new \DateTime($value, $options['timezone']);
+                },
+                'end'          => function (Options $options, $value) {
+                    return new \DateTime($value, $options['timezone']);
+                },
+                'observatoire' => function (Options $options, $value) {
+                    $chroniques = $options['chroniques'];
+
+                    return count($chroniques) > 0 ? $chroniques[0]->getObservatoire() : null;
+                },
+            ]
+        );
+    }
+
+    /**
+     * @param string $locale
+     *
+     * @SuppressWarnings(PHPMD.StaticAccess)
+     */
+    private function setLocale($locale)
+    {
+        \Locale::setDefault($locale);
+        $this->translator->setLocale($locale);
+    }
+
+    /**
+     * @param string $archivePath
+     *
+     * @throws \Twig_Error
+     * @throws \RuntimeException
+     * @throws \InvalidArgumentException
+     *
+     * @return int
+     */
+    private function sendArchive($archivePath, Utilisateur $user, array $chroniques)
+    {
+        $attachment = \Swift_Attachment::fromPath($archivePath, 'application/zip');
+        $attachment->setFilename('export.zip');
+
+        $message = \Swift_Message::newInstance()
+            ->setSubject(
+                $this->translator->transChoice(
+                    'export.exportMail.title(%chronique%)',
+                    count($chroniques),
+                    ['%chronique%' => implode(', ', $chroniques)]
+                )
+            )
+            ->setFrom('no.reply.BDOH@irstea.fr')
+            ->setTo([$user->getEmail() => (string) $user])
+            ->attach($attachment);
+
+        $message->setBody(
+            $this->templating->render(
+                'IrsteaBdohConsultBundle:Mail:export.txt.twig',
+                ['user' => (string) $user]
+            )
+        );
+
+        return $this->mailer->send($message);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/AbstractJobCommand.php b/src/Irstea/BdohDataBundle/Command/AbstractJobCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..22c4f0a83f4a1cb44a980c76ea632d9d0d4a1ccb
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/AbstractJobCommand.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Doctrine\ORM\EntityNotFoundException;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\JobQueueBundle\Entity\Job;
+use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
+
+/**
+ * Class AbstractJobCommand.
+ */
+abstract class AbstractJobCommand extends ContainerAwareCommand
+{
+    /**
+     * @var Job
+     */
+    private $job = null;
+
+    /** Get job.
+     * @return Job
+     */
+    public function getJob()
+    {
+        return $this->job;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \InvalidArgumentException
+     */
+    protected function configure()
+    {
+        parent::configure();
+        $this->addOption('jms-job-id', null, InputOption::VALUE_REQUIRED, 'Identifiant du job');
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \Doctrine\ORM\EntityNotFoundException
+     * @throws \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
+     * @throws \Symfony\Component\Console\Exception\InvalidArgumentException
+     * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
+     */
+    protected function initialize(InputInterface $input, OutputInterface $output)
+    {
+        parent::initialize($input, $output);
+
+        $jobId = $input->getOption('jms-job-id');
+        if ($jobId === null) {
+            return;
+        }
+
+        $this->job = $job = $this->fetchJob($jobId);
+
+        list($user, $obs) = $this->findUserAndObservatoire($job);
+
+        if ($user !== null) {
+            $this->simulateLogin($user);
+        }
+
+        if ($obs !== null) {
+            $this->setCurrentObservatoire($obs);
+        }
+    }
+
+    /**
+     * @param string $jobId
+     *
+     * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
+     * @throws \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
+     * @throws EntityNotFoundException
+     *
+     * @return Job
+     */
+    private function fetchJob($jobId)
+    {
+        $job = $this->getContainer()
+            ->get('doctrine')
+            ->getManagerForClass(Job::class)
+            ->find(Job::class, $jobId);
+        if ($job === null) {
+            throw new EntityNotFoundException("Job #$jobId not found");
+        }
+
+        return $job;
+    }
+
+    /**
+     * @param Job $job
+     *
+     * @return array
+     */
+    private function findUserAndObservatoire(Job $job)
+    {
+        $user = null;
+        $obs = null;
+        foreach ($job->getRelatedEntities() as $related) {
+            if ($related instanceof Utilisateur) {
+                $user = $related;
+            } elseif ($related instanceof Observatoire) {
+                $obs = $related;
+            }
+        }
+
+        return [$user, $obs];
+    }
+
+    /**
+     * @param Utilisateur $user
+     */
+    private function simulateLogin(Utilisateur $user)
+    {
+        $token = new UsernamePasswordToken($user, null, 'command');
+        $this->getContainer()->get('security.token_storage')->setToken($token);
+    }
+
+    /**
+     * @param Observatoire $obs
+     */
+    private function setCurrentObservatoire(Observatoire $obs)
+    {
+        $obs->defineAsCurrent();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ComputeChroniqueCommand.php b/src/Irstea/BdohDataBundle/Command/ComputeChroniqueCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..c46dbc2c75d856b78d6114f5081b02fbbfbd213a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ComputeChroniqueCommand.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityNotFoundException;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueCalculeeRepository;
+use Irstea\BdohDataBundle\EventListener\MeasuresUpdateEvent;
+use Irstea\BdohDataBundle\Events;
+use Irstea\BdohSecurityBundle\Entity\Repository\UtilisateurRepository;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * {@inheritdoc}
+ */
+class ComputeChroniqueCommand extends AbstractJobCommand
+{
+    const COMMAND_NAME = 'bdoh:compute:chronique';
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws InvalidArgumentException
+     */
+    protected function configure()
+    {
+        parent::configure();
+        $this
+            ->setName(self::COMMAND_NAME)
+            ->setDescription('Calcule les mesures d\'une chronique calculée')
+            ->addArgument('chronique_id', InputArgument::REQUIRED, 'Identifiant de la chronique')
+            ->addArgument('user_id', InputArgument::REQUIRED, 'Initiateur de la comande')
+            ->addOption('propagate', 'p', InputOption::VALUE_NONE, 'Propager aux chroniques filles');
+    }
+
+    /**
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @throws EntityNotFoundException
+     * @throws InvalidArgumentException
+     *
+     * @return int Exit code
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $chroniqueId = $input->getArgument('chronique_id');
+        $userId = $input->getArgument('user_id');
+        $propagate = $input->getOption('propagate');
+
+        return $this->getContainer()
+            ->get('doctrine')
+            ->getManagerForClass(ChroniqueCalculee::class)
+            ->transactional(
+                function (EntityManagerInterface $manager) use ($chroniqueId, $userId, $propagate) {
+                    /** @var ChroniqueCalculeeRepository $chroRepo */
+                    $chroRepo = $manager->getRepository(ChroniqueCalculee::class);
+
+                    /** @var ChroniqueCalculee $chronique */
+                    $chronique = $chroRepo->findOneById($chroniqueId);
+
+                    if (!$chronique) {
+                        throw new EntityNotFoundException(sprintf('%s:%d', ChroniqueCalculee::class, $chroniqueId));
+                    }
+
+                    /** @var UtilisateurRepository $userRepo */
+                    $userRepo = $manager->getRepository(Utilisateur::class);
+
+                    /** @var Utilisateur $user */
+                    $user = $userRepo->find($userId);
+
+                    if (!$user) {
+                        throw new EntityNotFoundException(sprintf('%s:%d', Utilisateur::class, $userId));
+                    }
+
+                    $result = $chroRepo->computeChronique($chronique->getId());
+
+                    if ($result === 0) {
+                        $manager->refresh($chronique);
+
+                        // met à jour la date de calcul de la chronique (date de mise à jour)
+                        $date = new \DateTime('now', new \DateTimeZone('UTC'));
+                        $chronique->setMiseAJour($date);
+                        $manager->persist($chronique);
+                        $manager->flush();
+
+                        // historique de calcul
+                        $this->getContainer()->get('irstea_bdoh_logger.logger')->createHistoriqueCalculChronique(
+                            $user,
+                            $date,
+                            $chronique->getObservatoire(),
+                            $chronique
+                        );
+
+                        // MeasuresUpdateEvent pour les taux de remplissage et la propagation
+                        $event = new MeasuresUpdateEvent(
+                            $chronique,
+                            $user,
+                            new \DateTime($chronique->getDateDebutMesures()),
+                            new \DateTime($chronique->getDateFinMesures()),
+                            $propagate
+                        );
+                        $this->getContainer()->get('event_dispatcher')->dispatch(Events::MEASURES_UPDATE, $event);
+                    }
+
+                    return $result;
+                }
+            );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ComputeFillingRateCommand.php b/src/Irstea/BdohDataBundle/Command/ComputeFillingRateCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7401a0a08ab9a4532d6e1bb186cde03e919eace
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ComputeFillingRateCommand.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Doctrine\ORM\EntityNotFoundException;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * {@inheritdoc}
+ */
+class ComputeFillingRateCommand extends AbstractJobCommand
+{
+    const COMMAND_NAME = 'bdoh:compute:filling_rates';
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws InvalidArgumentException
+     */
+    protected function configure()
+    {
+        parent::configure();
+        $this
+            ->setName(self::COMMAND_NAME)
+            ->setDescription('Met à jour les lacunes d\'une chronique')
+            ->addArgument('chronique_id', InputArgument::REQUIRED, 'Identifiant de la chronique')
+            ->addArgument('date_debut', InputArgument::OPTIONAL, 'Début de la période à recalculer')
+            ->addArgument('date_fin', InputArgument::OPTIONAL, 'Fin de la période à recalculer');
+    }
+
+    /**
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @throws EntityNotFoundException
+     * @throws InvalidArgumentException
+     *
+     * @return int Exit code
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $chroniqueId = $input->getArgument('chronique_id');
+        $dateDebutStr = $input->getArgument('date_debut');
+        $dateFinStr = $input->getArgument('date_fin');
+
+        $manager = $this->getContainer()->get('doctrine')->getManagerForClass(ChroniqueContinue::class);
+
+        /** @var ChroniqueRepository $repo */
+        $repo = $manager->getRepository(Chronique::class);
+
+        /** @var Chronique $chronique */
+        $chronique = $repo->findOneById($chroniqueId);
+
+        if (!$chronique) {
+            throw new EntityNotFoundException(sprintf('%s:%d', Chronique::class, $chroniqueId));
+        }
+
+        $utc = new \DateTimeZone('UTC');
+        $dateDebut = $dateDebutStr ? new \DateTime($dateDebutStr, $utc) : null;
+        $dateFin = $dateFinStr ? new \DateTime($dateFinStr, $utc) : null;
+
+        /** @var Observatoire $obs */
+        $obs = $chronique->getStation()->getSites()->first()->getObservatoire();
+        $obs->defineAsCurrent();
+
+        $repo->updateFillingRates($chronique, $dateDebut, $dateFin);
+
+        return 0;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ConvertChroniqueCommand.php b/src/Irstea/BdohDataBundle/Command/ConvertChroniqueCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..b381536b0ef55153b4d7e8037f5a650561ba19d8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ConvertChroniqueCommand.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityNotFoundException;
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueConvertieRepository;
+use Irstea\BdohDataBundle\EventListener\MeasuresUpdateEvent;
+use Irstea\BdohDataBundle\Events;
+use Irstea\BdohSecurityBundle\Entity\Repository\UtilisateurRepository;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * {@inheritdoc}
+ */
+class ConvertChroniqueCommand extends AbstractJobCommand
+{
+    const COMMAND_NAME = 'bdoh:convert:chronique';
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws InvalidArgumentException
+     */
+    protected function configure()
+    {
+        parent::configure();
+        $this
+            ->setName(self::COMMAND_NAME)
+            ->setDescription('Calcule les mesures d\'une chronique convertie.')
+            ->addArgument('chronique_id', InputArgument::REQUIRED, 'Identifiant de la chronique')
+            ->addArgument('user_id', InputArgument::REQUIRED, 'Initiateur de la comande')
+            ->addOption('propagate', 'p', InputOption::VALUE_NONE, 'Propager aux chroniques filles');
+    }
+
+    /**
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @throws EntityNotFoundException
+     * @throws InvalidArgumentException
+     *
+     * @return int Exit code
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $chroniqueId = $input->getArgument('chronique_id');
+        $userId = $input->getArgument('user_id');
+        $propagate = $input->getOption('propagate');
+
+        return $this->getContainer()
+            ->get('doctrine')
+            ->getManagerForClass(ChroniqueConvertie::class)
+            ->transactional(
+                function (EntityManagerInterface $manager) use ($chroniqueId, $userId, $propagate) {
+                    /** @var ChroniqueConvertieRepository $chroRepo */
+                    $chroRepo = $manager->getRepository(ChroniqueConvertie::class);
+
+                    /** @var ChroniqueConvertie $chronique */
+                    $chronique = $chroRepo->findOneById($chroniqueId);
+
+                    if (!$chronique) {
+                        throw new EntityNotFoundException(sprintf('%s:%d', ChroniqueConvertie::class, $chroniqueId));
+                    }
+
+                    /** @var UtilisateurRepository $userRepo */
+                    $userRepo = $manager->getRepository(Utilisateur::class);
+
+                    /** @var Utilisateur $user */
+                    $user = $userRepo->find($userId);
+
+                    if (!$user) {
+                        throw new EntityNotFoundException(sprintf('%s:%d', Utilisateur::class, $userId));
+                    }
+
+                    $result = $chroRepo->convertChronique($chronique);
+
+                    if ($result === 0) {
+                        $manager->refresh($chronique);
+
+                        // met à jour la date de conversion de la chronique (date de mise à jour)
+                        $date = new \DateTime('now', new \DateTimeZone('UTC'));
+                        $chronique->setMiseAJour($date);
+                        // et met à jour l'autorisation des lq ld sur la chronique convertie en fonction de la chronique mère
+                        $chronique->setAllowValueLimits((bool) $chronique->getConversion()->getEntree()->getAllowValueLimits());
+                        $manager->persist($chronique);
+                        $manager->flush();
+
+                        // historique de conversion
+                        $this->getContainer()->get('irstea_bdoh_logger.logger')->createHistoriqueConversionChronique(
+                            $user,
+                            $date,
+                            $chronique->getObservatoire(),
+                            $chronique
+                        );
+
+                        // MeasuresUpdateEvent pour les taux de remplissage et la propagation
+                        $event = new MeasuresUpdateEvent(
+                            $chronique,
+                            $user,
+                            new \DateTime($chronique->getDateDebutMesures()),
+                            new \DateTime($chronique->getDateFinMesures()),
+                            $propagate
+                        );
+                        $this->getContainer()->get('event_dispatcher')->dispatch(Events::MEASURES_UPDATE, $event);
+                    }
+
+                    return $result;
+                }
+            );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ExportCumulativeCommand.php b/src/Irstea/BdohDataBundle/Command/ExportCumulativeCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..82ab1c8af6faece55ec24f17b863fcbc5ec6e7a9
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ExportCumulativeCommand.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use JMS\DiExtraBundle\Annotation as DI;
+
+/**
+ * Class ExportMeanCommand.
+ *
+ * @DI\Service()
+ * @DI\Tag("console.command")
+ */
+class ExportCumulativeCommand extends ExportMeanCommand
+{
+    const EXTRACTOR_TYPE = 'cumulative';
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ExportIdenticalCommand.php b/src/Irstea/BdohDataBundle/Command/ExportIdenticalCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..2826431217f3dcf54a4364560734927df0d0d5f8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ExportIdenticalCommand.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use JMS\DiExtraBundle\Annotation as DI;
+
+/**
+ * Class ExportIdenticalCommand.
+ *
+ * @DI\Service()
+ * @DI\Tag("console.command")
+ */
+class ExportIdenticalCommand extends AbstractExportCommand
+{
+    const EXTRACTOR_TYPE = 'identical';
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ExportInstantaneousCommand.php b/src/Irstea/BdohDataBundle/Command/ExportInstantaneousCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..e490f1234b232a64b80ce9d3e9c4e072ee98d424
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ExportInstantaneousCommand.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+
+/**
+ * Class ExportInstantaneousCommand.
+ *
+ * @DI\Service()
+ * @DI\Tag("console.command")
+ */
+class ExportInstantaneousCommand extends AbstractExportCommand
+{
+    const EXTRACTOR_TYPE = 'instantaneous';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->addArgument('timestep', InputArgument::REQUIRED, 'Pas de temps');
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureParameterResolver(OptionsResolverInterface $resolver)
+    {
+        parent::configureParameterResolver($resolver);
+
+        $resolver->setRequired(['timestep']);
+
+        $resolver->setAllowedTypes(
+            [
+                'timestep' => ['string'],
+            ]
+        );
+
+        $resolver->setNormalizers(
+            [
+                'timestep' => function (Options $options, $value) {
+                    return (int) $value;
+                },
+            ]
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ExportMeanCommand.php b/src/Irstea/BdohDataBundle/Command/ExportMeanCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..d723442fe215ce32afcb4bc2ed8b6b5adad5c6bf
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ExportMeanCommand.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+
+/**
+ * Class ExportMeanCommand.
+ *
+ * @DI\Service()
+ * @DI\Tag("console.command")
+ */
+class ExportMeanCommand extends AbstractExportCommand
+{
+    const EXTRACTOR_TYPE = 'mean';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->addArgument('timestep', InputArgument::REQUIRED, 'Pas de temps');
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configureParameterResolver(OptionsResolverInterface $resolver)
+    {
+        parent::configureParameterResolver($resolver);
+
+        $resolver->setRequired(['timestep']);
+
+        $resolver->setAllowedTypes(
+            [
+                'timestep' => ['string'],
+            ]
+        );
+
+        $resolver->setNormalizers(
+            [
+                'timestep' => function (Options $options, $value) {
+                    return $this->doctrine->getRepository(PasEchantillonnage::class)->findOneById($value);
+                },
+            ]
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Command/ScheduleRecomputeCommand.php b/src/Irstea/BdohDataBundle/Command/ScheduleRecomputeCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ce65acb6906263bddfdda9fe9d52df776629b98
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Command/ScheduleRecomputeCommand.php
@@ -0,0 +1,95 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Command;
+
+use Doctrine\Bundle\DoctrineBundle\Registry;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Class ScheduleRecomputeCommand.
+ *
+ * @DI\Service()
+ * @DI\Tag("console.command")
+ */
+class ScheduleRecomputeCommand extends Command
+{
+    const COMMAND_NAME = 'bdoh:schedule:recompute';
+
+    /**
+     * @var JobManagerInterface
+     */
+    private $jobManager;
+
+    /**
+     * @var Registry
+     */
+    private $doctrine;
+
+    /**
+     * ScheduleRecomputeCommand constructor.
+     *
+     * @param JobManagerInterface $jobManager
+     * @param Registry            $doctrine
+     *
+     * @DI\InjectParams({
+     *     "jobManager" = @DI\Inject("irstea_bdoh.job_manager"),
+     *     "doctrine" = @DI\Inject("doctrine")
+     * })
+     */
+    public function __construct(JobManagerInterface $jobManager, Registry $doctrine)
+    {
+        parent::__construct(self::COMMAND_NAME);
+        $this->jobManager = $jobManager;
+        $this->doctrine = $doctrine;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        parent::configure();
+        $this
+            ->setName(self::COMMAND_NAME)
+            ->setDescription('Planifie un recalcul des lacunes de toutes les chroniques.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        /** @var ChroniqueRepository $repo */
+        $repo = $this->doctrine->getRepository(Chronique::class);
+
+        foreach ($repo->findAll() as $chronique) {
+            $job = $this->jobManager->enqueueComputeFillingRates($chronique);
+            $output->writeln("{$chronique->getObservatoire()->getNom()} {$chronique}: job #{$job->getId()}");
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Controller/DataProvidingController.php b/src/Irstea/BdohDataBundle/Controller/DataProvidingController.php
new file mode 100644
index 0000000000000000000000000000000000000000..563bd71e36a2a13530280b63ff093dddf757af6a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Controller/DataProvidingController.php
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Form\Type\UTCDateTimeType;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\QualiteRepository;
+use Irstea\BdohSecurityBundle\Exception\ForbiddenException;
+use Symfony\Component\Form\Extension\Core\Type\FormType;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+/**
+ * This controller has actions returning data sets,
+ * for chart visualization, displaying of measures table...
+ *
+ * Usually, these actions return JSON data, for Javascript processing.
+ */
+class DataProvidingController extends Controller
+{
+    /**
+     * Returns all measures :
+     *      -> in json format ;
+     *      -> for a given 'chronique'
+     *      -> and beetwen 2 dates.
+     *
+     * @param Request $request
+     * @param $id
+     *
+     * @throws \Exception
+     *
+     * @return Response
+     */
+    public function getChroniqueMeasuresAction(Request $request, $id)
+    {
+        $request->setRequestFormat('json');
+        $params = $this->parseQuery($request);
+        $data = $this->fetchViewerData(
+            (int) $id,
+            $params['beginDate'],
+            $params['endDate']
+        );
+
+        return $this->renderJson($data);
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return array
+     */
+    private function parseQuery(Request $request)
+    {
+        $form = $this->createQueryForm();
+        $form->handleRequest($request);
+        if (!$form->isValid()) {
+            throw new BadRequestHttpException($this->createErrorMessage($form));
+        }
+
+        return $form->getData();
+    }
+
+    /**
+     * @return \Symfony\Component\Form\FormInterface
+     */
+    private function createQueryForm()
+    {
+        return $this->container->get('form.factory')
+            ->createNamedBuilder(null, FormType::class, null, ['csrf_protection' => false])
+            ->setMethod('GET')
+            ->add('beginDate', UTCDateTimeType::class, ['constraints' => [new NotBlank()]])
+            ->add('endDate', UTCDateTimeType::class, ['constraints' => [new NotBlank()]])
+            ->getForm();
+    }
+
+    /**
+     * @param FormInterface $form
+     *
+     * @return Response
+     */
+    private function createErrorMessage($form)
+    {
+        $errors = [];
+        foreach ($form->getErrors(true) as $error) {
+            $property = $error->getOrigin()->getName();
+            $value = json_encode($error->getOrigin()->getViewData());
+            $message = $error->getMessage();
+            $errors[] = "$property: $message ($value)";
+        }
+
+        return implode("\n", $errors);
+    }
+
+    /**
+     * @param $ids
+     * @param \DateTime $beginDate
+     * @param \DateTime $endDate
+     *
+     * @throws \Exception
+     *
+     * @return mixed
+     */
+    private function fetchViewerData($ids, \DateTime $beginDate, \DateTime $endDate)
+    {
+        $authChecker = $this->get('security.authorization_checker');
+
+        /** @var ChroniqueRepository $repository */
+        $repository = $this->getBdohRepo('Chronique');
+
+        $chroniques = $repository->findById(\explode('_', $ids));
+        if (empty($chroniques)) {
+            throw new NotFoundHttpException();
+        }
+
+        $chroniquesAndRights = [];
+        foreach ($chroniques as $chronique) {
+            if (!$this->isGranted('CONSULT_TIMESERIES', $chronique)) {
+                throw new ForbiddenException();
+            }
+            $chroniquesAndRights[] = [$chronique, $authChecker->isGranted('CONSULT_CHECKPOINTS', $chronique)];
+        }
+
+        $maxPoints = $this->container->getParameter('irstea_bdoh_data.viewers.max_valid_display_points');
+
+        $data = $repository->getMultipleChroniquesViewerData(
+            $chroniquesAndRights,
+            $beginDate,
+            $endDate,
+            $maxPoints
+        );
+
+        // construction des données des qualités (style, label, showLabel)
+        /** @var QualiteRepository $qualiteRepo */
+        $qualiteRepo = $this->getBdohRepo('Qualite');
+        $isEnglish = \strpos($this->getTranslator()->getLocale(), 'en') === 0;
+        $qualites = [];
+        foreach ($data['chronicles'] as &$chroniquesData) {
+            foreach ($chroniquesData['series'] as &$serie) {
+                if (isset($serie['label'])) {
+                    $serie['label'] = $this->getTranslator()->trans($serie['label']);
+                } elseif (isset($serie['qualiteId'])) {
+                    $qid = $serie['qualiteId'];
+                    if (!isset($qualites[$qid])) {
+                        $qualites[$qid] = $qualiteRepo->findOneById($qid);
+                    }
+                    $serie['style'] = $qualites[$qid]->getStyle();
+                    if (isset($chroniquesData['discontinuousStyle'])) {
+                        $serie['style'] = \array_merge($serie['style'], $chroniquesData['discontinuousStyle']);
+                    }
+                    $serie['label'] = $qualites[$qid]->getLibelle($isEnglish ? 'en' : 'fr');
+                    $serie['showLabel'] = true;
+                }
+            }
+        }
+
+        return $data;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Controller/DownloadController.php b/src/Irstea/BdohDataBundle/Controller/DownloadController.php
new file mode 100644
index 0000000000000000000000000000000000000000..206c033d8c9b92d136b9a12219bfae445109cf08
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Controller/DownloadController.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Util\HttpFileResponse;
+
+/**
+ * Realizes the following downloads :
+ *      => Download of user conditions.
+ */
+class DownloadController extends Controller
+{
+    /**
+     * Download of user conditions.
+     */
+    public function conditionsAction()
+    {
+        $observatoire = $this->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        $termsOfUses = $observatoire->getConditionsUtilisation();
+        $cguPath = $termsOfUses ?: $this->container->getParameter('irstea_bdoh_data.measure_export.default_termofuses_file');
+
+        return new HttpFileResponse($cguPath, 'application/octet-stream');
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Controller/ExportController.php b/src/Irstea/BdohDataBundle/Controller/ExportController.php
new file mode 100644
index 0000000000000000000000000000000000000000..86cec4db7c033d64b58ab7a86fee0d5b4b5af260
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Controller/ExportController.php
@@ -0,0 +1,280 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Controller;
+
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use JMS\DiExtraBundle\Annotation as DI;
+use JMS\JobQueueBundle\Entity\Job;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
+use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
+use Symfony\Component\Form\Extension\Core\Type\FormType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
+use Symfony\Component\Form\FormError;
+use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+use Symfony\Component\Validator\Constraints\Count;
+use Symfony\Component\Validator\Constraints\GreaterThan;
+use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
+use Symfony\Component\Validator\Constraints\LessThanOrEqual;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+/**
+ * Realizes the following exports :
+ *      => Export of measures for one or several 'chroniques'.
+ */
+class ExportController extends Controller
+{
+    /**
+     * @var JobManagerInterface
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    public $jobManager;
+
+    /**
+     * @var FormFactoryInterface
+     * @DI\Inject("form.factory")
+     */
+    public $formFactory;
+
+    /**
+     * @var AuthorizationCheckerInterface
+     * @DI\Inject("security.authorization_checker")
+     */
+    public $authChecker;
+
+    /**
+     * @Route("/mesure/export", name="bdoh_data_measure_export")
+     * @Method("POST")
+     *
+     * @param Request $request
+     *
+     * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
+     * @throws \InvalidArgumentException
+     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
+     * @throws \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     * @throws \Symfony\Component\Validator\Exception\InvalidOptionsException
+     * @throws \Symfony\Component\Validator\Exception\MissingOptionsException
+     * @throws \LogicException
+     * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
+     *
+     * @return Response
+     */
+    public function chroniquesMeasuresAction(Request $request)
+    {
+        $form = $this->createExportForm();
+        $form->handleRequest($request);
+        if (!$form->isValid()) {
+            return $this->reportFormErrors($form);
+        }
+
+        $params = $form->getData();
+
+        /** @var Collection $chroniques */
+        $chroniques = $params['chroniques'];
+
+        foreach ($chroniques as $chronique) {
+            if (!$this->authChecker->isGranted('DOWNLOAD', $chronique)) {
+                throw new AccessDeniedHttpException();
+            }
+        }
+
+        /** @var \DateTime $beginDate */
+        $beginDate = $params['beginDate'];
+
+        /** @var \DateTime $endDate */
+        $endDate = $params['endDate'];
+
+        $timezone = new \DateTimeZone(sprintf('%+03d00', $params['timezone']));
+
+        switch ($params['exportType']) {
+            case 'instantaneous':
+                $timestep = $params['instantStep'];
+                break;
+            case 'cumulative':
+            case 'mean':
+                $timestep = $params['meanCumulStep']->getId();
+                break;
+            default:
+                $timestep = null;
+        }
+
+        $job = $this->jobManager->enqueueExport(
+            $this->getUser(),
+            $params['exportType'],
+            $params['exportFormat'],
+            $beginDate,
+            $endDate,
+            $chroniques->toArray(),
+            $timestep,
+            $timezone,
+            $this->isLocaleEn() ? 'en' : 'fr'
+        );
+
+        $this->reportJobToUser($request, $job);
+
+        return $this->redirectToReferer();
+    }
+
+    /**
+     * @throws \Symfony\Component\Validator\Exception\MissingOptionsException
+     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
+     * @throws \Symfony\Component\Validator\Exception\InvalidOptionsException
+     * @throws \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     *
+     * @return FormInterface
+     */
+    private function createExportForm()
+    {
+        $dateOptions = [
+            'widget'         => 'single_text',
+            'format'         => DateTimeType::HTML5_FORMAT,
+            'model_timezone' => 'UTC',
+            'view_timezone'  => 'UTC',
+            'constraints'    => [new NotBlank()],
+        ];
+
+        return $this->formFactory
+            ->createNamedBuilder(null, FormType::class, null, ['csrf_protection' => false])
+            ->add('beginDate', DateTimeType::class, $dateOptions)
+            ->add('endDate', DateTimeType::class, $dateOptions)
+            ->add(
+                'exportFormat',
+                ChoiceType::class,
+                [
+                    'choices'     => [
+                        'Bdoh'      => 'Bdoh',
+                        'Qtvar'     => 'Qtvar',
+                        'Vigilance' => 'Vigilance',
+                    ],
+                    'constraints' => [new NotBlank()],
+                ]
+            )
+            ->add(
+                'exportType',
+                ChoiceType::class,
+                [
+                    'choices'     => [
+                        'identical'     => 'identical',
+                        'instantaneous' => 'instantaneous',
+                        'mean'          => 'mean',
+                        'cumulative'    => 'cumulative',
+                    ],
+                    'constraints' => [new NotBlank()],
+                ]
+            )
+            ->add(
+                'instantStep',
+                IntegerType::class,
+                [
+                    'constraints' => [
+                        new NotBlank(),
+                        new GreaterThan(0),
+                        new LessThanOrEqual(1440),
+                    ],
+                ]
+            )
+            ->add(
+                'meanCumulStep',
+                EntityType::class,
+                ['class' => PasEchantillonnage::class]
+            )
+            ->add(
+                'timezone',
+                IntegerType::class,
+                [
+                    'constraints' => [
+                        new NotBlank(),
+                        new GreaterThanOrEqual(-12),
+                        new LessThanOrEqual(12),
+                    ],
+                ]
+            )
+            ->add(
+                'chroniques',
+                EntityType::class,
+                [
+                    'class'       => Chronique::class,
+                    'multiple'    => true,
+                    'constraints' => [new Count(['min' => 1])],
+                ]
+            )
+            ->add(
+                'termsOfUses',
+                CheckboxType::class,
+                ['constraints' => [new NotBlank()]]
+            )
+            ->getForm();
+    }
+
+    /**
+     * @param FormInterface $form
+     *
+     * @return JsonResponse
+     */
+    private function reportFormErrors(FormInterface $form)
+    {
+        $msg = [
+            'status'  => Response::HTTP_BAD_REQUEST,
+            'message' => 'Bad request',
+            'details' => [],
+        ];
+
+        foreach ($form->getErrors(true) as $error) {
+            /** @var FormError $error */
+            $path = $error->getOrigin()->getPropertyPath();
+            $msg['details'][(string) $path] = [
+                'message' => $error->getMessage(),
+                'value'   => $error->getOrigin()->getViewData(),
+            ];
+        }
+
+        return new JsonResponse($msg, $msg['status']);
+    }
+
+    /**
+     * @param Request $request
+     * @param Job     $job
+     */
+    private function reportJobToUser(Request $request, Job $job)
+    {
+        /** @var Session $session */
+        $session = $request->getSession();
+        $session->getFlashBag()->add(
+            'info',
+            $this->getTranslator()->trans('measure.export.job_queued(%job_id%)', ['%job_id%' => $job->getId()])
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Controller/JobController.php b/src/Irstea/BdohDataBundle/Controller/JobController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1fc2b6d6043b526afcbe829c220a31b382579fbe
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Controller/JobController.php
@@ -0,0 +1,184 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Controller;
+
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohBundle\Manager\ObservatoireManagerInterface;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohSecurityBundle\Security\Voter\JobVoter;
+use JMS\DiExtraBundle\Annotation as DI;
+use JMS\JobQueueBundle\Entity\Job;
+use JMS\JobQueueBundle\Entity\Repository\JobRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+
+/**
+ * Class JobController.
+ *
+ * @Route("/jobs")
+ */
+class JobController extends Controller
+{
+    /**
+     * @var RegistryInterface
+     *
+     * @DI\Inject("doctrine")
+     */
+    public $doctrine;
+
+    /**
+     * @var ObservatoireManagerInterface
+     *
+     * @DI\Inject("irstea_bdoh.manager.observatoire")
+     */
+    public $observatoireManager;
+
+    /**
+     * @var AuthorizationCheckerInterface
+     *
+     * @DI\Inject("security.authorization_checker")
+     */
+    public $authChecker;
+
+    /**
+     * @var JobManagerInterface
+     *
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    public $jobManager;
+
+    /**
+     * @Route("/", name="bdoh_job_list")
+     * @Method("GET")
+     * @Template("@IrsteaBdohData/Job/all.html.twig")
+     */
+    public function indexAction()
+    {
+        $obs = $this->observatoireManager->getCurrent();
+
+        if (!$this->authChecker->isGranted(JobVoter::LIST_PERM, $obs)) {
+            throw new AccessDeniedHttpException();
+        }
+
+        /** @var JobRepository $repo */
+        $repo = $this->doctrine->getRepository(Job::class);
+        $jobs = $repo->findBy([], ['id' => 'DESC'], 250);
+
+        return ['jobs' => array_map([$this, 'prepareJob'], $jobs)];
+    }
+
+    /**
+     * @Route("/{id}", name="bdoh_job_show")
+     * @Method("GET")
+     * @Security("is_granted('JOB_SHOW', job)")
+     * @Template("@IrsteaBdohData/Job/show.html.twig")
+     */
+    public function showAction(Job $job)
+    {
+        return ['job' => $this->prepareJob($job)];
+    }
+
+    /**
+     * @Route("/{id}", name="bdoh_job_update")
+     * @Method("POST")
+     *
+     * @param Request $request
+     * @param Job     $job
+     *
+     * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
+     * @throws \InvalidArgumentException
+     * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function updateAction(Request $request, Job $job)
+    {
+        $action = $request->request->get('action');
+        switch ($action) {
+            case 'cancel':
+                if (!$this->authChecker->isGranted(JobVoter::CANCEL_PERM, $job)) {
+                    throw new AccessDeniedHttpException();
+                }
+                $this->jobManager->cancel($job);
+                break;
+
+            case 'retry':
+                if (!$this->authChecker->isGranted(JobVoter::RETRY_PERM, $job)) {
+                    throw new AccessDeniedHttpException();
+                }
+                $job = $this->jobManager->retry($job);
+                break;
+
+            default:
+                throw new BadRequestHttpException(sprintf('Unknown action %s', $action));
+        }
+
+        return $this->redirectToRoute('bdoh_job_show', ['id' => $job->getId()]);
+    }
+
+    /**
+     * @param Job $job
+     *
+     * @return array
+     */
+    public function prepareJob(Job $job)
+    {
+        $started = !$job->isNew() && !$job->isPending() && !$job->isCanceled();
+        $ran = $started && $job->isInFinalState();
+
+        if ($job->isPending() && $job->isStartable() && $job->getExecuteAfter() < new \DateTime()) {
+            $state = 'ready';
+        } else {
+            $state = $job->getState();
+        }
+
+        return [
+            'entity'         => $job,
+            'owner'          => $job->findRelatedEntity(Utilisateur::class),
+            'observatoire'   => $job->findRelatedEntity(Observatoire::class),
+            'chroniques'     => $job->getRelatedEntities()->filter(
+                function ($c) {
+                    return $c instanceof Chronique;
+                }
+            ),
+            'state'          => $state,
+            'started'        => $started,
+            'ran'            => $ran,
+            'final'          => $job->isInFinalState(),
+            'showable'       => $this->authChecker->isGranted(JobVoter::SHOW_PERM, $job),
+            'cancelable'     => $this->jobManager->canCancel($job),
+            'cancel_granted' => $this->authChecker->isGranted(JobVoter::CANCEL_PERM, $job),
+            'retriable'      => $this->jobManager->canRetry($job),
+            'retry_granted'  => $this->authChecker->isGranted(JobVoter::RETRY_PERM, $job),
+        ];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/AbstractYamlFixture.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/AbstractYamlFixture.php
new file mode 100644
index 0000000000000000000000000000000000000000..3db0332bb2c83fc8627f06af7a3ea21c3374d709
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/AbstractYamlFixture.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM;
+
+use Doctrine\Common\DataFixtures\AbstractFixture;
+use Doctrine\Common\Persistence\ObjectManager;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Class AbstractYamlFixture.
+ */
+abstract class AbstractYamlFixture extends AbstractFixture
+{
+    /**
+     * Entry point of data loading.
+     */
+    public function load(ObjectManager $manager)
+    {
+        $data = $this->readYaml();
+        $this->loadEntities($data, $manager);
+        $manager->flush();
+    }
+
+    /**
+     * @return array
+     */
+    protected function readYaml()
+    {
+        $path = $this->getFilePath();
+        $content = file_get_contents($path);
+
+        return Yaml::parse($content);
+    }
+
+    /**
+     * @return string
+     */
+    protected function getFilePath()
+    {
+        return $this->getBaseDir() . '/files/' . $this->getFilename();
+    }
+
+    /**
+     * @return string
+     */
+    protected function getFilename()
+    {
+        $parts = explode('\\', get_class($this));
+
+        return end($parts) . 'Data.yml';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getBaseDir()
+    {
+        $reflThis = new \ReflectionObject($this);
+
+        return dirname($reflThis->getFileName());
+    }
+
+    /**
+     * @param array         $data
+     * @param ObjectManager $manager
+     *
+     * @return mixed
+     */
+    protected function loadEntities(array $data, ObjectManager $manager)
+    {
+        foreach ($data as $key => $entityData) {
+            $entity = $this->loadEntity($entityData, $key);
+            $manager->persist($entity);
+            $this->setReference(get_class($entity) . $key, $entity);
+        }
+    }
+
+    /**
+     * @param array  $data
+     * @param string $key
+     *
+     * @return mixed
+     */
+    abstract protected function loadEntity(array $data, $key);
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/BaremeJeuBaremes.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/BaremeJeuBaremes.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d87ea78ec5bef36162977757d87ce82308e3ed6
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/BaremeJeuBaremes.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Bareme;
+use Irstea\BdohDataBundle\Entity\BaremeJeuBareme;
+use Irstea\BdohDataBundle\Entity\JeuBareme;
+
+/**
+ * {@inheritdoc}
+ */
+class BaremeJeuBaremes extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [Baremes::class, JeuxBaremes::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $def, $nom)
+    {
+        $bareme = $this->getReference(Bareme::class . $def['bareme']);
+        $jeuBareme = $this->getReference(JeuBareme::class . $def['jeuBareme']);
+
+        $baremeJeuBareme = new BaremeJeuBareme();
+        $baremeJeuBareme->setBareme($bareme);
+        $baremeJeuBareme->setJeuBareme($jeuBareme);
+        $baremeJeuBareme->setDebutValidite(new \DateTime($def['debutValidite']));
+        $baremeJeuBareme->setFinValidite(new \DateTime($def['finValidite']));
+
+        return $baremeJeuBareme;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Baremes.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Baremes.php
new file mode 100644
index 0000000000000000000000000000000000000000..0dfcbe8c2332847d29fc66dbff5c5abccddffef9
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Baremes.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Bareme;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Unite;
+
+/**
+ * {@inheritdoc}
+ */
+class Baremes extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [Observatoires::class, Unites::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $baremeData, $nomBareme)
+    {
+        $observatoire = $this->getReference(Observatoire::class . $baremeData['observatoire']);
+
+        $bareme = new Bareme();
+        $bareme->setNom($nomBareme);
+        $bareme->setCommentaire($baremeData['commentaire']);
+        $bareme->setObservatoire($observatoire);
+
+        if (array_key_exists('uniteentree', $baremeData)) {
+            $unite = $this->getReference(Unite::class . $baremeData['uniteentree']);
+            $bareme->setUniteEntree($unite);
+        }
+
+        if (array_key_exists('unitesortie', $baremeData)) {
+            $unite = $this->getReference(Unite::class . $baremeData['unitesortie']);
+            $bareme->setUniteSortie($unite);
+        }
+
+        $bareme->setValeurs($baremeData['valeurs']);
+        $bareme->setDateCreation(new \DateTime());
+
+        return $bareme;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesCalculees.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesCalculees.php
new file mode 100644
index 0000000000000000000000000000000000000000..49df58555ee23798365f0604d524af4c97b8b9c3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesCalculees.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+
+/**
+ * {@inheritdoc}
+ */
+class ChroniquesCalculees extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [TypeParametres::class, Stations::class, Echantillonnages::class, Unites::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $chroniqueData, $nomChronique)
+    {
+        /** @var Echantillonnage $echantillonnage */
+        $echantillonnage = $this->getReference(Echantillonnage::class . 'instantaneous');
+
+        /** @var TypeParametre $param */
+        $param = $this->getReference(TypeParametre::class . $chroniqueData['typeParametre']);
+
+        /** @var Station $station */
+        $station = $this->getReference(Station::class . $chroniqueData['station']);
+
+        /** @var Unite $unite */
+        $unite = $this->getReference(Unite::class . $chroniqueData['unite']);
+
+        $chronique = new ChroniqueCalculee();
+        $chronique->setLibelle($nomChronique);
+        $chronique->setCode($chroniqueData['code']);
+        $chronique->setUnite($unite);
+        $chronique->setGenealogie($chroniqueData['genealogie']);
+        $chronique->setEstVisible($chroniqueData['estVisible']);
+        $chronique->setFacteurMultiplicatif($chroniqueData['coefficient']);
+        $chronique->setParametre($param);
+        $chronique->setStation($station);
+        $chronique->setEchantillonnage($echantillonnage);
+
+        return $chronique;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesContinues.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesContinues.php
new file mode 100644
index 0000000000000000000000000000000000000000..09ef29a979980d2fa2d03af51e65272357952b4b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/ChroniquesContinues.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+
+/**
+ * {@inheritdoc}
+ */
+class ChroniquesContinues extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [Stations::class, Unites::class, TypeParametres::class, Echantillonnages::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $data, $code)
+    {
+        /** @var Station $station */
+        $station = $this->getReference(Station::class . $data['station']);
+
+        /** @var Unite $unite */
+        $unite = $this->getReference(Unite::class . $data['unite']);
+
+        /** @var TypeParametre $param */
+        $param = $this->getReference(TypeParametre::class . $data['parametre']);
+
+        /** @var Echantillonnage $echantillonnage */
+        $echantillonnage = $this->getReference(Echantillonnage::class . $data['echantillonnage']);
+
+        $chronique = new ChroniqueContinue();
+        $chronique->setCode($code);
+        $chronique->setLibelle($data['libelle']);
+        $chronique->setUnite($unite);
+        $chronique->setParametre($param);
+        $chronique->setStation($station);
+        $chronique->setEchantillonnage($echantillonnage);
+
+        return $chronique;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Datasets.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Datasets.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ff1120476eaf65f6009368b6dbcb17308550949
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Datasets.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+class Datasets extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFilename()
+    {
+        return 'OSSData.yml';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [\Irstea\BdohDataBundle\DataFixtures\ORM\Test\Observatoires::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function readYaml()
+    {
+        $data = parent::readYaml();
+
+        $res = [];
+        foreach ($data as $nomObs => $obs) {
+            foreach ($obs['Datasets'] as $nom => $_stations) {
+                $res[$nom] = ['observatoire' => $nomObs];
+            }
+        }
+
+        return $res;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $datasetData, $titreDataset)
+    {
+        /* @var Observatoire $observatoire */
+        $observatoire = $this->getReference(Observatoire::class . $datasetData['observatoire']);
+
+        $dataset = new \Irstea\BdohDataBundle\Entity\DataSet();
+        $dataset->setTitre($titreDataset);
+        $dataset->setDescription($titreDataset);
+        $dataset->setGenealogie($titreDataset);
+        $dataset->setObservatoire($observatoire);
+
+        return $dataset;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Echantillonnages.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Echantillonnages.php
new file mode 100644
index 0000000000000000000000000000000000000000..25012ece615bbfb6a9668f20dea97a299da32889
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Echantillonnages.php
@@ -0,0 +1,48 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+
+/**
+ * Class Echantillonnages.
+ */
+class Echantillonnages extends AbstractYamlFixture
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $properties, $code)
+    {
+        $samp = new Echantillonnage();
+
+        $samp->setCode($code);
+        $samp->setOrdreSortie($properties['ordreSortie']);
+        $samp->setHasDirection($properties['hasDirection']);
+        $samp->setNom($properties['nom']);
+        $samp->setNomEn($properties['nomEn']);
+
+        return $samp;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxBaremes.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxBaremes.php
new file mode 100644
index 0000000000000000000000000000000000000000..da3fa3d34510e6ae2ecaf501f58930be2b488549
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxBaremes.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\JeuBareme;
+
+/**
+ * {@inheritdoc}
+ */
+class JeuxBaremes extends AbstractYamlFixture
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $dummy, $libelleJeuBaremes)
+    {
+        return new JeuBareme();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxQualites.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxQualites.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f95279043d850ff4a732b184791711bb3b6f249
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/JeuxQualites.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\JeuQualite;
+use Irstea\BdohDataBundle\Entity\Qualite;
+
+/**
+ * {@inheritdoc}
+ */
+class JeuxQualites extends AbstractYamlFixture
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $jeuData, $nomJeu)
+    {
+        $jeu = new JeuQualite();
+        $jeu->setNom($nomJeu);
+        $jeu->setEstAffectable($jeuData['estAffectable'] ?? false);
+
+        /* Loads 'Qualites' of current 'JeuQualite' */
+        foreach ($jeuData['qualites'] as $code => $qualiteData) {
+            $qualite = new Qualite();
+            $qualite->setJeu($jeu);
+            $qualite->setCode($code);
+            $qualite->setLibelle($qualiteData[0]);
+            $qualite->setLibelleEn($qualiteData[1]);
+            $qualite->setOrdre(count($qualiteData) > 2 ? $qualiteData[2] : null);
+            if ($nomJeu === 'Draix' || $nomJeu === 'VALID') {
+                if ($qualite->getOrdre() < 2) {
+                    $qualite->setType('gap');
+                }
+            }
+
+            $jeu->addQualite($qualite);
+        }
+
+        return $jeu;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Observatoires.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Observatoires.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1aaae76e395fa54a1f3363d0b25b72b0630d1b4
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Observatoires.php
@@ -0,0 +1,66 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\JeuQualite;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+/**
+ * Observatoires.
+ */
+class Observatoires extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFilename()
+    {
+        return 'OSSData.yml';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [JeuxQualites::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $observatoireData, $nomObs)
+    {
+        $observatoire = new Observatoire();
+        $observatoire->setNom($nomObs);
+
+        /* Defines 'JeuQualite' */
+        /** @var JeuQualite $jeuQualite */
+        $jeuQualite = $this->getReference(JeuQualite::class . ($observatoireData['JeuQualite'] ?? 'VALID'));
+        $observatoire->setJeu($jeuQualite);
+
+        return $observatoire;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/SitesExperimentaux.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/SitesExperimentaux.php
new file mode 100644
index 0000000000000000000000000000000000000000..308f001679f9507c7e79e8086a891b1bd5b68ac3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/SitesExperimentaux.php
@@ -0,0 +1,82 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+
+/**
+ * Class SitesExperimentaux.
+ */
+class SitesExperimentaux extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFilename()
+    {
+        return 'OSSData.yml';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [\Irstea\BdohDataBundle\DataFixtures\ORM\Test\Observatoires::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function readYaml()
+    {
+        $data = parent::readYaml();
+
+        $res = [];
+        foreach ($data as $nomObs => $obs) {
+            foreach ($obs['Sites'] as $nom => $_stations) {
+                $res[$nom] = ['observatoire' => $nomObs];
+            }
+        }
+
+        return $res;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $siteData, $nomSite)
+    {
+        /* @var Observatoire $observatoire */
+        $observatoire = $this->getReference(Observatoire::class . $siteData['observatoire']);
+
+        $siteExperimental = new SiteExperimental();
+        $siteExperimental->setNom($nomSite);
+        $siteExperimental->setObservatoire($observatoire);
+
+        return $siteExperimental;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Stations.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Stations.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e72bd5ae6e7e2c6a657089511e5d425ec4245cd
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Stations.php
@@ -0,0 +1,93 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Irstea\BdohDataBundle\Entity\Station;
+
+/**
+ * Class Stations.
+ */
+class Stations extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFilename()
+    {
+        return 'OSSData.yml';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [SitesExperimentaux::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function readYaml()
+    {
+        $data = parent::readYaml();
+
+        $res = [];
+        foreach ($data as $obs) {
+            foreach ($obs['Sites'] as $nomSite => $stations) {
+                foreach ($stations as $nomStation => $station) {
+                    $station['site'] = $nomSite;
+                    $res[$nomStation] = $station;
+                }
+            }
+        }
+
+        return $res;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $stationData, $nomStation)
+    {
+        /** @var SiteExperimental $siteExperimental */
+        $siteExperimental = $this->getReference(SiteExperimental::class . $stationData['site']);
+        unset($stationData['site']);
+
+        $station = new Station();
+        $station->setNom($nomStation);
+        $station->addSite($siteExperimental);
+        $station->setCode($nomStation);
+        $this->setReference(Station::class . $nomStation, $station);
+
+        foreach ($stationData as $field => $value) {
+            $setter = 'set' . ucfirst($field);
+            $station->$setter($value);
+        }
+
+        return $station;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Transformations.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Transformations.php
new file mode 100644
index 0000000000000000000000000000000000000000..552934149c6c5444bf9d47315aeff1db1e1fb5b1
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Transformations.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\JeuBareme;
+use Irstea\BdohDataBundle\Entity\Transformation;
+
+/**
+ * {@inheritdoc}
+ */
+class Transformations extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [ChroniquesContinues::class, JeuxBaremes::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $transformationData, $nomTransformation)
+    {
+        $chroniqueMere = $this->getReference(ChroniqueContinue::class . $transformationData['entree']);
+        $jeuBareme = $this->getReference(JeuBareme::class . $transformationData['jeuBaremeActuel']);
+
+        $transformation = new Transformation();
+        $transformation->setEntree($chroniqueMere);
+        $transformation->setJeuBaremeActuel($jeuBareme);
+
+        return $transformation;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/TypeParametres.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/TypeParametres.php
new file mode 100644
index 0000000000000000000000000000000000000000..036342bb03e920967023423177be28ec5c8ba114
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/TypeParametres.php
@@ -0,0 +1,61 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+
+/**
+ * Class TypeParametres.
+ */
+class TypeParametres extends AbstractYamlFixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [Unites::class];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $parametreData, $nomParam)
+    {
+        $typeParametre = new TypeParametre();
+        $typeParametre->setNom($nomParam);
+        $typeParametre->setNomEn($parametreData['en']);
+        $typeParametre->setCode($parametreData['code']);
+
+        foreach ($parametreData['unites'] as $libelleUnite) {
+            /** @var Unite $unite */
+            $unite = $this->getReference(Unite::class . $libelleUnite);
+            $typeParametre->addUnite($unite);
+        }
+
+        return $typeParametre;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Unites.php b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Unites.php
new file mode 100644
index 0000000000000000000000000000000000000000..d638ba593aa40d2c95e548d3c1b5f49ff0e10f0d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/Unites.php
@@ -0,0 +1,43 @@
+<?php
+declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DataFixtures\ORM\Test;
+
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\Entity\Unite;
+
+/**
+ * Class Unites.
+ */
+class Unites extends AbstractYamlFixture
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $_dummy, $libelleUnite)
+    {
+        $unite = new Unite();
+        $unite->setLibelle($libelleUnite);
+
+        return $unite;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremeJeuBaremesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremeJeuBaremesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..16909bf8a37bd2c9f86358576fef298f3e8f6e01
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremeJeuBaremesData.yml
@@ -0,0 +1,11 @@
+#####
+#
+# BaremeJeuBaremes pour les transformations de chroniques
+#
+#####
+
+BJB Test Charbo:
+    jeuBareme: Jeu de barêmes Test Charbo
+    bareme: Bareme test Station Charbo
+    debutValidite: '2010-01-01 00:00:00'
+    finValidite: '2013-12-31 23:59:59'
\ No newline at end of file
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..97a6ea03d25658db40872d6203f8ecb8be07cf01
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/BaremesData.yml
@@ -0,0 +1,11 @@
+#####
+#
+# Baremes
+#
+#####
+Bareme test Station Charbo:
+    observatoire: Bac à sable
+    commentaire: Courbe de tarage sur la station charbonnières
+    uniteentree: mm
+    unitesortie: L/s
+    valeurs: [['0','0','4','-1','-1'],['0.02','0','4','-1','-1'],['0.04','0','4','-1','-1'],['0.06','0.005084551','4','-1','-1'],['0.08','0.148565149','4','-1','-1'],['0.1','0.593953133','4','-1','-1'],['0.12','1.441101398','4','-1','-1'],['0.14','2.768889755','4','-1','-1'],['0.16','4.644799557','4','-1','-1'],['0.18','7.128806641','4','-1','-1'],['0.2','10.27545046','4','-1','-1'],['0.22','14.13509432','4','-1','-1'],['0.24','18.75476165','4','-1','-1'],['0.26','24.17872504','4','-1','-1'],['0.28','30.44893982','4','-1','-1'],['0.3','37.60537432','4','-1','-1'],['0.32','45.68626834','4','-1','-1'],['0.34','54.7283399','4','-1','-1'],['0.36','64.76695384','4','-1','-1'],['0.38','75.83626134','4','-1','-1'],['0.4','87.96931695','4','-1','-1'],['0.42','118.7649305','4','-1','-1'],['0.44','171.7828514','4','-1','-1'],['0.46','238.2444828','4','-1','-1'],['0.48','315.5148351','4','-1','-1'],['0.5','402.1133353','4','-1','-1'],['0.52','497.0516245','4','-1','-1'],['0.54','599.6075535','4','-1','-1'],['0.56','709.2227511','4','-1','-1'],['0.58','825.4482964','4','-1','-1'],['0.6','947.912787','4','-1','-1'],['0.62','1076.302148','4','-1','-1'],['0.64','1210.346139','4','-1','-1'],['0.66','1349.808952','4','-1','-1'],['0.68','1494.48241','4','-1','-1'],['0.7','1644.180929','4','-1','-1'],['0.72','1798.737672','4','-1','-1'],['0.74','1958.001578','4','-1','-1'],['0.76','2121.835001','4','-1','-1'],['0.78','2290.111826','4','-1','-1'],['0.8','2462.715932','4','-1','-1'],['0.82','2639.539935','4','-1','-1'],['0.84','2820.484133','4','-1','-1'],['0.86','3005.455631','4','-1','-1'],['0.88','3194.367594','4','-1','-1'],['0.9','3387.138615','4','-1','-1'],['0.92','3583.692165','4','-1','-1'],['0.94','3783.956125','4','-1','-1'],['0.96','3987.862377','4','-1','-1'],['0.98','4195.346444','4','-1','-1'],['1','4406.347176','4','-1','-1'],['1.02','4620.806472','4','-1','-1'],['1.04','4838.669033','4','-1','-1'],['1.06','5059.882147','4','-1','-1'],['1.08','5284.395486','4','-1','-1'],['1.1','5512.160937','4','-1','-1'],['1.12','5743.13244','4','-1','-1'],['1.14','5977.265846','4','-1','-1'],['1.16','6214.518791','4','-1','-1'],['1.18','6454.850574','4','-1','-1']]
\ No newline at end of file
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesCalculeesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesCalculeesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a06af7034e55bf15603069cd9d61f6524e4b0ba
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesCalculeesData.yml
@@ -0,0 +1,23 @@
+#####
+#
+# Chroniques calculées
+#
+#####
+Débit calculé Charbonnières vierge:
+    unite: L/s
+    typeParametre: Débit liquide
+    station: FICTIVE 1
+    code: DEBFI
+    genealogie: Débit test chronique calculée
+    estVisible: true
+    coefficient: 1
+
+Débit calculé Charbonnières avec barêmes:
+    unite: L/s
+    typeParametre: Débit liquide
+    station: FICTIVE 2
+    code: DEBFIM
+    genealogie: Débit test avec barêmes
+    estVisible: true
+    coefficient: 1
+    premiereEntree: Transformation Test Charbo
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesContinuesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesContinuesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..79d18b36be037eb35457c293dfa0e308a5c628c7
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/ChroniquesContinuesData.yml
@@ -0,0 +1,20 @@
+PLUVIO:
+  station: FICTIVE 1
+  libelle: Précipitation ici-bas
+  unite: mm
+  parametre: Précipitation
+  echantillonnage: instantaneous
+
+LIMNI:
+  station: FICTIVE 1
+  libelle: Hauteur d'eau dans l'eau
+  unite: cm
+  parametre: Hauteur d'eau
+  echantillonnage: instantaneous
+
+HAUTEAU:
+  station: FICTIVE 1
+  libelle: Hauteur d'eau dans notre cours
+  unite: mm
+  parametre: Hauteur d'eau
+  echantillonnage: instantaneous
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/EchantillonnagesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/EchantillonnagesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d5e0f39bd53d284c1d800bf437563a55bcd1f2d0
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/EchantillonnagesData.yml
@@ -0,0 +1,15 @@
+instantaneous:
+    ordreSortie: 4
+    hasDirection: false
+    nom: Interpolation linéaire
+    nomEn: Linear intepolation
+mean:
+    ordreSortie: 8
+    hasDirection: true
+    nom: Moyenne
+    nomEn: Mean
+cumulative:
+    ordreSortie: 12
+    hasDirection: true
+    nom: Cumul
+    nomEn: Accumulation
\ No newline at end of file
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxBaremesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxBaremesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ac844e40e4dd7a513cd276d38880423c4da89788
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxBaremesData.yml
@@ -0,0 +1,7 @@
+#####
+#
+# JeuxBaremes pour les transformations de chroniques
+#
+#####
+
+Jeu de barêmes Test Charbo: {}
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxQualitesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxQualitesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f53b46755a377bd4d8e82b90c7236757d5e7e1d8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/JeuxQualitesData.yml
@@ -0,0 +1,78 @@
+#####
+# JeuxQualites, Qualites and their mappings.
+#####
+
+VALID:
+    estAffectable: true
+    qualites:
+        v:   [Valide                   , Valid                , 800]
+        a:   [Absente                  , Missing              , 300]
+        l:   [Lacune                   , Gap                  , 100]
+        i:   [Invalide                 , Invalid              , 200]
+        d:   [Douteuse                 , Uncertain            , 400]
+        e:   [Estimée                  , Estimated            , 500]
+        lq:  [Limite de quantification , Quantification limit , 600]
+        ld:  [Limite de détection      , Detection limit      , 700]
+        gap: [Lacune technique         , Technical gap        , 100]
+    traductions:
+        Hydro2    : { v: 9, a: 0, l: gap, i: gap, d: 5, gap: gap }
+        VALID     : { v: v, a: a, l: l,   i: i,   d: d, gap: l,   ld: ld, lq: lq, e: e }
+
+##################################################
+Draix:
+    estAffectable: true
+    qualites:
+        "0":   [Lacune           , Gap           , 100]
+        "1":   [Absente          , Missing       , 400]
+        "2":   [Bonne            , Good          , 900]
+        "3":   [Moyenne          , Average       , 800]
+        "4":   [Douteuse         , Uncertain     , 300]
+        "5":   [Très douteuse    , Very uncertain, 200]
+        gap:   [Lacune technique , Technical gap , 100]
+    traductions:
+        Hydro2:
+            "0": gap
+            "1": 0
+            "2": 9
+            "3": 5
+            "4": 5
+            "5": 5
+            "gap": gap
+        Draix:
+            "0": 0
+            "1": 1
+            "2": 2
+            "3": 3
+            "4": 4
+            "5": 5
+            gap: 0
+
+##################################################
+Hydro2:
+    qualites:
+        "0": [ Absente               , Missing            ]
+        "9": [ Bonne                 , Good               ]
+        "5": [ Estimée               , Estimated          ]
+        "8": [ Reconstituée bonne    , Rebuilt good       ]
+        I:   [ Valeur inconnue faible, Unknown low value  ]
+        S:   [ Valeur inconnue forte , Unknown high value ]
+        gap: [ Lacune technique      , Technical gap      ]
+    traductions:
+        VALID:
+            "0": a
+            "9": v
+            "5": d
+            "8": v
+            I: d
+            S: d
+            gap: l
+        Draix:
+            "0": 1
+            "9": 2
+            "5": 4
+            "8": 2
+            I: 4
+            S: 4
+            gap: 0
+
+
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/OSSData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/OSSData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b59a2ccaa30461e83f5567815fd485d95385224c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/OSSData.yml
@@ -0,0 +1,26 @@
+#####
+# Observatoires, Sites expérimentaux and Stations.
+#####
+
+### Bac à sable ###
+Bac à sable:
+    Sites:
+        Bac à sable:
+            FICTIVE 1 :
+                code           : F1
+                codeAlternatif : HYDRO2_F1; VIGI_F1
+                altitude       : 102
+
+            FICTIVE 2 :
+                code      : F2
+                altitude  : 1856
+                estActive : false
+
+            FICTIVE 3 : []
+    Datasets:
+        Patate:
+            description: Description Test
+            genealogie: Genealogie Test
+        Jeu de données Test2:
+            description: Description Test2
+            genealogie: Genealogie Test2
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TransformationsData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TransformationsData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d4891371070eef501097eaeabe791b03ef923bad
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TransformationsData.yml
@@ -0,0 +1,9 @@
+#####
+#
+# Transformations (de chroniques)
+#
+#####
+
+Transformation Test Charbo:
+    entree: HAUTEAU
+    jeuBaremeActuel: Jeu de barêmes Test Charbo
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TypeParametresData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TypeParametresData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..679883efd2da8c899bf0309e89cb59a774d6ed55
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/TypeParametresData.yml
@@ -0,0 +1,188 @@
+#####
+# TypeParametres.
+#####
+
+Co. en azote Kjeldahl NK:
+    en: Co. en azote Kjeldahl NK
+    unites: [mg/L]
+    code: CNK
+
+Co. en azote ammonium N-NH4:
+    en: Co. en azote ammonium N-NH4
+    unites: [mg/L]
+    code: CNH4
+
+Co. en azote nitrate N-N03:
+    en: Co. en azote nitrate N-N03
+    unites: [mg/L]
+    code: CNO3
+
+Co. en azote nitrite N-NO2:
+    en: Co. en azote nitrite N-NO2
+    unites: [mg/L]
+    code: CNO2
+
+Co. en carbone inorganique dissous DIC:
+    en: Co. en carbone inorganique dissous DIC
+    unites: [mg/L]
+    code: CDIC
+
+Co. en carbone organique dissous DOC:
+    en: Co. en carbone organique dissous DOC
+    unites: [mg/L]
+    code: CDOC
+
+Co. en chlorure Cl:
+    en: Co. en chlorure Cl
+    unites: [mg/L]
+    code: CCL
+
+Co. en MES:
+    en: Co. en MES
+    unites: [mg/L, g/L]
+    code: CMES
+
+Co. en phosphore phosphate P-PO4:
+    en: Co. en phosphore phosphate P-PO4
+    unites: [mg/L]
+    code: CPO4
+
+Co. en phosphore total PT:
+    en: Co. en phosphore total PT
+    unites: [mg/L]
+    code: CPT
+
+Co. en potassium K:
+    en: Co. en potassium K
+    unites: [mg/L]
+    code: CK
+
+Conductivité:
+    en: Conductivité
+    unites: [Sm-1]
+    code: COND
+
+Débit:
+    en: Débit
+    unites: [L/s, m3/s]
+    code: DEB
+
+Débit liquide:
+    en: Débit liquide
+    unites: [L/s, m3/s]
+    code: DEBL
+
+Débit solide:
+    en: Débit solide
+    unites: [L/s, m3/s]
+    code: DEBS
+
+Débit total:
+    en: Débit total
+    unites: [L/s, m3/s]
+    code: DEBTOT
+
+Direction du vent:
+    en: Direction du vent
+    unites: []
+    code: DIRV
+
+Énergie de rayonnement solaire:
+    en: Énergie de rayonnement solaire
+    unites: [J/m2]
+    code: ERAY
+
+Évapotranspiration potentielle:
+    en: Évapotranspiration potentielle
+    unites: [mm/h, mm/j]
+    code: ETP
+
+Flux en suspension:
+    en: Flux en suspension
+    unites: [g/s, kg/s]
+    code: FMES
+
+Hauteur d'eau:
+    en: Hauteur d'eau
+    unites: [mm, cm, m]
+    code: HT
+
+Humidité de l'air:
+    en: Humidité de l'air
+    unites: ["%"]
+    code: HUMA
+
+Humidité du sol:
+    en: Humidité du sol
+    unites: ["%"]
+    code: HUMS
+
+Niveau piézométrique:
+    en: Niveau piézométrique
+    unites: [m]
+    code: PZ
+
+pH:
+    en: pH
+    unites: [Unité pH]
+    code: PH
+
+Précipitation:
+    en: Précipitation
+    unites: [mm]
+    code: PRCP
+
+Pression atmosphérique:
+    en: Pression atmosphérique
+    unites: [hPa, mbar]
+    code: PA
+
+Puissance de rayonnement solaire:
+    en: Puissance de rayonnement solaire
+    unites: [W/m2]
+    code: PRAY
+
+Rafales de vent:
+    en: Rafales de vent
+    unites: []
+    code: RAFV
+
+Température de l'air:
+    en: Température de l'air
+    unites: [°C]
+    code: TEMPA
+
+Température de l'eau:
+    en: Température de l'eau
+    unites: [°C]
+    code: TEMPE
+
+Température du sol:
+    en: Température du sol
+    unites: [°C]
+    code: TEMPS
+
+Tension hydrique du sol:
+    en: Tension hydrique du sol
+    unites: [Pa]
+    code: THS
+
+Turbidité:
+    en: Turbidité
+    unites: [NTU, mV, g/L de SiO2]
+    code: TURB
+
+Vitesse de l'eau:
+    en: Vitesse de l'eau
+    unites: [m/s]
+    code: VE
+
+Vitesse du vent:
+    en: Vitesse du vent
+    unites: [m/s]
+    code: VV
+
+Volume de sédiments:
+    en: Volume de sédiments
+    unites: [L, m3]
+    code: VOLMES
diff --git a/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/UnitesData.yml b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/UnitesData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..00a848880180c655208c12b1a4f38fd64a964112
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DataFixtures/ORM/Test/files/UnitesData.yml
@@ -0,0 +1,29 @@
+"%": {}
+"°C": {}
+"cm": {}
+"g/L": {}
+"g/L de SiO2": {}
+"g/s": {}
+"hPa": {}
+"J/cm²": {}
+"J/m2": {}
+"kg/s": {}
+"L": {}
+"L/s": {}
+"m": {}
+"m/s": {}
+"m3": {}
+"m3.m-3": {}
+"m3/s": {}
+"mbar": {}
+"mg/L": {}
+"mm": {}
+"mm/h": {}
+"mm/j": {}
+"mV": {}
+"NTU": {}
+"Pa": {}
+"Sm-1": {}
+"Unité pH": {}
+"W/m2": {}
+"µS/cm": {}
diff --git a/src/Irstea/BdohDataBundle/DependencyInjection/Configuration.php b/src/Irstea/BdohDataBundle/DependencyInjection/Configuration.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5b4cf50610d84c74b652e27263b255b890d8a83
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DependencyInjection/Configuration.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * This is the class that validates and merges configuration from your app/config files.
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
+ */
+class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('irstea_bdoh_data');
+
+        // Here you should define the parameters that are allowed to
+        // configure your bundle. See the documentation linked above for
+        // more information on that topic.
+
+        return $treeBuilder;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/DependencyInjection/IrsteaBdohDataExtension.php b/src/Irstea/BdohDataBundle/DependencyInjection/IrsteaBdohDataExtension.php
new file mode 100644
index 0000000000000000000000000000000000000000..83725db3990220d0912ff46e842c356960dc6313
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/DependencyInjection/IrsteaBdohDataExtension.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\DependencyInjection;
+
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+
+/**
+ * This is the class that loads and manages your bundle configuration.
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
+ */
+class IrsteaBdohDataExtension extends Extension
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load(array $configs, ContainerBuilder $container)
+    {
+        $configuration = new Configuration();
+        $config = $this->processConfiguration($configuration, $configs);
+
+        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
+        $loader->load('services.yml');
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/BaremeType.php b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/BaremeType.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cf9941fac6c438b7b70069f352a1b3e5c5a6382
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/BaremeType.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\DBAL\Types;
+
+use Doctrine\DBAL\Platforms\AbstractPlatform;
+use Doctrine\DBAL\Types\Type;
+
+class BaremeType extends Type
+{
+    const BAREME = 'bareme';
+
+    public function getName()
+    {
+        return self::BAREME;
+    }
+
+    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
+    {
+        return '_float8';
+    }
+
+    public function requiresSQLCommentHint(AbstractPlatform $platform)
+    {
+        return true;
+    }
+
+    public function convertToDatabaseValue($value, AbstractPlatform $platform)
+    {
+        if (!is_array($value) || sizeof($value) < 2) {
+            return null;
+        }
+
+        $valueToReturn = [];
+        foreach ($value as $line) {
+            foreach ($line as $index => $x) {
+                if (!is_numeric($x)) {
+                    $line[$index] = 'null';
+                }
+            }
+            while (sizeof($line) < 5) {
+                $line[] = 'null';
+            }
+
+            $valueToReturn[] = '{' . implode(',', $line) . '}';
+        }
+
+        return '{' . implode(',', $valueToReturn) . '}';
+    }
+
+    public function convertToPHPValue($value, AbstractPlatform $platform)
+    {
+        if ($value === null) {
+            return null;
+        }
+
+        $value = str_replace('},{', ';', $value);
+        $value = str_replace('{', '', $value);
+        $value = str_replace('}', '', $value);
+
+        $values = explode(';', $value);
+
+        $toReturn = [];
+
+        foreach ($values as $line) {
+            $temp = explode(',', $line);
+            $toReturn[] = $temp;
+        }
+
+        return $toReturn;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/DateTimeMsType.php b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/DateTimeMsType.php
new file mode 100644
index 0000000000000000000000000000000000000000..5915daf29a3c09dbc1f07acf4001e79eb6b6dc37
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/DateTimeMsType.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\DBAL\Types;
+
+use Doctrine\DBAL\Platforms\AbstractPlatform;
+use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Type that maps an PostgreSQL TIMESTAMP(3) to a string 'Y-m-d H:i:s.u'.
+ */
+class DateTimeMsType extends Type
+{
+    const DATETIMEMS = 'datetimems';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return self::DATETIMEMS;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
+    {
+        if ($platform instanceof PostgreSqlPlatform) {
+            return 'TIMESTAMP(3) WITHOUT TIME ZONE';
+        }
+
+        return $platform->getDateTimeTypeDeclarationSQL($fieldDeclaration);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/GeometryType.php b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/GeometryType.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e2bd4f821abacf2e7af487cd66c562eff29fe9a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/GeometryType.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\DBAL\Types;
+
+use Doctrine\DBAL\Platforms\AbstractPlatform;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Description of PointType.
+ */
+class GeometryType extends Type
+{
+    const GEOMETRY = 'geometry';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return self::GEOMETRY;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
+    {
+        return 'geometry';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/SQLArrayType.php b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/SQLArrayType.php
new file mode 100644
index 0000000000000000000000000000000000000000..a29a101497b402b1d927ea80f17453b973305d04
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/SQLArrayType.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\DBAL\Types;
+
+use Doctrine\DBAL\Platforms\AbstractPlatform;
+use Doctrine\DBAL\Types\Type;
+
+abstract class SQLArrayType extends Type
+{
+    /**
+     * @return Type
+     */
+    abstract protected function getInnerType();
+
+    /**
+     * @return Type
+     */
+    private function doGetInnerType()
+    {
+        static $type = null;
+        if ($type === null) {
+            return $type = $this->getInnerType();
+        }
+
+        return $type;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->doGetInnerType()->getName() . 'array';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
+    {
+        return '_' . $this->doGetInnerType()->getSQLDeclaration($fieldDeclaration, $platform);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function convertToDatabaseValue($value, AbstractPlatform $platform)
+    {
+        if (!is_array($value)) {
+            return null;
+        }
+
+        return $this->convertToDatabaseValueRecursive($value, $platform, $this->doGetInnerType());
+    }
+
+    /**
+     * @param array            $values
+     * @param AbstractPlatform $platform
+     * @param Type             $type
+     *
+     * @return string
+     */
+    protected function convertToDatabaseValueRecursive(array $values, AbstractPlatform $platform, Type $type)
+    {
+        $result = [];
+        foreach ($values as $value) {
+            if (is_array($value)) {
+                $result[] = $this->convertToDatabaseValueRecursive($value, $platform, $type);
+            } else {
+                $result[] = $type->convertToDatabaseValue($value, $platform);
+            }
+        }
+
+        return '{' . implode(',', $result) . '}';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function convertToPHPValue($value, AbstractPlatform $platform)
+    {
+        if ($value === null) {
+            return null;
+        }
+
+        return $this->convertToPHPValueRecursive($value, $platform, $this->doGetInnerType());
+    }
+
+    /**
+     * @param                  $values
+     * @param AbstractPlatform $platform
+     * @param Type             $type
+     */
+    protected function convertToPHPValueRecursive($values, AbstractPlatform $platform, Type $type)
+    {
+        throw new \RuntimeException(__METHOD__ . ' not yet implemented');
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/TextArrayType.php b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/TextArrayType.php
new file mode 100644
index 0000000000000000000000000000000000000000..2efa7ad13ad2ff960990fd64f853cb8a39599efe
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/DBAL/Types/TextArrayType.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\DBAL\Types;
+
+use Doctrine\DBAL\Types\Type;
+
+class TextArrayType extends SQLArrayType
+{
+    /**
+     * @return Type
+     */
+    protected function getInnerType()
+    {
+        return Type::getType(Type::TEXT);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/Listener/DocumentedEntityListener.php b/src/Irstea/BdohDataBundle/Doctrine/Listener/DocumentedEntityListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..da6038a5dc34cdb7268108fe7864a00fc85ccb45
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/Listener/DocumentedEntityListener.php
@@ -0,0 +1,292 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\Listener;
+
+use Doctrine\ORM\Event\PreUpdateEventArgs;
+use Irstea\BdohDataBundle\Entity\DocumentedEntityInterface;
+use JMS\DiExtraBundle\Annotation as DI;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\PropertyAccess\PropertyAccessor;
+
+/**
+ * Met à jour/supprime des documents liés à une entité.
+ *
+ * @DI\Service
+ * @DI\Tag("doctrine.orm.entity_listener", attributes={"lazy"=true})
+ * @ DI\Tag("doctrine.event_listener", attributes={"event"="postFlush", "lazy"=true})
+ */
+class DocumentedEntityListener implements LoggerAwareInterface
+{
+    /**
+     * @var string
+     *
+     * @DI\Inject("%kernel.root_dir%/../web")
+     */
+    public $webRoot;
+
+    /**
+     * @var string
+     */
+    public $documentPath = 'uploads';
+
+    /**
+     * @var PropertyAccessor
+     *
+     * @DI\Inject("property_accessor")
+     */
+    public $propertyAccessor;
+
+    /**
+     * @var LoggerInterface
+     */
+    private $logger;
+
+    /**
+     * @var string[]
+     */
+    private $toRename = [];
+
+    /**
+     * @var string[]
+     */
+    private $toUnlink = [];
+
+    /**
+     * DocumentedEntityListener constructor.
+     */
+    public function __construct()
+    {
+        $this->propertyAccessor = new PropertyAccessor();
+        $this->logger = new NullLogger();
+    }
+
+    /**
+     * @DI\InjectParams({"logger" = @DI\Inject("logger")})
+     */
+    public function setLogger(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * @param DocumentedEntityInterface $entity
+     *
+     * @throws \Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException
+     * @throws \Symfony\Component\PropertyAccess\Exception\InvalidArgumentException
+     * @throws \Symfony\Component\PropertyAccess\Exception\AccessException
+     */
+    public function prePersist(DocumentedEntityInterface $entity)
+    {
+        foreach ($entity->getDocumentFields() as $field) {
+            /* @var UploadedFile $value */
+            $value = $this->propertyAccessor->getValue($entity, $field);
+
+            if ($value instanceof UploadedFile) {
+                $this->uploadFile($entity, $field, $value);
+            }
+        }
+    }
+
+    /**
+     * @param DocumentedEntityInterface $entity
+     * @param string                    $field
+     * @param UploadedFile              $file
+     */
+    private function uploadFile(DocumentedEntityInterface $entity, $field, UploadedFile $newFile)
+    {
+        $normalized = $this->normalizePath($entity, $field, $newFile->getClientOriginalName());
+        $this->renameFile($newFile->getRealPath(), $normalized);
+        $this->propertyAccessor->setValue($entity, $field, $normalized);
+    }
+
+    /**
+     * @param $filename
+     * @param string $slug
+     * @param string $filepath
+     * @param mixed  $field
+     *
+     * @return string
+     */
+    private function normalizePath(DocumentedEntityInterface $entity, $field, $filepath)
+    {
+        $extension = pathinfo($filepath, PATHINFO_EXTENSION);
+        $filename = $field;
+        if (substr($filename, 0, 4) === 'path') {
+            $filename = lcfirst(substr($filename, 4));
+        }
+
+        return sprintf(
+            '%s/%s-%s.%s',
+            $this->documentPath,
+            $entity->getDocumentFilePrefix(),
+            $filename,
+            $extension
+        );
+    }
+
+    /**
+     * @param string $absSource
+     * @param string $relTarget
+     */
+    private function renameFile($absSource, $relTarget)
+    {
+        $absTarget = $this->webRoot . DIRECTORY_SEPARATOR . $relTarget;
+        $this->logger->debug("Planning to rename $absSource to $absTarget");
+        $this->toRename[$absSource] = $absTarget;
+    }
+
+    /**
+     * @param DocumentedEntityInterface $entity
+     * @param PreUpdateEventArgs        $event
+     *
+     * @throws \Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException
+     * @throws \Symfony\Component\PropertyAccess\Exception\InvalidArgumentException
+     * @throws \Symfony\Component\PropertyAccess\Exception\AccessException
+     */
+    public function preUpdate(DocumentedEntityInterface $entity, PreUpdateEventArgs $event)
+    {
+        $recompute = false;
+
+        foreach ($entity->getDocumentFields() as $field) {
+            if (!$event->hasChangedField($field)) {
+                continue;
+            }
+
+            $old = $event->getOldValue($field);
+            $new = $event->getNewValue($field);
+
+            if ($new instanceof UploadedFile) {
+                $this->logger->debug("New file for $field", compact('entity', 'field', 'old', 'new'));
+                if (!empty($old)) {
+                    $this->unlinkFile($old);
+                }
+                $this->uploadFile($entity, $field, $new);
+                $recompute = true;
+            } elseif (empty($new)) {
+                if (!empty($old)) {
+                    $this->logger->debug("$field removed", compact('entity', 'field', 'old', 'new'));
+                    $this->unlinkFile($old);
+                }
+            }
+        }
+
+        if ($recompute) {
+            $metadata = $event->getEntityManager()->getClassMetadata(get_class($entity));
+            $event->getEntityManager()->getUnitOfWork()->recomputeSingleEntityChangeSet($metadata, $entity);
+        }
+    }
+
+    /**
+     * @param string $relTarget
+     */
+    private function unlinkFile($relTarget)
+    {
+        $absTarget = $this->webRoot . DIRECTORY_SEPARATOR . $relTarget;
+        $this->logger->debug("Planning to unlink $absTarget");
+        $this->toUnlink[] = $absTarget;
+    }
+
+    /**
+     * @param DocumentedEntityInterface $entity
+     *
+     * @throws \Symfony\Component\PropertyAccess\Exception\AccessException
+     * @throws \Symfony\Component\PropertyAccess\Exception\InvalidArgumentException
+     * @throws \Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException
+     */
+    public function preRemove(DocumentedEntityInterface $entity)
+    {
+        foreach ($entity->getDocumentFields() as $field) {
+            $file = $this->propertyAccessor->getValue($entity, $field);
+            if ($file) {
+                $this->unlinkFile($file);
+            }
+        }
+    }
+
+    public function postPersist()
+    {
+        $this->processPendingOperations();
+    }
+
+    public function postUpdate()
+    {
+        $this->processPendingOperations();
+    }
+
+    public function postRemove()
+    {
+        $this->processPendingOperations();
+    }
+
+    public function processPendingOperations()
+    {
+        $this->logger->debug(
+            'processPendingOperations',
+            ['toUnlink' => $this->toUnlink, 'toRename' => $this->toRename]
+        );
+
+        foreach ($this->toUnlink as $path) {
+            $this->doUnlink($path);
+        }
+        $this->toUnlink = [];
+
+        foreach ($this->toRename as $source => $target) {
+            $this->doRename($source, $target);
+        }
+        $this->toRename = [];
+    }
+
+    /**
+     * @param $path
+     */
+    private function doUnlink($path)
+    {
+        if (!file_exists($path)) {
+            return;
+        }
+        $this->logger->debug("Trying to remove $path");
+        if (unlink($path) && !file_exists($path)) {
+            $this->logger->info("Removed $path");
+        } else {
+            $this->warning->info("Could not remove $path");
+        }
+    }
+
+    /**
+     * @param $source
+     * @param $target
+     */
+    private function doRename($source, $target)
+    {
+        $this->doUnlink($target);
+        $this->logger->debug("Trying to rename $source to $target");
+        $moved = is_uploaded_file($source) ? move_uploaded_file($source, $target) : rename($source, $target);
+        if ($moved && file_exists($target)) {
+            $this->logger->info("Renamed $source to $target");
+        } else {
+            $this->logger->warning("Could not rename $source to $target");
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Doctrine/Listener/ObservatoireStylesheetListener.php b/src/Irstea/BdohDataBundle/Doctrine/Listener/ObservatoireStylesheetListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ed4ca0d42816638f48da058992f6dd595153cb5
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Doctrine/Listener/ObservatoireStylesheetListener.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Doctrine\Listener;
+
+use Doctrine\ORM\Event\LifecycleEventArgs;
+use Irstea\BdohBundle\Manager\CssManager;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use JMS\DiExtraBundle\Annotation as DI;
+
+/**
+ * Crée/Met à jour/supprime la feuille de style d'un observatoire quand il est créé/modifié/supprimé.
+ *
+ * @DI\Service
+ * @DI\Tag("doctrine.orm.entity_listener", attributes={"lazy"=true})
+ */
+class ObservatoireStylesheetListener
+{
+    /**
+     * @var CssManager
+     *
+     * @DI\Inject("irstea_bdoh.manager.css")
+     */
+    public $cssManager;
+
+    /**
+     * @param Observatoire       $obs
+     * @param LifecycleEventArgs $event
+     *
+     * @throws \Less_Exception_Parser
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function postPersist(Observatoire $obs, LifecycleEventArgs $unused)
+    {
+        $this->cssManager->removeObservatoireCssFile($obs);
+    }
+
+    /**
+     * @param Observatoire       $obs
+     * @param LifecycleEventArgs $event
+     *
+     * @throws \Less_Exception_Parser
+     */
+    public function postUpdate(Observatoire $obs, LifecycleEventArgs $event)
+    {
+        $changes = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet($obs);
+
+        if (isset($changes['couleurPrimaire']) || isset($changes['couleurSecondaire'])) {
+            $this->cssManager->removeObservatoireCssFile($obs);
+        }
+    }
+
+    /**
+     * @param Observatoire       $obs
+     * @param LifecycleEventArgs $event
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function postRemove(Observatoire $obs, LifecycleEventArgs $unused)
+    {
+        $this->cssManager->removeObservatoireCssFile($obs);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Bareme.php b/src/Irstea/BdohDataBundle/Entity/Bareme.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f21678fe3105dde5d381157af3ab3c0a289b17d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Bareme.php
@@ -0,0 +1,248 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Bareme.
+ */
+class Bareme implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $commentaire;
+
+    /**
+     * @var bareme
+     */
+    protected $valeurs;
+
+    /**
+     * @var Unite
+     */
+    protected $uniteEntree;
+
+    /**
+     * @var Unite
+     */
+    protected $uniteSortie;
+
+    /**
+     * @var \DateTime
+     */
+    protected $dateCreation;
+
+    /**
+     * @var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return Bareme
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set commentaire.
+     *
+     * @param string $commentaire
+     *
+     * @return Bareme
+     */
+    public function setCommentaire($commentaire)
+    {
+        $this->commentaire = $commentaire;
+
+        return $this;
+    }
+
+    /**
+     * Get commentaire.
+     *
+     * @return string
+     */
+    public function getCommentaire()
+    {
+        return $this->commentaire;
+    }
+
+    /**
+     * Set valeurs.
+     *
+     * @param bareme $valeurs
+     *
+     * @return Bareme
+     */
+    public function setValeurs($valeurs)
+    {
+        $this->valeurs = $valeurs;
+
+        return $this;
+    }
+
+    /**
+     * Get valeurs.
+     *
+     * @return bareme
+     */
+    public function getValeurs()
+    {
+        return $this->valeurs;
+    }
+
+    /**
+     * Set uniteEntree.
+     *
+     * @param Unite $uniteEntree
+     *
+     * @return Bareme
+     */
+    public function setUniteEntree(Unite $uniteEntree = null)
+    {
+        $this->uniteEntree = $uniteEntree;
+
+        return $this;
+    }
+
+    /**
+     * Get uniteEntree.
+     *
+     * @return Unite
+     */
+    public function getUniteEntree()
+    {
+        return $this->uniteEntree;
+    }
+
+    /**
+     * Set uniteSortie.
+     *
+     * @param Unite $uniteSortie
+     *
+     * @return Bareme
+     */
+    public function setUniteSortie(Unite $uniteSortie = null)
+    {
+        $this->uniteSortie = $uniteSortie;
+
+        return $this;
+    }
+
+    /**
+     * Get uniteSortie.
+     *
+     * @return Unite
+     */
+    public function getUniteSortie()
+    {
+        return $this->uniteSortie;
+    }
+
+    /**
+     * @return \DateTime
+     */
+    public function getDateCreation()
+    {
+        return $this->dateCreation;
+    }
+
+    /**
+     * @param \DateTime
+     * @param mixed $dateCreation
+     *
+     * @return Bareme
+     */
+    public function setDateCreation($dateCreation)
+    {
+        $this->dateCreation = $dateCreation;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * @param type Observatoire
+     * @param mixed $observatoire
+     *
+     * @return Bareme
+     */
+    public function setObservatoire($observatoire)
+    {
+        $this->observatoire = $observatoire;
+
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->nom;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/BaremeJeuBareme.php b/src/Irstea/BdohDataBundle/Entity/BaremeJeuBareme.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b77f053b2227f2595d0ba08be886b56aca06b4b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/BaremeJeuBareme.php
@@ -0,0 +1,197 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class BaremeJeuBareme.
+ */
+class BaremeJeuBareme
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var \Datetime
+     */
+    protected $debutValidite;
+
+    /**
+     * @var \Datetime
+     */
+    protected $finValidite;
+
+    /**
+     * @var Bareme
+     */
+    protected $bareme;
+
+    /**
+     * @var JeuBareme
+     */
+    protected $jeuBareme;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set debutValidite.
+     *
+     * @param \Datetime
+     * @param mixed $debutValidite
+     *
+     * @return BaremeJeuBareme
+     */
+    public function setDebutValidite($debutValidite)
+    {
+        $this->debutValidite = $debutValidite;
+
+        return $this;
+    }
+
+    /**
+     * Get debutValidite.
+     *
+     * @return \Datetime
+     */
+    public function getDebutValidite()
+    {
+        return $this->debutValidite;
+    }
+
+    /**
+     * Set finValidite.
+     *
+     * @param \Datetime
+     * @param mixed $finValidite
+     *
+     * @return BaremeJeuBareme
+     */
+    public function setFinValidite($finValidite)
+    {
+        $this->finValidite = $finValidite;
+
+        return $this;
+    }
+
+    /**
+     * Get finValidite.
+     *
+     * @return \Datetime
+     */
+    public function getFinValidite()
+    {
+        return $this->finValidite;
+    }
+
+    /**
+     * Set bareme.
+     *
+     * @param Bareme $bareme
+     *
+     * @return BaremeJeuBareme
+     */
+    public function setBareme(Bareme $bareme = null)
+    {
+        $this->bareme = $bareme;
+
+        return $this;
+    }
+
+    /**
+     * Get bareme.
+     *
+     * @return Bareme
+     */
+    public function getBareme()
+    {
+        return $this->bareme;
+    }
+
+    /**
+     * Set jeuBareme.
+     *
+     * @param JeuBareme $jeuBareme
+     *
+     * @return BaremeJeuBareme
+     */
+    public function setJeuBareme(JeuBareme $jeuBareme = null)
+    {
+        $this->jeuBareme = $jeuBareme;
+
+        return $this;
+    }
+
+    /**
+     * Get jeuBareme.
+     *
+     * @return JeuBareme
+     */
+    public function getJeuBareme()
+    {
+        return $this->jeuBareme;
+    }
+
+    /**
+     * @param self $bjb
+     *
+     * @return bool
+     */
+    public function equals(self $bjb)
+    {
+        if (!$bjb) {
+            return false;
+        }
+
+        if (!$this->getBareme()) {
+            $equalBaremes = (!$bjb->getBareme());
+        } else {
+            $equalBaremes = ($this->getBareme()->getId() === $bjb->getBareme()->getId());
+        }
+
+        if (!$this->getDebutValidite()) {
+            $equalBeginnings = (!$bjb->getDebutValidite());
+        } else {
+            $equalBeginnings = ($this->getDebutValidite()->format('Y-m-d H:i:s') === $bjb->getDebutValidite()->format('Y-m-d H:i:s'));
+        }
+
+        if (!$this->getFinValidite()) {
+            $equalEnds = (!$bjb->getFinValidite());
+        } else {
+            if (!$bjb->getFinValidite()) {
+                $equalEnds = false;
+            } else {
+                $equalEnds = ($this->getFinValidite()->format('Y-m-d H:i:s') === $bjb->getFinValidite()->format('Y-m-d H:i:s'));
+            }
+        }
+
+        return $equalBaremes && $equalBeginnings && $equalEnds;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Bassin.php b/src/Irstea/BdohDataBundle/Entity/Bassin.php
new file mode 100644
index 0000000000000000000000000000000000000000..53a2787d206824ae7dd320545c1c333576ab210d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Bassin.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Class Bassin.
+ *
+ * @UniqueEntity(fields={"nom", "observatoire"}, message="Bassin.nom.alreadyExists")
+ */
+class Bassin implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var float
+     */
+    protected $aire;
+
+    /**
+     * @var geometry
+     */
+    protected $perimetre;
+
+    /**
+     * @var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * @var Station
+     */
+    protected $stationExutoire;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return Bassin
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set aire.
+     *
+     * @param float $aire
+     *
+     * @return Bassin
+     */
+    public function setAire($aire)
+    {
+        $this->aire = $aire;
+
+        return $this;
+    }
+
+    /**
+     * Get aire.
+     *
+     * @return float
+     */
+    public function getAire()
+    {
+        return $this->aire;
+    }
+
+    /**
+     * Set perimetre.
+     *
+     * @param geometry $perimetre
+     *
+     * @return Bassin
+     */
+    public function setPerimetre($perimetre)
+    {
+        $this->perimetre = $perimetre;
+
+        return $this;
+    }
+
+    /**
+     * Get perimetre.
+     *
+     * @return geometry
+     */
+    public function getPerimetre()
+    {
+        return $this->perimetre;
+    }
+
+    /**
+     * Set observatoire.
+     *
+     * @param Observatoire $observatoire
+     *
+     * @return Bassin
+     */
+    public function setObservatoire(Observatoire $observatoire = null)
+    {
+        $this->observatoire = $observatoire;
+
+        return $this;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * Set stationExutoire.
+     *
+     * @param Station $stationExutoire
+     *
+     * @return Bassin
+     */
+    public function setStationExutoire(Station $stationExutoire = null)
+    {
+        $this->stationExutoire = $stationExutoire;
+
+        return $this;
+    }
+
+    /**
+     * Get stationExutoire.
+     *
+     * @return Station
+     */
+    public function getStationExutoire()
+    {
+        return $this->stationExutoire;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->nom;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Chronique.php b/src/Irstea/BdohDataBundle/Entity/Chronique.php
new file mode 100644
index 0000000000000000000000000000000000000000..274b60ca7c55d920852cab474acfbc071077db3b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Chronique.php
@@ -0,0 +1,621 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Chronique.
+ *
+ * @UniqueEntity(fields={"code", "station"}, message="Chronique.code.alreadyExists", repositoryMethod="findAnyByStationAndCode")
+ * @SuppressWarnings(PHPMD.TooManyFields)
+ */
+abstract class Chronique implements ChroniqueRelatedInterface, LabelledEntityInterface
+{
+    use ChroniqueRelatedTrait;
+    use LabelledEntityTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $code;
+
+    /**
+     * @var string
+     */
+    protected $genealogie;
+
+    /**
+     * @var string
+     */
+    protected $genealogieEn;
+
+    /**
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * @var bool
+     */
+    protected $estVisible = true;
+
+    /**
+     * @var float
+     */
+    protected $minimumValide;
+
+    /**
+     * @var float
+     */
+    protected $maximumValide;
+
+    /**
+     * @var string
+     */
+    protected $dateDebutMesures;
+
+    /**
+     * @var string
+     */
+    protected $dateFinMesures;
+
+    /**
+     * @var int
+     */
+    protected $nbMesures;
+
+    /**
+     * @var Unite
+     */
+    protected $unite;
+
+    /**
+     * @var TypeParametre
+     */
+    protected $parametre;
+
+    /**
+     * @var Station
+     */
+    protected $station;
+
+    /**
+     * @var Partenaire
+     */
+    protected $producteur;
+
+    /**
+     * @var bool
+     */
+    protected $echantillonageSet = false;
+
+    /**
+     * @var bool
+     */
+    protected $allowValueLimits = false;
+
+    /**
+     * @var DataSet|null
+     */
+    protected $dataset;
+
+    /**
+     * @var Milieu
+     */
+    protected $milieu;
+
+    //--------------------------------------ctor------------------------------------------------------------
+
+    //-----------------------------getter et setter------------------------------------------------------
+
+    /**
+     * Get id.
+     *
+     * @return string
+     */
+    public function getNomLong()
+    {
+        $code = $this->getCode();
+        $unite = $this->getUnite();
+        $station = $this->getStation();
+        $parametre = $this->getParametre();
+        $separator = ',';
+        $tableauSite = $this->getStation()->getSites()->toArray();
+        $bool = is_array($tableauSite);
+        if ($bool === true) {
+            $tableauSite = implode($separator, $tableauSite);
+        }
+        $dateBeg = $this->getDateDebutMesures();
+        if ($dateBeg === null) {
+            $dateBeg = 'NA';
+        }
+        $dateFin = $this->getDateFinMesures();
+        if ($dateFin === null) {
+            $dateFin = 'NA';
+        }
+        $nomLong = 'Site(s) :  ' . $tableauSite . ' , Station : '
+            . $station . '  ,  Paramètre : ' . $parametre . '   , Unité : ' . $unite . ' , Code : ' . $code
+            . ' ( Date Début : ' . $dateBeg . ' , Date Fin : ' . $dateFin . ')';
+
+        return $nomLong;
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set code.
+     *
+     * @param string $code
+     */
+    public function setCode($code)
+    {
+        $this->code = IrsteaBdohDataBundle::slugify($code);
+    }
+
+    /**
+     * Get code.
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * @param string $description
+     */
+    public function setDescription(string $description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * Set genealogie.
+     *
+     * @param string $genealogie
+     */
+    public function setGenealogie($genealogie)
+    {
+        $this->genealogie = $genealogie;
+    }
+
+    /**
+     * Get genealogie.
+     *
+     * @return string
+     */
+    public function getGenealogie()
+    {
+        return $this->genealogie;
+    }
+
+    /**
+     * @return string
+     */
+    public function getGenealogieEn()
+    {
+        return $this->genealogieEn;
+    }
+
+    /**
+     * @param string $genealogieEn
+     */
+    public function setGenealogieEn(string $genealogieEn)
+    {
+        $this->genealogieEn = $genealogieEn;
+    }
+
+    /**
+     * Set estVisible.
+     *
+     * @param bool $estVisible
+     */
+    public function setEstVisible($estVisible)
+    {
+        $this->estVisible = $estVisible;
+    }
+
+    /**
+     * Get estVisible.
+     *
+     * @return bool
+     */
+    public function getEstVisible()
+    {
+        return $this->estVisible;
+    }
+
+    /**
+     * Set minimumValide.
+     *
+     * @param float $minimumValide
+     */
+    public function setMinimumValide($minimumValide)
+    {
+        $this->minimumValide = $minimumValide;
+    }
+
+    /**
+     * Get minimumValide.
+     *
+     * @return float
+     */
+    public function getMinimumValide()
+    {
+        return $this->minimumValide;
+    }
+
+    /**
+     * Set maximumValide.
+     *
+     * @param float $maximumValide
+     */
+    public function setMaximumValide($maximumValide)
+    {
+        $this->maximumValide = $maximumValide;
+    }
+
+    /**
+     * Get maximumValide.
+     *
+     * @return float
+     */
+    public function getMaximumValide()
+    {
+        return $this->maximumValide;
+    }
+
+    /**
+     * Set dateDebutMesures.
+     *
+     * @param string $dateDebutMesures
+     */
+    public function setDateDebutMesures($dateDebutMesures)
+    {
+        $this->dateDebutMesures = $dateDebutMesures;
+    }
+
+    /**
+     * Get dateDebutMesures.
+     *
+     * @return string
+     */
+    public function getDateDebutMesures()
+    {
+        return $this->dateDebutMesures;
+    }
+
+    /**
+     * Set dateFinMesures.
+     *
+     * @param string $dateFinMesures
+     */
+    public function setDateFinMesures($dateFinMesures)
+    {
+        $this->dateFinMesures = $dateFinMesures;
+    }
+
+    /**
+     * Get dateFinMesures.
+     *
+     * @return string
+     */
+    public function getDateFinMesures()
+    {
+        return $this->dateFinMesures;
+    }
+
+    /**
+     * Set nbMesures.
+     *
+     * @param int $nbMesures
+     */
+    public function setNbMesures($nbMesures)
+    {
+        $this->nbMesures = $nbMesures;
+    }
+
+    /**
+     * Get nbMesures.
+     *
+     * @return int
+     */
+    public function getNbMesures()
+    {
+        return $this->nbMesures;
+    }
+
+    /**
+     * Set unite.
+     *
+     * @param Unite|null $unite
+     */
+    public function setUnite(Unite $unite = null)
+    {
+        if ($unite) {
+            $this->unite = $unite;
+        }
+    }
+
+    /**
+     * Get unite.
+     *
+     * @return Unite
+     */
+    public function getUnite()
+    {
+        return $this->unite;
+    }
+
+    /**
+     * Set producteur.
+     *
+     * @param Partenaire|null $producteur
+     */
+    public function setProducteur(Partenaire $producteur = null)
+    {
+        $this->producteur = $producteur;
+    }
+
+    /**
+     * Get producteur.
+     *
+     * @return Partenaire|null
+     */
+    public function getProducteur()
+    {
+        return $this->producteur;
+    }
+
+    /**
+     * Set parametre.
+     *
+     * @param TypeParametre $parametre
+     */
+    public function setParametre(TypeParametre $parametre)
+    {
+        $this->parametre = $parametre;
+    }
+
+    /**
+     * Get parametre.
+     *
+     * @return TypeParametre
+     */
+    public function getParametre()
+    {
+        return $this->parametre;
+    }
+
+    /**
+     * Set station.
+     *
+     * @param Station $station
+     */
+    public function setStation(Station $station)
+    {
+        $this->station = $station;
+    }
+
+    /**
+     * Get station.
+     *
+     * @return Station
+     */
+    public function getStation()
+    {
+        return $this->station;
+    }
+
+    /*
+     * Whether this time series should be plotted with reverse Y axis
+     */
+
+    /**
+     * @return bool
+     */
+    public function getReverseAxis()
+    {
+        return false;
+    }
+
+    /**
+     * Set echantillonageSet.
+     *
+     * @param bool $echantillonageSet
+     */
+    public function setEchantillonageSet($echantillonageSet)
+    {
+        $this->echantillonageSet = $echantillonageSet;
+    }
+
+    /**
+     * Get echantillonageSet.
+     *
+     * @return bool
+     */
+    public function getEchantillonageSet()
+    {
+        return $this->echantillonageSet;
+    }
+
+    /**
+     * Set whether quantification/detection limits can be assigned to this chronique's measures.
+     *
+     * @param bool $allowValueLimits
+     */
+    public function setAllowValueLimits($allowValueLimits)
+    {
+        $this->allowValueLimits = $allowValueLimits;
+    }
+
+    /**
+     * Get whether quantification/detection limits can be assigned to this chronique's measures.
+     *
+     * @return bool
+     */
+    public function getAllowValueLimits()
+    {
+        return $this->allowValueLimits;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getCode() ? sprintf('%s / %s', $this->getStation()->getCode(), $this->getCode()) : '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isContinue()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDiscontinue()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCalculee()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isConvertie()
+    {
+        return false;
+    }
+
+    /**
+     * @return string
+     */
+    abstract public function dtype();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChronique()
+    {
+        return $this;
+    }
+
+    /** Get transformations.
+     * @return Collection|Transformation[]|Conversion[]
+     */
+    public function getTransformations()
+    {
+        return new ArrayCollection();
+    }
+
+    /** Has children.
+     * @return bool
+     */
+    public function hasChildren()
+    {
+        return false;
+    }
+
+    /**
+     * Renvoie la qualité "lacune" par défaut.
+     *
+     * @return Qualite|null
+     */
+    public function getDefaultGapQualite()
+    {
+        return ($obs = $this->getObservatoire()) ? $obs->getJeu()->getDefaultGapQualite() : null;
+    }
+
+    /**
+     * @return DataSet|null
+     */
+    public function getDataSet(): ?DataSet
+    {
+        return $this->dataset;
+    }
+
+    /**
+     * @param DataSet|null $dataset
+     */
+    public function setDataSet(?DataSet $dataset)
+    {
+        $this->dataset = $dataset;
+    }
+
+    /**
+     * @return Milieu|null
+     */
+    public function getMilieu(): ?Milieu
+    {
+        return $this->milieu;
+    }
+
+    /**
+     * @param Milieu $milieu
+     */
+    public function setMilieu(Milieu $milieu): void
+    {
+        $this->milieu = $milieu;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueCalculee.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueCalculee.php
new file mode 100644
index 0000000000000000000000000000000000000000..1722a7eea3a6b37259ea71366dc2a9299f0d90b3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueCalculee.php
@@ -0,0 +1,150 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class ChroniqueCalculee.
+ */
+class ChroniqueCalculee extends ChroniqueContinue
+{
+    /**
+     * @var float
+     */
+    protected $facteurMultiplicatif = 1.0;
+
+    /**
+     * @var \DateTime
+     */
+    protected $miseAJour;
+
+    /**
+     * @var Transformation|null
+     */
+    protected $premiereEntree;
+
+    /**
+     * @var Transformation|null
+     */
+    protected $secondeEntree;
+
+    /**
+     * Set facteurMultiplicatif.
+     *
+     * @param float $facteurMultiplicatif
+     */
+    public function setFacteurMultiplicatif($facteurMultiplicatif)
+    {
+        $this->facteurMultiplicatif = $facteurMultiplicatif;
+    }
+
+    /**
+     * Get facteurMultiplicatif.
+     *
+     * @return float
+     */
+    public function getFacteurMultiplicatif()
+    {
+        return $this->facteurMultiplicatif;
+    }
+
+    /**
+     * @return \DateTime
+     */
+    public function getMiseAJour()
+    {
+        return $this->miseAJour;
+    }
+
+    /**
+     * @param \DateTime $miseAJour
+     *
+     * @return ChroniqueCalculee
+     */
+    public function setMiseAJour($miseAJour)
+    {
+        $this->miseAJour = $miseAJour;
+
+        return $this;
+    }
+
+    /**
+     * Get premiereEntree.
+     *
+     * @return Transformation|null
+     */
+    public function getPremiereEntree()
+    {
+        return $this->premiereEntree;
+    }
+
+    /**
+     * Set premiereEntree.
+     *
+     * @param Transformation|null $transformation
+     */
+    public function setPremiereEntree(Transformation $transformation = null)
+    {
+        $this->premiereEntree = $transformation;
+        if ($transformation) {
+            $transformation->setSortie($this);
+        }
+    }
+
+    /**
+     * Get secondeEntree.
+     *
+     * @return Transformation|null
+     */
+    public function getSecondeEntree()
+    {
+        return $this->secondeEntree;
+    }
+
+    /**
+     * Set secondeEntree.
+     *
+     * @param Transformation|null $transformation
+     */
+    public function setSecondeEntree(Transformation $transformation = null)
+    {
+        $this->secondeEntree = $transformation;
+        if ($transformation) {
+            $transformation->setSortie($this);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCalculee()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dtype()
+    {
+        return 'calculee';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueContinue.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueContinue.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a2f7d71195f8c3295e4be76b58e094904ee5989
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueContinue.php
@@ -0,0 +1,429 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Class ChroniqueContinue.
+ */
+class ChroniqueContinue extends Chronique
+{
+    /**
+     * @var Collection|PointControle[]
+     */
+    protected $pointsControle;
+
+    /**
+     * @var Collection|Mesure[]
+     */
+    protected $mesures;
+
+    /**
+     * @var Echantillonnage
+     */
+    protected $echantillonnage;
+
+    /**
+     * @var Collection|TauxRemplissage[]
+     */
+    protected $tauxRemplissage;
+
+    /**
+     * @var string
+     */
+    protected $directionMesure;
+
+    /**
+     * @var Unite
+     */
+    protected $uniteCumul;
+
+    /**
+     * @var Collection|Echantillonnage[]
+     */
+    protected $echantillonnagesSortieLicites;
+
+    /**
+     * @var Collection|Echantillonnage[]
+     */
+    protected $optionsEchantillonnageSortie;
+
+    /**
+     * @var Collection|Transformation[]
+     */
+    private $transformations;
+
+    /**
+     * ChroniqueContinue constructor.
+     */
+    public function __construct()
+    {
+        $this->pointsControle = new ArrayCollection();
+        $this->mesures = new ArrayCollection();
+        $this->tauxRemplissage = new ArrayCollection();
+        $this->echantillonnagesSortieLicites = new ArrayCollection();
+        $this->optionsEchantillonnageSortie = new ArrayCollection();
+        $this->transformations = new ArrayCollection();
+    }
+
+    /**
+     * Add pointsControle.
+     *
+     * @param PointControle $pointsControle
+     */
+    public function addPointControle(PointControle $pointsControle)
+    {
+        $this->pointsControle[] = $pointsControle;
+    }
+
+    /**
+     * Set pointsControle.
+     *
+     * @param ArrayCollection $pointsControle
+     */
+    public function setPointsControle(ArrayCollection $pointsControle)
+    {
+        $this->pointsControle = $pointsControle;
+    }
+
+    /**
+     * Get pointsControle.
+     *
+     * @return Collection
+     */
+    public function getPointsControle()
+    {
+        return $this->pointsControle;
+    }
+
+    /**
+     * Add mesures.
+     *
+     * @param Mesure $mesures
+     */
+    public function addMesure(Mesure $mesures)
+    {
+        $this->mesures[] = $mesures;
+    }
+
+    /**
+     * Set mesures.
+     *
+     * @param ArrayCollection $mesures
+     */
+    public function setMesures(ArrayCollection $mesures)
+    {
+        $this->mesures = $mesures;
+    }
+
+    /**
+     * Get mesures.
+     *
+     * @return Collection
+     */
+    public function getMesures()
+    {
+        return $this->mesures;
+    }
+
+    /**
+     * Set echantillonnage.
+     *
+     * @param Echantillonnage $echantillonnage
+     */
+    public function setEchantillonnage(Echantillonnage $echantillonnage)
+    {
+        $this->echantillonnage = $echantillonnage;
+    }
+
+    /**
+     * Get echantillonnage.
+     *
+     * @return Echantillonnage
+     */
+    public function getEchantillonnage()
+    {
+        return $this->echantillonnage;
+    }
+
+    /**
+     * Add tauxRemplissage.
+     *
+     * @param TauxRemplissage $tauxRemplissage
+     */
+    public function addTauxRemplissage(TauxRemplissage $tauxRemplissage)
+    {
+        $this->tauxRemplissage[] = $tauxRemplissage;
+    }
+
+    /**
+     * Set tauxRemplissage.
+     *
+     * @param ArrayCollection $tauxRemplissage
+     */
+    public function setTauxRemplissage(ArrayCollection $tauxRemplissage)
+    {
+        $this->tauxRemplissage = $tauxRemplissage;
+    }
+
+    /**
+     * Get tauxRemplissage.
+     *
+     * @return Collection
+     */
+    public function getTauxRemplissage()
+    {
+        return $this->tauxRemplissage;
+    }
+
+    /**
+     * Set directionMesure.
+     *
+     * @param string $directionMesure
+     *
+     * @return ChroniqueContinue
+     */
+    public function setDirectionMesure($directionMesure)
+    {
+        $this->directionMesure = $directionMesure;
+
+        return $this;
+    }
+
+    /**
+     * Get directionMesure.
+     *
+     * @return string
+     */
+    public function getDirectionMesure()
+    {
+        return $this->directionMesure;
+    }
+
+    /**
+     * Set uniteCumul.
+     *
+     * @param Unite|null $uniteCumul
+     */
+    public function setUniteCumul(Unite $uniteCumul = null)
+    {
+        if ($uniteCumul) {
+            $this->uniteCumul = $uniteCumul;
+        }
+    }
+
+    /**
+     * Get uniteCumul.
+     *
+     * @return Unite
+     */
+    public function getUniteCumul()
+    {
+        return $this->uniteCumul;
+    }
+
+    /*
+     * Whether this time series should be plotted with reverse Y axis
+     *
+     * @return bool
+     */
+    public function getReverseAxis()
+    {
+        return ($param = $this->getParametre()) && ($param->getCode() === 'PRCP');
+    }
+
+    /**
+     * Add pointsControle.
+     *
+     * @param PointControle $pointsControle
+     *
+     * @return ChroniqueContinue
+     */
+    public function addPointsControle(PointControle $pointsControle)
+    {
+        $this->pointsControle[] = $pointsControle;
+
+        return $this;
+    }
+
+    /**
+     * Remove pointsControle.
+     *
+     * @param PointControle $pointsControle
+     */
+    public function removePointsControle(PointControle $pointsControle)
+    {
+        $this->pointsControle->removeElement($pointsControle);
+    }
+
+    /**
+     * Remove mesures.
+     *
+     * @param Mesure $mesures
+     */
+    public function removeMesure(Mesure $mesures)
+    {
+        $this->mesures->removeElement($mesures);
+    }
+
+    /**
+     * Remove tauxRemplissage.
+     *
+     * @param TauxRemplissage $tauxRemplissage
+     */
+    public function removeTauxRemplissage(TauxRemplissage $tauxRemplissage)
+    {
+        $this->tauxRemplissage->removeElement($tauxRemplissage);
+    }
+
+    /**
+     * Add echantillonnagesSortieLicites.
+     *
+     * @param Echantillonnage $echantillonnagesSortieLicites
+     *
+     * @return ChroniqueContinue
+     */
+    public function addEchantillonnagesSortieLicite(Echantillonnage $echantillonnagesSortieLicites)
+    {
+        $this->echantillonnagesSortieLicites[] = $echantillonnagesSortieLicites;
+
+        return $this;
+    }
+
+    /**
+     * Set $echantillonnagesSortieLicites.
+     *
+     * @param Collection $echantillonnagesSortieLicites
+     */
+    public function setEchantillonnagesSortieLicite(Collection $echantillonnagesSortieLicites)
+    {
+        $this->echantillonnagesSortieLicites[] = $echantillonnagesSortieLicites;
+    }
+
+    /**
+     * Remove echantillonnagesSortieLicites.
+     *
+     * @param Echantillonnage $echantillonnagesSortieLicites
+     */
+    public function removeEchantillonnagesSortieLicite(Echantillonnage $echantillonnagesSortieLicites)
+    {
+        $this->echantillonnagesSortieLicites->removeElement($echantillonnagesSortieLicites);
+    }
+
+    /**
+     * Get echantillonnagesSortieLicites.
+     *
+     * @return Collection
+     */
+    public function getEchantillonnagesSortieLicites()
+    {
+        return $this->echantillonnagesSortieLicites;
+    }
+
+    /**
+     * Add optionsEchantillonnageSortie.
+     *
+     * @param OptionEchantillonnageSortie $optionsEchantillonnageSortie
+     *
+     * @return ChroniqueContinue
+     */
+    public function addOptionsEchantillonnageSortie(OptionEchantillonnageSortie $optionsEchantillonnageSortie)
+    {
+        $this->optionsEchantillonnageSortie[] = $optionsEchantillonnageSortie;
+
+        return $this;
+    }
+
+    /**
+     * Set $optionsEchantillonnageSortie.
+     *
+     * @param ArrayCollection $optionsEchantillonnageSortie
+     */
+    public function setOptionsEchantillonnageSortie(Collection $optionsEchantillonnageSortie)
+    {
+        $this->optionsEchantillonnageSortie[] = $optionsEchantillonnageSortie;
+    }
+
+    /**
+     * Remove optionsEchantillonnageSortie.
+     *
+     * @param OptionEchantillonnageSortie $optionsEchantillonnageSortie
+     */
+    public function removeOptionsEchantillonnageSortie(OptionEchantillonnageSortie $optionsEchantillonnageSortie)
+    {
+        $this->optionsEchantillonnageSortie->removeElement($optionsEchantillonnageSortie);
+    }
+
+    /**
+     * Get optionsEchantillonnageSortie.
+     *
+     * @return Collection
+     */
+    public function getOptionsEchantillonnageSortie()
+    {
+        return $this->optionsEchantillonnageSortie;
+    }
+
+    /** Get transformations.
+     * @return Collection|Transformation[]
+     */
+    public function getTransformations()
+    {
+        return $this->transformations;
+    }
+
+    /** Has children.
+     * @return bool
+     */
+    public function hasChildren()
+    {
+        return !($this->transformations->isEmpty());
+    }
+
+    /**
+     * @return bool
+     */
+    public function getMustEditExportOptions()
+    {
+        return !$this->getEchantillonageSet()
+            && \count($this->getEchantillonnagesSortieLicites()) === 0
+            && \count($this->getOptionsEchantillonnageSortie()) === 0;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isContinue()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dtype()
+    {
+        return 'continue';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueConvertie.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueConvertie.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a164aac8ac7526cf84d485daa538808c1c4e505
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueConvertie.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class ChroniqueConvertie.
+ */
+class ChroniqueConvertie extends ChroniqueContinue
+{
+    /**
+     * @var \DateTime
+     */
+    protected $miseAJour;
+
+    /**
+     * @var Conversion|null
+     */
+    protected $conversion;
+
+    /**
+     * @return \DateTime
+     */
+    public function getMiseAJour()
+    {
+        return $this->miseAJour;
+    }
+
+    /**
+     * @param \DateTime $miseAJour
+     *
+     * @return ChroniqueConvertie
+     */
+    public function setMiseAJour($miseAJour)
+    {
+        $this->miseAJour = $miseAJour;
+
+        return $this;
+    }
+
+    /**
+     * Get conversion.
+     *
+     * @return Conversion|null
+     */
+    public function getConversion()
+    {
+        return $this->conversion;
+    }
+
+    /**
+     * Set conversion.
+     *
+     * @param Conversion|null $conversion
+     */
+    public function setConversion(Conversion $conversion = null)
+    {
+        $this->conversion = $conversion;
+        if ($conversion) {
+            $conversion->setSortie($this);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isConvertie()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dtype()
+    {
+        return 'convertie';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueDiscontinue.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueDiscontinue.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0a7308744cb58958b6d82f9f67cadb1282ac033
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueDiscontinue.php
@@ -0,0 +1,130 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Class ChroniqueDiscontinue.
+ */
+class ChroniqueDiscontinue extends Chronique
+{
+    /**
+     * @var Collection
+     */
+    protected $plages;
+
+    /**
+     * @var Collection|Conversion[]
+     */
+    private $conversions;
+
+    /**
+     * ChroniqueDiscontinue constructor.
+     */
+    public function __construct()
+    {
+        $this->plages = new ArrayCollection();
+        $this->conversions = new ArrayCollection();
+    }
+
+    /**
+     * Add plages.
+     *
+     * @param Plage $plages
+     */
+    public function addPlage(Plage $plages)
+    {
+        $this->plages[] = $plages;
+    }
+
+    /**
+     * Set plages.
+     *
+     * @param Collection $plages
+     */
+    public function setPlages(Collection $plages)
+    {
+        $this->plages = $plages;
+    }
+
+    /**
+     * Get plages.
+     *
+     * @return Collection
+     */
+    public function getPlages()
+    {
+        return $this->plages;
+    }
+
+    /*
+     * Whether this time series should be plotted with reverse Y axis
+     *
+     * @return bool
+     */
+    public function getReverseAxis()
+    {
+        return false;
+    }
+
+    /** Get transformations.
+     * @return Collection|Conversion[]
+     */
+    public function getTransformations()
+    {
+        return $this->getConversions();
+    }
+
+    /** Get conversions.
+     * @return Collection|Conversion[]
+     */
+    public function getConversions()
+    {
+        return $this->conversions;
+    }
+
+    /** Has children.
+     * @return bool
+     */
+    public function hasChildren()
+    {
+        return !($this->conversions->isEmpty());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDiscontinue()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dtype()
+    {
+        return 'discontinue';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedInterface.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b02a66019c0a7b58fe946e1cf8027b8de160ae2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class ChroniqueRelatedInterface.
+ */
+interface ChroniqueRelatedInterface extends SiteRelatedInterface
+{
+    /**
+     * @return Chronique
+     */
+    public function getChronique();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedTrait.php b/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf2d373f7bf62553d151cc144ca9b2cf3925f40d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ChroniqueRelatedTrait.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Interface ChroniqueRelatedTrait.
+ */
+trait ChroniqueRelatedTrait
+{
+    use SiteRelatedTrait;
+
+    /**
+     * @return SiteExperimental[]
+     */
+    public function getSites()
+    {
+        return $this->getChronique()->getStation()->getSites();
+    }
+
+    /**
+     * @return Chronique
+     */
+    abstract public function getChronique();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Commune.php b/src/Irstea/BdohDataBundle/Entity/Commune.php
new file mode 100644
index 0000000000000000000000000000000000000000..766fd81380257b61372278ffd3b0fe6970ed78d9
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Commune.php
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class Commune.
+ */
+class Commune
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $codePostal;
+
+    /**
+     * @var string
+     */
+    protected $codeInsee;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set codePostal.
+     *
+     * @param string $codePostal
+     */
+    public function setCodePostal($codePostal)
+    {
+        $this->codePostal = $codePostal;
+    }
+
+    /**
+     * Get codePostal.
+     *
+     * @return string
+     */
+    public function getCodePostal()
+    {
+        return $this->codePostal;
+    }
+
+    /**
+     * Set codeInsee.
+     *
+     * @param string $codeInsee
+     */
+    public function setCodeInsee($codeInsee)
+    {
+        $this->codeInsee = $codeInsee;
+    }
+
+    /**
+     * Get codeInsee.
+     *
+     * @return string
+     */
+    public function getCodeInsee()
+    {
+        return $this->codeInsee;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $ts = $this->getNom() ?? '';
+        $cp = $this->getCodePostal();
+        if ($cp) {
+            $ts .= ' (' . $cp . ')';
+        }
+
+        return $ts;
+    }
+
+    /**
+     * Get the 'departement' number of a 'commune' from its 'codePostal'.
+     *
+     * @return string
+     */
+    public function getDepartement()
+    {
+        return $this->codePostal ? substr($this->codePostal, 0, 2) : '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Conversion.php b/src/Irstea/BdohDataBundle/Entity/Conversion.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe97274b104d82cbc4c98c189eff05c056466b51
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Conversion.php
@@ -0,0 +1,170 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Class Conversion.
+ */
+class Conversion
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var JeuConversion
+     */
+    protected $jeuConversionActuel;
+
+    /**
+     * @var Collection|JeuConversion[]
+     */
+    protected $jeuConversionsHistoriques;
+
+    /**
+     * @var ChroniqueDiscontinue
+     */
+    private $entree;
+
+    /**
+     * @var ChroniqueConvertie
+     */
+    private $sortie;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->jeuConversionsHistoriques = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set jeuConversionActuel.
+     *
+     * @param JeuConversion $jeuConversion
+     *
+     * @return Conversion
+     */
+    public function setJeuConversionActuel(JeuConversion $jeuConversion)
+    {
+        $this->jeuConversionActuel = $jeuConversion;
+
+        return $this;
+    }
+
+    /**
+     * Get jeuConversionActuel.
+     *
+     * @return JeuConversion
+     */
+    public function getJeuConversionActuel()
+    {
+        return $this->jeuConversionActuel;
+    }
+
+    /**
+     * Add jeuConversionsHistoriques.
+     *
+     * @param JeuConversion $jeuConversion
+     *
+     * @return Conversion
+     */
+    public function addJeuConversionsHistoriques(JeuConversion $jeuConversion)
+    {
+        $this->jeuConversionsHistoriques[] = $jeuConversion;
+
+        return $this;
+    }
+
+    /**
+     * Get jeuConversionsHistoriques.
+     *
+     * @return Collection|JeuConversion[]
+     */
+    public function getJeuConversionsHistoriques()
+    {
+        return $this->jeuConversionsHistoriques;
+    }
+
+    /**
+     * Set entree.
+     *
+     * @param ChroniqueDiscontinue $entree
+     *
+     * @return Conversion
+     */
+    public function setEntree(ChroniqueDiscontinue $entree)
+    {
+        $this->entree = $entree;
+
+        return $this;
+    }
+
+    /**
+     * Get entree.
+     *
+     * @return ChroniqueDiscontinue
+     */
+    public function getEntree()
+    {
+        return $this->entree;
+    }
+
+    /**
+     * Set sortie.
+     *
+     * @param ChroniqueConvertie $sortie
+     *
+     * @return Conversion
+     */
+    public function setSortie(ChroniqueConvertie $sortie)
+    {
+        $this->sortie = $sortie;
+
+        return $this;
+    }
+
+    /**
+     * Get sortie.
+     *
+     * @return ChroniqueConvertie
+     */
+    public function getSortie()
+    {
+        return $this->sortie;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/CoursEau.php b/src/Irstea/BdohDataBundle/Entity/CoursEau.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a8ec474df174c6a7fb433862714cd5aa405d996
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/CoursEau.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Class CoursEau.
+ *
+ * @UniqueEntity(fields={"nom", "observatoire"}, message="CoursEau.nom.alreadyExists")
+ */
+class CoursEau implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $codeHydro;
+
+    /**
+     * @var int
+     */
+    protected $classification;
+
+    /**
+     * @var geometry
+     */
+    protected $trace;
+
+    /**
+     * @var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return CoursEau
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set codeHydro.
+     *
+     * @param string $codeHydro
+     *
+     * @return CoursEau
+     */
+    public function setCodeHydro($codeHydro)
+    {
+        $this->codeHydro = $codeHydro;
+
+        return $this;
+    }
+
+    /**
+     * Get codeHydro.
+     *
+     * @return string
+     */
+    public function getCodeHydro()
+    {
+        return $this->codeHydro;
+    }
+
+    /**
+     * Set classification.
+     *
+     * @param int $classification
+     *
+     * @return CoursEau
+     */
+    public function setClassification($classification)
+    {
+        $this->classification = $classification;
+
+        return $this;
+    }
+
+    /**
+     * Get classification.
+     *
+     * @return int
+     */
+    public function getClassification()
+    {
+        return $this->classification;
+    }
+
+    /**
+     * Set trace.
+     *
+     * @param geometry $trace
+     *
+     * @return CoursEau
+     */
+    public function setTrace($trace)
+    {
+        $this->trace = $trace;
+
+        return $this;
+    }
+
+    /**
+     * Get trace.
+     *
+     * @return geometry
+     */
+    public function getTrace()
+    {
+        return $this->trace;
+    }
+
+    /**
+     * Set observatoire.
+     *
+     * @param Observatoire $observatoire
+     *
+     * @return CoursEau
+     */
+    public function setObservatoire($observatoire)
+    {
+        $this->observatoire = $observatoire;
+
+        return $this;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->nom;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/CriteriaClimat.php b/src/Irstea/BdohDataBundle/Entity/CriteriaClimat.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad9a0aecc2148b64c0bbb7f25f492b4ad9d79fb2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/CriteriaClimat.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class CriteriaClimat
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/CriteriaGeology.php b/src/Irstea/BdohDataBundle/Entity/CriteriaGeology.php
new file mode 100644
index 0000000000000000000000000000000000000000..d3ee6f265925c6afaf733d0e11a09e8bf2486b32
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/CriteriaGeology.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class CriteriaGeology
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/DataConstraint.php b/src/Irstea/BdohDataBundle/Entity/DataConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..3518c0d5d300f8e3f0741efdffd9275022f98bcf
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/DataConstraint.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class DataConstraint
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/DataSet.php b/src/Irstea/BdohDataBundle/Entity/DataSet.php
new file mode 100644
index 0000000000000000000000000000000000000000..4038bad966ecd9b769ccd5093f378a0908350fb8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/DataSet.php
@@ -0,0 +1,431 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ *  Class Jeu de donnée.
+ */
+class DataSet
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string|null
+     */
+    protected $uuid;
+
+    /**
+     * @var string|null
+     */
+    protected $titre;
+
+    /**
+     * @var string|null
+     */
+    protected $titreEn;
+
+    /**
+     * @var string|null
+     */
+    protected $description;
+
+    /**
+     * @var string|null
+     */
+    protected $descriptionEn;
+
+    /**
+     * @var string|null
+     */
+    protected $genealogie;
+
+    /**
+     * @var string|null
+     */
+    protected $genealogieEn;
+
+    /**
+     * @var Collection<TopicCategory>
+     * @Assert\NotNull
+     * @Assert\Count(min=1)
+     */
+    protected $topicCategories;
+
+    /**
+     * @var Collection<CriteriaClimat>
+     */
+    protected $portailSearchCriteriaClimat;
+
+    /**
+     * @var Collection<CriteriaGeology>
+     */
+    protected $portailSearchCriteriaGeology;
+
+    /**
+     * @var DataConstraint|null
+     * @Assert\NotNull
+     */
+    protected $dataConstraint;
+
+    /**
+     * @var InspireTheme|null
+     */
+    protected $inspireTheme;
+
+    /**
+     * @var Collection<PersonneTheia>
+     */
+    protected $dataManagers;
+
+    /**
+     * @var Collection<PersonneTheia>
+     * @Assert\NotNull
+     * @Assert\Count(min=1)
+     */
+    protected $principalInvestigators;
+
+    /**
+     * @var Collection<PersonneTheia>
+     */
+    protected $dataCollectors;
+
+    /**
+     * @var Collection<PersonneTheia>
+     */
+    protected $projectMembers;
+
+    /**
+     * @var Collection<Chronique>
+     */
+    protected $chroniques;
+
+    /**
+     *@var Observatoire|null
+     */
+    protected $observatoire;
+
+    /**
+     * @var Doi|null
+     */
+    protected $doi;
+
+    //------------------------ctr----------------------------------------
+
+    /**
+     * DataSet constructor.
+     */
+    public function __construct()
+    {
+        $this->topicCategories = new ArrayCollection();
+        $this->portailSearchCriteriaClimat = new ArrayCollection();
+        $this->portailSearchCriteriaGeology = new ArrayCollection();
+        $this->projectMembers = new ArrayCollection();
+        $this->dataCollectors = new ArrayCollection();
+        $this->principalInvestigators = new ArrayCollection();
+        $this->dataManagers = new ArrayCollection();
+        $this->chroniques = new ArrayCollection();
+    }
+
+    //--------------------------------- getter et setter -------------------------------------------------
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function getUuid(): string
+    {
+        return $this->uuid = IrsteaBdohDataBundle::slugify($this->getTitre());
+    }
+
+    /**
+     * @param string $uuid
+     */
+    public function setUuid(string $uuid): void
+    {
+        $this->uuid = IrsteaBdohDataBundle::slugify($this->getTitre());
+    }
+
+    public function getTitre(): ?string
+    {
+        return $this->titre;
+    }
+
+    public function setTitre(?string $titre): void
+    {
+        $this->titre = $titre;
+    }
+
+    public function getDescription(): ?string
+    {
+        return $this->description;
+    }
+
+    public function setDescription(?string $description): void
+    {
+        $this->description = $description;
+    }
+
+    public function getGenealogie(): ?string
+    {
+        return $this->genealogie;
+    }
+
+    public function setGenealogie(?string $genealogie): void
+    {
+        $this->genealogie = $genealogie;
+    }
+
+    public function getTitreEn(): ?string
+    {
+        return $this->titreEn;
+    }
+
+    public function setTitreEn(?string $titreEn): void
+    {
+        $this->titreEn = $titreEn;
+    }
+
+    public function getDescriptionEn(): ?string
+    {
+        return $this->descriptionEn;
+    }
+
+    public function setDescriptionEn(?string $descriptionEn): void
+    {
+        $this->descriptionEn = $descriptionEn;
+    }
+
+    public function getGenealogieEn(): ?string
+    {
+        return $this->genealogieEn;
+    }
+
+    public function setGenealogieEn(?string $genealogieEn): void
+    {
+        $this->genealogieEn = $genealogieEn;
+    }
+
+    public function getInspireTheme(): ?InspireTheme
+    {
+        return $this->inspireTheme;
+    }
+
+    public function setInspireTheme(?InspireTheme $inspireTheme)
+    {
+        $this->inspireTheme = $inspireTheme;
+    }
+
+    public function setDataConstraint(?DataConstraint $dataConstraint): void
+    {
+        $this->dataConstraint = $dataConstraint;
+    }
+
+    public function getDataConstraint(): ?DataConstraint
+    {
+        return $this->dataConstraint;
+    }
+
+    public function addTopicCategory(TopicCategory $topicCat): void
+    {
+        $this->topicCategories[] = $topicCat;
+    }
+
+    public function removeTopicCategory(TopicCategory $topicCat): void
+    {
+        $this->topicCategories->removeElement($topicCat);
+    }
+
+    /**
+     * @return Collection<TopicCategory>
+     */
+    public function getTopicCategories(): Collection
+    {
+        return $this->topicCategories;
+    }
+
+    public function addPortailSearchCriteriaClimat(CriteriaClimat $portailSearchCriteriaClimat): void
+    {
+        $this->portailSearchCriteriaClimat[] = $portailSearchCriteriaClimat;
+    }
+
+    public function removePortailSearchCriteriaClimat(CriteriaClimat $portailSearchCriteriaClimat)
+    {
+        $this->portailSearchCriteriaClimat->removeElement($portailSearchCriteriaClimat);
+    }
+
+    /**
+     * @return Collection<CriteriaClimat>
+     */
+    public function getPortailSearchCriteriaClimat(): Collection
+    {
+        return $this->portailSearchCriteriaClimat;
+    }
+
+    public function addPortailSearchCriteriaGeology(CriteriaGeology $portailSearchCriteriaGeology): void
+    {
+        $this->portailSearchCriteriaGeology[] = $portailSearchCriteriaGeology;
+    }
+
+    public function removePortailSearchCriteriaGeology(CriteriaGeology $portailSearchCriteriaGeology): void
+    {
+        $this->portailSearchCriteriaGeology->removeElement($portailSearchCriteriaGeology);
+    }
+
+    /**
+     * @return Collection<CriteriaGeology>
+     */
+    public function getPortailSearchCriteriaGeology(): Collection
+    {
+        return $this->portailSearchCriteriaGeology;
+    }
+
+    public function addPrincipalInvestigator(PersonneTheia $principalInvestigator): void
+    {
+        $this->principalInvestigators[] = $principalInvestigator;
+    }
+
+    public function removePrincipalInvestigator(PersonneTheia $principalInvestigator): void
+    {
+        $this->principalInvestigators->removeElement($principalInvestigator);
+    }
+
+    /**
+     * @return Collection<PersonneTheia>
+     */
+    public function getPrincipalInvestigators(): Collection
+    {
+        return $this->principalInvestigators;
+    }
+
+    public function addDataCollector(PersonneTheia $dataCollector): void
+    {
+        $this->principalInvestigators[] = $dataCollector;
+    }
+
+    public function removeDataCollector(PersonneTheia $dataCollector): void
+    {
+        $this->dataCollectors->removeElement($dataCollector);
+    }
+
+    /**
+     * @return Collection<PersonneTheia>
+     */
+    public function getDataCollectors(): Collection
+    {
+        return $this->dataCollectors;
+    }
+
+    public function addDataManager(PersonneTheia $dataManager): void
+    {
+        $this->dataManagers[] = $dataManager;
+    }
+
+    public function removeDataManager(PersonneTheia $dataManager): void
+    {
+        $this->dataManagers->removeElement($dataManager);
+    }
+
+    /**
+     * @return Collection<PersonneTheia>
+     */
+    public function getDataManagers(): Collection
+    {
+        return $this->dataManagers;
+    }
+
+    public function addProjectMember(PersonneTheia $projectMember): void
+    {
+        $this->projectMembers[] = $projectMember;
+    }
+
+    public function removeProjectMember(PersonneTheia $projectMember): void
+    {
+        $this->projectMembers->removeElement($projectMember);
+    }
+
+    /**
+     * @return Collection<PersonneTheia>
+     */
+    public function getProjectMembers(): Collection
+    {
+        return $this->projectMembers;
+    }
+
+    public function addChronique(Chronique $chronique): void
+    {
+        $chronique->setDataSet($this);
+        $this->chroniques[] = $chronique;
+    }
+
+    public function removeChronique(Chronique $chronique): void
+    {
+        $chronique->setDataSet(null);
+        $this->chroniques->removeElement($chronique);
+    }
+
+    /**
+     * @return Collection<Chronique>
+     */
+    public function getChroniques(): Collection
+    {
+        return $this->chroniques;
+    }
+
+    public function getDoi(): ?Doi
+    {
+        return $this->doi;
+    }
+
+    public function setDoi(?Doi $doi): void
+    {
+        $this->doi = $doi;
+    }
+
+    public function getObservatoire(): ?Observatoire
+    {
+        return $this->observatoire;
+    }
+
+    public function setObservatoire(Observatoire $observatoire)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getTitre() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/DocumentedEntityInterface.php b/src/Irstea/BdohDataBundle/Entity/DocumentedEntityInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..06c8880a99b611376e126da2496003acccaa6fe1
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/DocumentedEntityInterface.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Interface DocumentedEntityInterface.
+ *
+ * Une entité avec des documents à uploader/downloader.
+ */
+interface DocumentedEntityInterface
+{
+    /**
+     * Retourne un préfixe de nom de fichier.
+     *
+     * @return string
+     */
+    public function getDocumentFilePrefix();
+
+    /**
+     * Retourne la liste des champs contenant des documents.
+     *
+     * @return string[]
+     */
+    public function getDocumentFields();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Doi.php b/src/Irstea/BdohDataBundle/Entity/Doi.php
new file mode 100644
index 0000000000000000000000000000000000000000..282bb6513c8d183b00fd6aaa68b4c77d9ce4cf06
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Doi.php
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Description of Doi.
+ */
+class Doi implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    private $identifiant = '10.17180/';
+
+    /**
+     * @var string
+     */
+    private $description;
+
+    /**
+     * @var string
+     */
+    private $descriptionEn;
+
+    /**
+     * @var Observatoire
+     */
+    private $observatoire;
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return 'DOI ' . $this->identifiant;
+    }
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $identifiant
+     */
+    public function setIdentifiant($identifiant)
+    {
+        $this->identifiant = $identifiant;
+    }
+
+    /**
+     * @return string
+     */
+    public function getIdentifiant()
+    {
+        return $this->identifiant;
+    }
+
+    /**
+     * @param $description
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescriptionEn()
+    {
+        return $this->descriptionEn;
+    }
+
+    /**
+     * @param string $descriptionEn
+     */
+    public function setDescriptionEn($descriptionEn)
+    {
+        $this->descriptionEn = $descriptionEn;
+    }
+
+    /**
+     * @param Observatoire|null $observatoire
+     */
+    public function setObservatoire(Observatoire $observatoire = null)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Echantillonnage.php b/src/Irstea/BdohDataBundle/Entity/Echantillonnage.php
new file mode 100644
index 0000000000000000000000000000000000000000..6de3ae2b5476a3c98a64162e0dbe72831b3be620
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Echantillonnage.php
@@ -0,0 +1,202 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Irstea\BdohDataBundle\Entity\Echantillonnage.
+ *
+ * @UniqueEntity(fields="nom")
+ */
+class Echantillonnage
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $code;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $nomEn;
+
+    /**
+     * @var int
+     */
+    protected $ordreSortie;
+
+    /**
+     * @var bool
+     */
+    protected $hasDirection;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Get ordreSortie.
+     *
+     * @return int
+     */
+    public function getOrdreSortie()
+    {
+        return $this->ordreSortie;
+    }
+
+    /**
+     * Get hasDirection.
+     *
+     * @return bool
+     */
+    public function getHasDirection()
+    {
+        return $this->hasDirection;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom();
+    }
+
+    /**
+     * Get nomEn.
+     *
+     * @return string
+     */
+    public function getNomEn()
+    {
+        return $this->nomEn;
+    }
+
+    /**
+     * Get code.
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * Set code.
+     *
+     * @param string $code
+     *
+     * @return Echantillonnage
+     */
+    public function setCode($code)
+    {
+        $this->code = $code;
+
+        return $this;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return Echantillonnage
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Set nomEn.
+     *
+     * @param string $nomEn
+     *
+     * @return Echantillonnage
+     */
+    public function setNomEn($nomEn)
+    {
+        $this->nomEn = $nomEn;
+
+        return $this;
+    }
+
+    /**
+     * Set ordreSortie.
+     *
+     * @param int $ordreSortie
+     *
+     * @return Echantillonnage
+     */
+    public function setOrdreSortie($ordreSortie)
+    {
+        $this->ordreSortie = $ordreSortie;
+
+        return $this;
+    }
+
+    /**
+     * Set hasDirection.
+     *
+     * @param bool $hasDirection
+     *
+     * @return Echantillonnage
+     */
+    public function setHasDirection($hasDirection)
+    {
+        $this->hasDirection = $hasDirection;
+
+        return $this;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/FamilleParametres.php b/src/Irstea/BdohDataBundle/Entity/FamilleParametres.php
new file mode 100644
index 0000000000000000000000000000000000000000..f73552fe140689fa4e51207ae3580fa392c86d9a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/FamilleParametres.php
@@ -0,0 +1,262 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\Collection;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ *FamilleParametres.
+ *
+ * @UniqueEntity(fields="nom", message="FamilleParametres.nom.alreadyExists")
+ * @UniqueEntity(fields="nomEn", message="FamilleParametres.nom.alreadyExists")
+ */
+class FamilleParametres
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var array
+     */
+    protected $nomEn;
+
+    /**
+     * @var string
+     */
+    protected $prefix;
+
+    /**
+     * @var FamilleParametres
+     */
+    protected $familleParente;
+
+    /**
+     * @var Collection
+     */
+    private $typesParametres;
+
+    /**
+     * @var Collection
+     */
+    private $famillesFilles;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->typesParametres = new \Doctrine\Common\Collections\ArrayCollection();
+        $this->famillesFilles = new \Doctrine\Common\Collections\ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return FamilleParametres
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set nomEn.
+     *
+     * @param string $nomEn
+     *
+     * @return FamilleParametres
+     */
+    public function setNomEn($nomEn)
+    {
+        $this->nomEn = $nomEn;
+
+        return $this;
+    }
+
+    /**
+     * Get nomEn.
+     *
+     * @return string
+     */
+    public function getNomEn()
+    {
+        return $this->nomEn;
+    }
+
+    /**
+     * Set prefix.
+     *
+     * @param string $prefix
+     *
+     * @return FamilleParametres
+     */
+    public function setPrefix($prefix)
+    {
+        $this->prefix = $prefix;
+
+        return $this;
+    }
+
+    /**
+     * Get prefix.
+     *
+     * @return string
+     */
+    public function getPrefix()
+    {
+        return $this->prefix;
+    }
+
+    /**
+     * Set familleParente.
+     *
+     * @param FamilleParametres $familleParente
+     *
+     * @return FamilleParametres
+     */
+    public function setFamilleParente($familleParente)
+    {
+        $this->familleParente = $familleParente;
+
+        return $this;
+    }
+
+    /**
+     * Get familleParente.
+     *
+     * @return FamilleParametres
+     */
+    public function getFamilleParente()
+    {
+        return $this->familleParente;
+    }
+
+    /**
+     * Add typeParametre.
+     *
+     * @param TypeParametre $typeParametre
+     *
+     * @return FamilleParametres
+     */
+    public function addTypeParametre(TypeParametre $typeParametre)
+    {
+        $this->typesParametres[] = $typeParametre;
+
+        return $this;
+    }
+
+    /**
+     * Remove typeParametre.
+     *
+     * @param TypeParametre $typeParametre
+     */
+    public function removeTypeParametre(TypeParametre $typeParametre)
+    {
+        $this->typesParametres->removeElement($typeParametre);
+    }
+
+    /**
+     * Get typesParametres.
+     *
+     * @return Collection
+     */
+    public function getTypesParametres()
+    {
+        return $this->typesParametres;
+    }
+
+    /**
+     * Add familleFille.
+     *
+     * @param FamilleParametres $familleFille
+     *
+     * @return FamilleParametres
+     */
+    public function addFamilleFille(FamilleParametres $familleFille)
+    {
+        $this->famillesFilles[] = $familleFille;
+
+        return $this;
+    }
+
+    /**
+     * Remove familleFille.
+     *
+     * @param FamilleParametres $familleFille
+     */
+    public function removeFamilleFille(FamilleParametres $familleFille)
+    {
+        $this->famillesFilles->removeElement($familleFille);
+    }
+
+    /**
+     * Get famillesFilles.
+     *
+     * @return Collection
+     */
+    public function getFamillesFilles()
+    {
+        return $this->famillesFilles;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/InspireTheme.php b/src/Irstea/BdohDataBundle/Entity/InspireTheme.php
new file mode 100644
index 0000000000000000000000000000000000000000..09b9df3cb617b60ca9bdc74d316136af0ef35c22
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/InspireTheme.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class InspireTheme
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/JeuBareme.php b/src/Irstea/BdohDataBundle/Entity/JeuBareme.php
new file mode 100644
index 0000000000000000000000000000000000000000..be3bfb41d2700daab68a3f4d202774a1d24ad247
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/JeuBareme.php
@@ -0,0 +1,308 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\Common\Proxy\Exception\InvalidArgumentException;
+
+/**
+ * JeuBareme.
+ */
+class JeuBareme implements ChroniqueRelatedInterface
+{
+    use ChroniqueRelatedTrait;
+
+    const LQ_LD_TRUE_VALUE = 'chronique.lq_ld.options.true_value';
+
+    const LQ_LD_HALF_VALUE = 'chronique.lq_ld.options.half_value';
+
+    const LQ_LD_PLACEHOLDER = 'chronique.lq_ld.options.placeholder';
+
+    const LQ_LD_GAP = 'chronique.lq_ld.options.gap';
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var Collection
+     */
+    protected $baremeJeuBaremes;
+
+    /**
+     * @var Transformation
+     */
+    protected $transformation;
+
+    /**
+     * @var \DateTime
+     */
+    private $dateCreation;
+
+    /**
+     * @var float
+     */
+    protected $delaiPropagation = 0;
+
+    /**
+     * @var string
+     */
+    protected $valueLimitTransformationType;
+
+    /**
+     * @var float
+     */
+    protected $valueLimitPlaceholder = 0.0;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->baremeJeuBaremes = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Add baremeJeuBaremes.
+     *
+     * @param BaremeJeuBareme $baremeJeuBaremes
+     *
+     * @return JeuBareme
+     */
+    public function addBaremeJeuBareme(BaremeJeuBareme $baremeJeuBaremes)
+    {
+        $this->baremeJeuBaremes[] = $baremeJeuBaremes;
+
+        return $this;
+    }
+
+    /**
+     * Remove baremeJeuBaremes.
+     *
+     * @param BaremeJeuBareme $baremeJeuBaremes
+     */
+    public function removeBaremeJeuBareme(BaremeJeuBareme $baremeJeuBaremes)
+    {
+        $this->baremeJeuBaremes->removeElement($baremeJeuBaremes);
+    }
+
+    /**
+     * Get baremeJeuBaremes.
+     *
+     * @return \Doctrine\Common\Collections\Collection
+     */
+    public function getBaremeJeuBaremes()
+    {
+        return $this->baremeJeuBaremes;
+    }
+
+    /**
+     * Set transformation.
+     *
+     * @param Transformation $transformation
+     *
+     * @return JeuBareme
+     */
+    public function setTransformation(Transformation $transformation = null)
+    {
+        $this->transformation = $transformation;
+
+        return $this;
+    }
+
+    /**
+     * Get transformation.
+     *
+     * @return Transformation
+     */
+    public function getTransformation()
+    {
+        return $this->transformation;
+    }
+
+    /**
+     * Set dateCreation.
+     *
+     * @param \DateTime $dateCreation
+     *
+     * @return JeuBareme
+     */
+    public function setDateCreation($dateCreation)
+    {
+        $this->dateCreation = $dateCreation;
+
+        return $this;
+    }
+
+    /**
+     * Get dateCreation.
+     *
+     * @return \DateTime
+     */
+    public function getDateCreation()
+    {
+        return $this->dateCreation;
+    }
+
+    /**
+     * @param JeuBareme $jeuBareme
+     *
+     * @return bool
+     */
+    public function equals($jeuBareme)
+    {
+        if (!$jeuBareme
+            || $this->getDelaiPropagation() !== $jeuBareme->getDelaiPropagation()
+            || $this->getValueLimitTransformationType() !== $jeuBareme->getValueLimitTransformationType()
+            || ($this->getValueLimitTransformationType() && $this->getValueLimitPlaceholder() !== $jeuBareme->getValueLimitPlaceholder())
+        ) {
+            return false;
+        }
+
+        if (!$this->getBaremeJeuBaremes() && !$jeuBareme->getBaremeJeuBaremes()) {
+            return true;
+        }
+
+        $bjbs1 = $this->getBaremeJeuBaremes();
+        $bjbs2 = $jeuBareme->getBaremeJeuBaremes();
+        $equals = ($bjbs1 && $bjbs2 && $bjbs1->count() === $bjbs2->count());
+
+        while ($equals && ($bjb1 = $bjbs1->current())) {
+            $equals = $bjb1->equals($bjbs2->current());
+            $bjbs1->next();
+            $bjbs2->next();
+        }
+
+        return $equals;
+    }
+
+    /**
+     * Set propagation delay.
+     *
+     * @param float $delaiPropagation
+     *
+     * @return self
+     */
+    public function setDelaiPropagation($delaiPropagation)
+    {
+        $this->delaiPropagation = $delaiPropagation;
+
+        return $this;
+    }
+
+    /**
+     * Get propagation delay.
+     *
+     * @return float
+     */
+    public function getDelaiPropagation()
+    {
+        return $this->delaiPropagation;
+    }
+
+    /**
+     * @return array
+     */
+    public static function getValueLimitTransformationTypeList()
+    {
+        return [
+            self::LQ_LD_TRUE_VALUE,
+            self::LQ_LD_HALF_VALUE,
+            self::LQ_LD_PLACEHOLDER,
+            self::LQ_LD_GAP,
+        ];
+    }
+
+    /**
+     * Set how value limits should be processed when transforming this chronique.
+     *
+     * @param string $valueLimitTransformationType
+     *
+     * @return self
+     */
+    public function setValueLimitTransformationType($valueLimitTransformationType = null)
+    {
+        if (!$valueLimitTransformationType) {
+            $valueLimitTransformationType = null;
+        }
+        if ($valueLimitTransformationType && !\in_array($valueLimitTransformationType, self::getValueLimitTransformationTypeList())) {
+            throw new InvalidArgumentException("Invalid value limit transformation type: $valueLimitTransformationType");
+        }
+        $this->valueLimitTransformationType = $valueLimitTransformationType;
+
+        return $this;
+    }
+
+    /**
+     * Get how value limits should be processed when transforming this chronique.
+     *
+     * @return string
+     */
+    public function getValueLimitTransformationType()
+    {
+        return $this->valueLimitTransformationType;
+    }
+
+    /**
+     * Set the placeholder for value limits when transforming this chronique.
+     *
+     * @param float $valueLimitPlaceholder
+     *
+     * @return self
+     */
+    public function setValueLimitPlaceholder($valueLimitPlaceholder)
+    {
+        $this->valueLimitPlaceholder = $valueLimitPlaceholder;
+
+        return $this;
+    }
+
+    /**
+     * Get the placeholder for value limits when transforming this chronique.
+     *
+     * @return float
+     */
+    public function getValueLimitPlaceholder()
+    {
+        return $this->valueLimitPlaceholder;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChronique()
+    {
+        return $this->transformation->getChronique();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/JeuConversion.php b/src/Irstea/BdohDataBundle/Entity/JeuConversion.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccb790c501b40397ddabbdec6fadfe4148b709b3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/JeuConversion.php
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * JeuConversion.
+ */
+class JeuConversion
+{
+    /**
+     * @var int
+     */
+    private $id;
+
+    /**
+     * @var Conversion
+     */
+    private $conversion;
+
+    /**
+     * @var \DateTime
+     */
+    private $dateCreation;
+
+    /**
+     * @var int
+     */
+    private $paramConversion;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set conversion.
+     *
+     * @param Conversion $conversion
+     *
+     * @return JeuConversion
+     */
+    public function setConversion(Conversion $conversion = null)
+    {
+        $this->conversion = $conversion;
+
+        return $this;
+    }
+
+    /**
+     * Get conversion.
+     *
+     * @return Conversion
+     */
+    public function getConversion()
+    {
+        return $this->conversion;
+    }
+
+    /**
+     * Set dateCreation.
+     *
+     * @param \DateTime $dateCreation
+     *
+     * @return JeuConversion
+     */
+    public function setDateCreation($dateCreation)
+    {
+        $this->dateCreation = $dateCreation;
+
+        return $this;
+    }
+
+    /**
+     * Get dateCreation.
+     *
+     * @return \DateTime
+     */
+    public function getDateCreation()
+    {
+        return $this->dateCreation;
+    }
+
+    /**
+     * equals.
+     *
+     * @param JeuConversion $jeuConversion
+     *
+     * @return bool
+     */
+    public function equals($jeuConversion)
+    {
+        return $jeuConversion && ($this->getParamConversion() === $jeuConversion->getParamConversion());
+    }
+
+    /**
+     * Set paramConversion.
+     *
+     * @param int $paramConversion
+     *
+     * @return JeuConversion
+     */
+    public function setParamConversion($paramConversion)
+    {
+        $this->paramConversion = $paramConversion;
+
+        return $this;
+    }
+
+    /**
+     * Get paramConversion.
+     *
+     * @return int
+     */
+    public function getParamConversion()
+    {
+        return $this->paramConversion;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/JeuQualite.php b/src/Irstea/BdohDataBundle/Entity/JeuQualite.php
new file mode 100644
index 0000000000000000000000000000000000000000..70f958e57a21489b0903dead1b78eafab2332482
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/JeuQualite.php
@@ -0,0 +1,299 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Class JeuQualite.
+ */
+class JeuQualite
+{
+    const DEFAULT_CHECKPOINT_SHAPE = 'circle';
+
+    const DEFAULT_CHECKPOINT_STROKE = 2;
+
+    const DEFAULT_CHECKPOINT_COLOR = [0, 128, 0]; // vert #008000
+
+    const DEFAULT_CHECKPOINT_SIZE = 5;
+
+    const DEFAULT_CHECKPOINT_STYLE = [
+        'shape'  => self::DEFAULT_CHECKPOINT_SHAPE,
+        'stroke' => self::DEFAULT_CHECKPOINT_STROKE,
+        'color'  => self::DEFAULT_CHECKPOINT_COLOR,
+        'size'   => self::DEFAULT_CHECKPOINT_SIZE,
+    ];
+
+    const DEFAULT_DISCONTINUOUS_SHAPE = 'filledCircle';
+
+    const DEFAULT_DISCONTINUOUS_STROKE = 2;
+
+    const DEFAULT_DISCONTINUOUS_SIZE = 5;
+
+    const DEFAULT_DISCONTINUOUS_STYLE = [
+        'shape'  => self::DEFAULT_DISCONTINUOUS_SHAPE,
+        'stroke' => self::DEFAULT_DISCONTINUOUS_STROKE,
+        'size'   => self::DEFAULT_DISCONTINUOUS_SIZE,
+    ];
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var array|null
+     */
+    protected $checkpointStyle;
+
+    /**
+     * @var array|null
+     */
+    protected $discontinuousStyle;
+
+    /**
+     * @var bool
+     */
+    protected $estAffectable = false;
+
+    /**
+     * @var Collection|Qualite[]
+     */
+    protected $qualites;
+
+    /**
+     * JeuQualite constructor.
+     */
+    public function __construct()
+    {
+        $this->qualites = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set estAffectable.
+     *
+     * @param bool $estAffectable
+     */
+    public function setEstAffectable($estAffectable)
+    {
+        $this->estAffectable = $estAffectable;
+    }
+
+    /**
+     * Get estAffectable.
+     *
+     * @return bool
+     */
+    public function getEstAffectable()
+    {
+        return $this->estAffectable;
+    }
+
+    /**
+     * Add qualites.
+     *
+     * @param Qualite $qualite
+     */
+    public function addQualite(Qualite $qualite)
+    {
+        $this->qualites[$qualite->getCode()] = $qualite;
+    }
+
+    /**
+     * Remove qualites.
+     *
+     * @param Qualite $qualites
+     */
+    public function removeQualite(Qualite $qualites)
+    {
+        $this->qualites->removeElement($qualites);
+    }
+
+    /**
+     * Get qualites.
+     *
+     * @return Qualite[]|Collection
+     */
+    public function getQualites()
+    {
+        return $this->qualites;
+    }
+
+    /**
+     * @param string $code
+     *
+     * @return Qualite
+     */
+    public function getQualite($code)
+    {
+        if (!$this->qualites->containsKey($code)) {
+            throw new \OutOfBoundsException("Unknown qualite in $this: " . json_encode($code));
+        }
+
+        return $this->qualites->get($code);
+    }
+
+    /**
+     * Renvoie la qualité "lacune" par défaut.
+     *
+     * @return Qualite|null
+     */
+    public function getDefaultGapQualite()
+    {
+        foreach ($this->qualites as $q) {
+            if ($q->isDefaultGap()) {
+                return $q;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Est-ce que ce jeu contient des qualités lq/ld.
+     *
+     * @return bool
+     */
+    public function hasValueLimits()
+    {
+        foreach ($this->qualites as $q) {
+            if (in_array($q->getOrdre(), Qualite::$ordresLimites, true)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Set checkpoint style.
+     *
+     * @param array|null $style
+     */
+    public function setCheckpointStyle($style)
+    {
+        $this->checkpointStyle = $style;
+    }
+
+    /**
+     * Get checkpoint style.
+     *
+     * @return array
+     */
+    public function getCheckpointStyle()
+    {
+        $checkpointStyle = $this->checkpointStyle ?: self::DEFAULT_CHECKPOINT_STYLE;
+        // always return a fully defined style in case it has been defined partialy in case the style components evolved
+        if (!isset($checkpointStyle['shape'])) {
+            $checkpointStyle['shape'] = self::DEFAULT_CHECKPOINT_SHAPE;
+        }
+        if (!isset($checkpointStyle['stroke'])) {
+            $checkpointStyle['stroke'] = self::DEFAULT_CHECKPOINT_STROKE;
+        }
+        if (!isset($checkpointStyle['color'])) {
+            $checkpointStyle['color'] = self::DEFAULT_CHECKPOINT_COLOR;
+        }
+        if (!isset($checkpointStyle['size'])) {
+            $checkpointStyle['size'] = self::DEFAULT_CHECKPOINT_SIZE;
+        }
+
+        return $checkpointStyle;
+    }
+
+    /**
+     * Set discontinuous style.
+     *
+     * @param array|null $style
+     */
+    public function setDiscontinuousStyle($style)
+    {
+        $this->discontinuousStyle = $style;
+    }
+
+    /**
+     * Get discontinuous style.
+     *
+     * @return array
+     */
+    public function getDiscontinuousStyle()
+    {
+        $discontinuousStyle = $this->discontinuousStyle ?: self::DEFAULT_DISCONTINUOUS_STYLE;
+        // always return a fully defined style in case it has been defined partialy in case the style components evolved
+        if (!isset($discontinuousStyle['shape'])) {
+            $discontinuousStyle['shape'] = self::DEFAULT_DISCONTINUOUS_SHAPE;
+        }
+        if (!isset($discontinuousStyle['stroke'])) {
+            $discontinuousStyle['stroke'] = self::DEFAULT_DISCONTINUOUS_STROKE;
+        }
+        if (!isset($discontinuousStyle['size'])) {
+            $discontinuousStyle['size'] = self::DEFAULT_DISCONTINUOUS_SIZE;
+        }
+
+        return $discontinuousStyle;
+    }
+
+    /**
+     * To string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Mesure.php b/src/Irstea/BdohDataBundle/Entity/Mesure.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9fdc6dd1eaa05f05d2b004866e7b6c79f5d192d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Mesure.php
@@ -0,0 +1,222 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Mesure.
+ *
+ * WARNING : the linked 'chroniqueContinue' will be loaded eagerly
+ * {@link http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#performance-impact
+ *        See Doctrine2 documentation for more information.}
+ */
+class Mesure
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $date;
+
+    /**
+     * @var float
+     */
+    protected $valeur;
+
+    /**
+     * @var float
+     */
+    protected $minimum;
+
+    /**
+     * @var float
+     */
+    protected $maximum;
+
+    /**
+     * @var bool
+     */
+    protected $estCalculee = false;
+
+    /**
+     * @var Qualite
+     */
+    protected $qualite;
+
+    /**
+     * @var ChroniqueContinue
+     */
+    protected $chronique;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set date.
+     *
+     * @param string $date
+     */
+    public function setDate($date)
+    {
+        $this->date = $date;
+    }
+
+    /**
+     * Get date.
+     *
+     * @return string
+     */
+    public function getDate()
+    {
+        return $this->date;
+    }
+
+    /**
+     * Set valeur.
+     *
+     * @param float $valeur
+     */
+    public function setValeur($valeur)
+    {
+        $this->valeur = $valeur;
+    }
+
+    /**
+     * Get valeur.
+     *
+     * @return float
+     */
+    public function getValeur()
+    {
+        return $this->valeur;
+    }
+
+    /**
+     * Set minimum.
+     *
+     * @param float $minimum
+     */
+    public function setMinimum($minimum)
+    {
+        $this->minimum = $minimum;
+    }
+
+    /**
+     * Get minimum.
+     *
+     * @return float
+     */
+    public function getMinimum()
+    {
+        return $this->minimum;
+    }
+
+    /**
+     * Set maximum.
+     *
+     * @param float $maximum
+     */
+    public function setMaximum($maximum)
+    {
+        $this->maximum = $maximum;
+    }
+
+    /**
+     * Get maximum.
+     *
+     * @return float
+     */
+    public function getMaximum()
+    {
+        return $this->maximum;
+    }
+
+    /**
+     * Set estCalculee.
+     *
+     * @param bool $estCalculee
+     */
+    public function setEstCalculee($estCalculee)
+    {
+        $this->estCalculee = $estCalculee;
+    }
+
+    /**
+     * Get estCalculee.
+     *
+     * @return bool
+     */
+    public function getEstCalculee()
+    {
+        return $this->estCalculee;
+    }
+
+    /**
+     * Set qualite.
+     *
+     * @param Qualite $qualite
+     */
+    public function setQualite(Qualite $qualite)
+    {
+        $this->qualite = $qualite;
+    }
+
+    /**
+     * Get qualite.
+     *
+     * @return Qualite
+     */
+    public function getQualite()
+    {
+        return $this->qualite;
+    }
+
+    /**
+     * Set chronique.
+     *
+     * @param ChroniqueContinue $chronique
+     */
+    public function setChronique(ChroniqueContinue $chronique)
+    {
+        $this->chronique = $chronique;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return ChroniqueContinue
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Milieu.php b/src/Irstea/BdohDataBundle/Entity/Milieu.php
new file mode 100644
index 0000000000000000000000000000000000000000..c99e9b215f4ed4597117992679bc9db6ebf02a3b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Milieu.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class Milieu
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Observatoire.php b/src/Irstea/BdohDataBundle/Entity/Observatoire.php
new file mode 100644
index 0000000000000000000000000000000000000000..8eb73acb0c54d3e591f1d0f5c8d96b61e266f07c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Observatoire.php
@@ -0,0 +1,743 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * Observatoire
+ * This class allows to manage :
+ *  -> any kind of 'observatoires' ;
+ *  -> and the special "current observatoire" and "all observatoires".
+ *
+ * @UniqueEntity(fields="slug", message="Observatoire.slug.alreadyExists")
+ * @UniqueEntity(fields="theiaCode", message="Observatoire.slug.alreadyExists")
+ */
+class Observatoire implements ObservatoireRelatedInterface, DocumentedEntityInterface
+{
+    /***************************************************************************
+     * CONSTANTS
+     **************************************************************************/
+
+    const DEFAULT_COULEUR_PRIMAIRE = '#003A80';
+
+    const DEFAULT_COULEUR_SECONDAIRE = '#009EE0';
+
+    /***************************************************************************
+     * Attribute and methods to store & manage the current 'observatoire' !
+     **************************************************************************/
+
+    protected static $current = null;
+
+    /**
+     * @return Observatoire
+     *
+     * @deprecated Utiliser l'ObservatoireManager
+     */
+    public static function getCurrent()
+    {
+        return self::$current;
+    }
+
+    /**
+     * @deprecated Utiliser l'ObservatoireManager
+     */
+    public function defineAsCurrent()
+    {
+        self::$current = $this;
+    }
+
+    /**
+     * @deprecated Utiliser l'ObservatoireManager
+     */
+    public static function resetCurrent()
+    {
+        self::$current = null;
+    }
+
+    /**
+     * @return bool
+     *
+     * @deprecated Utiliser l'ObservatoireManager
+     */
+    public function isCurrent()
+    {
+        return self::getCurrent() === $this;
+    }
+
+    /***************************************************************************
+     * Rest of attributes and methods.
+     **************************************************************************/
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string|null
+     */
+    protected $theiaCode;
+
+    /**
+     * @var string|null
+     */
+    protected $theiaPassword;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $titre;
+
+    /**
+     * @var string
+     */
+    protected $titreEn;
+
+    /**
+     * @var string
+     */
+    protected $email;
+
+    /**
+     * @var string
+     */
+    protected $slug;
+
+    /**
+     * @var string|UploadedFile|null
+     *
+     * @Assert\File(mimeTypes = {"application/pdf", "application/x-pdf"})
+     */
+    protected $conditionsUtilisation;
+
+    /**
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * @var string
+     */
+    protected $descriptionEn;
+
+    /**
+     * @var string
+     */
+    protected $lien;
+
+    /**
+     * @var string (color in hexafloat form)
+     */
+    protected $couleurPrimaire = self::DEFAULT_COULEUR_PRIMAIRE;
+
+    /**
+     * @var string (color in hexafloat form)
+     */
+    protected $couleurSecondaire = self::DEFAULT_COULEUR_SECONDAIRE;
+
+    /**
+     * @var string|UploadedFile|null (path relative to web directory)
+     *
+     * @Assert\Image(maxSize = "500k")
+     */
+    protected $pathPhotoPrincipale;
+
+    /**
+     * @var string|UploadedFile|null (path relative to web directory)
+     *
+     * @Assert\Image(maxSize = "500k")
+     */
+    protected $pathPhotoSecondaire;
+
+    /**
+     * @var string|UploadedFile|null (path relative to web directory)
+     *
+     * @Assert\Image(maxSize = "50k")
+     */
+    protected $pathLogo;
+
+    /**
+     * @var Collection<SiteExperimental>
+     */
+    protected $sites;
+
+    /**
+     * @var Collection<CoursEau>
+     */
+    protected $coursEaux;
+
+    /**
+     * @var JeuQualite
+     */
+    protected $jeu;
+
+    /**
+     * @var PersonneTheia|null
+     * @Assert\NotNull(message = "Obligatoire")
+     */
+    protected $projectLeader;
+
+    /**
+     * @var Collection<PersonneTheia>
+     * @Assert\NotNull
+     */
+    protected $dataManagers;
+
+    /**
+     * @var Collection<Partenaire>
+     */
+    protected $partenaires;
+
+    /**
+     * @var Collection<Doi>
+     */
+    protected $dois;
+
+    /**
+     * @var Doi|null
+     */
+    protected $doiPrincipal;
+
+    /**
+     * @var Collection<DataSet>
+     */
+    protected $dataSets;
+
+    /**
+     * @var bool
+     */
+    protected $miseAJourAutomatique = false;
+
+    /**
+     * Observatoire constructor.
+     */
+    public function __construct()
+    {
+        $this->sites = new ArrayCollection();
+        $this->partenaires = new ArrayCollection();
+        $this->coursEaux = new ArrayCollection();
+        $this->dois = new ArrayCollection();
+        $this->dataManagers = new ArrayCollection();
+        $this->dataSets = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom): void
+    {
+        $this->setSlug($nom);
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    public function getTheiaCode(): ?string
+    {
+        return $this->theiaCode;
+    }
+
+    public function setTheiaCode(?string $theiaCode): void
+    {
+        $this->theiaCode = $theiaCode;
+    }
+
+    public function getTheiaPassword(): ?string
+    {
+        return $this->theiaPassword;
+    }
+
+    public function setTheiaPassword(?string $theiaPassword): void
+    {
+        $this->theiaPassword = $theiaPassword;
+    }
+
+    public function isMiseAJourAutomatique(): bool
+    {
+        return $this->miseAJourAutomatique;
+    }
+
+    /**
+     * @param bool $miseAJourAutomatique
+     */
+    public function setMiseAJourAutomatique(bool $miseAJourAutomatique): void
+    {
+        $this->miseAJourAutomatique = $miseAJourAutomatique;
+    }
+
+    /**
+     * @return string
+     */
+    public function getTitre()
+    {
+        return $this->titre;
+    }
+
+    /**
+     * @param string $titre
+     */
+    public function setTitre($titre): void
+    {
+        $this->titre = $titre;
+    }
+
+    /**
+     * @return string
+     */
+    public function getTitreEn()
+    {
+        return $this->titreEn;
+    }
+
+    /**
+     * @param string $titreEn
+     */
+    public function setTitreEn(string $titreEn): void
+    {
+        $this->titreEn = $titreEn;
+    }
+
+    /**
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * @param string $email
+     */
+    public function setEmail($email): void
+    {
+        $this->email = $email;
+    }
+
+    public function getProjectLeader(): ?PersonneTheia
+    {
+        return $this->projectLeader;
+    }
+
+    public function setProjectLeader(PersonneTheia $projectLeader): void
+    {
+        $this->projectLeader = $projectLeader;
+    }
+
+    public function addDataManager(PersonneTheia $dataManager): void
+    {
+        $this->dataManagers[] = $dataManager;
+    }
+
+    public function removeDataManager(PersonneTheia $dataManager): void
+    {
+        $this->dataManagers->removeElement($dataManager);
+    }
+
+    /**
+     * @return Collection<PersonneTheia>
+     */
+    public function getDataManagers(): Collection
+    {
+        return $this->dataManagers;
+    }
+
+    public function addDataSet(DataSet $dataSet): void
+    {
+        $dataSet->setObservatoire($this);
+        $this->dataSets[] = $dataSet;
+    }
+
+    public function removeDataSet(DataSet $dataSet): void
+    {
+        $dataSet->setObservatoire(null);
+        $this->dataSets->removeElement($dataSet);
+    }
+
+    /**
+     * @return Collection<DataSet>
+     */
+    public function getDataSets(): Collection
+    {
+        return $this->dataSets;
+    }
+
+    /**
+     * Set lien.
+     *
+     * @param string $lien
+     */
+    public function setLien($lien): void
+    {
+        $this->lien = $lien;
+    }
+
+    /**
+     * Get lien.
+     *
+     * @return string
+     */
+    public function getLien()
+    {
+        return $this->lien;
+    }
+
+    /**
+     * Set slug.
+     *
+     * @param string $slug
+     */
+    public function setSlug($slug): void
+    {
+        $this->slug = IrsteaBdohDataBundle::slugify($slug);
+    }
+
+    /**
+     * Get slug.
+     *
+     * @return string
+     */
+    public function getSlug()
+    {
+        return $this->slug;
+    }
+
+    /**
+     * Set conditionsUtilisation.
+     *
+     * @param string|UploadedFile|null $conditionsUtilisation
+     */
+    public function setConditionsUtilisation($conditionsUtilisation)
+    {
+        $this->conditionsUtilisation = $conditionsUtilisation;
+    }
+
+    /**
+     * @return string|UploadedFile|null
+     */
+    public function getConditionsUtilisation()
+    {
+        return $this->conditionsUtilisation;
+    }
+
+    /**
+     * Set description.
+     *
+     * @param string $description
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * Get description.
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Set descriptionEn.
+     *
+     * @param string|null $description
+     */
+    public function setDescriptionEn(?string $description): void
+    {
+        $this->descriptionEn = $description;
+    }
+
+    /**
+     * Get descriptionEn.
+     *
+     * @return string|null
+     */
+    public function getDescriptionEn(): ?string
+    {
+        return $this->descriptionEn;
+    }
+
+    /**
+     * Set couleurPrimaire.
+     *
+     * @param string $couleurPrimaire
+     */
+    public function setCouleurPrimaire($couleurPrimaire)
+    {
+        $this->couleurPrimaire = $couleurPrimaire;
+    }
+
+    /**
+     * Get couleurPrimaire.
+     *
+     * @return string
+     */
+    public function getCouleurPrimaire()
+    {
+        return $this->couleurPrimaire;
+    }
+
+    /**
+     * Set couleurSecondaire.
+     *
+     * @param string $couleurSecondaire
+     */
+    public function setCouleurSecondaire($couleurSecondaire)
+    {
+        $this->couleurSecondaire = $couleurSecondaire;
+    }
+
+    /**
+     * Get couleurSecondaire.
+     *
+     * @return string
+     */
+    public function getCouleurSecondaire(): string
+    {
+        return $this->couleurSecondaire;
+    }
+
+    /**
+     * Set pathPhotoPrincipale.
+     *
+     * @param string|UploadedFile|null $pathPhotoPrincipale
+     */
+    public function setPathPhotoPrincipale($pathPhotoPrincipale)
+    {
+        $this->pathPhotoPrincipale = $pathPhotoPrincipale;
+    }
+
+    /**
+     * @return string|UploadedFile|null
+     */
+    public function getPathPhotoPrincipale()
+    {
+        return $this->pathPhotoPrincipale;
+    }
+
+    /**
+     * Set pathPhotoSecondaire.
+     *
+     * @param string|UploadedFile|null $pathPhotoSecondaire
+     */
+    public function setPathPhotoSecondaire($pathPhotoSecondaire)
+    {
+        $this->pathPhotoSecondaire = $pathPhotoSecondaire;
+    }
+
+    /**
+     * @return string|UploadedFile|null
+     */
+    public function getPathPhotoSecondaire()
+    {
+        return $this->pathPhotoSecondaire;
+    }
+
+    /**
+     * Set pathLogo.
+     *
+     * @param string|UploadedFile|null $pathLogo
+     */
+    public function setPathLogo($pathLogo): void
+    {
+        $this->pathLogo = $pathLogo;
+    }
+
+    /**
+     * @return string|UploadedFile|null
+     */
+    public function getPathLogo()
+    {
+        return $this->pathLogo;
+    }
+
+    public function addSite(SiteExperimental $site): void
+    {
+        $this->sites[] = $site;
+    }
+
+    public function removeSite(SiteExperimental $sites): void
+    {
+        $this->sites->removeElement($sites);
+    }
+
+    /**
+     * @param Collection<SiteExperimental> $sites
+     */
+    public function setSites(Collection $sites): void
+    {
+        $this->sites = $sites;
+    }
+
+    /**
+     * @return Collection<SiteExperimental>
+     */
+    public function getSites(): Collection
+    {
+        return $this->sites;
+    }
+
+    public function setJeu(?JeuQualite $jeu): void
+    {
+        $this->jeu = $jeu;
+    }
+
+    public function getJeu(): ?JeuQualite
+    {
+        return $this->jeu;
+    }
+
+    public function addPartenaire(Partenaire $partenaires): void
+    {
+        $partenaires->setObservatoire($this);
+        $this->partenaires[] = $partenaires;
+    }
+
+    public function removePartenaire(Partenaire $partenaires): void
+    {
+        $partenaires->setObservatoire(null);
+        $this->partenaires->removeElement($partenaires);
+    }
+
+    /**
+     * @return Collection<Partenaire>
+     */
+    public function getPartenaires(): Collection
+    {
+        return $this->partenaires;
+    }
+
+    public function __toString(): string
+    {
+        return $this->getNom() ?: '';
+    }
+
+    public function addSiteExperimental(SiteExperimental $sites): void
+    {
+        $this->sites[] = $sites;
+    }
+
+    public function addDoi(Doi $doi): void
+    {
+        $doi->setObservatoire($this);
+        $this->dois[] = $doi;
+    }
+
+    public function removeDoi(Doi $doi): void
+    {
+        $doi->setObservatoire(null);
+        $this->dois->removeElement($doi);
+    }
+
+    /**
+     * @return Collection<Doi>
+     */
+    public function getDois(): Collection
+    {
+        return $this->dois;
+    }
+
+    public function getDoiPrincipal(): ?Doi
+    {
+        return $this->doiPrincipal;
+    }
+
+    public function setDoiPrincipal(?Doi $doiPrincipal): void
+    {
+        $this->doiPrincipal = $doiPrincipal;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasChronique(): bool
+    {
+        /** @var SiteExperimental $site */
+        foreach ($this->sites as $site) {
+            /** @var Station $station */
+            foreach ($site->getStations() as $station) {
+                if (!$station->getChroniques()->isEmpty()) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getObservatoire(): Observatoire
+    {
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDocumentFilePrefix(): string
+    {
+        return $this->slug;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDocumentFields(): array
+    {
+        return ['pathLogo', 'pathPhotoPrincipale', 'pathPhotoSecondaire', 'conditionsUtilisation'];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/ObservatoireRelatedInterface.php b/src/Irstea/BdohDataBundle/Entity/ObservatoireRelatedInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..13453f0943cb25780f40e345603464dddbe67739
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/ObservatoireRelatedInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Interface ObservatoireRelatedInterface.
+ */
+interface ObservatoireRelatedInterface
+{
+    /**
+     * @return Observatoire
+     */
+    public function getObservatoire();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/OptionEchantillonnageSortie.php b/src/Irstea/BdohDataBundle/Entity/OptionEchantillonnageSortie.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d82d2c407351bbdc4b603b2aba5675868bddcbd
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/OptionEchantillonnageSortie.php
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+
+/**
+ * Class OptionEchantillonnageSortie.
+ */
+class OptionEchantillonnageSortie implements LabelledEntityInterface
+{
+    /**
+     * @var int
+     */
+    private $id;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @var Echantillonnage
+     */
+    private $echantillonnageEntree;
+
+    /**
+     * @var PasEchantillonnage
+     */
+    private $pasEchantillonnage;
+
+    /**
+     * Set echantillonnageEntree.
+     *
+     * @param Echantillonnage $echantillonnageEntree
+     *
+     * @return OptionEchantillonnageSortie
+     */
+    public function setEchantillonnageEntree(Echantillonnage $echantillonnageEntree = null)
+    {
+        $this->echantillonnageEntree = $echantillonnageEntree;
+
+        return $this;
+    }
+
+    /**
+     * Get echantillonnageEntree.
+     *
+     * @return Echantillonnage
+     */
+    public function getEchantillonnageEntree()
+    {
+        return $this->echantillonnageEntree;
+    }
+
+    /**
+     * Set pasEchantillonnage.
+     *
+     * @param PasEchantillonnage $pasEchantillonnage
+     *
+     * @return OptionEchantillonnageSortie
+     */
+    public function setPasEchantillonnage(PasEchantillonnage $pasEchantillonnage = null)
+    {
+        $this->pasEchantillonnage = $pasEchantillonnage;
+
+        return $this;
+    }
+
+    /**
+     * Get pasEchantillonnage.
+     *
+     * @return PasEchantillonnage
+     */
+    public function getPasEchantillonnage()
+    {
+        return $this->pasEchantillonnage;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString(): string
+    {
+        return $this->getLibelle();
+    }
+
+    /**
+     * @param string $lang
+     *
+     * @return string
+     */
+    public function getLibelle(string $lang = 'fr'): string
+    {
+        return $this->pasEchantillonnage ? $this->pasEchantillonnage->getLibelle($lang) : '';
+    }
+
+    /**
+     * @return string
+     */
+    public function getLibelleEn(): string
+    {
+        return $this->getLibelle('en');
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Partenaire.php b/src/Irstea/BdohDataBundle/Entity/Partenaire.php
new file mode 100644
index 0000000000000000000000000000000000000000..34d6d304ed1650d07525c1fa39133936f943022d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Partenaire.php
@@ -0,0 +1,285 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * Class Partenaire.
+ *
+ * @UniqueEntity(fields={"nom", "observatoire"}, errorPath="nom", message="Ce nom existe déjà dans cet Observatoire")
+ */
+class Partenaire implements DocumentedEntityInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $lien;
+
+    /**
+     * @var string
+     */
+    protected $pathLogo;
+
+    /**
+     * @var bool
+     */
+    protected $estFinanceur = true;
+
+    /**
+     * @var TypeFunding
+     */
+    protected $typeFundings;
+
+    /**
+     *@var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * @var string
+     */
+    protected $iso;
+
+    /**
+     * @var string
+     */
+    protected $scanR;
+
+    /**
+     * Temporary variable used to upload file ; not mapped to Doctrine !
+     *
+     * @var UploadedFile
+     *
+     * @Assert\Image(maxSize = "50k")
+     */
+    protected $fileLogo = null;
+
+    //------------------------ctr----------------------------------------
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * @param Observatoire $observatoire
+     */
+    public function setObservatoire($observatoire)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * Set lien.
+     *
+     * @param string $lien
+     */
+    public function setLien($lien)
+    {
+        $this->lien = $lien;
+    }
+
+    /**
+     * Get lien.
+     *
+     * @return string
+     */
+    public function getLien()
+    {
+        return $this->lien;
+    }
+
+    /**
+     * Set pathLogo.
+     *
+     * @param string $pathLogo
+     */
+    public function setPathLogo($pathLogo)
+    {
+        $this->pathLogo = $pathLogo;
+    }
+
+    /**
+     * @return UploadedFile|string|null
+     */
+    public function getPathLogo()
+    {
+        return $this->pathLogo;
+    }
+
+    /**
+     * Set TypeFundings.
+     *
+     * @param TypeFunding $typeFundings
+     *
+     * @return Partenaire
+     */
+    public function setTypeFundings(TypeFunding $typeFundings = null)
+    {
+        $this->typeFundings = $typeFundings;
+
+        return $this;
+    }
+
+    /**
+     * Get TypeFundings.
+     *
+     * @return TypeFunding
+     */
+    public function getTypeFundings()
+    {
+        return $this->typeFundings;
+    }
+
+    /**
+     * Set estFinanceur.
+     *
+     * @param bool $estFinanceur
+     */
+    public function setEstFinanceur($estFinanceur)
+    {
+        $this->estFinanceur = $estFinanceur;
+    }
+
+    /**
+     * Get estFinanceur.
+     *
+     * @return bool
+     */
+    public function getEstFinanceur()
+    {
+        return $this->estFinanceur;
+    }
+
+    /**
+     * Set iso.
+     *
+     * @param string $iso
+     */
+    public function setIso($iso)
+    {
+        $this->iso = $iso;
+    }
+
+    /**
+     * Get iso.
+     *
+     * @return string
+     */
+    public function getIso()
+    {
+        return $this->iso;
+    }
+
+    /**
+     * Set scanR.
+     *
+     * @param string $scanR
+     */
+    public function setScanR($scanR)
+    {
+        $this->scanR = $scanR;
+    }
+
+    /**
+     * Get scanR.
+     *
+     * @return string
+     */
+    public function getScanR()
+    {
+        return $this->scanR;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDocumentFilePrefix()
+    {
+        return IrsteaBdohDataBundle::slugify($this->nom);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDocumentFields()
+    {
+        return ['pathLogo'];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/PasEchantillonnage.php b/src/Irstea/BdohDataBundle/Entity/PasEchantillonnage.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cfc1f4b020c9bfb42c3327c034312129e8152a2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/PasEchantillonnage.php
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+
+/**
+ * Class PasEchantillonnage.
+ */
+class PasEchantillonnage implements LabelledEntityInterface
+{
+    use LabelledEntityTrait;
+
+    /**
+     * @var int
+     */
+    private $id;
+
+    /**
+     * @var int
+     */
+    protected $approxSecondes;
+
+    /**
+     * @var string
+     */
+    private $unite;
+
+    /**
+     * @var int
+     */
+    private $valeur;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId(): int
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set unite.
+     *
+     * @param string $unite
+     *
+     * @return self
+     */
+    public function setUnite(string $unite): self
+    {
+        $this->unite = $unite;
+
+        return $this;
+    }
+
+    /**
+     * Get unite.
+     *
+     * @return string
+     */
+    public function getUnite(): string
+    {
+        return $this->unite;
+    }
+
+    /**
+     * Set valeur.
+     *
+     * @param int $valeur
+     *
+     * @return self
+     */
+    public function setValeur(int $valeur): self
+    {
+        $this->valeur = $valeur;
+
+        return $this;
+    }
+
+    /**
+     * Get valeur.
+     *
+     * @return int
+     */
+    public function getValeur(): int
+    {
+        return $this->valeur;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString(): string
+    {
+        return $this->valeur . ' ' . $this->unite;
+    }
+
+    /**
+     * Set approxSecondes.
+     *
+     * @param int $approxSecondes
+     *
+     * @return self
+     */
+    public function setApproxSecondes(int $approxSecondes): self
+    {
+        $this->approxSecondes = $approxSecondes;
+
+        return $this;
+    }
+
+    /**
+     * Get approxSecondes.
+     *
+     * @return int
+     */
+    public function getApproxSecondes(): int
+    {
+        return $this->approxSecondes;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/PersonneTheia.php b/src/Irstea/BdohDataBundle/Entity/PersonneTheia.php
new file mode 100644
index 0000000000000000000000000000000000000000..00e2cd83833bd931095407154679cc729656f3a4
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/PersonneTheia.php
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+
+class PersonneTheia
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $email;
+
+    /**
+     * @var string
+     */
+    protected $prenom;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var Partenaire
+     */
+    protected $partenaire;
+
+    /**
+     * @var Utilisateur|null
+     */
+    protected $utilisateur;
+
+    //----------------------------------------------getter et setter------------------------------------------------
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set email.
+     *
+     * @param string $email
+     */
+    public function setEmail(string $email)
+    {
+        $this->email = $email;
+    }
+
+    /**
+     * Get email.
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * Set prenom.
+     *
+     * @param string $prenom
+     */
+    public function setPrenom($prenom)
+    {
+        $this->prenom = $prenom;
+    }
+
+    /**
+     * Get prenom.
+     *
+     * @return string
+     */
+    public function getPrenom()
+    {
+        return $this->prenom;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set Partenaire.
+     *
+     * @param Partenaire $partenaire
+     *
+     * @return PersonneTheia
+     */
+    public function setPartenaire(Partenaire $partenaire = null)
+    {
+        $this->partenaire = $partenaire;
+
+        return $this;
+    }
+
+    /**
+     * Get Partenaire.
+     *
+     * @return Partenaire
+     */
+    public function getPartenaire()
+    {
+        return $this->partenaire;
+    }
+
+    /**
+     * Set Utilisateur.
+     *
+     * @param Utilisateur $utilisateur
+     *
+     * @return PersonneTheia
+     */
+    public function setUtilisateur(Utilisateur $utilisateur = null)
+    {
+        $this->utilisateur = $utilisateur;
+
+        return $this;
+    }
+
+    /**
+     * Get Utilisateur.
+     *
+     * @return Utilisateur
+     */
+    public function getUtilisateur()
+    {
+        return $this->utilisateur;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() . ' ' . $this->getPrenom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Plage.php b/src/Irstea/BdohDataBundle/Entity/Plage.php
new file mode 100644
index 0000000000000000000000000000000000000000..c30461d278d2613d6f1cd13ab9c6603d1c4daba3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Plage.php
@@ -0,0 +1,218 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class Plage.
+ */
+class Plage
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $debut;
+
+    /**
+     * @var string
+     */
+    protected $fin;
+
+    /**
+     * @var float
+     */
+    protected $valeur;
+
+    /**
+     * @var float
+     */
+    protected $minimum;
+
+    /**
+     * @var float
+     */
+    protected $maximum;
+
+    /**
+     * @var Qualite
+     */
+    protected $qualite;
+
+    /**
+     * @var ChroniqueDiscontinue
+     */
+    protected $chronique;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set debut.
+     *
+     * @param string $debut
+     */
+    public function setDebut($debut)
+    {
+        $this->debut = $debut;
+    }
+
+    /**
+     * Get debut.
+     *
+     * @return string
+     */
+    public function getDebut()
+    {
+        return $this->debut;
+    }
+
+    /**
+     * Set fin.
+     *
+     * @param string $fin
+     */
+    public function setFin($fin)
+    {
+        $this->fin = $fin;
+    }
+
+    /**
+     * Get fin.
+     *
+     * @return string
+     */
+    public function getFin()
+    {
+        return $this->fin;
+    }
+
+    /**
+     * Set valeur.
+     *
+     * @param float $valeur
+     */
+    public function setValeur($valeur)
+    {
+        $this->valeur = $valeur;
+    }
+
+    /**
+     * Get valeur.
+     *
+     * @return float
+     */
+    public function getValeur()
+    {
+        return $this->valeur;
+    }
+
+    /**
+     * Set minimum.
+     *
+     * @param float $minimum
+     */
+    public function setMinimum($minimum)
+    {
+        $this->minimum = $minimum;
+    }
+
+    /**
+     * Get minimum.
+     *
+     * @return float
+     */
+    public function getMinimum()
+    {
+        return $this->minimum;
+    }
+
+    /**
+     * Set maximum.
+     *
+     * @param float $maximum
+     */
+    public function setMaximum($maximum)
+    {
+        $this->maximum = $maximum;
+    }
+
+    /**
+     * Get maximum.
+     *
+     * @return float
+     */
+    public function getMaximum()
+    {
+        return $this->maximum;
+    }
+
+    /**
+     * Set qualite.
+     *
+     * @param Qualite $qualite
+     */
+    public function setQualite(Qualite $qualite)
+    {
+        $this->qualite = $qualite;
+    }
+
+    /**
+     * Get qualite.
+     *
+     * @return Qualite
+     */
+    public function getQualite()
+    {
+        return $this->qualite;
+    }
+
+    /**
+     * Set chronique.
+     *
+     * @param ChroniqueDiscontinue $chronique
+     */
+    public function setChronique(ChroniqueDiscontinue $chronique)
+    {
+        $this->chronique = $chronique;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return ChroniqueDiscontinue
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/PointControle.php b/src/Irstea/BdohDataBundle/Entity/PointControle.php
new file mode 100644
index 0000000000000000000000000000000000000000..5689f8b723e161b3f4bfde170638a9e0b15a1061
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/PointControle.php
@@ -0,0 +1,198 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * PointControle
+ * WARNING : the linked 'chroniqueContinue' will be loaded eagerly
+ * {@link http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#performance-impact
+ *        See Doctrine2 documentation for more information.}.
+ */
+class PointControle implements ChroniqueRelatedInterface
+{
+    use ChroniqueRelatedTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $date;
+
+    /**
+     * @var float
+     */
+    protected $valeur;
+
+    /**
+     * @var float
+     */
+    protected $minimum;
+
+    /**
+     * @var float
+     */
+    protected $maximum;
+
+    /**
+     * @var ChroniqueContinue
+     */
+    protected $chronique;
+
+    /**
+     * @var Qualite
+     */
+    protected $qualite;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set date.
+     *
+     * @param string $date
+     */
+    public function setDate($date)
+    {
+        $this->date = $date;
+    }
+
+    /**
+     * Get date.
+     *
+     * @return string
+     */
+    public function getDate()
+    {
+        return $this->date;
+    }
+
+    /**
+     * Set valeur.
+     *
+     * @param float $valeur
+     */
+    public function setValeur($valeur)
+    {
+        $this->valeur = $valeur;
+    }
+
+    /**
+     * Get valeur.
+     *
+     * @return float
+     */
+    public function getValeur()
+    {
+        return $this->valeur;
+    }
+
+    /**
+     * Set minimum.
+     *
+     * @param float $minimum
+     */
+    public function setMinimum($minimum)
+    {
+        $this->minimum = $minimum;
+    }
+
+    /**
+     * Get minimum.
+     *
+     * @return float
+     */
+    public function getMinimum()
+    {
+        return $this->minimum;
+    }
+
+    /**
+     * Set maximum.
+     *
+     * @param float $maximum
+     */
+    public function setMaximum($maximum)
+    {
+        $this->maximum = $maximum;
+    }
+
+    /**
+     * Get maximum.
+     *
+     * @return float
+     */
+    public function getMaximum()
+    {
+        return $this->maximum;
+    }
+
+    /**
+     * Set chronique.
+     *
+     * @param ChroniqueContinue $chronique
+     */
+    public function setChronique(ChroniqueContinue $chronique)
+    {
+        $this->chronique = $chronique;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return ChroniqueContinue
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * Set qualite.
+     *
+     * @param Qualite $qualite
+     */
+    public function setQualite(Qualite $qualite = null)
+    {
+        $this->qualite = $qualite;
+    }
+
+    /**
+     * Get qualite.
+     *
+     * @return Qualite
+     */
+    public function getQualite()
+    {
+        return $this->qualite;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Qualite.php b/src/Irstea/BdohDataBundle/Entity/Qualite.php
new file mode 100644
index 0000000000000000000000000000000000000000..ded303115d5dd3ac2992e16f9899818f3346d5c7
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Qualite.php
@@ -0,0 +1,317 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+
+/**
+ * Class Qualite.
+ */
+class Qualite implements LabelledEntityInterface
+{
+    use LabelledEntityTrait;
+
+    const GAP_CODE = 'gap';
+
+    const GAP_ORDRE = 100;
+
+    const INVALID_ORDRE = 200;
+
+    /**
+     * @var array
+     */
+    public static $ordresInvalides = [self::GAP_ORDRE, self::INVALID_ORDRE];
+
+    const LD_ORDRE = 600;
+
+    const LQ_ORDRE = 700;
+
+    /**
+     * @var array
+     */
+    public static $ordresLimites = [self::LD_ORDRE, self::LQ_ORDRE];
+
+    const DEFAULT_COLOR = [0, 0, 255]; // bleu #0000FF
+
+    const DEFAULT_THICKNESS = 1;
+
+    const DEFAULT_STYLE = [
+        'color'     => self::DEFAULT_COLOR,
+        'thickness' => self::DEFAULT_THICKNESS,
+    ];
+
+    const DEFAULT_GAP_COLOR = [255, 0, 0]; // rouge #FF0000
+
+    const DEFAULT_GAP_THICKNESS = 5;
+
+    const DEFAULT_GAP_STYLE = [
+        'color'     => self::DEFAULT_GAP_COLOR,
+        'thickness' => self::DEFAULT_GAP_THICKNESS,
+    ];
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $code;
+
+    /**
+     * @var string
+     */
+    protected $libelle;
+
+    /**
+     * @var string
+     */
+    protected $libelleEn;
+
+    /**
+     * @var int
+     */
+    protected $ordre;
+
+    /**
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * @var Collection
+     */
+    protected $traductions;
+
+    /**
+     * @var JeuQualite
+     */
+    protected $jeu;
+
+    /**
+     * @var array|null
+     */
+    protected $style;
+
+    /**
+     * Qualite constructor.
+     */
+    public function __construct()
+    {
+        $this->traductions = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set code.
+     *
+     * @param string $code
+     */
+    public function setCode($code)
+    {
+        $this->code = $code;
+    }
+
+    /**
+     * Get code.
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * Set ordre.
+     *
+     * @param int $ordre
+     */
+    public function setOrdre($ordre)
+    {
+        $this->ordre = $ordre;
+    }
+
+    /**
+     * Get ordre.
+     *
+     * @return int
+     */
+    public function getOrdre()
+    {
+        return $this->ordre;
+    }
+
+    /**
+     * Set type.
+     *
+     * @param string $type
+     */
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * Get type.
+     *
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Add traductions.
+     *
+     * @param QualiteJeuQualite $traduction
+     */
+    public function addTraduction(QualiteJeuQualite $traduction)
+    {
+        $this->traductions[] = $traduction;
+    }
+
+    /**
+     * Remove traductions.
+     *
+     * @param QualiteJeuQualite $traductions
+     */
+    public function removeTraduction(QualiteJeuQualite $traduction)
+    {
+        $this->traductions->removeElement($traduction);
+    }
+
+    /**
+     * Get traductions.
+     *
+     * @return Collection
+     */
+    public function getTraductions()
+    {
+        return $this->traductions;
+    }
+
+    /**
+     * Set jeu.
+     *
+     * @param JeuQualite $jeu
+     */
+    public function setJeu(JeuQualite $jeu)
+    {
+        $this->jeu = $jeu;
+    }
+
+    /**
+     * Get jeu.
+     *
+     * @return JeuQualite
+     */
+    public function getJeu()
+    {
+        return $this->jeu;
+    }
+
+    /**
+     * Set style.
+     *
+     * @param array|null $style
+     */
+    public function setStyle($style)
+    {
+        $this->style = $style;
+    }
+
+    /**
+     * Get style.
+     *
+     * @return array
+     */
+    public function getStyle()
+    {
+        $isGap = $this->isInvalide();
+        $style = $this->style ?: ($isGap ? self::DEFAULT_GAP_STYLE : self::DEFAULT_STYLE);
+        // always return a fully defined style in case it has been defined partialy in case the style components evolved
+        if (!isset($style['color'])) {
+            $style['color'] = $isGap ? self::DEFAULT_GAP_COLOR : self::DEFAULT_COLOR;
+        }
+        if (!isset($style['thickness'])) {
+            $style['thickness'] = $isGap ? self::DEFAULT_GAP_THICKNESS : self::DEFAULT_THICKNESS;
+        }
+
+        return $style;
+    }
+
+    /**
+     * Is invalide.
+     *
+     * @return bool
+     */
+    public function isInvalide()
+    {
+        return \in_array($this->getOrdre(), self::$ordresInvalides, true);
+    }
+
+    /**
+     * Is limite.
+     *
+     * @return bool
+     */
+    public function isLimite()
+    {
+        return \in_array($this->getOrdre(), self::$ordresLimites, true);
+    }
+
+    /**
+     * Is default gap.
+     *
+     * @return bool
+     */
+    public function isDefaultGap()
+    {
+        // we don't want the 'gap' code since we don't use it
+        return $this->ordre === self::GAP_ORDRE && $this->code !== self::GAP_CODE;
+    }
+
+    /**
+     * To string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getCode() . ' (' . $this->getLibelle() . ')';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/QualiteJeuQualite.php b/src/Irstea/BdohDataBundle/Entity/QualiteJeuQualite.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e2a8f34f9305e62e423dbb51d41b11f9288621c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/QualiteJeuQualite.php
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class QualiteJeuQualite.
+ */
+class QualiteJeuQualite
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var Qualite
+     */
+    protected $traduction;
+
+    /**
+     * @var JeuQualite
+     */
+    protected $jeu;
+
+    /**
+     * @var Qualite
+     */
+    protected $qualite;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set traduction.
+     *
+     * @param Qualite $traduction
+     */
+    public function setTraduction(Qualite $traduction)
+    {
+        $this->traduction = $traduction;
+    }
+
+    /**
+     * Get traduction.
+     *
+     * @return Qualite
+     */
+    public function getTraduction()
+    {
+        return $this->traduction;
+    }
+
+    /**
+     * Set jeu.
+     *
+     * @param JeuQualite $jeu
+     */
+    public function setJeu(JeuQualite $jeu)
+    {
+        $this->jeu = $jeu;
+    }
+
+    /**
+     * Get jeu.
+     *
+     * @return JeuQualite
+     */
+    public function getJeu()
+    {
+        return $this->jeu;
+    }
+
+    /**
+     * Set qualite.
+     *
+     * @param Qualite $qualite
+     */
+    public function setQualite(Qualite $qualite)
+    {
+        $this->qualite = $qualite;
+    }
+
+    /**
+     * Get qualite.
+     *
+     * @return Qualite
+     */
+    public function getQualite()
+    {
+        return $this->qualite;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/BaremeRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/BaremeRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5cc00ed353392693e0e1ef57688b1949d72515c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/BaremeRepository.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class BaremeRepository.
+ */
+class BaremeRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire' for the list in Sonata Admin.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'b', $indexBy = null)
+    {
+        return parent::createQueryBuilder($alias, $indexBy)
+            ->where($alias . '.observatoire = :observatoire')
+            ->setParameter('observatoire', $this->getCurrentObservatoire());
+    }
+
+    /**
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createOrderedQueryBuilder()
+    {
+        return parent::createQueryBuilder('b')->orderBy('b.dateCreation', 'DESC');
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createOrderedQueryBuilder()->getQuery()->getResult();
+    }
+
+    /**
+     * @param bool $includeTechnical
+     *
+     * @return array
+     */
+    public function securedFindAll($includeTechnical = true)
+    {
+        $where = 'b.observatoire = :observatoire';
+        if ($includeTechnical) {
+            $where .= ' OR b.observatoire IS NULL';
+        }
+
+        return $this->createOrderedQueryBuilder()
+            ->andWhere($where)
+            ->setParameter('observatoire', $this->getCurrentObservatoire())
+            ->getQuery()->getResult();
+    }
+
+    /**
+     * Returns all 'scales' entities that use the given unit.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Unite $unite
+     *
+     * @return array
+     */
+    public function findByUnite($unite)
+    {
+        return parent::createQueryBuilder('b')
+            ->leftJoin('b.uniteEntree', 'ue')
+            ->leftJoin('b.uniteSortie', 'us')
+            ->where('ue = :unite or us = :unite')
+            ->setParameter('unite', $unite)
+            ->getQuery()
+            ->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/BassinRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/BassinRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ae5c4ba92cc54793edb828a236a097894ffba63
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/BassinRepository.php
@@ -0,0 +1,273 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Bassin;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Station;
+
+/**
+ * Class BassinRepository.
+ */
+class BassinRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire' for the list in Sonata Admin.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'ba', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias);
+        }
+
+        return parent::createQueryBuilder($alias, $indexBy)
+            ->where($alias . '.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('ba')->orderBy('ba.nom', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @return array
+     */
+    public function getDataFromShapeTable($tableName)
+    {
+        try {
+            // récupération des stations et des bassins de l'observatoire courant
+            $allStations = $this->getBdohRepo('Station')->findAll();
+            $allStationsCodes = [];
+            foreach ($allStations as $station) {
+                /* @var Station $station */
+                $allStationsCodes[] = $station->getCode();
+            }
+            $allBassins = $this->findAll();
+            $allBassinsNoms = [];
+            foreach ($allBassins as $bassin) {
+                /* @var Bassin $bassin */
+                $allBassinsNoms[] = $bassin->getNom();
+            }
+
+            // requêtes d'analyse des bassins importés dans la table temporaire crée par shp2pgsql
+
+            // requête de base
+            $baseSqlParamsArray = [];
+            $baseSqlTypesArray = [];
+            $baseQuery = "SELECT nom, st_area(geom)::INTEGER AS aire, UPPER(code_exu) AS code_exu FROM $tableName";
+            $baseNomOk = ' AND nom IS NOT NULL';
+            $baseStationOk = ' AND code_exu IS NULL';
+            if ($allStationsCodes !== []) {
+                $baseStationOk = ' AND (code_exu IS NULL OR UPPER(code_exu) IN (?))';
+                $baseSqlParamsArray[] = $allStationsCodes;
+                $baseSqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            }
+            $baseOrderBy = ' ORDER BY nom ASC';
+
+            // requête sur les nouveaux bassins
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $newBassinsQuery = $baseQuery;
+            if ($allBassinsNoms !== []) {
+                $newBassinsQuery .= ' WHERE nom NOT IN (?)';
+                $sqlParamsArray[] = $allBassinsNoms;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $newBassinsQuery .= ' WHERE TRUE';
+            }
+            $newBassinsQuery .= $baseNomOk . $baseStationOk;
+            $sqlParamsArray = \array_merge($sqlParamsArray, $baseSqlParamsArray);
+            $sqlTypesArray = \array_merge($sqlTypesArray, $baseSqlTypesArray);
+            $newBassinsQuery .= $baseOrderBy;
+            $newBassins = $this->_em->getConnection()->fetchAll($newBassinsQuery, $sqlParamsArray, $sqlTypesArray);
+
+            // requête sur les bassins existants
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $existingBassinsQuery = $baseQuery;
+            if ($allBassinsNoms !== []) {
+                $existingBassinsQuery .= ' WHERE nom IN (?)';
+                $sqlParamsArray[] = $allBassinsNoms;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $existingBassinsQuery .= ' WHERE FALSE';
+            }
+            $existingBassinsQuery .= $baseNomOk . $baseStationOk;
+            $sqlParamsArray = \array_merge($sqlParamsArray, $baseSqlParamsArray);
+            $sqlTypesArray = \array_merge($sqlTypesArray, $baseSqlTypesArray);
+            $existingBassinsQuery .= $baseOrderBy;
+            $existingBassins = $this->_em->getConnection()->fetchAll($existingBassinsQuery, $sqlParamsArray, $sqlTypesArray);
+
+            // requête sur les bassins avec station exutoire inconnue
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $bassinsNopeStationQuery = $baseQuery;
+            if ($allStationsCodes !== []) {
+                $bassinsNopeStationQuery .= ' WHERE code_exu IS NOT NULL AND UPPER(code_exu) NOT IN (?)';
+                $sqlParamsArray[] = $allStationsCodes;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $bassinsNopeStationQuery .= ' WHERE code_exu IS NOT NULL';
+            }
+            $bassinsNopeStationQuery .= $baseNomOk;
+            $bassinsNopeStationQuery .= $baseOrderBy;
+            $bassinsNopeStation = $this->_em->getConnection()->fetchAll($bassinsNopeStationQuery, $sqlParamsArray, $sqlTypesArray);
+        } catch (\Exception $e) {
+            $this->dropTemporaryShapeTable($tableName);
+
+            return ['error' => 'bassin'];
+        }
+
+        return [
+            'cible'            => 'bassin',
+            'new'              => $newBassins,
+            'countNew'         => \count($newBassins),
+            'existing'         => $existingBassins,
+            'countExisting'    => \count($existingBassins),
+            'nopeStation'      => $bassinsNopeStation,
+            'countNopeStation' => \count($bassinsNopeStation),
+        ];
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeKeepExistingImport($tableName)
+    {
+        // récupération des bassins de l'observatoire courant
+        $allBassins = $this->findAll();
+        $allBassinsNoms = [];
+        foreach ($allBassins as $bassin) {
+            /* @var Bassin $bassin */
+            $allBassinsNoms[] = $bassin->getNom();
+        }
+
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requetes de selection des bassins importés dans la table temporaire crée par shp2pgsql
+
+        // filtrage sur les nouveaux bassins uniquement
+        $sqlParamsArray = [];
+        $sqlTypesArray = [];
+        $newBassinsFilter = 'AND t.nom IS NOT NULL';
+        if ($allBassinsNoms !== []) {
+            $newBassinsFilter .= ' AND t.nom NOT IN (?)';
+            $sqlParamsArray[] = $allBassinsNoms;
+            $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+        }
+
+        // requête de selection des nouveaux bassins AVEC station exutoire existante
+        // note : le DISTINCT est necessaire au cas ou la station est sur plusieurs sites
+        $newBassinsWithExistingStationQuery = <<<SQL
+SELECT NEXTVAL('bassin_id_seq'), $currentObsId, a.nom, a.aire, a.geom, a.stid FROM (
+  SELECT DISTINCT t.nom, st_area(t.geom)::INTEGER AS aire, t.geom, st.id AS stid
+  FROM $tableName t, station st, stations_sites ss, siteexperimental si
+  WHERE UPPER(t.code_exu) = st.code AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId
+    $newBassinsFilter
+) a
+SQL;
+
+        // requête de selection des nouveaux bassins SANS station exutoire
+        $newBassinsWithoutStationQuery = <<<SQL
+SELECT NEXTVAL('bassin_id_seq'), $currentObsId, t.nom, st_area(t.geom)::INTEGER, t.geom, NULL
+FROM $tableName t WHERE t.code_exu IS NULL $newBassinsFilter
+SQL;
+
+        // requêtes d'insertion
+        $baseInsertQueryBegin = 'INSERT INTO bassin (id, observatoire_id, nom, aire, perimetre, stationexutoire_id) ';
+        $baseInsertQueryEnd = ' ON CONFLICT DO NOTHING';
+        $newBassinsWithExistingStationInsertQuery =
+            $baseInsertQueryBegin . '(' . $newBassinsWithExistingStationQuery . ')' . $baseInsertQueryEnd;
+        $newBassinsWithoutStationInsertQuery =
+            $baseInsertQueryBegin . '(' . $newBassinsWithoutStationQuery . ')' . $baseInsertQueryEnd;
+
+        $inserts = $this->_em->getConnection()->executeUpdate($newBassinsWithExistingStationInsertQuery, $sqlParamsArray, $sqlTypesArray)
+            + $this->_em->getConnection()->executeUpdate($newBassinsWithoutStationInsertQuery, $sqlParamsArray, $sqlTypesArray);
+
+        return [$inserts, 0];
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeOverwriteExistingImport($tableName)
+    {
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requetes de selection des bassins importés dans la table temporaire crée par shp2pgsql
+
+        // filtrage sur les bassins existants uniquement
+        $existingBassinsFilter = "AND t.nom = b.nom AND b.observatoire_id = $currentObsId";
+
+        // requête de selection des bassins existants AVEC station exutoire existante
+        // note : le DISTINCT est necessaire au cas ou la station est sur plusieurs sites
+        $existingBassinsWithExistingStationQuery = <<<SQL
+SELECT DISTINCT b.id AS bid, st_area(t.geom)::INTEGER AS aire, t.geom, st.id AS stid
+FROM $tableName t, station st, stations_sites ss, siteexperimental si, bassin b
+WHERE UPPER(t.code_exu) = st.code AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId
+  $existingBassinsFilter
+SQL;
+
+        // requête de selection des bassins existants SANS station exutoire
+        $existingBassinsWithoutStationQuery = <<<SQL
+SELECT b.id AS bid, st_area(t.geom)::INTEGER AS aire, t.geom, NULL::INTEGER AS stid
+FROM $tableName t, bassin b
+WHERE t.code_exu IS NULL $existingBassinsFilter
+SQL;
+
+        // requêtes de mise à jour
+        $baseUpdateQueryBegin =
+            'UPDATE bassin SET (aire, perimetre, stationexutoire_id) = (temp.aire, temp.geom, temp.stid) FROM (';
+        $baseUpdateQueryEnd = ') temp WHERE bassin.id = temp.bid';
+        $existingBassinsWithExistingStationUpdateQuery =
+            $baseUpdateQueryBegin . $existingBassinsWithExistingStationQuery . $baseUpdateQueryEnd;
+        $existingBassinsWithoutStationUpdateQuery =
+            $baseUpdateQueryBegin . $existingBassinsWithoutStationQuery . $baseUpdateQueryEnd;
+
+        // faire l'update avant l'insert sinon le résultat est faussé
+        $updates = $this->_em->getConnection()->executeUpdate($existingBassinsWithExistingStationUpdateQuery)
+            + $this->_em->getConnection()->executeUpdate($existingBassinsWithoutStationUpdateQuery);
+
+        return [$this->shapeKeepExistingImport($tableName)[0], $updates];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueCalculeeRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueCalculeeRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..e05c82989b1f76d1ad322ab8ce9c58e07e92071e
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueCalculeeRepository.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\Query;
+
+/**
+ * Class ChroniqueCalculeeRepository.
+ */
+class ChroniqueCalculeeRepository extends ChroniqueContinueRepository
+{
+    /**
+     * @param string $chroniqueId
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return int
+     */
+    public function computeChronique($chroniqueId)
+    {
+        $sqlCommand = "SELECT bdoh_compute_chronique($chroniqueId) as code";
+        $dcs = $this->_em->getConnection()->prepare($sqlCommand);
+        $dcs->execute();
+        list($code) = $dcs->fetch(Query::HYDRATE_SCALAR);
+
+        if ($code === 0) {
+            $this->updateDatesMesuresByChronique($chroniqueId);
+        }
+
+        return $code;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueContinueRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueContinueRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..006ecbcf8dd9a535e7cfa69385779b52c2dacb4d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueContinueRepository.php
@@ -0,0 +1,1085 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+use Irstea\BdohDataBundle\Entity\Mesure;
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use Irstea\BdohDataBundle\Entity\PointControle;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+
+/**
+ * Class ChroniqueContinueRepository.
+ */
+class ChroniqueContinueRepository extends ChroniqueRepository
+{
+    /**
+     * @return MesureRepositoryInterface
+     */
+    public function getMeasureRepo()
+    {
+        /** @var MesureRepositoryInterface $repo */
+        $repo = $this->_em->getRepository(Mesure::class);
+
+        return $repo;
+    }
+
+    /**
+     * Shortcut to MesureRepository::getFirstLastDatesByChronique().
+     *
+     * @param array $chroniqueIds
+     *
+     * @return array|array[]
+     */
+    public function getFirstLastDatesByChronique(array $chroniqueIds = [])
+    {
+        return $this->getMeasureRepo()->getFirstLastDatesByChronique($chroniqueIds);
+    }
+
+    /**
+     * According to a start date and an end date, chooses and returns a time step for cumulative data.
+     *
+     * @param string $startDate Start date
+     * @param string $endDate   End date
+     *
+     * @throws \Exception
+     *
+     * @return int The time steps in seconds
+     */
+    private function getCumulativeTimeStep($startDate, $endDate)
+    {
+        if ($startDate && $endDate) {
+            // si la periode est inférieure ou égale à 1 mois le pas de temps est de 1h (3600 secondes)
+            // sinon le pas de temps est de 1j (86400 secondes)
+            $oneMonthAfterStart = \date_modify(new \DateTime($startDate, new \DateTimeZone('UTC')), '+1 month');
+            $lapse = strtotime($endDate) - $oneMonthAfterStart->getTimestamp();
+            $timeStep = ($lapse > 0) ? 86400 : 3600;
+        } else {
+            $timeStep = 86400;
+        }
+
+        return $timeStep;
+    }
+
+    /**getFillingRatesByYearAndMonth
+     * For a given 'chronique', returns an array whose structure is :
+     *  => Keys   = years
+     *  => Values = array(
+     *      -> 'month'      => array of rate (float)
+     *      -> 'totalTaux'  => sum of weighted rates (float)
+     *      -> 'totalPoids' => sum of weights
+     *  )
+     *  See, for use, "src/Irstea/BdohConsultBundle/Resources/views/Main/chronique.html.twig".
+     *
+     * @param ChroniqueContinue $chronique
+     *
+     * @return array
+     */
+    public function getFillingRatesByYearAndMonth(ChroniqueContinue $chronique)
+    {
+        $sql = 'SELECT 100 * taux as taux, poids, (100 * taux * poids) as weightedrate, ' .
+            "date_part('year', debut) as year, " .
+            "date_part('month', debut) as month " .
+            'FROM tauxremplissage ' .
+            'WHERE chronique_id = ' . $chronique->getId() . ' ' .
+            'ORDER BY year DESC, month ASC';
+
+        $results = $this->_em->getConnection()->fetchAll($sql);
+        $fillingRates = [];
+
+        foreach ($results as $result) {
+            if (false === array_key_exists($result['year'], $fillingRates)) {
+                $fillingRates[$result['year']] = [
+                    'month'      => [],
+                    'totalTaux'  => 0,
+                    'totalPoids' => 0,
+                ];
+            }
+            $currentYear = &$fillingRates[$result['year']];
+
+            $currentYear['month'][$result['month']] = ['taux' => $result['taux'], 'overlap'  => false];
+
+            $currentYear['totalTaux'] += $result['weightedrate'];
+            $currentYear['totalPoids'] += $result['poids'];
+            $currentYear['overlap'] = false;
+        }
+
+        return $fillingRates;
+    }
+
+    /**
+     * Selects measures for a given 'chronique', between two dates.
+     * Note : this query is intended for "curves viewer" purpose.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param mixed             $beginDate
+     * @param mixed             $endDate
+     * @param bool              $rightsForCheckpoints
+     * @param mixed             $maxValidPoints
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getOneChronicleViewerData(ChroniqueContinue $chronique, $beginDate, $endDate, $rightsForCheckpoints, $maxValidPoints = 50000)
+    {
+        if (!($beginDate instanceof \DateTime)) {
+            $beginDate = new \DateTime($beginDate ?: '0000-01-01 UTC');
+        }
+        if (!($endDate instanceof \DateTime)) {
+            $endDate = new \DateTime($endDate ?: '9999-12-31 UTC');
+        }
+
+        // Might need to specify that $beginDate & $endDate are in UTC
+        $utc = new \DateTimeZone('UTC');
+        $beginDate->setTimezone($utc);
+        $endDate->setTimezone($utc);
+
+        $beginDate = $beginDate->format(\DateTime::ATOM);
+        $endDate = $endDate->format(\DateTime::ATOM);
+
+        // For the current observatory, get the IDs of "gap" qualities
+        $jeuToJeu = new JeuToJeu($this->_em);
+        $gapIds = $jeuToJeu->getGapTypeIds();
+
+        // A few necessary values
+        $sampling = $chronique->getEchantillonnage();
+        $samplingType = $sampling ? $sampling->getCode() : 'instantaneous';
+        switch ($samplingType) {
+            case 'mean':
+                $tableOfMeasures = $this->seriesInstantaneousOrMeanSampling(
+                    $chronique,
+                    $beginDate,
+                    $endDate,
+                    true,
+                    // on privilégie *ahead* pour les moyennes si la direction n'est pas définie
+                    $chronique->getDirectionMesure() !== 'backward',
+                    $maxValidPoints
+                );
+                break;
+            case 'cumulative':
+                $tableOfMeasures = $this->seriesCumulativeSampling(
+                    $chronique,
+                    $beginDate,
+                    $endDate,
+                    // on privilégie *backward* pour les cumuls si la direction n'est pas définie
+                    $chronique->getDirectionMesure() === 'ahead'
+                );
+                break;
+            default:
+                $tableOfMeasures = $this->seriesInstantaneousOrMeanSampling(
+                    $chronique,
+                    $beginDate,
+                    $endDate,
+                    false,
+                    false,
+                    $maxValidPoints
+                );
+        }
+
+        // Indicate the sampling type (continuous/mean/cumulative) in the return value
+        $tableOfMeasures['samplingType'] = $samplingType;
+
+        // Whether the Y axis should be reversed for this time series
+        $tableOfMeasures['reverseAxis'] = $chronique->getReverseAxis();
+
+        // on n'affiche pas les points de contrôle sur les graphes en cumulé
+        // mais on affiche l'information de l'existance de ptc sur la periode
+        $tableOfMeasures['checkpointsOnCumulative'] = false;
+
+        // Add the possible control points to the output data
+        if ($rightsForCheckpoints) {
+            /** @var PointControleRepository $controlPointsRepo */
+            $controlPointsRepo = $this->_em->getRepository(PointControle::class);
+            $controlPoints = $controlPointsRepo->getControlesFromDates($chronique, $beginDate, $endDate);
+            if ($controlPoints && ($nCP = sizeof($controlPoints))) {
+                if ($samplingType !== 'cumulative') {
+                    $controlSeries = \array_fill(0, $nCP, [0.0, 0.0]);
+                    $i = 0;
+                    foreach ($controlPoints as $cp) {
+                        $controlSeries[$i][0] = 1000.0 * (float) strtotime($cp['date']);
+                        $controlSeries[$i][1] = (float) $cp['valeur'];
+                        ++$i;
+                    }
+                    $tableOfMeasures['series'][] = [
+                        'seriesFlag' => 'controlPoints',
+                        'values'     => $controlSeries,
+                        'style'      => $chronique->getObservatoire()->getJeu()->getCheckpointStyle(),
+                        'label'      => 'checkpoints', // traduit dans le contrôleur
+                        'showLabel'  => true,
+                    ];
+                } else {
+                    $tableOfMeasures['checkpointsOnCumulative'] = true;
+                }
+            }
+        }
+
+        $nPts = 0;
+        foreach ($tableOfMeasures['series'] as $s) {
+            if ($s['seriesFlag'] !== 'controlPoints') {
+                $nPts += sizeof($s['values']);
+            }
+        }
+        $tableOfMeasures['nPts'] = $nPts;
+
+        return $tableOfMeasures;
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     * @param string            $beginDate
+     * @param string            $endDate
+     * @param bool              $mean
+     * @param bool              $ahead
+     * @param int               $maxAllowedPoints
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    private function seriesInstantaneousOrMeanSampling(
+        $chronique,
+        $beginDate,
+        $endDate,
+        $mean,
+        $ahead,
+        $maxAllowedPoints = 50000
+    ) {
+        // vérification de la présence de mesures sur l'intervalle
+        $nbMesures = $chronique->getNbMesures();
+        $dateDebut = $chronique->getDateDebutMesures();
+        $dateFin = $chronique->getDateFinMesures();
+        $beginDateTime = new \DateTime($beginDate, new \DateTimeZone('UTC'));
+        $endDateTime = new \DateTime($endDate, new \DateTimeZone('UTC'));
+        $debutDateTime = new \DateTime($dateDebut, new \DateTimeZone('UTC'));
+        $finDateTime = new \DateTime($dateFin, new \DateTimeZone('UTC'));
+        if (!$nbMesures || !$dateDebut || !$dateFin ||
+            $endDateTime < $debutDateTime || $finDateTime < $beginDateTime) {
+            return [
+                'series'            => [],
+                'validMeasureCount' => 0,
+                'tooManyPoints'     => false,
+                'ahead'             => $ahead,
+            ];
+        }
+
+        // l'affichage en moyennes nécéssite 2 points par mesure
+        if ($mean) {
+            $maxAllowedPoints /= 2;
+        }
+
+        $chroniqueId = $chronique->getId();
+
+        // détermination des plages de qualités indentiques pour evaluer le
+        // nombre de points "valides" et la nécéssité d'un sous échantillonage
+        // avec récupération d'informations utiles pour le sous-échantillonnage
+
+        $sqlBoundaries = <<<SQL
+WITH flags(i, date, epochms, flag) AS (
+    SELECT
+        ROW_NUMBER() OVER () AS i,
+        date,
+        1000 * EXTRACT(EPOCH FROM m.date AT TIME ZONE 'UTC') AS epochms,
+        CASE q.ordre
+            WHEN 100 THEN 'gap'
+            WHEN 200 THEN 'invalid'
+            ELSE 'valid_' || q.code
+        END AS flag
+    FROM mesure m INNER JOIN qualite q ON (m.qualite_id = q.id)
+    WHERE
+        chronique_id = $chroniqueId
+        AND m.date >= (SELECT COALESCE(MAX(date), '$beginDate') FROM mesure WHERE chronique_id = $chroniqueId AND date <= '$beginDate')
+        AND m.date <= (SELECT COALESCE(MIN(date), '$endDate') FROM mesure WHERE chronique_id = $chroniqueId AND date >= '$endDate')
+    ORDER BY m.date ASC
+)
+SELECT * FROM (
+    SELECT
+        *,
+        COALESCE(flag <> LAG(flag) OVER(), true) AS debut,
+        COALESCE(flag <> LEAD(flag) OVER(), true) AS fin
+    FROM flags
+) f WHERE debut or fin
+SQL;
+
+        $boundariesStmt = $this->_em->getConnection()->prepare($sqlBoundaries);
+        $boundariesStmt->execute();
+        $boundaries = $boundariesStmt->fetchAll(\PDO::FETCH_NUM);
+
+        // le nombre de bornes
+        $nbBoundaries = \count($boundaries);
+
+        $boudariesData = [];
+        $nbValid = 0;
+        $spanValid = 0.0;
+        $dataIndex = 0;
+        foreach ($boundaries as $boundary) {
+            // récupération des données de la plage de qualité
+            list($i, $date, $epochms, $flag, $debut, $fin) = $boundary;
+            $epochms = (float) $epochms;
+            if ($debut) {
+                $boudariesData[$dataIndex] = [];
+                $boudariesData[$dataIndex]['i_debut'] = $i;
+                $boudariesData[$dataIndex]['date_debut'] = $date;
+                $boudariesData[$dataIndex]['epochms_debut'] = $epochms;
+            }
+            if ($fin) {
+                $boudariesData[$dataIndex]['i_fin'] = $i;
+                $boudariesData[$dataIndex]['date_fin'] = $date;
+                $boudariesData[$dataIndex]['epochms_fin'] = $epochms;
+                if ($flag !== 'invalid' && $flag !== 'gap') {
+                    $nbValid += $boudariesData[$dataIndex]['i_fin'] - $boudariesData[$dataIndex]['i_debut'] + 1;
+                    $spanValid += $boudariesData[$dataIndex]['epochms_fin'] - $boudariesData[$dataIndex]['epochms_debut'];
+                }
+                ++$dataIndex;
+            }
+        }
+
+        if ($nbValid <= $maxAllowedPoints) { // pas de sous-échantillonnage
+            // toutes les mesures
+            $sqlMesures = <<<SQL
+SELECT
+    1000 * EXTRACT(EPOCH FROM m.date AT TIME ZONE 'UTC') AS date,
+    m.valeur AS valeur,
+    m.qualite_id AS qid,
+    q.ordre AS ordre,
+    CASE q.ordre
+        WHEN 100 THEN 'gap'
+        WHEN 200 THEN 'invalid'
+        ELSE 'valid_' || q.code
+    END AS flag
+FROM mesure m INNER JOIN qualite q ON (m.qualite_id = q.id)
+WHERE
+    m.chronique_id = $chroniqueId
+    AND m.date >= (SELECT COALESCE(MAX(date), '$beginDate') FROM mesure WHERE chronique_id = $chroniqueId AND date <= '$beginDate')
+    AND m.date <= (SELECT COALESCE(MIN(date), '$endDate') FROM mesure WHERE chronique_id = $chroniqueId AND date >= '$endDate')
+ORDER BY m.date ASC
+SQL;
+        } else { // on sous-échantillonne
+            // reduction du nombre de points max autorisés par le nombre de bornes
+            // (qui, elles, ne disparaissent pas pendant le sous échantillonnage)
+            $maxAllowedPointsRedux = \max($maxAllowedPoints - $nbBoundaries, 1);
+
+            // détermination de la durée d'échantillonnage de base sachant que l'on prend
+            // 2 points par echantillonnage (le min et le max pour chaque échantillonnage)
+            $baseSpliceSpan = $spanValid * 2.0 / (float) $maxAllowedPointsRedux;
+
+            // les données d'echantillonnage
+            $datesDebuts = [];
+            $datesFins = [];
+            $sliceSpans = [];
+            foreach ($boudariesData as $boudaryData) {
+                $datesDebuts[] = $boudaryData['date_debut'];
+                $datesFins[] = $boudaryData['date_fin'];
+                $span = $boudaryData['epochms_fin'] - $boudaryData['epochms_debut'];
+                $nbSlices = \max($span / $baseSpliceSpan, 1.0);
+                $sliceSpans[] = \max(\ceil($span / $nbSlices), 1.0) / 1000.0;
+            }
+            $datesDebuts = "'{" . \implode(',', $datesDebuts) . "}'";
+            $datesFins = "'{" . \implode(',', $datesFins) . "}'";
+            $sliceSpans = "'{" . \implode(',', $sliceSpans) . "}'";
+
+            // les mesures sous-echantillonnées
+            $sqlMesures = <<<SQL
+SELECT * FROM bdoh_subsampled_instantaneous_all_series_measures_with_flag($chroniqueId, $datesDebuts, $datesFins, $sliceSpans)
+SQL;
+        }
+
+        $mesures = $this->_em->getConnection()->prepare($sqlMesures);
+        $mesures->setFetchMode(\PDO::FETCH_NUM);
+        $mesures->execute();
+
+        $series = [];
+        /* $series = [
+            qid => [
+                'seriesFlag' => flag,
+                'values' => [[date, valeur], ...],
+                'qualiteId' => qid
+            ],
+            ...
+        ] */
+        $lastMesure = null;
+        $lastValueNotAdded = false;
+
+        /* Note sur l'affrontement des qualités :
+
+        on ne suit pas le tableau d'affrontement des qualités de la documentation sur les lq/ld
+
+        seul l'ordre inférieur gagne
+
+        donc lq (600) vs ld (700) -> lq (et pas éstimé)
+        pareil pour lq vs lq -> lq et ld vs ld -> ld
+        et v (800) vs lq/ld -> lq/ld (et pas éstimé) */
+
+        foreach ($mesures as $mesure) {
+            $lastValueNotAdded = false;
+
+            // récupération des données de la mesure
+            list($date, $valeur, $qid, $ordre, $flag) = $mesure;
+            $date = (float) $date;
+            $valeur = $valeur === null ? 0.0 : (float) $valeur;
+
+            if (!isset($series[$qid])) {
+                $series[$qid] = [
+                    'seriesFlag' => $flag,
+                    'values'     => [],
+                    'qualiteId'  => $qid,
+                ];
+            }
+
+            if ($lastMesure) {
+                // récupération des données de la mesure précédente
+                list($last_date, $last_valeur, $last_qid, $last_ordre, $last_flag) = $lastMesure;
+                $last_date = (float) $last_date;
+                $last_valeur = $last_valeur === null ? 0.0 : (float) $last_valeur;
+
+                // gestion de la propagation des qualités si la qualité change
+                if ($last_flag !== $flag) {
+                    if ($last_ordre > $ordre) {
+                        // propagation de l'actuelle sur la précédente (amont)
+                        $last_valeur_corrected = $last_valeur;
+                        if ($flag === 'invalid' || $flag === 'gap') {
+                            $last_valeur_corrected = 0.0;
+                        }
+                        // point de propagation de la qualité
+                        $series[$qid]['values'][] = [$last_date, $last_valeur_corrected];
+                        // point intermédiaire pour le plateau des moyennes
+                        if ($mean && $flag !== 'invalid' && $flag !== 'gap') {
+                            if ($ahead) {
+                                $series[$qid]['values'][] = [$date, $last_valeur];
+                            } else {
+                                $series[$qid]['values'][] = [$last_date, $valeur];
+                            }
+                        }
+                    } elseif ($last_ordre < $ordre) {
+                        // propagation de la précédente sur l'actuelle (aval)
+                        $valeur_corrected = $valeur;
+                        if ($last_flag === 'invalid' || $last_flag === 'gap') {
+                            $valeur_corrected = 0.0;
+                        }
+                        // point intermédiaire pour le plateau des moyennes
+                        if ($mean && $flag !== 'invalid' && $flag !== 'gap') {
+                            if ($ahead) {
+                                $series[$last_qid]['values'][] = [$date, $last_valeur];
+                            } else {
+                                $series[$last_qid]['values'][] = [$last_date, $valeur];
+                            }
+                        }
+                        // point de propagation de la qualité
+                        $series[$last_qid]['values'][] = [$date, $valeur_corrected];
+                    }
+                    // intéruption de la continuité de la série précédente
+                    $series[$last_qid]['values'][] = [null, null];
+                }
+
+                // pas de changement de qualité
+                else {
+                    // point intermédiaire pour le plateau des moyennes
+                    if ($mean && $flag !== 'invalid' && $flag !== 'gap') {
+                        if ($ahead) {
+                            $series[$qid]['values'][] = [$date, $last_valeur];
+                        } else {
+                            $series[$qid]['values'][] = [$last_date, $valeur];
+                        }
+                    }
+                }
+
+                // enregistrement du point courant si on n'est pas sur un invalid ni un gap
+                // ou si on est sur un invalid qui suit un gap
+                if (($flag !== 'invalid' && $flag !== 'gap') || ($last_ordre < $ordre)) {
+                    $series[$qid]['values'][] = [$date, $valeur];
+                } else {
+                    $lastValueNotAdded = true;
+                }
+            } else {
+                // enregistrement du tout premier point
+                $series[$qid]['values'][] = [$date, $valeur];
+            }
+
+            // enregistrement de la mesure dans la mesure précédente
+            $lastMesure = $mesure;
+        }
+
+        // ajout du tout dernier point s'il n'a pas été ajouté
+        if ($lastValueNotAdded === true) {
+            // récupération des données de la dernière mesure
+            list($last_date, $last_valeur, $last_qid, $last_ordre, $last_flag) = $lastMesure;
+            $last_date = (float) $last_date;
+            $last_valeur = $last_valeur === null ? 0.0 : (float) $last_valeur;
+            $series[$last_qid]['values'][] = [$last_date, $last_valeur];
+        }
+
+        // pas de recalcul des bornes aux bornes du graphe (le graphe n'en a pas besoin)
+
+        // suppression des points en dehors de la periode affichée s'ils ne sont pas en continuité
+        // au début des séries
+        foreach ($series as &$serie) {
+            if ($serie['values'][0][0] > (float) (1000 * $endDateTime->getTimestamp())) {
+                \array_shift($serie['values']);
+            }
+            if (count($serie['values']) === 0) {
+                unset($series[$serie['qualiteId']]);
+            }
+        }
+        // les [null, null] à la fin des séries
+        foreach ($series as &$serie) {
+            if ($serie['values'][\count($serie['values']) - 1] === [null, null]) {
+                \array_pop($serie['values']);
+            }
+            if (count($serie['values']) === 0) {
+                unset($series[$serie['qualiteId']]);
+            }
+        }
+        // à la fin des séries
+        foreach ($series as &$serie) {
+            if ($serie['values'][\count($serie['values']) - 1][0] < (float) (1000 * $beginDateTime->getTimestamp())) {
+                \array_pop($serie['values']);
+            }
+            if (count($serie['values']) === 0) {
+                unset($series[$serie['qualiteId']]);
+            }
+        }
+
+        // trie des series suivant le qid pour que la légende soit dans l'ordre des qualités
+        \ksort($series, SORT_NUMERIC);
+
+        return [
+            'series'            => \array_values($series),
+            'validMeasureCount' => $nbValid,
+            'tooManyPoints'     => $nbValid > $maxAllowedPoints,
+            'ahead'             => $ahead,
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     * @param string            $beginDate
+     * @param string            $endDate
+     * @param bool              $ahead
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    private function seriesCumulativeSampling(
+        $chronique,
+        $beginDate,
+        $endDate,
+        $ahead
+    ) {
+        $chroniqueId = $chronique->getId();
+        $timeStep = $this->getCumulativeTimeStep($beginDate, $endDate);
+
+        if ($ahead) {
+            $math = 'FLOOR';
+            $whereDate = <<<SQL
+        AND m.date >= '$beginDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' - (INTERVAL '1 second' * $timeStep)
+        AND m.date < '$endDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' + (INTERVAL '1 second' * $timeStep)
+SQL;
+        } else {
+            $math = 'CEIL';
+            $whereDate = <<<SQL
+        AND m.date > '$beginDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' - (INTERVAL '1 second' * $timeStep)
+        AND m.date <= '$endDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' + (INTERVAL '1 second' * $timeStep)
+SQL;
+        }
+
+        $sqlCumuls = <<<SQL
+WITH qualites(qid, ordre, flag) AS (
+    SELECT DISTINCT
+        m.qualite_id AS qid,
+        q.ordre AS ordre,
+        CASE q.ordre
+            WHEN 100 THEN 'gap'
+            WHEN 200 THEN 'invalid'
+            ELSE 'valid_' || q.code
+        END AS flag
+    FROM mesure m INNER JOIN qualite q ON (m.qualite_id = q.id)
+    WHERE q.code <> 'gap' AND chronique_id = $chroniqueId
+),
+mesures(stepbefore, step, stepafter, valeur, ordre) AS (
+    SELECT
+        1000 * EXTRACT(EPOCH FROM ('$beginDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' +
+            (INTERVAL '1 second' * (($math(EXTRACT(EPOCH FROM AGE(m.date AT TIME ZONE 'UTC',
+                '$beginDate' AT TIME ZONE 'UTC')) / $timeStep) - 1) * $timeStep)))) AS stepbefore,
+        1000 * EXTRACT(EPOCH FROM ('$beginDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' +
+            (INTERVAL '1 second' * ($math(EXTRACT(EPOCH FROM AGE(m.date AT TIME ZONE 'UTC',
+                '$beginDate' AT TIME ZONE 'UTC')) / $timeStep) * $timeStep)))) AS step,
+        1000 * EXTRACT(EPOCH FROM ('$beginDate'::TIMESTAMP WITHOUT TIME ZONE AT TIME ZONE 'UTC' +
+            (INTERVAL '1 second' * (($math(EXTRACT(EPOCH FROM AGE(m.date AT TIME ZONE 'UTC',
+                '$beginDate' AT TIME ZONE 'UTC')) / $timeStep) + 1) * $timeStep)))) AS stepafter,
+        m.valeur::NUMERIC AS valeur,
+        q.ordre AS ordre
+    FROM mesure m INNER JOIN qualite q ON (m.qualite_id = q.id)
+    WHERE
+        chronique_id = $chroniqueId
+        $whereDate
+    ORDER BY m.date
+),
+cumuls(stepbefore, step, stepafter, sum_valeur, min_ordre) AS (
+    SELECT stepbefore, step, stepafter, sum(valeur), min(ordre)
+    FROM mesures
+    GROUP BY stepbefore, step, stepafter
+    ORDER BY step
+)
+SELECT stepbefore, step, stepafter, sum_valeur, qid, flag
+FROM cumuls INNER JOIN qualites ON (min_ordre = ordre)
+ORDER BY step
+SQL;
+
+        $cumuls = $this->_em->getConnection()->prepare($sqlCumuls);
+        $cumuls->setFetchMode(\PDO::FETCH_NUM);
+        $cumuls->execute();
+
+        $series = [];
+        /* $series = [
+            qid => [
+                'seriesFlag' => flag,
+                'values' => [[date, valeur], ...],
+                'qualiteId' => qid
+            ],
+            ...
+        ] */
+        $nbValid = 0;
+        $lastFlag = null;
+
+        foreach ($cumuls as $cumul) {
+            // récupération des données du cumul
+            list($stepbefore, $step, $stepafter, $sum_valeur, $qid, $flag) = $cumul;
+            $stepbefore = (float) $stepbefore;
+            $step = (float) $step;
+            $stepafter = (float) $stepafter;
+            $sum_valeur = (float) $sum_valeur;
+
+            if (!isset($series[$qid])) {
+                $series[$qid] = [
+                    'seriesFlag' => $flag,
+                    'values'     => [],
+                    'qualiteId'  => $qid,
+                ];
+            }
+
+            if ($flag === 'invalid' || $flag === 'gap') {
+                if ($lastFlag && $lastFlag !== $flag) {
+                    $series[$qid]['values'][] = [null, null];
+                }
+                if ($ahead) {
+                    $series[$qid]['values'][] = [$step, 0.0];
+                    $series[$qid]['values'][] = [$stepafter, 0.0];
+                } else {
+                    $series[$qid]['values'][] = [$stepbefore, 0.0];
+                    $series[$qid]['values'][] = [$step, 0.0];
+                }
+            } else {
+                $series[$qid]['values'][] = [$step, $sum_valeur];
+                ++$nbValid;
+            }
+
+            $lastFlag = $flag;
+        }
+
+        // trie des series suivant le qid pour que la légende soit dans l'ordre des qualités
+        \ksort($series, SORT_NUMERIC);
+
+        return [
+            'series'            => \array_values($series),
+            'validMeasureCount' => $nbValid,
+            'tooManyPoints'     => false,
+            'timeStep'          => $timeStep,
+            'ahead'             => $ahead,
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     * @param \DateTime         $debut
+     * @param \DateTime         $fin
+     * @param $timestep
+     * @param \DateTimeZone $timezone
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getDataChangeStepInstant(
+        ChroniqueContinue $chronique,
+        \DateTime $debut,
+        \DateTime $fin,
+        $timestep,
+        \DateTimeZone $timezone
+    ) {
+        $timestepSeconds = (60 * $timestep);
+
+        return $this->extractResampledMeasures(
+            <<<'SQL'
+                SELECT
+                    s.step%TZCORRECTION% AS date,
+                    bdoh_interpolate_linear(s.start_date, s.start_valeur, s.end_date, s.end_valeur, s.step) AS valeur,
+                    q.code AS qualite
+                FROM
+                    bdoh_export_interpolate_linear(:chronique_id, :debut::TIMESTAMP, :fin::TIMESTAMP, :timestep::INTERVAL) s
+                    INNER JOIN interp_qualite iq
+                        ON (iq.input1_id = s.start_qualite_id AND iq.input2_id = s.end_qualite_id)
+                    INNER JOIN qualite q
+                        ON (q.jeu_id = :jeu_id AND q.id =
+                            CASE s.step
+                                WHEN s.start_date THEN
+                                    s.start_qualite_id
+                                ELSE
+                                    iq.output_id
+                            END)
+                ORDER BY s.step;
+SQL
+            ,
+            $chronique,
+            $debut,
+            $fin,
+            sprintf('%d minutes', $timestep),
+            $timezone,
+            ['jeu_id' => $chronique->getObservatoire()->getJeu()->getId()]
+        );
+    }
+
+    /**
+     * @param string            $query
+     * @param ChroniqueContinue $chronique
+     * @param \DateTime         $debut
+     * @param \DateTime         $fin
+     * @param int|string        $timestep
+     * @param \DateTimeZone     $timezone
+     * @param array             $moreParameters
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    private function extractResampledMeasures(
+        $query,
+        ChroniqueContinue $chronique,
+        \DateTime $debut,
+        \DateTime $fin,
+        $timestep,
+        \DateTimeZone $timezone,
+        array $moreParameters = []
+    ) {
+        list($withTzCorrection, $parameters) = $this->getTzCorrectionForSql($timezone);
+
+        $parameters = array_merge(
+            $moreParameters,
+            $parameters,
+            [
+                'chronique_id' => $chronique->getId(),
+                'debut'        => $this->formatTimestampAtUtc($debut),
+                'fin'          => $this->formatTimestampAtUtc($fin),
+                'timestep'     => $timestep,
+            ]
+        );
+
+        $queryWithTz = str_replace('%TZCORRECTION%', $withTzCorrection, $query);
+
+        return [
+            $this->_em->getConnection()->executeQuery($queryWithTz, $parameters),
+            $this->getExportReport($chronique, $debut, $fin),
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue  $chronique
+     * @param \DateTime          $debut
+     * @param \DateTime          $fin
+     * @param PasEchantillonnage $timestep
+     * @param \DateTimeZone      $timezone
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getDataChangeStepMean(
+        ChroniqueContinue $chronique,
+        \DateTime $debut,
+        \DateTime $fin,
+        PasEchantillonnage $timestep,
+        \DateTimeZone $timezone
+    ) {
+        return [
+            $this->getResampledMeasures(
+                $chronique,
+                $debut,
+                $fin,
+                $timestep->getId(),
+                $timezone,
+                [
+                    'boundary_start %TZCORRECTION% AS debut',
+                    'boundary_end %TZCORRECTION% AS fin',
+                    'value AS valeur',
+                    'quality AS qualite',
+                ],
+                "bdoh_interp_to_mean_or_cumul(:chronique_id, :debut, :fin, :timestep, true, 'round-time')"
+            ),
+            $this->getExportReport($chronique, $debut, $fin),
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue  $chronique
+     * @param \DateTime          $debut
+     * @param \DateTime          $fin
+     * @param PasEchantillonnage $timestep
+     * @param \DateTimeZone      $timezone
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getDataChangeStepCumulative(
+        ChroniqueContinue $chronique,
+        \DateTime $debut,
+        \DateTime $fin,
+        PasEchantillonnage $timestep,
+        \DateTimeZone $timezone
+    ) {
+        return [
+            $this->getResampledMeasures(
+                $chronique,
+                $debut,
+                $fin,
+                $timestep->getId(),
+                $timezone,
+                [
+                    'boundary_start %TZCORRECTION% AS debut',
+                    'boundary_end %TZCORRECTION% AS fin',
+                    'valeur',
+                    'qualite',
+                ],
+                "bdoh_interp_to_cumulative(:chronique_id, :debut, :fin, :timestep, 'round-time')"
+            ),
+            $this->getExportReport($chronique, $debut, $fin),
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     * @param \DateTime         $debut
+     * @param \DateTime         $fin
+     * @param $timestep
+     * @param \DateTimeZone $timezone
+     * @param array         $columns
+     * @param $from
+     *
+     * @throws \Exception
+     *
+     * @return \Doctrine\DBAL\Driver\Statement
+     */
+    private function getResampledMeasures(
+        ChroniqueContinue $chronique,
+        \DateTime $debut,
+        \DateTime $fin,
+        $timestep,
+        \DateTimeZone $timezone,
+        array $columns,
+        $from
+    ) {
+        $dbal = $this->_em->getConnection();
+
+        list($withTzCorrection, $parameters) = $this->getTzCorrectionForSql($timezone);
+
+        $parameters = array_merge(
+            $parameters,
+            [
+                'chronique_id' => $chronique->getId(),
+                'debut'        => $this->formatTimestampAtUtc($debut),
+                'fin'          => $this->formatTimestampAtUtc($fin),
+                'timestep'     => $timestep,
+            ]
+        );
+
+        $columnsWithTz = array_map(
+            function ($column) use ($withTzCorrection) {
+                return str_replace('%TZCORRECTION%', $withTzCorrection, $column);
+            },
+            $columns
+        );
+
+        $builder = $dbal
+            ->createQueryBuilder()
+            ->select($columnsWithTz)
+            ->from($from);
+
+        return $dbal->executeQuery($builder->getSQL(), $parameters);
+    }
+
+    /**
+     * @param Utilisateur|mixed $user
+     *
+     * @return array
+     */
+    public function securedFindAllHavingControlePoints($user)
+    {
+        $sql = 'select distinct chronique_id from pointcontrole';
+        $results = $this->_em->getConnection()->fetchAll($sql);
+
+        $ids = [];
+        foreach ($results as $result) {
+            $ids[] = $result['chronique_id'];
+        }
+
+        $qb = $this->createSecuredQueryBuilderForEdit($user, 'ch');
+
+        if ($ids !== []) {
+            $qb = $qb->andWhere('ch.id in (' . implode(',', $ids) . ')');
+        } else {
+            $qb = $qb->andWhere('false = true');
+        }
+
+        return $qb
+            ->orderBy('st.nom', 'ASC')
+            ->addOrderBy('ch.code', 'ASC')
+            ->getQuery()->getResult();
+    }
+
+    /**
+     * Selects PointControle for a given 'chronique'.
+     *
+     * Returns an array whose structure is:
+     *      => 0 == "Doctrine statement" (Doctrine\DBAL\Driver\Statement)
+     *      => 1 == array(
+     *          "first"  => SQL date
+     *          "last"   => SQL date
+     *          "number" => number of measures selected
+     *      )
+     *
+     * Note : this query is intended for export purpose.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param mixed             $timezone
+     * @param mixed             $defaultQualityCode
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getControlePointsForExport(ChroniqueContinue $chronique, $timezone, $defaultQualityCode = '')
+    {
+        // SQL query for measures selection
+        $qualityColumn = $defaultQualityCode ? "COALESCE(q.code, '$defaultQualityCode')" : 'q.code';
+        $measuresSql = "SELECT (p.date + '$timezone') as date, p.valeur, $qualityColumn as qualite, p.minimum, p.maximum " .
+            'FROM pointcontrole as p ' .
+            'LEFT JOIN qualite q ON q.id = p.qualite_id ' .
+            'WHERE p.chronique_id = ' . $chronique->getId() . ' ';
+        $measuresSql .= 'ORDER BY p.date ASC ';
+
+        // SQL query for information about this selection
+        $infoSql = 'SELECT MIN(p.date) as first, ' .
+            '       MAX(p.date) as last, ' .
+            '       COUNT(p.id) as number ' .
+            'FROM pointcontrole as p ' .
+            'WHERE p.chronique_id = ' . $chronique->getId() . ' ';
+
+        // Returns "Doctrine statement" + information
+        return [
+            $this->_em->getConnection()->executeQuery($measuresSql),
+            $this->_em->getConnection()->fetchAssoc($infoSql),
+        ];
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     * @param null              $defaultParams
+     *
+     * @return array
+     */
+    public function getAllowedExportParameters(ChroniqueContinue $chronique, $defaultParams = null)
+    {
+        $params = [
+            'samplings' => [], // Allowed sampling types at regular time step
+            'timeSteps' => [], // Allowed regular time steps
+        ];
+
+        $inputSampling = $chronique->getEchantillonnage();
+        if (!$inputSampling) {
+            $inputSampling = $this->_em->getRepository(Echantillonnage::class)->findOneByCode('instantaneous');
+        }
+        $minOutputOrder = $inputSampling->getOrdreSortie();
+        $inputSamplingCode = $inputSampling->getCode();
+
+        // Allowed export parameters are set properly for this time series
+        if (!$chronique->getMustEditExportOptions()) {
+            // Get allowed sampling types at regular time step (making sure they are possible given the time series' sampling type)
+            foreach ($chronique->getEchantillonnagesSortieLicites() as $sampling) {
+                if ($sampling->getOrdreSortie() >= $minOutputOrder) {
+                    $params['samplings'][] = $sampling;
+                }
+            }
+            // Now, get allowed regular time steps (only those matching the time series' sampling type)
+            foreach ($chronique->getOptionsEchantillonnageSortie() as $option) {
+                if ($option->getEchantillonnageEntree()->getCode() === $inputSamplingCode) {
+                    $params['timeSteps'][] = $option->getPasEchantillonnage();
+                }
+            }
+        } // Allowed export parameters are not firmly set yet. Use default parameters instead.
+        elseif ($defaultParams) {
+            $defaultParams = $defaultParams[$inputSamplingCode];
+            $allowedSamplingCodes = $defaultParams['samplings'];
+            foreach ($this->_em->getRepository(Echantillonnage::class)->findByCode($allowedSamplingCodes) as $sampling) {
+                if ($sampling->getOrdreSortie() >= $minOutputOrder) {
+                    $params['samplings'][] = $sampling;
+                }
+            }
+
+            $defaultStepValues = [];
+            $defaultStepUnits = [];
+            foreach ($defaultParams['steps'] as $valueAndUnit) {
+                $defaultStepValues[] = $valueAndUnit[0];
+                $defaultStepUnits[] = $valueAndUnit[1];
+            }
+            // Alas, we won't be able to check consistency between the time series' sampling type
+            // and the default time steps in a simple way. Take all defaults and just don't care.
+            $params['timeSteps'] = $this->_em->getRepository(PasEchantillonnage::class)->findBy(
+                [
+                    'valeur' => $defaultStepValues,
+                    'unite'  => $defaultStepUnits,
+                ]
+            );
+        }
+
+        // Sort sampling types by output 'order' & time steps by approx. seconds
+        if (\sizeof($params['samplings']) > 0) {
+            usort(
+                $params['samplings'],
+                function ($s1, $s2) {
+                    return $s1->getOrdreSortie() - $s2->getOrdreSortie();
+                }
+            );
+        }
+        if (\sizeof($params['timeSteps']) > 0) {
+            usort(
+                $params['timeSteps'],
+                function ($ts1, $ts2) {
+                    return $ts1->getApproxSecondes() - $ts2->getApproxSecondes();
+                }
+            );
+        }
+
+        return $params;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueConvertieRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueConvertieRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..7fa26de8593fe8e87647b802bed16dfe3463f46c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueConvertieRepository.php
@@ -0,0 +1,153 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+
+/**
+ * Class ChroniqueConvertieRepository.
+ */
+class ChroniqueConvertieRepository extends ChroniqueContinueRepository
+{
+    /**
+     * @param ChroniqueConvertie $chronique
+     *
+     * @throws \Exception
+     *
+     * @return int
+     */
+    public function convertChronique(ChroniqueConvertie $chronique)
+    {
+        if (!$chronique
+            || !($conversion = $chronique->getConversion())
+            || !($choniqueMere = $conversion->getEntree())
+            || !($defaultGapQualite = $chronique->getDefaultGapQualite())) {
+            return 1;
+        }
+
+        $chroniqueId = $chronique->getId();
+        $gapId = $defaultGapQualite->getId();
+        $intervalle = $conversion->getJeuConversionActuel()->getParamConversion();
+
+        $connection = $this->getEntityManager()->getConnection();
+        $connection->beginTransaction();
+        try {
+            // récupération des plages de la chronique mère
+            $sqlSelectPlages = <<<'SQL'
+SELECT debut, debut - interval '1 second' as debut_moins_1, fin, fin - interval '1 second' as fin_moins_1,
+       fin + interval '1 second' as fin_plus_1, fin + (interval '1 seconds' * :intervalle) as fin_plus_intervalle,
+       valeur, minimum, maximum, qualite_id
+FROM plage WHERE chronique_id = :id ORDER BY debut ASC
+SQL;
+            $plages = $connection->prepare($sqlSelectPlages);
+            $plages->setFetchMode(\PDO::FETCH_NUM);
+            $plages->execute(
+                [
+                    ':intervalle' => $intervalle,
+                    ':id'         => $choniqueMere->getId(),
+                ]
+            );
+
+            // conversion des plages en mesures
+            $mesures = [];
+            $lastPlage = null;
+            foreach ($plages as $plage) {
+                // la plage en cours
+                list($debut, $debut_moins_1, $fin, $fin_moins_1, $fin_plus_1,
+                    $fin_plus_intervalle, $valeur, $minimum, $maximum, $qualite_id) = $plage;
+                $valeur = $valeur === null ? 'NULL' : $valeur;
+                $minimum = $minimum === null ? 'NULL' : $minimum;
+                $maximum = $maximum === null ? 'NULL' : $maximum;
+                if ($lastPlage) {
+                    // la plage précédente
+                    list($last_debut, $last_debut_moins_1, $last_fin, $last_fin_moins_1, $last_fin_plus_1,
+                        $last_fin_plus_intervalle, $last_valeur, $last_minimum, $last_maximum, $last_qualite_id) = $lastPlage;
+                    $last_valeur = $last_valeur === null ? 'NULL' : $last_valeur;
+                    $last_minimum = $last_minimum === null ? 'NULL' : $last_minimum;
+                    $last_maximum = $last_maximum === null ? 'NULL' : $last_maximum;
+
+                    // date de fin de la plage précédente à utiliser :
+                    $last_fin_ajout = $last_fin;
+                    // si la date de fin de la plage précédente est égale à la date de début de la plage courante
+                    // on prend la date de fin de la plage précédente moins 1 seconde
+                    if ($last_fin === $debut) {
+                        $last_fin_ajout = $last_fin_moins_1;
+                    }
+                    $last_debut_date = new \DateTime($last_debut, new \DateTimeZone('UTC'));
+                    $last_fin_ajout_date = new \DateTime($last_fin_ajout, new \DateTimeZone('UTC'));
+                    if ($last_debut_date < $last_fin_ajout_date) {
+                        // ajout de la valeur de fin de la plage précédente
+                        // uniquement si la fin reste strictement posterieur à la date de début de la plage précédente
+                        $mesures[] = "(nextval('mesure_id_seq'), $last_qualite_id, $chroniqueId, '$last_fin_ajout', $last_valeur, $last_minimum, $last_maximum, TRUE)";
+                    }
+
+                    // si l'intervalle entre la date de fin de la plage précédente et la date de début de la plage courante
+                    // est supérieur à l'intervalle des lacunes, on rajoute 2 lacunes à +/- 1 seconde
+                    $last_fin_plus_intervalle_date = new \DateTime($last_fin_plus_intervalle, new \DateTimeZone('UTC'));
+                    $debut_date = new \DateTime($debut, new \DateTimeZone('UTC'));
+                    if ($last_fin_plus_intervalle_date < $debut_date) {
+                        $mesures[] = "(nextval('mesure_id_seq'), $gapId, $chroniqueId, '$last_fin_plus_1', NULL, NULL, NULL, TRUE)";
+                        $mesures[] = "(nextval('mesure_id_seq'), $gapId, $chroniqueId, '$debut_moins_1', NULL, NULL, NULL, TRUE)";
+                    }
+                }
+                // ajout de la valeur de début de la plage en cours
+                $mesures[] = "(nextval('mesure_id_seq'), $qualite_id, $chroniqueId, '$debut', $valeur, $minimum, $maximum, TRUE)";
+                $lastPlage = $plage;
+            }
+            // ajout de la dernière mesure (date de fin de la dernière plage)
+            // uniquement si il ne s'agit pas d'une plage ponctuelle
+            if ($lastPlage) {
+                // la plage précédente
+                list($last_debut, $last_debut_moins_1, $last_fin, $last_fin_moins_1, $last_fin_plus_1,
+                    $last_fin_plus_intervalle, $last_valeur, $last_minimum, $last_maximum, $last_qualite_id) = $lastPlage;
+                $last_valeur = $last_valeur === null ? 'NULL' : $last_valeur;
+                $last_minimum = $last_minimum === null ? 'NULL' : $last_minimum;
+                $last_maximum = $last_maximum === null ? 'NULL' : $last_maximum;
+                if ($last_debut !== $last_fin) {
+                    $mesures[] = "(nextval('mesure_id_seq'), $last_qualite_id, $chroniqueId, '$last_fin', $last_valeur, $last_minimum, $last_maximum, TRUE)";
+                }
+            }
+
+            // suppression des anciennes mesures de la chronique convertie
+            $sqlDeleteMesures = 'DELETE FROM mesure WHERE chronique_id = :id AND estcalculee';
+            $connection->executeUpdate($sqlDeleteMesures, [$chroniqueId]);
+
+            // insertion des nouvelles mesures
+            if (count($mesures) !== 0) {
+                $sqlInsertMesures = "INSERT INTO mesure (id, qualite_id, chronique_id, date, valeur, minimum, maximum, estcalculee) VALUES \n" .
+                    implode(",\n", $mesures);
+                $connection->executeUpdate($sqlInsertMesures);
+            }
+
+            // mise à jour des metadata de la chronique convertie
+            $sqlUpdateMetadata = 'SELECT bdoh_update_measures_metadata(:id)';
+            $connection->executeUpdate($sqlUpdateMetadata, [$chroniqueId]);
+
+            $connection->commit();
+        } catch (\Exception $e) {
+            $connection->rollBack();
+            throw $e;
+        }
+
+        return 0;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueDiscontinueRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueDiscontinueRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ab59de24ac24212fe830fdb63d72b0f999b7dda
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueDiscontinueRepository.php
@@ -0,0 +1,214 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue;
+use Irstea\BdohDataBundle\Entity\Plage;
+
+/**
+ * Class ChroniqueDiscontinueRepository.
+ */
+class ChroniqueDiscontinueRepository extends ChroniqueRepository
+{
+    const MEASURE_TABLE = 'plage';
+
+    const BEGIN_DATE_FIELD = 'debut';
+
+    const END_DATE_FIELD = 'fin';
+
+    /**
+     * @return MesureRepositoryInterface
+     */
+    public function getMeasureRepo()
+    {
+        /** @var MesureRepositoryInterface $repo */
+        $repo = $this->_em->getRepository(Plage::class);
+
+        return $repo;
+    }
+
+    /**
+     * For a given 'chronique', returns an array whose structure is :
+     *  => Keys   = years
+     *  => Values = array(
+     *      -> 'month'      => array of count (int)
+     *      -> 'totalTaux'  => sum of count (int)
+     *      -> 'totalPoids' => 1
+     *  )
+     *  See, for use, "src/Irstea/BdohConsultBundle/Resources/views/Main/chronique.html.twig".
+     *
+     * @param ChroniqueDiscontinue $chronique
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getFillingRatesByYearAndMonth(ChroniqueDiscontinue $chronique)
+    {
+        $sql = <<<'SQL'
+WITH mois(debut, fin) AS (SELECT m, m + '1 month' FROM generate_series(date_trunc('month',
+    (SELECT datedebutmesures FROM chronique WHERE id = :chronique_id)),
+    (SELECT datefinmesures FROM chronique WHERE id = :chronique_id), '1 month') m)
+SELECT
+    count(p.debut) FILTER (WHERE p.debut >= m.debut) as count,
+    count(p.debut) > 0 as overlap,
+    date_part('year', m.debut) as year,
+    date_part('month', m.debut) as month
+FROM mois m LEFT OUTER JOIN plage p ON (p.debut, p.fin) OVERLAPS (m.debut, m.fin) AND p.chronique_id = :chronique_id
+GROUP BY m.debut
+ORDER BY m.debut ASC;
+SQL;
+
+        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
+        $stmt->setFetchMode(\PDO::FETCH_ASSOC);
+        $stmt->execute(
+            [
+                ':chronique_id' => $chronique->getId(),
+            ]
+        );
+
+        $fillingRates = [];
+
+        foreach ($stmt as $row) {
+            if (false === array_key_exists($row['year'], $fillingRates)) {
+                $fillingRates[$row['year']] = [
+                    'month'      => [],
+                    'totalTaux'  => 0,
+                    'totalPoids' => 1,
+                    'overlap'    => false,
+                ];
+            }
+            $currentYear = &$fillingRates[$row['year']];
+
+            $currentYear['month'][$row['month']] = ['taux' => $row['count'], 'overlap' => $row['overlap']];
+
+            $currentYear['totalTaux'] += $row['count'];
+            $currentYear['overlap'] = $currentYear['overlap'] || $row['overlap'];
+        }
+
+        return $fillingRates;
+    }
+
+    /**
+     * Shortcut to PlageRepository::getFirstLastDatesByChronique().
+     *
+     * @param array $chroniqueIds
+     *
+     * @return array|array[]
+     */
+    public function getFirstLastDatesByChronique(array $chroniqueIds = [])
+    {
+        return $this->getMeasureRepo()->getFirstLastDatesByChronique($chroniqueIds);
+    }
+
+    /**
+     * @param ChroniqueDiscontinue $chronique
+     * @param \DateTime|null       $beginDate
+     * @param \DateTime|null       $endDate
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getOneChronicleViewerData(
+        ChroniqueDiscontinue $chronique,
+        \DateTime $beginDate = null,
+        \DateTime $endDate = null
+    ) {
+        $sql = <<<SQL
+SELECT
+    1000 * EXTRACT('epoch' FROM p.debut AT TIME ZONE 'UTC') AS debut,
+    1000 * EXTRACT('epoch' FROM p.fin AT TIME ZONE 'UTC') AS fin,
+    p.valeur AS valeur,
+    q.id AS qid,
+    CASE q.ordre
+        WHEN 100 THEN 'gap'
+        WHEN 200 THEN 'invalid'
+        ELSE 'valid_' || q.code
+    END AS flag
+FROM plage p INNER JOIN qualite q ON (p.qualite_id = q.id)
+WHERE p.chronique_id = :id AND (p.debut, p.fin) OVERLAPS (:beginDate, :endDate)
+ORDER BY p.debut ASC
+SQL;
+
+        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
+        $stmt->setFetchMode(\PDO::FETCH_ASSOC);
+        $stmt->execute(
+            [
+                ':id'        => $chronique->getId(),
+                ':beginDate' => $beginDate !== null ? $beginDate->format(\DateTime::ATOM) : '-infinity',
+                ':endDate'   => $endDate !== null ? $endDate->format(\DateTime::ATOM) : 'infinity',
+            ]
+        );
+
+        $series = [];
+        /* $series = [
+            qid => [
+                'seriesFlag' => flag,
+                'values' => [[date, valeur], ...],
+                'qualiteId' => qid
+            ],
+            ...
+        ] */
+        $validMeasureCount = 0;
+        $pointCount = 0;
+
+        foreach ($stmt as $row) {
+            $debut = (float) $row['debut'];
+            $fin = (float) $row['fin'];
+            $valeur = $row['valeur'] === null ? 0.0 : (float) $row['valeur'];
+            $qid = $row['qid'];
+            $flag = $row['flag'];
+
+            if ($flag !== 'invalid' && $flag !== 'gap') {
+                ++$validMeasureCount;
+            }
+            ++$pointCount;
+
+            if (!isset($series[$qid])) {
+                $series[$qid] = [
+                    'seriesFlag' => $flag,
+                    'values'     => [],
+                    'qualiteId'  => $qid,
+                ];
+            }
+
+            $series[$qid]['values'][] = [$debut, $valeur];
+            $series[$qid]['values'][] = [$fin, $valeur];
+            $series[$qid]['values'][] = [null, null];
+        }
+
+        // trie des series suivant le qid pour que la légende soit dans l'ordre des qualités
+        \ksort($series, SORT_NUMERIC);
+
+        return [
+            'samplingType'            => 'discontinuous',
+            'discontinuousStyle'      => $chronique->getObservatoire()->getJeu()->getDiscontinuousStyle(),
+            'reverseAxis'             => $chronique->getReverseAxis(),
+            'series'                  => array_values($series),
+            'validMeasureCount'       => $validMeasureCount,
+            'nPts'                    => $pointCount,
+            'tooManyPoints'           => false,
+            'checkpointsOnCumulative' => false,
+        ];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..cdb2e52883d127ace7fb2f644d298a6e42a6ebdc
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ChroniqueRepository.php
@@ -0,0 +1,1093 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+use Irstea\BdohBundle\Util\DateTimeUtil;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue;
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\Echantillonnage;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\Transformation;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+
+/**
+ * Class ChroniqueRepository.
+ */
+class ChroniqueRepository extends EntityRepository
+{
+    const MEASURE_TABLE = 'mesure';
+
+    const BEGIN_DATE_FIELD = 'date';
+
+    const END_DATE_FIELD = 'date';
+
+    /**
+     * Returns the good measure repository, of a given 'chronique'.
+     *
+     * @param Chronique $chronique
+     *
+     * @return MesureRepositoryInterface
+     */
+    public function getMeasureRepoByChronique(Chronique $chronique)
+    {
+        /** @var ChroniqueContinueRepository|ChroniqueDiscontinueRepository $repo */
+        $repo = $this->_em->getRepository(get_class($chronique));
+
+        return $repo->getMeasureRepo();
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias);
+        }
+
+        return parent::createQueryBuilder($alias, $indexBy)
+            ->leftJoin($alias . '.station', 'st')
+            ->leftJoin('st.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     * @param DataSet    $dataset
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilderFilter($alias, $indexBy = null, $dataset)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias);
+        }
+
+        return parent::createQueryBuilder($alias, $indexBy)
+            ->leftJoin($alias . '.station', 'st')
+            ->leftJoin('st.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->andWhere($alias . '.dataset IS NULL')
+            ->andWhere($alias . '.dateDebutMesures IS NOT NULL')
+            ->andWhere($alias . '.dateFinMesures IS NOT NULL')
+            ->orWhere($alias . '.dataset = :dataset')
+            ->setParameter('observatoire', $currentObs)
+            ->setParameter('dataset', $dataset->getId());
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'
+     * on which current user has sufficient rights.
+     *
+     * @param Utilisateur|mixed $user
+     * @param string            $alias
+     *
+     * @return QueryBuilder
+     */
+    public function createSecuredQueryBuilderForEdit($user, $alias = 'ch')
+    {
+        $qb = $this->createQueryBuilder($alias);
+
+        if ($user instanceof Utilisateur) {
+            $rolesOnSites = $user->getRolesSite();
+            $rolesOnObs = $user->getRolesObservatoire();
+
+            $clauses = [];
+            $params = [];
+
+            if ($rolesOnSites instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnSites as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE || $role->getValeur() === Role::CONTRIBUTEUR) {
+                        $site = $role->getSite();
+                        $clauses[] = 'si = :site' . $i;
+                        $params['site' . $i++] = $site;
+                    }
+                }
+            }
+
+            //This is a little too much ; kept here only for "logic explanation"
+            //Only actual useful test would be against Observatoire::getCurrent()
+            if ($rolesOnObs instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnObs as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE) {
+                        $obs = $role->getObservatoire();
+                        $clauses[] = 'si.observatoire = :obs' . $i;
+                        $params['obs' . $i++] = $obs;
+                    }
+                }
+            }
+
+            if ([] !== $clauses) {
+                $qb = $qb->andWhere(implode(' or ', $clauses));
+                foreach ($params as $key => $param) {
+                    $qb = $qb->setParameter($key, $param);
+                }
+            } else { //No right => no site to be returned
+                $qb = $qb->andWhere('true = false');
+            }
+        } else { //No user => no site to be returned
+            $qb = $qb->andWhere('true = false');
+        }
+
+        return $qb;
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'
+     * on which current user has sufficient rights.
+     *
+     * @param Utilisateur|mixed $user
+     * @param string            $alias
+     *
+     * @return QueryBuilder
+     */
+    public function createSecuredQueryBuilderForView($user, $alias = 'ch')
+    {
+        $qb = $this->createQueryBuilder($alias);
+
+        if ($user instanceof Utilisateur) {
+            if (!in_array('ROLE_ADMIN', $user->getRoles()) && !$user->isATrustedUserOfCurrentObservatory()) {
+                $rolesOnChroniques = $user->getRolesChronique();
+
+                $clauses = ['ch.estVisible = true'];
+                $params = [];
+
+                if ($rolesOnChroniques instanceof \Traversable) {
+                    $i = 0;
+                    foreach ($rolesOnChroniques as $role) {
+                        if ($role->getValeur() === Role::UTILISATEUR) {
+                            $chronique = $role->getChronique();
+                            $clauses[] = 'ch = :chronique' . $i;
+                            $params['chronique' . $i++] = $chronique;
+                        }
+                    }
+                }
+
+                if ([] !== $clauses) {
+                    $qb = $qb->andWhere(implode(' or ', $clauses));
+                    foreach ($params as $key => $param) {
+                        $qb = $qb->setParameter($key, $param);
+                    }
+                }
+            }
+        } else { // anonymous user
+            $qb = $qb->andWhere('ch.estVisible = true');
+        }
+
+        return $qb;
+    }
+
+    /**
+     * @param int $chroniqueId
+     *
+     * @return array
+     */
+    public function getPoint(int $chroniqueId): array
+    {
+        $query = <<<SQL
+            WITH env AS (
+                SELECT
+                   ST_Transform(ST_Envelope(ST_Union(ST_Envelope(st.point))) , 4236) AS env
+                FROM station st
+                    INNER JOIN chronique c ON (c.station_id = st.id)
+                WHERE
+                    c.id = :chroniqueId
+            )
+            SELECT
+                ST_X(env) as x,
+                ST_Y(env) as y,
+                ST_Z(env) as z
+            FROM env;
+SQL;
+
+        $row = $this->getEntityManager()->getConnection()->fetchArray($query, ['chroniqueId' => $chroniqueId]);
+        [$rectangleX, $rectangleY, $rectangleZ] = $row;
+
+        if ($rectangleZ === null) {
+            $rectangle = [(float) $rectangleX, (float) $rectangleY];
+        } else {
+            $rectangle = [(float) $rectangleX, (float) $rectangleY, (float) $rectangleZ];
+        }
+
+        return $rectangle;
+    }
+
+    /**
+     * All 'chroniques' of current 'observatoire'.
+     *
+     * @return Chronique[]
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('ch')
+            ->addOrderBy('ch.code', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * A "findAll" with all jointures, for performance purpose and according to user's rights.
+     *
+     * @param Utilisateur|mixed $user
+     *
+     * @return Chronique[]
+     */
+    public function securedBigFindAll($user = null)
+    {
+        return $this->createSecuredQueryBuilderForEdit($user, 'ch')
+            ->select('ch, st, si, co')
+            ->leftJoin('st.commune', 'co')
+            ->orderBy('st.nom', 'ASC')
+            ->addOrderBy('ch.code', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * A "findAll" with all jointures, for performance purpose.
+     *
+     * @return Chronique[]
+     */
+    public function bigFindAll()
+    {
+        return $this->createQueryBuilder('ch')
+            ->select('ch, st, si, co')
+            ->leftJoin('st.commune', 'co')
+            ->orderBy('st.nom', 'ASC')
+            ->addOrderBy('ch.code', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * @param int $obsId
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function findContainingBassins($obsId)
+    {
+        // note : le DISTINCT est necessaire au cas ou la station est sur plusieurs sites
+        $sql = <<<SQL
+SELECT ch.id AS id, ARRAY_TO_STRING(ARRAY_AGG(DISTINCT ba.nom), '##') as bassins
+FROM chronique ch, station st, stations_sites ss, siteexperimental si, bassin ba
+WHERE ch.station_id=st.id AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = '$obsId'
+    AND ba.observatoire_id='$obsId' AND st_distance(ba.perimetre, st.point) < 20 AND st_srid(st.point) > 0
+GROUP BY ch.id ORDER BY ch.id
+SQL;
+        $returns = $this->_em->getConnection()->executeQuery($sql)->fetchAll();
+        $bassins = [];
+        foreach ($returns as $row) {
+            $bassins[$row['id']] = $row['bassins'];
+        }
+
+        return $bassins;
+    }
+
+    /**
+     * @param int $obsId
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function findNeighbouringCoursEaux($obsId)
+    {
+        // note : le DISTINCT est necessaire au cas ou la station est sur plusieurs sites
+        $sql = <<<SQL
+SELECT ch.id AS id, ARRAY_TO_STRING(ARRAY_AGG(DISTINCT ce.nom), '##') as courseaux
+FROM chronique ch, station st, stations_sites ss, siteexperimental si, courseau ce
+WHERE ch.station_id=st.id AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = '$obsId'
+    AND ce.observatoire_id='$obsId' AND st_distance(ce.trace, st.point) < 50 AND st_srid(st.point) > 0
+GROUP BY ch.id ORDER BY ch.id
+SQL;
+        $returns = $this->_em->getConnection()->executeQuery($sql)->fetchAll();
+        $coursEaux = [];
+        foreach ($returns as $row) {
+            $coursEaux[$row['id']] = $row['courseaux'];
+        }
+
+        return $coursEaux;
+    }
+
+    /**
+     * @param int  $obsId
+     * @param bool $isLocaleEn
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function findParentFamilies($obsId, $isLocaleEn)
+    {
+        $nom = $isLocaleEn ? 'nomen' : 'nom';
+
+        // note : le DISTINCT est necessaire au cas ou la station est sur plusieurs sites
+        $sql = <<<SQL
+WITH RECURSIVE r_familles(id, pid, first, noms) AS (
+    SELECT f.id, f.familleparente_id, f.id, ARRAY[f.$nom]
+    FROM familleparametres f
+    UNION ALL
+    SELECT f.id, f.familleparente_id, r.first, ARRAY_APPEND(r.noms, f.$nom)::CHARACTER VARYING(255)[]
+    FROM familleparametres f, r_familles r
+    WHERE f.id = r.pid
+)
+SELECT ch.id AS id, ARRAY_TO_STRING(MAX(DISTINCT r.noms), '##') AS familles
+FROM chronique ch, station st, stations_sites ss, siteexperimental si, typeparametre t, r_familles r
+WHERE ch.station_id=st.id AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = '$obsId'
+    AND ch.parametre_id = t.id AND t.familleparametres_id = r.first
+GROUP BY ch.id ORDER BY ch.id
+SQL;
+        $returns = $this->_em->getConnection()->executeQuery($sql)->fetchAll();
+        $familles = [];
+        foreach ($returns as $row) {
+            $familles[$row['id']] = $row['familles'];
+        }
+
+        return $familles;
+    }
+
+    /**
+     * Returns all 'chroniques' of a given 'dataset'.
+     *
+     * @param DataSet $dataset
+     *
+     * @return Chronique[]
+     */
+    public function findByDataSet(DataSet $dataset)
+    {
+        return $this->createQueryBuilder('ch')
+            ->andWhere('ch.dataset = :dataset')
+            ->setParameter('dataset', $dataset)
+            ->orderBy('ch.station', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * Returns all 'chroniques' of a given 'station'.
+     *
+     * @param Station $station
+     *
+     * @return Chronique[]
+     */
+    public function findByStation(Station $station)
+    {
+        return $this->createQueryBuilder('ch')
+            ->andWhere('ch.station = :station')
+            ->setParameter('station', $station)
+            ->orderBy('ch.code', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * Returns all 'chroniques' of a given 'station' with the given 'unite'.
+     *
+     * @param Station $station
+     * @param Unite   $unite
+     *
+     * @return Chronique[]
+     */
+    public function findByStationAndUnite(Station $station, Unite $unite)
+    {
+        return $this->createQueryBuilder('ch')
+            ->andWhere('ch.station = :station')
+            ->andWhere('ch.unite = :unite')
+            ->setParameter('station', $station)
+            ->setParameter('unite', $unite)
+            ->orderBy('ch.code', 'ASC')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * Returns all 'chroniques' of a given 'station'.
+     *
+     * @param Station     $station
+     * @param Utilisateur $user
+     *
+     * @return Chronique[]
+     */
+    public function securedFindByStation(Station $station, Utilisateur $user = null)
+    {
+        return $this->createSecuredQueryBuilderForEdit($user, 'ch')
+            ->andWhere('ch.station = ' . $station->getId())
+            ->orderBy('ch.code', 'ASC')
+            ->getQuery()->getResult();
+    }
+
+    /**
+     * Returns a specific 'chronique' (by id.), for the current 'observatoire'.
+     *
+     * @param int $chroniqueId
+     *
+     * @throws \Exception
+     *
+     * @return Chronique
+     */
+    public function findOneById($chroniqueId)
+    {
+        return $this->createQueryBuilder('ch')
+            ->andWhere("ch.id = $chroniqueId")
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * Returns a specific 'chronique' (by 'station' and code), for the current 'observatoire'.
+     *
+     * @param Station $station
+     * @param string  $code
+     *
+     * @throws \Exception
+     *
+     * @return Chronique
+     */
+    public function findOneByStationAndCode(Station $station, $code)
+    {
+        return $this->createQueryBuilder('ch')
+            ->andWhere('ch.station = ' . $station->getId())
+            ->andWhere("ch.code = '$code'")
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * Retrouve une Chronique (quelque soit son type exact) par station et code.
+     *
+     * Note: cette méthode est utilisée pour assurer l'unicité des couples (station, code)
+     * dans un observatoire.
+     *
+     * @param array $criteria
+     *
+     * @return Chronique[]
+     */
+    public function findAnyByStationAndCode(array $criteria): array
+    {
+        return $this->getEntityManager()->getRepository(Chronique::class)
+            ->createQueryBuilder('ch')
+            ->where('ch.station = :station')
+            ->andWhere('ch.code = :code')
+            ->setParameters($criteria)
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * Gets the first and last dates by 'chronique',
+     * for 'ChroniqueContinue' and 'ChroniqueDiscontinue'.
+     *
+     * @param int[] $chroniques
+     *
+     * @return array[]
+     */
+    public function getFirstLastDatesByChronique(array $chroniques = [])
+    {
+        return array_merge(
+            $this->_em->getRepository(ChroniqueContinue::class)->getFirstLastDatesByChronique($chroniques),
+            $this->_em->getRepository(ChroniqueDiscontinue::class)->getFirstLastDatesByChronique($chroniques)
+        );
+    }
+
+    /**
+     * Returns the 'chroniques' number, for a given 'Station' and 'TypeParametre'.
+     *
+     * @param Station       $station
+     * @param TypeParametre $parametre
+     *
+     * @throws \Exception
+     *
+     * @return int
+     */
+    public function countByStationAndParametre(Station $station, TypeParametre $parametre)
+    {
+        return $this->createQueryBuilder('ch')
+            ->select('count(DISTINCT ch)')
+            ->andWhere('ch.station = ' . $station->getId())
+            ->andWhere('ch.parametre = ' . $parametre->getId())
+            ->getQuery()
+            ->getSingleScalarResult();
+    }
+
+    /**
+     * Shortcut to getFirstLastDates() function, of MesureRepository or PlageRepository.
+     *
+     * @param Chronique $chronique
+     *
+     * @return \DateTime[]
+     */
+    public function getFirstLastDates(Chronique $chronique)
+    {
+        return $this->getMeasureRepoByChronique($chronique)->getFirstLastDates($chronique->getId());
+    }
+
+    /**
+     * Returns the number of measures, for a given 'chronique'.
+     *
+     * @param Chronique $chronique
+     *
+     * @throws \Exception
+     *
+     * @return int
+     */
+    public function getMeasuresNumber(Chronique $chronique)
+    {
+        return $this->getMeasureRepoByChronique($chronique)
+            ->createSimpleQueryBuilder()
+            ->select('COUNT(m)')
+            ->andWhere('m.chronique = ' . $chronique->getId())
+            ->getQuery()
+            ->getSingleScalarResult();
+    }
+
+    /**
+     * @param array          $chroniquesAndRights
+     * @param \DateTime|null $beginDate
+     * @param \DateTime|null $endDate
+     * @param int            $maxValidPoints
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getMultipleChroniquesViewerData(
+        $chroniquesAndRights,
+        \DateTime $beginDate = null,
+        \DateTime $endDate = null,
+        $maxValidPoints = 50000
+    ) {
+        $data = [
+            'xMin'       => $this->formatTimestampAtUtc($beginDate),
+            'xMax'       => $this->formatTimestampAtUtc($endDate),
+            'chronicles' => [],
+        ];
+
+        /** @var Chronique $chronique */
+        /** @var bool $rightsForCheckpoints */
+        foreach ((array) $chroniquesAndRights as list($chronique, $rightsForCheckpoints)) {
+            $data['chronicles'][] =
+                $this->getChronicleViewerDataForChronicle($chronique, $beginDate, $endDate, $rightsForCheckpoints, $maxValidPoints);
+        }
+
+        return $data;
+    }
+
+    /**
+     * @param Chronique $chronique
+     * @param \DateTime $beginDate
+     * @param \DateTime $endDate
+     * @param bool      $rightsForCheckpoints
+     * @param int       $maxValidPoints
+     *
+     * @throws \Exception
+     *
+     * @return mixed
+     */
+    private function getChronicleViewerDataForChronicle(
+        Chronique $chronique,
+        \DateTime $beginDate,
+        \DateTime $endDate,
+        bool $rightsForCheckpoints,
+        $maxValidPoints = 50000
+    ) {
+        /** @var ChroniqueContinue|ChroniqueDiscontinue $chronique */
+        /** @var ChroniqueContinueRepository|ChroniqueDiscontinueRepository $chroRepo */
+        $chroRepo = $this->_em->getRepository(get_class($chronique));
+        $tableOfMeasures =
+            $chroRepo->getOneChronicleViewerData($chronique, $beginDate, $endDate, $rightsForCheckpoints, $maxValidPoints);
+
+        $tableOfMeasures['chronicleId'] = $chronique->getId();
+
+        $station = $chronique->getStation();
+        $tableOfMeasures['station'] = ($station) ? $station->getNom() : '';
+
+        $dataType = $chronique->getParametre();
+        $tableOfMeasures['dataType'] = ($dataType) ? $dataType->getNom() : '';
+
+        $tableOfMeasures['name'] = $chronique->__toString();
+
+        $dataUnit = $chronique->getUnite();
+        $tableOfMeasures['dataUnit'] = ($dataUnit) ? $dataUnit->getLibelle() : '';
+
+        $tableOfMeasures['stationCode'] = ($station) ? $station->getCode() : '';
+
+        $tableOfMeasures['chroniqueCode'] = $chronique->getCode();
+
+        $chroniqueClass = get_class($chronique);
+        $chroniqueClass = explode('\\', $chroniqueClass);
+        $tableOfMeasures['chroniqueClass'] = array_pop($chroniqueClass);
+
+        return $tableOfMeasures;
+    }
+
+    /**
+     * @param $id
+     *
+     * @throws \Exception
+     */
+    public function updateDatesMesuresByChronique($id)
+    {
+        $query = "SELECT c.id, bdoh_chronique_calcul_dates_mesures(c.id, c.dtype)
+            FROM chronique c
+            WHERE c.id = $id";
+        $this->_em->getConnection()->exec($query);
+    }
+
+    /**
+     * @param Utilisateur|null $user
+     * @param Station[]|int[]  $stations
+     * @param string           $startDate
+     * @param string           $endDate
+     *
+     * @throws \Exception
+     *
+     * @return array|bool
+     */
+    public function getSecuredChroniqueIDsWithMeasures($user, $stations = null, $startDate = null, $endDate = null)
+    {
+        // Check that the dates are REALLY dates & convert them to string
+        if ($startDate) {
+            list($valid, $startDate) = DateTimeUtil::dateValidationAndString($startDate);
+            if (!$valid) {
+                return false;
+            }
+        }
+        if ($endDate) {
+            list($valid, $endDate) = DateTimeUtil::dateValidationAndString($endDate);
+            if (!$valid) {
+                return false;
+            }
+        }
+
+        // List of station IDs
+        $stationIDs = [];
+        foreach ((array) $stations as $s) {
+            $stationIDs[] = \is_int($s) ? $s : $s->getId();
+        }
+
+        // Lines for each sampling type
+        $sqlLinesForSamplings = [];
+        // Get sampling types by code
+        $samplingTypes = $this->_em->getRepository(Echantillonnage::class)->findAll();
+        $samplingIDsByCode = [];
+        /** @var Echantillonnage $s */
+        foreach ($samplingTypes as $s) {
+            $samplingIDsByCode[$s->getCode()] = $s->getId();
+        }
+
+        // Instantaneous sampling type: default type. If sampling type is not defined and
+        // time series is not discontinuous, sampling is assumed to be instantaneous.
+        // We need at least one value in the time range defined by $startDate & $endDate.
+        // !!! Same processing now applied to time series with cumulative sampling
+        $dateFilter = '';
+        if ($startDate) {
+            $dateFilter .= " AND EXISTS (SELECT date FROM mesure WHERE chronique_id = c.id AND date >= '$startDate')";
+        }
+        if ($endDate) {
+            $dateFilter .= " AND EXISTS (SELECT date FROM mesure WHERE chronique_id = c.id AND date <= '$endDate')";
+        }
+        $sqlLinesForSamplings[] = '(c.echantillonnage_id IN '
+            . '(' . \implode(',', [$samplingIDsByCode['instantaneous'], $samplingIDsByCode['cumulative']]) . ')'
+            . " OR (c.echantillonnage_id IS NULL AND dtype <> 'discontinue'))$dateFilter";
+
+        // Mean sampling type: there must be at least two measures, of which at least one
+        // after $startDate & at least one before $endDate.
+        $startFilter = $startDate ? " AND EXISTS (SELECT date FROM mesure WHERE chronique_id = c.id AND date >= '$startDate')" : '';
+        $endFilter = $endDate ? " AND EXISTS (SELECT date FROM mesure WHERE chronique_id = c.id AND date <= '$endDate')" : '';
+        $sqlLinesForSamplings[] = 'c.echantillonnage_id = ' . $samplingIDsByCode['mean']
+            . ' AND (SELECT COUNT(*) FROM mesure WHERE chronique_id = c.id) > 1'
+            . $startFilter . $endFilter;
+
+        // Cumulative sampling type: we consider that there are always data
+        // !!! OR NOT!
+        // We could argue that, but we'll act like no measure in the database
+        // within our time range means that the time series IS empty within the latter.
+        // Consequently, time series with cumulative sampling are filtered the same way
+        // as those with instantaneous sampling: see code a few lines above.
+
+        /*$sqlLinesForSamplings[] = 'c.echantillonnage_id = '
+            . $samplingIDsByCode['cumulative'];*/
+
+        // Discontinuous time series: there must be at least one range,
+        // of which the end tip is after $startDate & the start tip is before $endDate.
+        $discontSubStatement = function ($append) {
+            return " AND EXISTS(SELECT * FROM plage WHERE chronique_id = c.id$append)";
+        };
+        if ($startDate) {
+            $s = $discontSubStatement(" AND fin >= '$startDate'");
+            if ($endDate) {
+                $s .= $discontSubStatement(" AND debut <= '$endDate'");
+            }
+        } elseif ($endDate) {
+            $s = $discontSubStatement(" AND debut <= '$endDate'");
+        } else {
+            $s = $discontSubStatement('');
+        }
+        $sqlLinesForSamplings[] = "dtype = 'discontinue'" . $s;
+
+        // chronique IDs that are allowed to be viewed by that $user
+        $allowedChroniques = $this->createSecuredQueryBuilderForView($user, 'ch')
+            ->select('ch.id')
+            ->getQuery()
+            ->getResult();
+        $allowedChroniqueIds = [];
+        foreach ($allowedChroniques as $allowedChronique) {
+            $allowedChroniqueIds[] = $allowedChronique['id'];
+        }
+
+        // Overall SQL query
+        $sqlQuery = 'SELECT DISTINCT c.id FROM chronique c';
+        if (\sizeof($stationIDs) > 0) {
+            $stationIDsString = implode(',', $stationIDs);
+            $sqlQuery .= " WHERE c.station_id IN ($stationIDsString)";
+        }
+        if (\sizeof($allowedChroniqueIds) > 0) {
+            $allowedChroniqueIdsString = implode(',', $allowedChroniqueIds);
+            $sqlQuery .= " AND c.id IN ($allowedChroniqueIdsString)";
+        }
+        $sqlQuery .= ' AND (('
+            . \implode(') OR (', $sqlLinesForSamplings)
+            . '))';
+        //echo($sqlQuery);exit;
+        // Execute query & return array of IDs
+        $statement = $this->_em->getConnection()->prepare($sqlQuery);
+        $statement->execute();
+
+        return $statement->fetchAll(\PDO::FETCH_COLUMN);
+    }
+
+    /**
+     * Selects measures for a given 'chronique', between two dates.
+     * Note : this query is intended for HTML table displaying purpose.
+     *
+     * @param ChroniqueContinue|ChroniqueDiscontinue $chronique
+     * @param \DateTime|null                         $beginDate
+     * @param \DateTime|null                         $endDate
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function getChroniqueTableData($chronique, \DateTime $beginDate = null, \DateTime $endDate = null)
+    {
+        /** @var QueryBuilder $qb */
+        $qb = $this
+            ->getMeasureRepoByChronique($chronique)
+            ->createQueryBuilderByChronique($chronique)
+            ->select('m.date', 'm.valeur', 'q.code');
+
+        $params = [];
+
+        if ($beginDate !== null) {
+            $qb->andWhere('m.date >= :beginDate');
+            $params[] = $this->formatTimestampAtUtc($beginDate);
+        }
+        if ($endDate !== null) {
+            $qb->andWhere('m.date < :endDate');
+            $params[] = $this->formatTimestampAtUtc($endDate);
+        }
+
+        return $this->_em->getConnection()
+            ->executeQuery($qb->getQuery()->getSQL(), $params)
+            ->fetchAll(\PDO::FETCH_NUM);
+    }
+
+    /**
+     * @param Chronique     $chronique
+     * @param \DateTime     $beginDate
+     * @param \DateTime     $endDate
+     * @param \DateTimeZone $timeZone
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getMeasuresForExport(
+        Chronique $chronique,
+        \DateTime $beginDate = null,
+        \DateTime $endDate = null,
+        \DateTimeZone $timeZone = null
+    ) {
+        $dbal = $this->_em->getConnection();
+
+        $begin = static::BEGIN_DATE_FIELD;
+        $end = static::END_DATE_FIELD;
+
+        list($withTzCorrection, $parameters) = $this->getTzCorrectionForSql($timeZone);
+
+        $builder = $dbal->createQueryBuilder()
+            ->setParameters($parameters)
+            ->from(static::MEASURE_TABLE, 'm')
+            ->orderBy(static::BEGIN_DATE_FIELD, 'ASC')
+            ->select("$begin $withTzCorrection AS $begin")
+            ->leftJoin('m', 'qualite', 'q', 'm.qualite_id = q.id')
+            ->addSelect('ROUND(m.valeur::NUMERIC, 3)::DOUBLE PRECISION AS valeur')
+            ->addSelect('ROUND(m.minimum::NUMERIC, 3)::DOUBLE PRECISION AS minimum')
+            ->addSelect('ROUND(m.maximum::NUMERIC, 3)::DOUBLE PRECISION AS maximum')
+            ->addSelect('q.code AS qualite')
+            ->where('m.chronique_id = :chroniqueId')
+            ->setParameter('chroniqueId', $chronique->getId());
+
+        if ($begin !== $end) {
+            $builder->addSelect("$end $withTzCorrection AS $end");
+        }
+
+        $this->addTimeLimits($builder, $beginDate, $endDate);
+
+        return [
+            $dbal->executeQuery($builder->getSQL(), $builder->getParameters()),
+            $this->getExportReport($chronique, $beginDate, $endDate),
+        ];
+    }
+
+    /**
+     * @param \DateTimeZone|null $timeZone
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    protected function getTzCorrectionForSql(\DateTimeZone $timeZone = null)
+    {
+        $tzOffset = $timeZone !== null ? $timeZone->getOffset(new \DateTime('2001-01-01T00:00:00Z')) : 0;
+
+        if ($tzOffset === 0) {
+            return ['', []];
+        }
+
+        return ['+ :tzOffset', ['tzOffset' => sprintf('%d seconds', $tzOffset)]];
+    }
+
+    /**
+     * @param \Doctrine\DBAL\Query\QueryBuilder $builder
+     * @param \DateTime|null                    $beginDate
+     * @param \DateTime|null                    $endDate
+     */
+    protected function addTimeLimits(
+        \Doctrine\DBAL\Query\QueryBuilder $builder,
+        \DateTime $beginDate = null,
+        \DateTime $endDate = null
+    ) {
+        if ($beginDate !== null) {
+            $builder
+                ->andWhere(static::BEGIN_DATE_FIELD . ' >= :begin')
+                ->setParameter('begin', $this->formatTimestampAtUtc($beginDate));
+        }
+
+        if ($endDate !== null) {
+            $builder
+                ->andWhere(static::END_DATE_FIELD . ' <= :end')
+                ->setParameter('end', $this->formatTimestampAtUtc($endDate));
+        }
+    }
+
+    /**
+     * @param \DateTime $timestamp
+     *
+     * @return string
+     */
+    protected function formatTimestampAtUtc(\DateTime $timestamp)
+    {
+        $copy = clone $timestamp;
+
+        return $copy
+            ->setTimezone(new \DateTimeZone('UTC'))
+            ->format('Y-m-d\TH:i:s');
+    }
+
+    /**
+     * @param Chronique      $chronique
+     * @param \DateTime|null $beginDate
+     * @param \DateTime|null $endDate
+     *
+     * @return array
+     */
+    protected function getExportReport(
+        Chronique $chronique,
+        \DateTime $beginDate = null,
+        \DateTime $endDate = null
+    ) {
+        $dbal = $this->_em->getConnection();
+
+        $begin = static::BEGIN_DATE_FIELD;
+        $end = static::END_DATE_FIELD;
+
+        $builder = $dbal->createQueryBuilder()
+            ->from(static::MEASURE_TABLE, 'm')
+            ->select("TO_CHAR(MIN($begin), 'YYYY-MM-DD\"T\"HH24:MI:SS\"Z\"') AS first")
+            ->addSelect("TO_CHAR(MAX($end), 'YYYY-MM-DD\"T\"HH24:MI:SS\"Z\"') AS last")
+            ->addSelect('COUNT(id) AS number')
+            ->where('chronique_id = :chroniqueId')
+            ->setParameter('chroniqueId', $chronique->getId());
+
+        $this->addTimeLimits($builder, $beginDate, $endDate);
+
+        return $dbal->fetchAssoc($builder->getSQL(), $builder->getParameters());
+    }
+
+    /**
+     * Computes and saves filling rates :
+     *   -> on a monthly base ;
+     *   -> on a given period (between $startDate and $endDate) ;
+     *   -> for a given 'chronique'.
+     *
+     * @param Chronique $chronique
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function updateMeasuresMetadata(Chronique $chronique)
+    {
+        $stmt = $this
+            ->getEntityManager()
+            ->getConnection()
+            ->prepare('SELECT bdoh_update_measures_metadata(:id)');
+
+        $stmt->execute(['id' => $chronique->getId()]);
+
+        $recordStr = $stmt->fetchColumn(0);
+        $stmt->closeCursor();
+
+        $record = json_decode('[' . substr($recordStr, 1, -1) . ']');
+        $utc = new \DateTimeZone('UTC');
+
+        return [
+            'start' => new \DateTime($record[0], $utc),
+            'end'   => new \DateTime($record[1], $utc),
+            'nbMes' => (int) $record[2],
+        ];
+    }
+
+    /**
+     * Computes and saves filling rates :
+     *   -> on a monthly base ;
+     *   -> on a given period (between $startDate and $endDate) ;
+     *   -> for a given 'chronique'.
+     *
+     * @param Chronique $chronique
+     * @param \DateTime $startDate
+     * @param \DateTime $endDate
+     *
+     * @throws \Exception
+     *
+     * @return int
+     */
+    public function updateFillingRates(Chronique $chronique, \DateTime $startDate = null, \DateTime $endDate = null)
+    {
+        $stmt = $this
+            ->getEntityManager()
+            ->getConnection()
+            ->prepare('SELECT bdoh_update_filling_rates(:id, :start, :end)');
+
+        $stmt->execute(
+            [
+                'id'    => $chronique->getId(),
+                'start' => $startDate ? $startDate->format(DATE_ATOM) : '-infinity',
+                'end'   => $endDate ? $endDate->format(DATE_ATOM) : 'infinity',
+            ]
+        );
+
+        $nbTaux = $stmt->fetchColumn(0);
+        $stmt->closeCursor();
+
+        return (int) $nbTaux;
+    }
+
+    /**
+     * Les chroniques filles de la chronique $parent.
+     *
+     * @param Chronique $parent
+     *
+     * @return array
+     */
+    public function findChildren(Chronique $parent)
+    {
+        $children = [];
+        /** @var Transformation[] $transformations */
+        $transformations = $parent->getTransformations()->toArray();
+        foreach ($transformations as $transformation) {
+            if ($transformation) {
+                $sortie = $transformation->getSortie();
+                if ($sortie && !in_array($sortie, $children)) {
+                    $children[] = $sortie;
+                }
+            }
+        }
+
+        return $children;
+    }
+
+    /**
+     * Les chroniques filles de la chronique $parent
+     * et toutes leur chroniques filles.
+     *
+     * @param Chronique $parent
+     *
+     * @return array
+     */
+    public function findAllChildren(Chronique $parent)
+    {
+        $allChildren = [];
+
+        $children = $this->findChildren($parent);
+        while (0 !== count($children)) {
+            $allChildren = array_merge($allChildren, $children);
+            $tempChildren = [];
+            foreach ($children as $child) {
+                $currentChildren = $this->findChildren($child);
+                if (0 !== count($currentChildren)) {
+                    $tempChildren = array_merge($tempChildren, $currentChildren);
+                }
+            }
+            $children = $tempChildren;
+        }
+
+        $allChildrenUnique = [];
+        foreach ($allChildren as $children) {
+            if (!in_array($children, $allChildrenUnique)) {
+                $allChildrenUnique[] = $children;
+            }
+        }
+
+        return $allChildrenUnique;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/CommuneRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/CommuneRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ddbf712347fb8c8698c96710d363d3f4ebe5b8e
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/CommuneRepository.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class CommuneRepository.
+ */
+class CommuneRepository extends EntityRepository
+{
+    /**
+     * @param string $alias
+     * @param null   $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createOrderedQueryBuilder($alias = 'c', $indexBy = null)
+    {
+        return parent::createQueryBuilder($alias, $indexBy)->orderBy($alias . '.nom', 'ASC');
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createOrderedQueryBuilder()->getQuery()->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/CoursEauRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/CoursEauRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..c7f8bbddeecbfb867c71a56d4290a17d8c0961ca
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/CoursEauRepository.php
@@ -0,0 +1,205 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+use Irstea\BdohDataBundle\Entity\CoursEau;
+
+/**
+ * Class CoursEauRepository.
+ */
+class CoursEauRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'ce', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias);
+        }
+
+        return parent::createQueryBuilder($alias, $indexBy)
+            ->where($alias . '.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('ce')->orderBy('ce.nom', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * @param $tableName
+     * @param $user
+     *
+     * @return array
+     */
+    public function getDataFromShapeTable($tableName, $user)
+    {
+        try {
+            // récupération des cours d'eau de l'observatoire courant
+            $allRivers = $this->findAll();
+            $allRiversNoms = [];
+            foreach ($allRivers as $river) {
+                /* @var CoursEau $river */
+                $allRiversNoms[] = $river->getNom();
+            }
+
+            // requêtes d'analyse des cours d'eau importés dans la table temporaire crée par shp2pgsql
+
+            // requête de base
+            $baseQuery = "SELECT toponyme, code_hydro, classifica FROM $tableName";
+            $baseToponymeOk = ' AND toponyme IS NOT NULL';
+            $baseOrderBy = ' ORDER BY toponyme ASC';
+
+            // requête sur les nouveaux cours d'eau (selon le nom)
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $newRiversQuery = $baseQuery;
+            if ($allRiversNoms !== []) {
+                $newRiversQuery .= ' WHERE toponyme NOT IN (?)';
+                $sqlParamsArray[] = $allRiversNoms;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $newRiversQuery .= ' WHERE TRUE';
+            }
+            $newRiversQuery .= $baseToponymeOk . $baseOrderBy;
+            $newRivers = $this->_em->getConnection()->fetchAll($newRiversQuery, $sqlParamsArray, $sqlTypesArray);
+
+            // requête sur les cours d'eau existants (selon le nom)
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $existingRiversQuery = $baseQuery;
+            if ($allRiversNoms !== []) {
+                $existingRiversQuery .= ' WHERE toponyme IN (?)';
+                $sqlParamsArray[] = $allRiversNoms;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $existingRiversQuery .= ' WHERE FALSE';
+            }
+            $existingRiversQuery .= $baseToponymeOk . $baseOrderBy;
+            $existingRivers = $this->_em->getConnection()->fetchAll($existingRiversQuery, $sqlParamsArray, $sqlTypesArray);
+        } catch (\Exception $e) {
+            $this->dropTemporaryShapeTable($tableName);
+
+            return ['error' => 'coursEau'];
+        }
+
+        return [
+            'cible'         => 'coursEau',
+            'new'           => $newRivers,
+            'countNew'      => \count($newRivers),
+            'existing'      => $existingRivers,
+            'countExisting' => \count($existingRivers),
+        ];
+    }
+
+    /**
+     * @param $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeKeepExistingImport($tableName)
+    {
+        // récupération des cours d'eau de l'observatoire courant
+        $allRivers = $this->findAll();
+        $allRiversNoms = [];
+        foreach ($allRivers as $river) {
+            /* @var CoursEau $river */
+            $allRiversNoms[] = $river->getNom();
+        }
+
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requete de selection des nouveaux cours d'eau importés dans la table temporaire crée par shp2pgsql
+
+        // filtrage sur les nouveaux cours d'eau uniquement (selon le nom)
+        $sqlParamsArray = [];
+        $sqlTypesArray = [];
+        $newRiversFilter = 'WHERE t.toponyme IS NOT NULL';
+        if ($allRiversNoms !== []) {
+            $newRiversFilter .= ' AND t.toponyme NOT IN (?)';
+            $sqlParamsArray[] = $allRiversNoms;
+            $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+        }
+
+        // requête de selection des nouveaux cours d'eau
+        $newRiversQuery = <<<SQL
+SELECT NEXTVAL('courseau_id_seq'), $currentObsId, t.toponyme, t.code_hydro, t.classifica::INTEGER, t.geom
+FROM $tableName t $newRiversFilter
+SQL;
+
+        // requête d'insertion
+        $newRiversInsertQuery = 'INSERT INTO courseau (id, observatoire_id, nom, codehydro, classification, trace) ' .
+            '(' . $newRiversQuery . ') ON CONFLICT DO NOTHING';
+
+        $inserts = $this->_em->getConnection()->executeUpdate($newRiversInsertQuery, $sqlParamsArray, $sqlTypesArray);
+
+        return [$inserts, 0];
+    }
+
+    /**
+     * @param $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeOverwriteExistingImport($tableName)
+    {
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requete de selection des cours d'eau existants importés dans la table temporaire crée par shp2pgsql
+
+        // filtrage sur les cours d'eau existants uniquement (selon le nom)
+        $existingRiversFilter = "WHERE t.toponyme = c.nom AND c.observatoire_id = $currentObsId";
+
+        // requête de selection des cours d'eau existants
+        $existingRiversQuery = <<<SQL
+SELECT c.id, t.code_hydro, t.classifica::INTEGER, t.geom FROM $tableName t, courseau c
+$existingRiversFilter
+SQL;
+
+        // requête de mise à jour
+        $existingRiversUpdateQuery =
+            'UPDATE courseau SET (codehydro, classification, trace) = (temp.code_hydro, temp.classifica, temp.geom) FROM ' .
+            '(' . $existingRiversQuery . ') temp WHERE courseau.id = temp.id';
+
+        // faire l'update avant l'insert sinon le résultat est faussé
+        $updates = $this->_em->getConnection()->executeUpdate($existingRiversUpdateQuery);
+
+        return [$this->shapeKeepExistingImport($tableName)[0], $updates];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/DataSetRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/DataSetRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..5dd3aceccb3b3eae3bac27fd46a4e72dd88ec860
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/DataSetRepository.php
@@ -0,0 +1,199 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+use Irstea\BdohDataBundle\Entity\DataSet;
+
+class DataSetRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias);
+        }
+
+        return parent::createQueryBuilder($alias = 'ds', $indexBy)
+            ->leftJoin('ds.observatoire', 'o')
+            ->where('o = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Observatoire $observatoire
+     *
+     * @return QueryBuilder
+     */
+    public function findByObservatoire($observatoire)
+    {
+        return parent::createQueryBuilder('ds')
+            ->leftJoin('ds.observatoire', 'o')
+            ->where('o = :observatoire')
+            ->setParameter('observatoire', $observatoire->getId());
+    }
+
+    /**
+     * @param int $id
+     *
+     * @throws \Exception
+     *
+     * @return DataSet
+     */
+    public function findOneById($id)
+    {
+        return $this->createQueryBuilder('ds')
+            ->andWhere('ds.id = :id')->setParameter('id', $id)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * @param int $datasetId
+     *
+     * @return array
+     */
+    public function getReclangleEnglobant(int $datasetId): array
+    {
+        $query = <<<SQL
+            WITH env AS (
+                SELECT
+                   ST_Transform(ST_Envelope(ST_Union(ST_Envelope(st.point))) , 4236) AS env
+                FROM station st
+                    INNER JOIN chronique c ON (c.station_id = st.id)
+                WHERE
+                    c.dataset_id = :datasetId
+            )
+            SELECT
+                ST_XMin(env) as xmin,
+                ST_YMin(env) as ymin,
+                ST_XMax(env) as xmax,
+                ST_YMax(env) as ymax
+            FROM env
+SQL;
+
+        $row = $this->getEntityManager()->getConnection()->fetchArray($query, ['datasetId' => $datasetId]);
+        [$rectangleXmin, $rectangleYmin, $rectangleXmax, $rectangleYmax] = $row;
+
+        $rectangle0 = [(float) $rectangleXmin, (float) $rectangleYmax];
+        $rectangle1 = [(float) $rectangleXmin, (float) $rectangleYmin];
+        $rectangle2 = [(float) $rectangleXmax, (float) $rectangleYmin];
+        $rectangle3 = [(float) $rectangleXmax, (float) $rectangleYmax];
+
+        $rectangle = [$rectangle0, $rectangle1, $rectangle2, $rectangle3, $rectangle0];
+
+        return $rectangle;
+    }
+
+    /**
+     * @param string $titre
+     *
+     * @throws \Exception
+     *
+     * @return DataSet
+     */
+    public function findOneByTitre($titre)
+    {
+        return $this->createQueryBuilder('ds')
+            ->andWhere('ds.titre = :titre')->setParameter('titre', $titre)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * @param string $uuid
+     *
+     * @throws \Exception
+     *
+     * @return DataSet
+     */
+    public function findOneByUuid($uuid)
+    {
+        return $this->createQueryBuilder('ds')
+            ->andWhere('ds.uuid = :uuid')->setParameter('uuid', $uuid)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * Gets the first and last dates by 'chronique', for a given 'dataset'.
+     *
+     * @param DataSet $dataset
+     *
+     * @return array Key = 'chronique' id. ; Value = array of ['first', 'last'].
+     */
+    public function getFirstLastDatesByChronique(DataSet $dataset)
+    {
+        // First and last dates by 'chronique', only for 'ChroniqueContinue'
+        $qbMesure = $this->getBdohRepo('Mesure')
+            ->createFirstLastDates()
+            ->addSelect('ch.id')->groupBy('ch.id')
+            ->andWhere('ds.id = :dataset')->setParameter('dataset', $dataset);
+
+        $datesMesure = $qbMesure->getQuery()->getResult();
+
+        // First and last dates by 'chronique', only for 'ChroniqueDiscontinue'
+        $qbPlage = $this->getBdohRepo('Plage')
+            ->createFirstLastDates()
+            ->addSelect('ch.id')->groupBy('ch.id')
+            ->andWhere('ds.id = :dataset')->setParameter('dataset', $dataset);
+
+        $datesPlage = $qbPlage->getQuery()->getResult();
+
+        // Puts the result in form : Key = 'chronique' id. ; Value = array of ['first', 'last']
+        $results = array_merge($datesMesure, $datesPlage);
+        $dates = [];
+
+        foreach ($results as $result) {
+            $dates[$result['id']] = [
+                'first' => $result['first'],
+                'last'  => $result['last'],
+            ];
+        }
+
+        return $dates;
+    }
+
+    /**
+     * @param DataSet $dataset
+     *
+     * @throws \Exception
+     *
+     * @return DataSet
+     */
+    public function findById($dataset)
+    {
+        return $this->createQueryBuilder('ds')
+            ->andWhere('ds.id = :id')->setParameter('id', $dataset->getId())
+            ->getQuery()
+            ->getSingleResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/DoiRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/DoiRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..21cc73f2a96f339ab7f84cf247edb428f9553d87
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/DoiRepository.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Description of DoiRepository.
+ */
+class DoiRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        $qb = parent::createQueryBuilder($alias, $indexBy);
+
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return $qb;
+        }
+
+        return $qb
+            ->where($alias . '.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/EchantillonnageRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/EchantillonnageRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..14c42b0739a3b907393bae69274fb0665aaeea4c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/EchantillonnageRepository.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class EchantillonnageRepository.
+ */
+class EchantillonnageRepository extends EntityRepository
+{
+    /**
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createOrderedQueryBuilder()
+    {
+        return parent::createQueryBuilder('e')->orderBy('e.ordreSortie', 'ASC');
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createOrderedQueryBuilder()->getQuery()->getResult();
+    }
+
+    /**
+     * @return array
+     */
+    public function getTypesEchant()
+    {
+        $all = $this->findAll();
+        $result = [];
+        foreach ($all as $echant) {
+            $result[$echant->getCode()] = $echant;
+        }
+
+        return $result;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/EntityRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/EntityRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c1b20d64a6e4fd3a68edfd6b390f4d87ba9c337
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/EntityRepository.php
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\EntityRepository as BaseEntityRepository;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+/**
+ * Class EntityRepository.
+ */
+class EntityRepository extends BaseEntityRepository
+{
+    /**
+     * @param $entity
+     *
+     * @deprecated
+     */
+    public function getRepository($entity)
+    {
+        return $this->_em->getRepository($entity);
+    }
+
+    /**
+     * Shortcut to return the Doctrine repository suitable for an entity class.
+     *
+     * @param object $entity
+     *
+     * @deprecated
+     */
+    public function getClassRepo($entity)
+    {
+        return $this->getRepository(get_class($entity));
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository of a BDOH entity.
+     *
+     * @param string $bdohEntity
+     *
+     * @deprecated
+     */
+    public function getBdohRepo($bdohEntity)
+    {
+        return $this->getRepository('IrsteaBdohDataBundle:' . $bdohEntity);
+    }
+
+    /**
+     * Shortcut to return a Doctrine repository of a "BDOH Security" entity.
+     *
+     * @param string $securityEntity
+     *
+     * @deprecated
+     */
+    public function getSecurityRepo($securityEntity)
+    {
+        return $this->getRepository('IrsteaBdohSecurityBundle:' . $securityEntity);
+    }
+
+    /**
+     * Returns the current 'observatoire'.
+     * If it doesn't exist or if it's the special "all observatoire", returns false.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Observatoire|false
+     */
+    public function getCurrentObservatoire()
+    {
+        $currentObs = Observatoire::getCurrent();
+
+        return (!$currentObs) ? false : $currentObs;
+    }
+
+    /**
+     * In a given array, replaces eventual entities by their ids.
+     *
+     * @param array  $array       Reference
+     * @param string $classEntity Type of entities searched
+     */
+    public function extractId(array &$array, $classEntity)
+    {
+        // Gets id. of eventual $classEntity instances
+        $array = array_map(
+            function ($e) use ($classEntity) {
+                return ($e instanceof $classEntity) ? $e->getId() : $e;
+            },
+            $array
+        );
+
+        return $array;
+    }
+
+    /**
+     * Drops a temporary 'Shape' SQL table.
+     * Empties the variable containing the SQL table name.
+     *
+     * @param string $tableName
+     */
+    public function dropTemporaryShapeTable($tableName)
+    {
+        try {
+            $tmpTable = explode('.', $tableName);
+            $this->_em->getConnection()->exec("DROP TABLE $tableName");
+            $this->_em->getConnection()->exec("DELETE FROM geometry_columns WHERE f_table_name='$tmpTable[1]'");
+            $tableName = null;
+        } catch (\Exception $e) {
+            //Table does not exist ; nothing to do.
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/FamilleParametresRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/FamilleParametresRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..43d6aa05aff5a3be09affa64dc238c8d67e0d67d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/FamilleParametresRepository.php
@@ -0,0 +1,277 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\FamilleParametres;
+use Irstea\BdohDataBundle\Entity\Station;
+
+/**
+ * FamilleParametresRepository.
+ */
+class FamilleParametresRepository extends EntityRepository
+{
+    /**
+     * Le tableaux des familles de paramètres utilisées sur l'observatoire courant ou sur une stations donnée
+     * avec leurs filles et leurs types de paramètres utilisés sur l'observatoire courant ou sur la station.
+     *
+     * Utilisé pour générer l'arborescence familles / types sur l'accueil de l'observatoire ou
+     * l'arborescence familles / types / chroniques sur la page de la station.
+     *
+     * @param bool         $isLocaleEn
+     * @param DataSet|null $dataset
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getFamillesAndTypesDataset($isLocaleEn = false, $dataset = null)
+    {
+        $tablesLienObservatoire = '';
+        if (!$dataset || !$dataset->getId()) {
+            $tablesLienObservatoire = ', dataset ds, station st, stations_sites ss, siteexperimental si';
+            $currentObsId = $this->getCurrentObservatoire()->getId();
+            $clauseLienObservatoireOuStation =
+                "ch.dataset_id = ds.id AND ch.station_id = st.id AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId";
+        } else {
+            $datasetId = $dataset->getId();
+            $clauseLienObservatoireOuStation = "ch.dataset_id = $datasetId";
+        }
+
+        $nom = $isLocaleEn ? 'nomen' : 'nom';
+
+        $sql = <<<SQL
+WITH RECURSIVE
+-- les types utilisés sur l'observatoires ou sur la station regroupés dans un tableau par famille
+-- les types sont triés par "nom" ou "nomen"
+types_observatoire_ou_dataset(fid, noms) AS (
+    SELECT ty.familleparametres_id, ARRAY_AGG(DISTINCT ty.$nom ORDER BY ty.$nom ASC)
+    FROM chronique ch $tablesLienObservatoire, typeparametre ty
+    WHERE $clauseLienObservatoireOuStation AND ch.parametre_id = ty.id
+    GROUP BY ty.familleparametres_id
+),
+-- la jointure entre toutes les familles et leur tableau de types éventuel
+familles_types(id, pid, prefix, nom, types) AS (
+    SELECT f.id, f.familleparente_id, f.prefix, f.$nom, t.noms AS types
+    FROM familleparametres f LEFT OUTER JOIN types_observatoire_ou_dataset t ON f.id = t.fid
+    ORDER BY f.id
+),
+-- la construction recursive des familles parentes de celles ayant des types uniquement
+r_familles_types(id, pid, prefix, nom, types) AS (
+    SELECT f.id, f.pid, f.prefix, f.nom, f.types
+    FROM familles_types f WHERE ARRAY_LENGTH(types, 1) > 0
+    UNION DISTINCT
+    SELECT f.id, f.pid, f.prefix, f.nom, f.types
+    FROM familles_types f, r_familles_types r
+    WHERE f.id = r.pid
+),
+-- la construction du tableau des familles filles utilisées pour chaque famille utilisée
+-- les familles filles sont triées par "prefix || nom" ou "prefix || nomen"
+familles_type_children(id, pid, prefix, nom, types, children) AS (
+    SELECT r1.id, r1.pid, r1.prefix, r1.nom, r1.types,
+        CASE ARRAY_AGG(r2.id ORDER BY r2.prefix || r2.nom ASC)
+            WHEN ARRAY[NULL]::INTEGER[] THEN ARRAY[]::INTEGER[]
+            ELSE ARRAY_AGG(r2.id ORDER BY r2.prefix || r2.nom ASC)
+        END AS children
+    FROM r_familles_types r1 LEFT OUTER JOIN r_familles_types r2 ON r1.id = r2.pid
+    GROUP BY r1.id, r1.pid, r1.prefix, r1.nom, r1.types
+)
+-- conversion des tableaux en json pour pouvoir les récupérer en php
+-- les familles sont également triées par "prefix || nom" ou "prefix || nomen"
+-- pour extraire les familles racines déjà ordonnées
+SELECT id, pid, prefix, nom, array_to_json(types) AS types, array_to_json(children) AS children
+FROM familles_type_children ORDER BY prefix ASC, nom ASC
+SQL;
+        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
+        $stmt->execute();
+        $familles = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+        $familiesIndexed = [];
+        foreach ($familles as &$famille) {
+            $famille['types'] = \json_decode($famille['types']);
+            $famille['children'] = \json_decode($famille['children']);
+            $familiesIndexed[$famille['id']] = $famille;
+        }
+
+        return $familiesIndexed;
+    }
+
+    //-----------------------------------------------------------------------------------------------------------------
+
+    /**
+     * Le tableaux des familles de paramètres utilisées sur l'observatoire courant ou sur une stations donnée
+     * avec leurs filles et leurs types de paramètres utilisés sur l'observatoire courant ou sur la station.
+     *
+     * Utilisé pour générer l'arborescence familles / types sur l'accueil de l'observatoire ou
+     * l'arborescence familles / types / chroniques sur la page de la station.
+     *
+     * @param bool         $isLocaleEn
+     * @param Station|null $station
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getFamillesAndTypes($isLocaleEn = false, $station = null)
+    {
+        $tablesLienObservatoire = '';
+        if (!$station || !$station->getId()) {
+            $tablesLienObservatoire = ', station st, stations_sites ss, siteexperimental si';
+            $currentObsId = $this->getCurrentObservatoire()->getId();
+            $clauseLienObservatoireOuStation =
+                "ch.station_id = st.id AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId";
+        } else {
+            $stationId = $station->getId();
+            $clauseLienObservatoireOuStation = "ch.station_id = $stationId";
+        }
+
+        $nom = $isLocaleEn ? 'nomen' : 'nom';
+
+        $sql = <<<SQL
+WITH RECURSIVE
+-- les types utilisés sur l'observatoires ou sur la station regroupés dans un tableau par famille
+-- les types sont triés par "nom" ou "nomen"
+types_observatoire_ou_station(fid, noms) AS (
+    SELECT ty.familleparametres_id, ARRAY_AGG(DISTINCT ty.$nom ORDER BY ty.$nom ASC)
+    FROM chronique ch $tablesLienObservatoire, typeparametre ty
+    WHERE $clauseLienObservatoireOuStation AND ch.parametre_id = ty.id
+    GROUP BY ty.familleparametres_id
+),
+-- la jointure entre toutes les familles et leur tableau de types éventuel
+familles_types(id, pid, prefix, nom, types) AS (
+    SELECT f.id, f.familleparente_id, f.prefix, f.$nom, t.noms AS types
+    FROM familleparametres f LEFT OUTER JOIN types_observatoire_ou_station t ON f.id = t.fid
+    ORDER BY f.id
+),
+-- la construction recursive des familles parentes de celles ayant des types uniquement
+r_familles_types(id, pid, prefix, nom, types) AS (
+    SELECT f.id, f.pid, f.prefix, f.nom, f.types
+    FROM familles_types f WHERE ARRAY_LENGTH(types, 1) > 0
+    UNION DISTINCT
+    SELECT f.id, f.pid, f.prefix, f.nom, f.types
+    FROM familles_types f, r_familles_types r
+    WHERE f.id = r.pid
+),
+-- la construction du tableau des familles filles utilisées pour chaque famille utilisée
+-- les familles filles sont triées par "prefix || nom" ou "prefix || nomen"
+familles_type_children(id, pid, prefix, nom, types, children) AS (
+    SELECT r1.id, r1.pid, r1.prefix, r1.nom, r1.types,
+        CASE ARRAY_AGG(r2.id ORDER BY r2.prefix || r2.nom ASC)
+            WHEN ARRAY[NULL]::INTEGER[] THEN ARRAY[]::INTEGER[]
+            ELSE ARRAY_AGG(r2.id ORDER BY r2.prefix || r2.nom ASC)
+        END AS children
+    FROM r_familles_types r1 LEFT OUTER JOIN r_familles_types r2 ON r1.id = r2.pid
+    GROUP BY r1.id, r1.pid, r1.prefix, r1.nom, r1.types
+)
+-- conversion des tableaux en json pour pouvoir les récupérer en php
+-- les familles sont également triées par "prefix || nom" ou "prefix || nomen"
+-- pour extraire les familles racines déjà ordonnées
+SELECT id, pid, prefix, nom, array_to_json(types) AS types, array_to_json(children) AS children
+FROM familles_type_children ORDER BY prefix ASC, nom ASC
+SQL;
+        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
+        $stmt->execute();
+        $familles = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+        $familiesIndexed = [];
+        foreach ($familles as &$famille) {
+            $famille['types'] = \json_decode($famille['types']);
+            $famille['children'] = \json_decode($famille['children']);
+            $familiesIndexed[$famille['id']] = $famille;
+        }
+
+        return $familiesIndexed;
+    }
+
+    /**
+     * Les familles de paramètre triées dans leur ordre hierarchique puis par "prefix || nom" ou "prefix || nomen"
+     * en excluant la famille $famille et ses familles filles si $famille est fourni.
+     *
+     * Utilisé pour générer la liste arborescente des familles pour les selecteurs de familles des pages d'edition
+     * des familles de paramètres et des types de paramètres dans sonata.
+     *
+     * @param FamilleParametres|null $famille
+     * @param bool                   $isLocaleEn
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function findAllHierachy($famille = null, $isLocaleEn = false)
+    {
+        $familleClause = '';
+        if ($famille && $famille->getId()) {
+            $familleClause = 'AND f.id <> ' . $famille->getId();
+        }
+
+        $nom = $isLocaleEn ? 'nomen' : 'nom';
+
+        $sql = <<<SQL
+WITH RECURSIVE r_familles(id, pid, nom, depth, path) AS (
+    SELECT f.id, f.familleparente_id, f.$nom, 0, ARRAY[COALESCE(f.prefix, '') || f.$nom]::CHARACTER VARYING(510)[]
+    FROM familleparametres f
+    WHERE f.familleparente_id IS NULL $familleClause
+    UNION ALL
+    SELECT f.id, f.familleparente_id, f.$nom, r.depth + 1,
+        (r.path || (COALESCE(f.prefix, '') || f.$nom)::CHARACTER VARYING(510))::CHARACTER VARYING(510)[]
+    FROM familleparametres f, r_familles r
+    WHERE f.familleparente_id = r.id $familleClause
+)
+SELECT r.id, r.depth FROM r_familles r ORDER BY r.path
+SQL;
+
+        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
+        $stmt->execute();
+        $hierarchies = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+        $hierarchyIds = [];
+        $hierarchyDepths = [];
+        foreach ($hierarchies as $hierarchy) {
+            $hierarchyIds[] = $hierarchy['id'];
+            $hierarchyDepths[$hierarchy['id']] = $hierarchy['depth'];
+        }
+
+        $allFamilies = $this->findAll();
+
+        $allFamiliesFilter = array_filter(
+            $allFamilies,
+            function ($family) use ($hierarchyIds) {
+                /* @var FamilleParametres $family */
+                return \in_array($family->getId(), $hierarchyIds);
+            }
+        );
+
+        $allFamiliesFilterWithId = [];
+        /* @var FamilleParametres $family */
+        foreach ($allFamiliesFilter as $family) {
+            $allFamiliesFilterWithId[$family->getId()] = $family;
+        }
+
+        $hierarchyFamilies = [];
+        foreach ($hierarchyIds as $id) {
+            $hierarchyFamilies[$id] = $allFamiliesFilterWithId[$id];
+            $allFamiliesFilterWithId[$id]->depth = $hierarchyDepths[$id];
+        }
+
+        return $hierarchyFamilies;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/JeuQualiteRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/JeuQualiteRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..4087bf99794c72276dc8831434aa6b4ccf819158
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/JeuQualiteRepository.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class JeuQualiteRepository.
+ */
+class JeuQualiteRepository extends EntityRepository
+{
+    /**
+     * This function returns *only* assignable 'JeuQualite'.
+     *
+     * @param mixed $includeNotAssignable
+     *
+     * @return array
+     */
+    public function findAll($includeNotAssignable = false)
+    {
+        $qb = $this->createQueryBuilder('jq');
+        if (!$includeNotAssignable) {
+            $qb = $qb->where('jq.estAffectable = true');
+        }
+
+        return $qb->getQuery()->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5b62bd228e15941d14847adb993eb99c659398f
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepository.php
@@ -0,0 +1,606 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Mesure;
+
+/**
+ * Overview of 'MesureRepository'.
+ *
+ *  => Methods for the import of 'Mesure' :
+ *      -> createTemporaryTable
+ *      -> dropTemporaryTable
+ *      -> copyIntoTemporaryTable
+ *      -> getTemporaryFirstLastDates
+ *      -> keepExistingImport
+ *      -> overwriteExistingImport
+ *      -> detectDateRedundancies
+ *
+ *  => Methods using directly Doctrine DBAL (without using the ORM layer) :
+ *      -> adjustDates
+ *      -> getValuesOut
+ *
+ *  => Methods returning a QueryBuilder :
+ *      -> createSimpleQueryBuilder
+ *      -> createQueryBuilderByChronique
+ *      -> createQueryBuilder
+ *      -> createFirstLastDates
+ *
+ *  => Methods using Doctrine ORM :
+ *      -> getMeasuresFromDates
+ *      -> getPreviousMeasure
+ *      -> getNextMeasure
+ *      -> getFirstLastDatesByChronique
+ *      -> getFirstLastDates
+ */
+class MesureRepository extends EntityRepository implements MesureRepositoryInterface
+{
+    /***************************************************************************
+     * Methods for the import of 'Mesure'
+     **************************************************************************/
+
+    const EXTRACTED_DATE_FORMAT = 'Y-m-d H:i:s T';
+
+    /**
+     * Creates a 'Mesure' SQL table whose goal is to be temporary.
+     *
+     * @throws \Exception
+     *
+     * @return string The SQL table name
+     */
+    public function createTemporaryTable()
+    {
+        $randomName = 'temp.tmp_mesure_' . mt_rand(1, 9999999);
+        $sql = "CREATE TABLE $randomName (
+                numline          integer                        NOT NULL ,
+                chronique_numset integer                        NOT NULL ,
+                chronique_id     integer                        NOT NULL ,
+                qualite_id       integer                        NOT NULL ,
+                date             timestamp(3) without time zone NOT NULL ,
+                valeur           double precision               ,
+                minimum          double precision               ,
+                maximum          double precision
+        )";
+        $this->_em->getConnection()->exec($sql);
+
+        return $randomName;
+    }
+
+    /**
+     * Drops a temporary 'Mesure' SQL table.
+     * Empties the variable containing the SQL table name.
+     *
+     * @param string|null $tableName
+     *
+     * @throws \Exception
+     *
+     * @return mixed|void
+     */
+    public function dropTemporaryTable(&$tableName)
+    {
+        $this->_em->getConnection()->exec("DROP TABLE $tableName");
+        $tableName = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function copyIntoTemporaryTable($tableName, $csvPath, $delimiter = ';', $null = '"\\\\N"')
+    {
+        $columns = implode(',', ['numline', 'chronique_numset', 'chronique_id', 'qualite_id', 'date', 'valeur', 'minimum', 'maximum']);
+        $conn = $this->_em->getConnection();
+        $pdo = $conn->getWrappedConnection();
+        $pdo->pgsqlCopyFromFile($tableName, $csvPath, $delimiter, $null, $columns);
+    }
+
+    /**
+     * Gets the first and last dates of a temporary 'Mesure' SQL table.
+     *
+     * @param mixed $tableName
+     *
+     * @return array [0] => first date ; [1] => last date
+     */
+    public function getTemporaryFirstLastDates($tableName)
+    {
+        $sql = "SELECT (MIN(date) || ' UTC'), (MAX(date) || ' UTC') FROM $tableName";
+
+        return $this->_em->getConnection()->fetchArray($sql);
+    }
+
+    /**
+     * Imports measures of a 'chronique' :
+     *    => FROM a temporary 'Mesure' SQL table ;
+     *    => TO   the real 'Mesure' SQL table ;
+     *    => ONLY measures which doesn't overlap the existing .
+     *
+     * @param string $tableName   Name of the temporary 'Mesure' table
+     * @param int    $chroniqueId The considered 'chronique'
+     *
+     * @throws \Exception
+     *
+     * @return int The number of INSERT realized
+     */
+    public function keepExistingImport($tableName, $chroniqueId)
+    {
+        // Columns to SELECT and INSERT
+        $columns = 'chronique_id, qualite_id, date, valeur, minimum, maximum';
+
+        // Generates ids. for new measures
+        $genId = "nextval('mesure_id_seq')";
+
+        // Dates of first and last existing measures.
+        list($firstExistingDate, $lastExistingDate) = $this->getFirstLastDates($chroniqueId);
+
+        // Selects the measures to import
+        $sqlSelect = "SELECT $genId, $columns, FALSE FROM $tableName " .
+            "WHERE chronique_id = $chroniqueId";
+
+        if ($firstExistingDate && $lastExistingDate) {
+            $sqlSelect .= " AND ((date < '$firstExistingDate') OR (date > '$lastExistingDate'))";
+        }
+
+        $sqlSelect .= ' ORDER BY date ASC';
+
+        // Inserts them into the real 'Mesure' SQL table
+        $sqlInsert = "INSERT INTO mesure (id, $columns, estCalculee) ($sqlSelect)";
+
+        // Executes the SQL query
+        return $this->_em->getConnection()->exec($sqlInsert);
+    }
+
+    /**
+     * Imports ALL measures of a 'chronique' :
+     *    => FROM     a temporary 'Mesure' SQL table ;
+     *    => TO       the real 'Mesure' SQL table ;
+     *    => DELETING existing measures overlapped by the new ones.
+     *
+     * @param string $tableName   Name of the temporary 'Mesure' table
+     * @param int    $chroniqueId The considered 'chronique'
+     * @param string $firstDate   Date of the first measure to import
+     * @param string $lastDate    Date of the last measure to import
+     *
+     * @throws \Exception
+     *
+     * @return array [0] => num. of DELETE ; [1] => num. of INSERT
+     */
+    public function overwriteExistingImport($tableName, $chroniqueId, $firstDate, $lastDate)
+    {
+        // Deletes existing measures overlapped by new ones
+        $sqlDelete = "DELETE FROM mesure WHERE (date >= '$firstDate') AND (date <= '$lastDate') " .
+            "AND chronique_id = $chroniqueId";
+
+        // Columns to SELECT and INSERT
+        $columns = 'chronique_id, qualite_id, date, valeur, minimum, maximum';
+
+        // Generates ids. for new measures
+        $genId = "nextval('mesure_id_seq')";
+
+        // Selects ALL new measures
+        $sqlSelect = "SELECT $genId, $columns, FALSE FROM $tableName " .
+            "WHERE chronique_id = $chroniqueId ORDER BY date ASC";
+
+        // Inserts them into the real 'Mesure' SQL table
+        $sqlInsert = "INSERT INTO mesure (id, $columns, estCalculee) ($sqlSelect)";
+
+        // Executes the SQL queries : DELETE first ; INSERT next
+        $connection = $this->_em->getConnection();
+
+        return [$connection->exec($sqlDelete), $connection->exec($sqlInsert)];
+    }
+
+    /**
+     * For a temporary 'Mesure' SQL table, detects the date redundancies.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *      => Key   == 'chronique' numset ;
+     *      => Value == array(
+     *          -> Key   == date ;
+     *          -> Value == array(
+     *              'count'     => integer ; number of times this date appears
+     *              'numLines'  => string  ; contains the date line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectDateRedundancies($tableName)
+    {
+        $sql = "SELECT chronique_numset, date, count(*), array_to_string(array_agg(numline), ', ') as numlines " .
+            "FROM $tableName " .
+            'GROUP BY chronique_numset, date ' .
+            'HAVING count(*) > 1';
+
+        $sqlResults = $this->_em->getConnection()->fetchAll($sql);
+        $redundancies = [];
+
+        foreach ($sqlResults as $result) {
+            $redundancies[$result['chronique_numset']][$result['date']] = [
+                'count'    => $result['count'],
+                'numLines' => $result['numlines'],
+            ];
+        }
+
+        return $redundancies;
+    }
+
+    /**
+     * For a temporary 'Plage' SQL table, detects the range overlaps.
+     *
+     * @param string $tableName
+     *
+     * @return array (empty)
+     */
+    public function detectRangeOverlaps($tableName)
+    {
+        return [];
+    }
+
+    /***************************************************************************
+     * Methods using directly Doctrine DBAL (without using the ORM layer)
+     **************************************************************************/
+
+    /**
+     * Adds a time to the dates of a 'Mesure' table.
+     *
+     * @param string $time      Format : +/-hhmm (+02:00, -10:00, -04:30, +00:30...)
+     * @param string $tableName Name of the 'Mesure' table
+     *
+     * @throws \Exception
+     */
+    public function adjustDates($time, $tableName)
+    {
+        $sql = "UPDATE $tableName set date = date + '$time'";
+        $this->_em->getConnection()->exec($sql);
+    }
+
+    /**
+     * For a 'Mesure' SQL table and by 'chronique',
+     * gets the first and last dates, and the number of measures whose :
+     *    =>    'valeur' lower  than the 'minimumValide' of the 'chronique' ;
+     *    => OR 'valeur' higher than the 'maximumValide' of the 'chronique' .
+     *
+     * @param string $tableName Name of the 'Mesure' table
+     * @param string $type      'tooSmall' or 'tooLarge'
+     *
+     * Returns an array whose structure is :
+     *    => Key   == 'chronique id.' ;
+     *    => Value == array(
+     *      'first' => the first date,
+     *      'last'  => the last date,
+     *      'count' => the number of measures concerned
+     *    )
+     * @param mixed $gapQuality
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getValuesOut($tableName, $type, $gapQuality)
+    {
+        // What type of check ?
+        switch ($type) {
+            case 'tooSmall':
+                $whereClause = "valeur < (SELECT minimumValide FROM chronique WHERE id = chronique_id) and qualite_id <> $gapQuality";
+                break;
+            case 'tooLarge':
+                $whereClause = "valeur > (SELECT maximumValide FROM chronique WHERE id = chronique_id) and qualite_id <> $gapQuality";
+                break;
+            default:
+                return [];
+        }
+
+        $sql = "SELECT chronique_id, (MIN(date) || ' UTC') as min, (MAX(date) || ' UTC') as max, count(*) " .
+            "FROM $tableName WHERE $whereClause GROUP BY chronique_id";
+
+        $results = $this->_em->getConnection()->fetchAll($sql);
+        $valuesOutByChronique = [];
+
+        // For each 'chronique', returns first and last dates, and number of measures concerned.
+        foreach ($results as $result) {
+            $valuesOutByChronique[$result['chronique_id']] = [
+                'first' => new \DateTime($result['min']),
+                'last'  => new \DateTime($result['max']),
+                'count' => $result['count'],
+            ];
+        }
+
+        return $valuesOutByChronique;
+    }
+
+    /**
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createSimpleQueryBuilder()
+    {
+        return parent::createQueryBuilder('m')
+            ->select("m.id, m.qualite, m.chronique, CONCAT(m.date, ' UTC') as date, m.valeur, m.minimum, m.maximum, m.estCalculee");
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createQueryBuilderByChronique(Chronique $chronique)
+    {
+        return $this->createSimpleQueryBuilder()
+            ->select("CONCAT(m.date, ' UTC') as date, m.valeur, q.id as qualite")
+            ->leftJoin('m.qualite', 'q')
+            ->where('m.chronique = ' . $chronique->getId())
+            ->orderBy('m.date', 'ASC');
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'm', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return $this->createSimpleQueryBuilder();
+        }
+
+        return $this->createSimpleQueryBuilder()
+            ->leftJoin('m.chronique', 'ch')
+            ->leftJoin('ch.station', 'st')
+            ->leftJoin('ch.dataset', 'ds')
+            ->leftJoin('st.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Returns a QueryBuilder pre-selecting the first and last dates.
+     */
+    public function createFirstLastDates()
+    {
+        return $this->createQueryBuilder()
+            ->select("CONCAT(MIN(m.date),' UTC') as first, CONCAT(MAX(m.date), ' UTC') as last");
+    }
+
+    /***************************************************************************
+     * Methods using Doctrine ORM
+     **************************************************************************/
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMeasuresFromDates(Chronique $chronique, $begin, $end, array $gapIds = null)
+    {
+        $chroniqueId = $chronique->getId();
+        if ($gapIds) {
+            $sql = "WITH dvv(date, value, valid, qualite) AS
+                  (SELECT (m.date || ' UTC') as date, m.valeur, m.qualite_id IN ( " . implode(',', $gapIds) . ") , m.qualite_id
+                   FROM mesure m WHERE m.chronique_id = '$chroniqueId'
+                    AND m.date >= '$begin' AND m.date < '$end'
+                    ORDER BY m.date
+                    )
+                    SELECT dvvc.date as date, dvvc.value as value, dvvc.qualite as qualite
+                    FROM (SELECT date, value,  valid, qualite, COALESCE(dvv.valid <> LAG(dvv.valid) OVER(), true) AS continuous FROM dvv) dvvc
+                    WHERE dvvc.continuous
+                    ;";
+
+            return $this->_em->getConnection()->executeQuery($sql)->fetchAll();
+        }
+        $qb = $this->createQueryBuilderByChronique($chronique);
+        if ($begin) {
+            $qb->andWhere("m.date >= '$begin'");
+        }
+        if ($end) {
+            $qb->andWhere("m.date <= '$end'");
+        }
+
+        return $qb->getQuery()->getArrayResult();
+    }
+
+    /**
+     * From a given 'chronique', retrieves the immediat previous 'Mesure' to a given date.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $date      SQL date
+     *
+     * @return mixed Irstea\BdohDataBundle\Entity\Mesure|null
+     */
+    public function getPreviousMeasure(ChroniqueContinue $chronique, $date)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique)
+            ->andWhere("m.date < '$date'")
+            ->orderBy('m.date', 'DESC')
+            ->setMaxResults(1);
+
+        $result = $qb->getQuery()->getArrayResult();
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * From a given 'chronique', retrieves the immediat next 'Mesure' to a given date.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $date      SQL date
+     *
+     * @return mixed Irstea\BdohDataBundle\Entity\Mesure|null
+     */
+    public function getNextMeasure(ChroniqueContinue $chronique, $date)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique)
+            ->andWhere("m.date > '$date'")
+            ->orderBy('m.date', 'ASC')
+            ->setMaxResults(1);
+
+        $result = $qb->getQuery()->getArrayResult();
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * From a given 'chronique', retrieves the immediat next 'Mesure' to a given date.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $date      SQL date
+     *
+     * @throws \Exception
+     *
+     * @return mixed Irstea\BdohDataBundle\Entity\Mesure|null
+     */
+    public function getNextMeasure2(ChroniqueContinue $chronique, $date)
+    {
+        $chroniqueId = $chronique->getId();
+        $sql = "SELECT m.qualite_id FROM mesure m
+               WHERE m.chronique_id=$chroniqueId
+               AND m.date >'$date'
+               ORDER BY m.date ASC LIMIT 1;";
+
+        $result = $this->_em->getConnection()->executeQuery($sql)->fetchAll();
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFirstLastDatesByChronique(array $chroniques = [])
+    {
+        // Gets id. of eventual 'ChroniqueContinue' instances
+        $this->extractId($chroniques, ChroniqueContinue::class);
+
+        $qb = $this->createFirstLastDates()->addSelect('ch.id')->groupBy('ch.id');
+
+        // Restriction on 'chroniques'
+        if ([] !== $chroniques) {
+            $qb->andWhere($qb->expr()->in('ch.id', $chroniques));
+        }
+
+        // Puts the result in form : Key = 'chronique' id. ; Value = array of ['first', 'last']
+        $results = $qb->getQuery()->getResult();
+        $dates = [];
+
+        foreach ($results as $result) {
+            $dates[$result['id']] = [
+                'first' => $result['first'],
+                'last'  => $result['last'],
+            ];
+        }
+
+        return $dates;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFirstLastDates($chroniqueId)
+    {
+        $allDates = $this->getFirstLastDatesByChronique([$chroniqueId]);
+        $dates = current($allDates);
+
+        return $dates ? [$dates['first'], $dates['last']] : [null, null];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteFromChronique($chroniqueId)
+    {
+        $this->_em->getConnection()->exec('DELETE FROM mesure WHERE chronique_id = ' . $chroniqueId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function emptyChroniquePeriode(Chronique $chronique, \DateTime $beginDate, \DateTime $endDate)
+    {
+        $em = $this->getEntityManager();
+
+        // Get the current bondaries of the time series
+        list($firstExtractedDate, $lastExtractedDate) = $this->getFirstLastDates($chronique->getId());
+        $firstDateTime = $this->parseExtractedDate($firstExtractedDate);
+        $lastDateTime = $this->parseExtractedDate($lastExtractedDate);
+
+        // The removal period is inside the time series' bondaries -> the data are changed into gap values
+        // BETWEEN treats the endpoint values as included in the range
+        if ($firstDateTime < $beginDate && $endDate < $lastDateTime) {
+            $gapQualite = $chronique->getDefaultGapQualite();
+            $count = $em->createQueryBuilder()
+                ->update(Mesure::class, 'm')
+                ->set('m.qualite', ':qualite')
+                ->set('m.valeur', ':valeur')
+                ->set('m.minimum', ':minimum')
+                ->set('m.maximum', ':maximum')
+                ->where('m.chronique = :chronique')
+                ->andWhere('m.date BETWEEN :begin AND :end')
+                ->setParameters([
+                    'qualite'    => $gapQualite,
+                    'valeur'     => null,
+                    'minimum'    => null,
+                    'maximum'    => null,
+                    'chronique'  => $chronique,
+                    'begin'      => $beginDate->format(DATE_ATOM),
+                    'end'        => $endDate->format(DATE_ATOM),
+                ])
+                ->getQuery()
+                ->execute();
+            $changed = true;
+        }
+        // The removal period includes one or both of the bondaries of the time series -> the data are removed
+        // BETWEEN treats the endpoint values as included in the range
+        else {
+            $count = $em->createQueryBuilder()
+                ->delete()
+                ->from(Mesure::class, 'm')
+                ->where('m.chronique = :chronique')
+                ->andWhere('m.date BETWEEN :begin AND :end')
+                ->setParameters([
+                    'chronique' => $chronique,
+                    'begin'     => $beginDate->format(DATE_ATOM),
+                    'end'       => $endDate->format(DATE_ATOM),
+                ])
+                ->getQuery()
+                ->execute();
+            $changed = false;
+        }
+
+        return ['changed' => $changed, 'count' => $count];
+    }
+
+    /**
+     * @param string $extractedDate
+     *
+     * dates are extracted from the database as a string concatanated with ' UTC':
+     * CONCAT(date, ' UTC')
+     *
+     * @return \DateTime
+     */
+    private function parseExtractedDate($extractedDate)
+    {
+        return \DateTime::createFromFormat(
+            self::EXTRACTED_DATE_FORMAT,
+            $extractedDate,
+            new \DateTimeZone('UTC')
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepositoryInterface.php b/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepositoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e5a76c731dd1f65a683bb0c3f1344f061f7296e
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/MesureRepositoryInterface.php
@@ -0,0 +1,224 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+
+/**
+ * Class MesureRepositoryInterface.
+ */
+interface MesureRepositoryInterface
+{
+    /**
+     * Creates a 'Mesure' SQL table whose goal is to be temporary.
+     *
+     * @return string The SQL table name
+     */
+    public function createTemporaryTable();
+
+    /**
+     * @param $tableName
+     *
+     * @return mixed
+     */
+    public function dropTemporaryTable(&$tableName);
+
+    /**
+     * Copies 'Mesure' FROM a CSV file INTO a temporary 'Mesure' SQL table.
+     *
+     * @param string $tableName
+     * @param string $csvPath
+     * @param string $delimiter
+     * @param string $null
+     */
+    public function copyIntoTemporaryTable($tableName, $csvPath, $delimiter = ';', $null = '"\\\\N"');
+
+    /**
+     * Gets the first and last dates of a temporary 'Mesure' SQL table.
+     *
+     * @param mixed $tableName
+     *
+     * @return array [0] => first date ; [1] => last date
+     */
+    public function getTemporaryFirstLastDates($tableName);
+
+    /**
+     * Imports measures of a 'chronique' :
+     *    => FROM a temporary 'Mesure' SQL table ;
+     *    => TO   the real 'Mesure' SQL table ;
+     *    => ONLY measures which doesn't overlap the existing .
+     *
+     * @param string $tableName   Name of the temporary 'Mesure' table
+     * @param int    $chroniqueId The considered 'chronique'
+     *
+     * @return int The number of INSERT realized
+     */
+    public function keepExistingImport($tableName, $chroniqueId);
+
+    /**
+     * Imports ALL measures of a 'chronique' :
+     *    => FROM     a temporary 'Mesure' SQL table ;
+     *    => TO       the real 'Mesure' SQL table ;
+     *    => DELETING existing measures overlapped by the new ones.
+     *
+     * @param string $tableName   Name of the temporary 'Mesure' table
+     * @param int    $chroniqueId The considered 'chronique'
+     * @param string $firstDate   Date of the first measure to import
+     * @param string $lastDate    Date of the last measure to import
+     *
+     * @return array [0] => num. of DELETE ; [1] => num. of INSERT
+     */
+    public function overwriteExistingImport($tableName, $chroniqueId, $firstDate, $lastDate);
+
+    /**
+     * For a temporary 'Mesure' SQL table, detects the date redundancies.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *      => Key   == 'chronique' numset ;
+     *      => Value == array(
+     *          -> Key   == date ;
+     *          -> Value == array(
+     *              'count'     => integer ; number of times this date appears
+     *              'numLines'  => string  ; contains the date line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectDateRedundancies($tableName);
+
+    /**
+     * For a temporary 'Plage' SQL table, detects the range overlaps.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *      => Key   == 'chronique' numset ;
+     *      => Value == array(
+     *          -> Value == array(
+     *              'plages'    => string ; overlapping ranges
+     *              'numLines'  => string  ; line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectRangeOverlaps($tableName);
+
+    /***************************************************************************
+     * Methods using directly Doctrine DBAL (without using the ORM layer)
+     **************************************************************************/
+
+    /**
+     * Adds a time to the dates of a 'Mesure' table.
+     *
+     * @param string $time      Format : +/-hhmm (+02:00, -10:00, -04:30, +00:30...)
+     * @param string $tableName Name of the 'Mesure' table
+     */
+    public function adjustDates($time, $tableName);
+
+    /**
+     * For a 'Mesure' SQL table and by 'chronique',
+     * gets the first and last dates, and the number of measures whose :
+     *    =>    'valeur' lower  than the 'minimumValide' of the 'chronique' ;
+     *    => OR 'valeur' higher than the 'maximumValide' of the 'chronique' .
+     *
+     * @param string $tableName  Name of the 'Mesure' table
+     * @param string $type       'tooSmall' or 'tooLarge'
+     * @param mixed  $gapQuality
+     *
+     * Returns an array whose structure is :
+     *    => Key   == 'chronique id.' ;
+     *    => Value == array(
+     *      'first' => the first date,
+     *      'last'  => the last date,
+     *      'count' => the number of measures concerned
+     *    )
+     */
+    public function getValuesOut($tableName, $type, $gapQuality);
+
+    /**
+     * From a given 'chronique', retrieves all 'Mesure' beetween two given dates.
+     *
+     * @param Chronique  $chronique
+     * @param string     $begin     SQL date
+     * @param string     $end       SQL date
+     * @param array|null $gapIds
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getMeasuresFromDates(Chronique $chronique, $begin, $end, array $gapIds = null);
+
+    /**
+     * Gets the first and last dates by 'chronique'.
+     *
+     * @param int[] $chroniqueIds 'ChroniqueContinue' instances OR ids
+     *
+     * @return array Key = 'chronique' id. ; Value = array of ['first', 'last'].
+     */
+    public function getFirstLastDatesByChronique(array $chroniqueIds);
+
+    /**
+     * Gets the first and last dates of a 'chronique'.
+     *
+     * @param int $chroniqueId
+     *
+     * @return array [0] => first date ; [1] => last date
+     */
+    public function getFirstLastDates($chroniqueId);
+
+    /**
+     * @param int $chroniqueId
+     *
+     * @throws \Exception
+     *
+     * @return mixed
+     */
+    public function deleteFromChronique($chroniqueId);
+
+    /** Supprime les mesures d'une chronique sur une période de temps donnée.
+     * Insère éventuellement des lacunes techniques pour le (re)calcul de lacunes.
+     *
+     * @param Chronique $chronique
+     * @param \DateTime $beginDate
+     * @param \DateTime $endDate
+     *
+     * @return array ['changed'=> boolean, 'count' => integer]
+     */
+    public function emptyChroniquePeriode(Chronique $chronique, \DateTime $beginDate, \DateTime $endDate);
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilderByChronique(Chronique $chronique);
+
+    /**
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createSimpleQueryBuilder();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/ObservatoireRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/ObservatoireRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bc257b3feabdcbc73bc203e201879c39155d925
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/ObservatoireRepository.php
@@ -0,0 +1,174 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Partenaire;
+
+/**
+ * ObservatoireRepository.
+ *
+ * @method findOneBySlug($slug): Observatoire
+ */
+class ObservatoireRepository extends EntityRepository
+{
+    /**
+     * Returns an array containing all 'observatoires' entities (with some related data).
+     * NOTE : the "all observatoire" is not selected !
+     */
+    public function findAll()
+    {
+        $dql = 'SELECT o, s, p FROM ' . $this->_entityName . ' o'
+            . ' LEFT OUTER JOIN o.sites s'
+            . ' LEFT OUTER JOIN o.partenaires p'
+            . ' ORDER BY o.slug';
+
+        $query = $this->_em->createQuery($dql);
+
+        return $query->getResult();
+    }
+
+    /**
+     * @param $alias
+     * @param null $indexBy
+     *
+     * @return Observatoire[]
+     */
+    public function findObservatoireToSendAutomatically()
+    {
+        return $this->createQueryBuilder('o')
+            ->andWhere('o.theiaCode IS not NULL')
+            ->andWhere('o.theiaPassword IS not NULL')
+            ->andWhere('o.miseajourAutomatique = TRUE')
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * @param int $id
+     *
+     * @throws \Exception
+     *
+     * @return Observatoire
+     */
+    public function findOneById($id)
+    {
+        return $this->createQueryBuilder('o')
+            ->andWhere('o.id = :id')->setParameter('id', $id)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * @param string $theiaCode
+     *
+     * @throws \Exception
+     *
+     * @return Observatoire
+     */
+    public function findOneByTheiaCode($theiaCode)
+    {
+        return $this->createQueryBuilder('o')
+            ->andWhere('o.theiaCode = :theiaCode')->setParameter('theiaCode', $theiaCode)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * Returns a QueryBuilder returning all 'TypeParametres' of current 'Observatoire'
+     * (ie : that have at least one 'Chronique').
+     * Utilisé pour la liste des paramètres dans le formulaire des besoins.
+     *
+     * @param bool $isLocaleEn
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createParametresQueryBuilder($isLocaleEn = false)
+    {
+        $chroniques = $this->getBdohRepo('Chronique')->findAll();
+
+        return $this->getBdohRepo('TypeParametre')->createQueryBuilder('p')
+            ->leftJoin('p.chroniques', 'ch')
+            ->where('ch in (:chroniques)')->setParameter('chroniques', $chroniques)
+            ->orderBy($isLocaleEn ? 'p.nomEn' : 'p.nom', 'ASC');
+    }
+
+    /**
+     * Returns all 'TypeParametres' of current 'Observatoire'
+     * (ie : that have at least one 'Chronique').
+     *
+     * Uniquement les types sans famille pour la transition vers les familles de paramètres.
+     *
+     * Utilisé pour afficher la liste des types sur l'accueil de l'observatoire et pour
+     * avoir la liste des types sans familles pour la page des station.
+     *
+     * @param bool $isLocaleEn
+     *
+     * @return array
+     */
+    public function getParametres($isLocaleEn = false)
+    {
+        $qb = $this->getBdohRepo('Chronique')->createQueryBuilder('c');
+        $qb->select('DISTINCT p.nom, p.nomEn')
+            ->leftJoin('c.parametre', 'p')
+            // Uniquement les types sans famille pour la transition vers les familles de paramètres.
+            ->andWhere($qb->expr()->isNull('p.familleParametres'))
+            ->orderBy($isLocaleEn ? 'p.nomEn' : 'p.nom', 'ASC');
+
+        return $qb->getQuery()->getResult();
+    }
+
+    /**
+     * Returns all 'observatoires' entities that are partenered with the given partenaire.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Partenaire $partenaire
+     *
+     * @return array
+     */
+    public function findByPartenaire($partenaire)
+    {
+        return parent::createQueryBuilder('o')
+            ->leftJoin('o.partenaires', 'p')
+            ->where('p = :partenaires')
+            ->setParameter('partenaires', $partenaire)
+            ->getQuery()
+            ->getResult();
+    }
+
+    /**
+     * @param int $id
+     *
+     * @throws \Exception
+     *
+     * @return Observatoire
+     */
+    public function findStationByObservatoire($id)
+    {
+        return $this->createQueryBuilder('o')
+            ->leftJoin('o.dataset', 'ds')
+            ->leftJoin('ds.chronique', 'ch')
+            ->leftJoin('ch.station', 'st')
+            ->andWhere('o.id = :id')->setParameter('id', $id)
+            ->getQuery()
+            ->getSingleResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/PartenaireRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/PartenaireRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b41c3cafdc8a1bec84e43b49838cbac349bcf4f
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/PartenaireRepository.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+
+/**
+ * Class PartenaireRepository.
+ */
+class PartenaireRepository extends EntityRepository
+{
+    /**
+     * @param string $alias
+     * @param null   $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'p', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return parent::createQueryBuilder($alias, $indexBy);
+        }
+
+        return parent::createQueryBuilder($alias = 'p', $indexBy)
+            ->leftJoin('p.observatoire', 'o')
+            ->where('o = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Observatoire $observatoire
+     *
+     * @return QueryBuilder
+     */
+    public function findByObservatoire($observatoire)
+    {
+        return parent::createQueryBuilder('p')
+            ->leftJoin('p.observatoire', 'o')
+            ->where('o = :observatoire')
+            ->andWhere('p.estFinanceur = true')
+            ->setParameter('observatoire', $observatoire->getId());
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder()->getQuery()->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/PersonneTheiaRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/PersonneTheiaRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d410248fb1f0e7f40815f86a0ca03c5dfcc643a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/PersonneTheiaRepository.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+
+class PersonneTheiaRepository extends EntityRepository
+{
+    /**
+     * @param string      $alias
+     * @param string|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        $qb = parent::createQueryBuilder($alias, $indexBy);
+
+        $currentObs = $this->getCurrentObservatoire();
+        if (!$currentObs) {
+            return $qb;
+        }
+
+        return $qb
+                ->leftJoin($alias . '.partenaire', 'pa')
+                ->where('pa.observatoire = :observatoire')
+                ->setParameter('observatoire', $currentObs);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/PlageRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/PlageRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..563387aa0d6f49557afcb3c09435bcd08592e122
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/PlageRepository.php
@@ -0,0 +1,556 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+
+/**
+ * Overview of 'PlageRepository' :.
+ *
+ *  => Methods for the import of 'Plage' :
+ *      -> createTemporaryTable
+ *      -> dropTemporaryTable
+ *      -> copyIntoTemporaryTable
+ *      -> getTemporaryFirstLastDates
+ *      -> keepExistingImport
+ *      -> overwriteExistingImport
+ *      -> detectDateRedundancies
+ *
+ *  => Methods using directly Doctrine DBAL (without using the ORM layer) :
+ *      -> adjustDates
+ *      -> getValuesOut
+ *
+ *  => Methods returning a QueryBuilder :
+ *      -> createSimpleQueryBuilder
+ *      -> createQueryBuilderByChronique
+ *      -> createQueryBuilder
+ *      -> createFirstLastDates
+ *
+ *  => Methods using Doctrine ORM :
+ *      -> getMeasuresFromDates
+ *      -> getFirstLastDatesByChronique
+ *      -> getFirstLastDates
+ */
+class PlageRepository extends EntityRepository implements MesureRepositoryInterface
+{
+    /***************************************************************************
+     * Methods for the import of 'Plage'
+     **************************************************************************/
+
+    /**
+     * Creates a 'Plage' SQL table whose goal is to be temporary.
+     *
+     * @throws \Exception
+     *
+     * @return string The SQL table name
+     */
+    public function createTemporaryTable()
+    {
+        $randomName = 'temp.tmp_plage_' . mt_rand(1, 9999999);
+        $sql = "CREATE TABLE $randomName (
+                numline          integer                        NOT NULL ,
+                chronique_numset integer                        NOT NULL ,
+                chronique_id     integer                        NOT NULL ,
+                qualite_id       integer                        NOT NULL ,
+                debut            timestamp(3) without time zone NOT NULL ,
+                fin              timestamp(3) without time zone NOT NULL ,
+                valeur           double precision               ,
+                minimum          double precision               ,
+                maximum          double precision
+        )";
+        $this->_em->getConnection()->exec($sql);
+
+        return $randomName;
+    }
+
+    /**
+     * Drops a temporary 'Plage' SQL table.
+     * Empties the variable containing the SQL table name.
+     *
+     * @param string $tableName
+     *
+     * @throws \Exception
+     */
+    public function dropTemporaryTable(&$tableName)
+    {
+        $this->_em->getConnection()->exec("DROP TABLE $tableName");
+        $tableName = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function copyIntoTemporaryTable($tableName, $csvPath, $delimiter = ';', $null = '"\\\\N"')
+    {
+        $columns = implode(',', ['numline', 'chronique_numset', 'chronique_id', 'qualite_id', 'debut', 'fin', 'valeur', 'minimum', 'maximum']);
+        $conn = $this->_em->getConnection();
+        $pdo = $conn->getWrappedConnection();
+        $pdo->pgsqlCopyFromFile($tableName, $csvPath, $delimiter, $null, $columns);
+    }
+
+    /**
+     * Gets the first and last dates of a temporary 'Plage' SQL table.
+     *
+     * @param mixed $tableName
+     *
+     * @return array [0] => first date ; [1] => last date
+     */
+    public function getTemporaryFirstLastDates($tableName)
+    {
+        $sql = "SELECT (MIN(debut) || ' UTC'), (MAX(fin) || ' UTC') FROM $tableName";
+
+        return $this->_em->getConnection()->fetchArray($sql);
+    }
+
+    /**
+     * Check if the first 'Plage' of a chronique is a point.
+     *
+     * @param string $beginDate
+     * @param int    $chroniqueId
+     *
+     * @return bool
+     */
+    public function isFirstPlageAPoint($beginDate, $chroniqueId)
+    {
+        $sql = "SELECT * FROM plage WHERE chronique_id = $chroniqueId AND debut = fin AND debut = '$beginDate'";
+
+        return $this->_em->getConnection()->fetchArray($sql) !== false;
+    }
+
+    /**
+     * Check if the last 'Plage' of a chronique is a point.
+     *
+     * @param string $endDate
+     * @param int    $chroniqueId
+     *
+     * @return bool
+     */
+    public function isLastPlageAPoint($endDate, $chroniqueId)
+    {
+        $sql = "SELECT * FROM plage WHERE chronique_id = $chroniqueId AND debut = fin AND fin = '$endDate'";
+
+        return $this->_em->getConnection()->fetchArray($sql) !== false;
+    }
+
+    /**
+     * Imports measures of a 'chronique' :
+     *    => FROM a temporary 'Plage' SQL table ;
+     *    => TO   the real 'Plage' SQL table ;
+     *    => ONLY measures which doesn't overlap the existing .
+     *
+     * @param string $tableName   Name of the temporary 'Plage' table
+     * @param int    $chroniqueId The considered 'chronique'
+     *
+     * @throws \Exception
+     *
+     * @return int The number of INSERT realized
+     */
+    public function keepExistingImport($tableName, $chroniqueId)
+    {
+        // Columns to SELECT and INSERT
+        $columns = 'chronique_id, qualite_id, debut, fin, valeur, minimum, maximum';
+
+        // Generates ids. for new measures
+        $genId = "nextval('plage_id_seq')";
+
+        // Dates of first and last existing measures.
+        list($firstExistingDate, $lastExistingDate) = $this->getFirstLastDates($chroniqueId);
+
+        // Selects the measures to import
+        $sqlSelect = "SELECT $genId, $columns FROM $tableName " .
+            "WHERE chronique_id = $chroniqueId";
+
+        if ($firstExistingDate && $lastExistingDate) {
+            $firstPlageIsAPoint = $this->isFirstPlageAPoint($firstExistingDate, $chroniqueId);
+            $lastPlageIsAPoint = $this->isLastPlageAPoint($lastExistingDate, $chroniqueId);
+
+            $sqlSelect .= ' AND (';
+            if ($firstPlageIsAPoint) {
+                $sqlSelect .= "(fin < '$firstExistingDate')";
+            } else {
+                $sqlSelect .= "((fin <= '$firstExistingDate' AND debut <> fin) OR fin < '$firstExistingDate')";
+            }
+            $sqlSelect .= ' OR ';
+            if ($lastPlageIsAPoint) {
+                $sqlSelect .= "(debut > '$lastExistingDate')";
+            } else {
+                $sqlSelect .= "((debut >= '$lastExistingDate' AND debut <> fin) OR debut > '$lastExistingDate')";
+            }
+            $sqlSelect .= ')';
+        }
+
+        $sqlSelect .= ' ORDER BY debut ASC';
+
+        // Inserts them into the real 'Plage' SQL table
+        $sqlInsert = "INSERT INTO plage (id, $columns) ($sqlSelect)";
+
+        // Executes the SQL query
+        return $this->_em->getConnection()->exec($sqlInsert);
+    }
+
+    /**
+     * Imports ALL measures of a 'chronique' :
+     *    => FROM     a temporary 'Plage' SQL table ;
+     *    => TO       the real 'Plage' SQL table ;
+     *    => DELETING existing measures overlapped by the new ones.
+     *
+     * @param string $tableName   Name of the temporary 'Plage' table
+     * @param int    $chroniqueId The considered 'chronique'
+     * @param string $firstDate   Date of the first measure to import
+     * @param string $lastDate    Date of the last measure to import
+     *
+     * @throws \Exception
+     *
+     * @return array [0] => num. of DELETE ; [1] => num. of INSERT
+     */
+    public function overwriteExistingImport($tableName, $chroniqueId, $firstDate, $lastDate)
+    {
+        // Deletes existing measures overlapped by new ones
+        $sqlDelete = "DELETE FROM plage WHERE ((fin > '$firstDate' AND debut < '$lastDate') OR " .
+            "((debut = fin OR '$firstDate' = '$lastDate') AND (debut = '$firstDate' OR fin = '$lastDate'))) " .
+            "AND chronique_id = $chroniqueId";
+
+        // Columns to SELECT and INSERT
+        $columns = 'chronique_id, qualite_id, debut, fin, valeur, minimum, maximum';
+
+        // Generates ids. for new measures
+        $genId = "nextval('plage_id_seq')";
+
+        // Selects ALL new measures
+        $sqlSelect = "SELECT $genId, $columns FROM $tableName " .
+            "WHERE chronique_id = $chroniqueId ORDER BY debut ASC";
+
+        // Inserts them into the real 'Plage' SQL table
+        $sqlInsert = "INSERT INTO plage (id, $columns) ($sqlSelect)";
+
+        // Executes the SQL queries : DELETE first ; INSERT next
+        $connection = $this->_em->getConnection();
+
+        return [$connection->exec($sqlDelete), $connection->exec($sqlInsert)];
+    }
+
+    /**
+     * For a temporary 'Plage' SQL table, detects the date redundancies.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *      => Key   == 'chronique' numset ;
+     *      => Value == array(
+     *          -> Key   == begin date ;
+     *          -> Value == array(
+     *              'count'     => integer ; number of times this date appears
+     *              'numLines'  => string  ; contains the date line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectDateRedundancies($tableName)
+    {
+        $sql = "SELECT chronique_numset, debut, fin, count(*), array_to_string(array_agg(numline), ', ') as numlines " .
+            "FROM $tableName " .
+            'GROUP BY chronique_numset, debut, fin ' .
+            'HAVING count(*) > 1';
+
+        $sqlResults = $this->_em->getConnection()->fetchAll($sql);
+        $redundancies = [];
+
+        foreach ($sqlResults as $result) {
+            $redundancies[$result['chronique_numset']][$result['debut']] = [
+                'count'    => $result['count'],
+                'numLines' => $result['numlines'],
+            ];
+        }
+
+        return $redundancies;
+    }
+
+    /**
+     * For a temporary 'Plage' SQL table, detects the range overlaps.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *      => Key   == 'chronique' numset ;
+     *      => Value == array(
+     *          -> Value == array(
+     *              'plages'    => sting  ; overlapping ranges
+     *              'numLines'  => string  ; line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectRangeOverlaps($tableName)
+    {
+        $sql = 'SELECT DISTINCT ON (LEAST(p1.numline, p2.numline), GREATEST(p1.numline, p2.numline)) ' .
+            "p1.chronique_numset, p1.numline || ', ' || p2.numline as numlines, " .
+            "p1.debut || ' - ' || p1.fin || ', ' || p2.debut || ' - ' || p2.fin as plages " .
+            "FROM $tableName p1, $tableName p2 " .
+            'WHERE p1.chronique_numset = p2.chronique_numset ' .
+            'AND (((p1.debut, p1.fin) OVERLAPS (p2.debut, p2.fin)) OR ' .
+            '((p1.debut = p1.fin OR p2.debut = p2.fin) AND (p1.debut = p2.debut OR p1.fin = p2.fin)))' .
+            'AND p1.numline <> p2.numline ' .
+            'ORDER BY LEAST(p1.numline, p2.numline), GREATEST(p1.numline, p2.numline), p1.numline, p2.numline';
+
+        $sqlResults = $this->_em->getConnection()->fetchAll($sql);
+        $overlaps = [];
+
+        foreach ($sqlResults as $result) {
+            $overlaps[$result['chronique_numset']][] = [
+                'plages'   => $result['plages'],
+                'numLines' => $result['numlines'],
+            ];
+        }
+
+        return $overlaps;
+    }
+
+    /***************************************************************************
+     * Methods using directly Doctrine DBAL (without using the ORM layer)
+     **************************************************************************/
+
+    /**
+     * Adds a time to the dates of a 'Plage' table.
+     *
+     * @param string $time      Format : +/-hhmm (+02:00, -10:00, -04:30, +00:30...)
+     * @param string $tableName Name of the 'Mesure' table
+     *
+     * @throws \Exception
+     */
+    public function adjustDates($time, $tableName)
+    {
+        $sql = "UPDATE $tableName set debut = debut + '$time', fin = fin + '$time'";
+        $this->_em->getConnection()->exec($sql);
+    }
+
+    /**
+     * For a 'Plage' SQL table (created by createTemporaryTable() function)
+     * and by 'chronique', gets the first and last dates, and the number of measures whose :
+     *    =>    'valeur' lower  than the 'minimumValide' of the 'chronique' ;
+     *    => OR 'valeur' higher than the 'maximumValide' of the 'chronique' .
+     *
+     * Returns an array whose structure is :
+     *    => Key   == 'chronique id.' ;
+     *    => Value == array(
+     *      'first' => the first date,
+     *      'last'  => the last date,
+     *      'count' => the number of measures concerned
+     *    )
+     *
+     * @param string $tableName  Name of the 'Plage' table
+     * @param string $type       'tooSmall' or 'tooLarge'
+     * @param null   $gapQuality
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function getValuesOut($tableName, $type, $gapQuality = null)
+    {
+        // What type of check ?
+        switch ($type) {
+            case 'tooSmall':
+                $whereClause = 'valeur < (SELECT minimumValide FROM chronique WHERE id = chronique_id)';
+                break;
+            case 'tooLarge':
+                $whereClause = 'valeur > (SELECT maximumValide FROM chronique WHERE id = chronique_id)';
+                break;
+            default:
+                return [];
+        }
+
+        $sql = "SELECT chronique_id, (MIN(debut) || ' UTC') as min, (MAX(fin) || ' UTC') as max, count(*) " .
+            "FROM $tableName WHERE $whereClause GROUP BY chronique_id";
+
+        $results = $this->_em->getConnection()->fetchAll($sql);
+        $valuesOutByChronique = [];
+
+        // For each 'chronique', returns first and last dates, and number of measures concerned.
+        foreach ($results as $result) {
+            $valuesOutByChronique[$result['chronique_id']] = [
+                'first' => new \DateTime($result['min']),
+                'last'  => new \DateTime($result['max']),
+                'count' => $result['count'],
+            ];
+        }
+
+        return $valuesOutByChronique;
+    }
+
+    /**
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createSimpleQueryBuilder()
+    {
+        return parent::createQueryBuilder('m')
+            ->select(
+                "m.id, m.qualite, m.chronique, CONCAT(m.debut, ' UTC') as debut, CONCAT(m.fin, ' UTC') as fin, m.valeur, m.minimum, m.maximum"
+            );
+    }
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilderByChronique(Chronique $chronique)
+    {
+        return $this->createSimpleQueryBuilder()
+            ->select("CONCAT(m.debut, ' UTC') as debut, CONCAT(m.fin, ' UTC') as fin, m.valeur, q.id as qualite")
+            ->leftJoin('m.qualite', 'q')
+            ->where('m.chronique = ' . $chronique->getId())
+            ->orderBy('m.debut', 'ASC');
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilder($alias = 'm', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return self::createSimpleQueryBuilder();
+        }
+
+        return self::createSimpleQueryBuilder()
+            ->leftJoin($alias . '.chronique', 'ch')
+            ->leftJoin('ch.station', 'st')
+            ->leftJoin('ch.dataset', 'ds')
+            ->leftJoin('st.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Returns a QueryBuilder pre-selecting the first and last dates.
+     */
+    public function createFirstLastDates()
+    {
+        return $this->createQueryBuilder()
+            ->select("CONCAT(MIN(m.debut),' UTC') as first, CONCAT(MAX(m.fin), ' UTC') as last");
+    }
+
+    /***************************************************************************
+     * Methods using Doctrine ORM
+     **************************************************************************/
+
+    /**
+     * From a given 'chronique', retrieves all 'Plage' beetween two given dates.
+     *
+     * @param Chronique  $chronique
+     * @param string     $begin     SQL date
+     * @param string     $end       SQL date
+     * @param array|null $gapIds
+     *
+     * @return array
+     */
+    public function getMeasuresFromDates(Chronique $chronique, $begin, $end, array $gapIds = null)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique);
+
+        if ($begin) {
+            $qb->andWhere("m.debut >= '$begin'");
+        }
+        if ($end) {
+            $qb->andWhere("m.fin   <= '$end'");
+        }
+
+        return $qb->getQuery()->getArrayResult();
+    }
+
+    /**
+     * Gets the first and last dates by 'chronique'.
+     *
+     * @param int[] $chroniques 'ChroniqueDiscontinue' instances OR ids
+     *
+     * @return array Key = 'chronique' id. ; Value = array of ['first', 'last'].
+     */
+    public function getFirstLastDatesByChronique(array $chroniques)
+    {
+        // Gets id. of eventual 'ChroniqueDiscontinue' instances
+        $this->extractId($chroniques, 'Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue');
+
+        $qb = $this->createFirstLastDates()->addSelect('ch.id')->groupBy('ch.id');
+
+        // Restriction on 'chroniques'
+        if ([] !== $chroniques) {
+            $qb->andWhere($qb->expr()->in('ch.id', $chroniques));
+        }
+
+        // Puts the result in form : Key = 'chronique' id. ; Value = array of ['first', 'last']
+        $results = $qb->getQuery()->getResult();
+        $dates = [];
+
+        foreach ($results as $result) {
+            $dates[$result['id']] = [
+                'first' => $result['first'],
+                'last'  => $result['last'],
+            ];
+        }
+
+        return $dates;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFirstLastDates($chroniqueId)
+    {
+        $dates = current($this->getFirstLastDatesByChronique([$chroniqueId]));
+
+        return $dates ? [$dates['first'], $dates['last']] : [null, null];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteFromChronique($chroniqueId)
+    {
+        $this->_em->getConnection()->exec('DELETE FROM plage WHERE chronique_id = ' . $chroniqueId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function emptyChroniquePeriode(Chronique $chronique, \DateTime $beginDate, \DateTime $endDate)
+    {
+        $count = $this->_em
+            ->getConnection()
+            ->executeUpdate(
+                'DELETE FROM plage WHERE chronique_id = :id AND ' .
+                    '((fin > :begin AND debut < :end) OR (debut = fin AND (debut = :begin OR fin = :end )))',
+                [
+                    ':id'    => $chronique->getId(),
+                    ':begin' => $beginDate->format(DATE_ATOM),
+                    ':end'   => $endDate->format(DATE_ATOM),
+                ]
+            );
+
+        return ['changed' => false, 'count' => $count];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/PointControleRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/PointControleRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc2bfa2dfb3c2c6d24396824a207c96641ebd9
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/PointControleRepository.php
@@ -0,0 +1,349 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+
+/**
+ * Class PointControleRepository.
+ */
+class PointControleRepository extends EntityRepository
+{
+    /***************************************************************************
+     * Methods for the import of 'Controle'
+     **************************************************************************/
+
+    /**
+     * Creates a 'Controle' SQL table whose goal is to be temporary.
+     *
+     * @return string The SQL table name
+     */
+    public function createTemporaryTable()
+    {
+        $randomName = 'temp.tmp_controle_' . rand(1, 9999999);
+        $sql = "CREATE TABLE $randomName (
+                numline      integer NOT NULL ,
+                chronique_id integer NOT NULL ,
+                date         timestamp(3) without time zone NOT NULL ,
+                valeur       double precision,
+                qualite_id   integer,
+                minimum      double precision,
+                maximum      double precision
+        )";
+        $this->_em->getConnection()->exec($sql);
+
+        return $randomName;
+    }
+
+    /**
+     * Copies 'Controle' FROM a CSV file INTO a temporary 'Controle' SQL table.
+     *
+     * @param mixed $tableName
+     * @param mixed $csvPath
+     * @param mixed $delimiter
+     * @param mixed $null
+     */
+    public function copyIntoTemporaryTable($tableName, $csvPath, $delimiter = ';', $null = '"\\\\N"')
+    {
+        $columns = implode(',', ['numline', 'chronique_id', 'date', 'valeur', 'qualite_id', 'minimum', 'maximum']);
+        $conn = $this->_em->getConnection();
+        $pdo = $conn->getWrappedConnection();
+        $pdo->pgsqlCopyFromFile($tableName, $csvPath, $delimiter, $null, $columns);
+    }
+
+    /**
+     * For a temporary SQL table, detects the date redundancies.
+     *
+     * @param string $tableName
+     *
+     * Returns an array whose structure is :
+     *          -> Key   == date ;
+     *          -> Value == array(
+     *              'count'     => integer ; number of times this date appears
+     *              'numLines'  => string  ; contains the date line numbers
+     *          )
+     *      )
+     *
+     * @return array
+     */
+    public function detectDateRedundancies($tableName)
+    {
+        $sql = "SELECT date, count(*), array_to_string(array_agg(numline), ', ') as numlines " .
+            "FROM $tableName " .
+            'GROUP BY date ' .
+            'HAVING count(*) > 1';
+
+        $sqlResults = $this->_em->getConnection()->fetchAll($sql);
+        $redundancies = [];
+
+        foreach ($sqlResults as $result) {
+            $redundancies[$result['date']] = [
+                'count'    => $result['count'],
+                'numLines' => $result['numlines'],
+            ];
+        }
+
+        return $redundancies;
+    }
+
+    /**
+     * Imports ALL controles of a 'chronique' :
+     *    => FROM     a temporary 'Controle' SQL table ;
+     *    => TO       the real 'Controle' SQL table ;
+     *    => DELETING existing controles.
+     *
+     * @param string $tableName   Name of the temporary 'Mesure' table
+     * @param int    $chroniqueId The considered 'chronique'
+     * @param string $firstDate   Date of the first controle to import
+     * @param string $lastDate    Date of the last controle to import
+     *
+     * @return array [0] => num. of DELETE ; [1] => num. of INSERT
+     */
+    public function import($tableName, $chroniqueId)
+    {
+        // Deletes existing controles
+        $sqlDelete = "DELETE FROM pointcontrole WHERE chronique_id = $chroniqueId";
+
+        // Columns to SELECT and INSERT
+        $columns = 'chronique_id, date, valeur, qualite_id, minimum, maximum';
+
+        // Generates ids. for new controles
+        $genId = "nextval('pointcontrole_id_seq')";
+
+        // Selects ALL new controles
+        $sqlSelect = "SELECT $genId, $columns FROM $tableName " .
+            "WHERE  chronique_id = $chroniqueId ORDER BY date ASC";
+
+        // Inserts them into the real 'Controle' SQL table
+        $sqlInsert = "INSERT INTO pointcontrole (id, $columns) ($sqlSelect)";
+
+        // Executes the SQL queries : DELETE first ; INSERT next
+        $connection = $this->_em->getConnection();
+
+        return [$connection->exec($sqlDelete), $connection->exec($sqlInsert)];
+    }
+
+    /**
+     * @param $tableName
+     * @param $chroniqueId
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function importStats($tableName, $chroniqueId)
+    {
+        // Count existing controles
+        $sqlNbPointControle = "SELECT count(*) as nbPointControle FROM pointcontrole WHERE chronique_id = $chroniqueId";
+
+        // Count ALL new controles
+        $sqlNbNewPointControle = "SELECT count(*) as nbNewPointControle FROM $tableName ";
+
+        $connection = $this->_em->getConnection();
+
+        return [
+            $connection->executeQuery($sqlNbNewPointControle)->fetchColumn(),
+            $connection->executeQuery($sqlNbPointControle)->fetchColumn(),
+        ];
+    }
+
+    /**
+     * For a 'Controle' SQL table
+     * gets the first and last dates.
+     *
+     * @param string $tableName Name of the 'Controle' table
+     *
+     * Returns an array whose structure is :
+     *    => Key   == 'chronique id.' ;
+     *    => Value == array(
+     *      'first' => the first date,
+     *      'last'  => the last date
+     *    )
+     *
+     * @return array
+     */
+    public function getValuesOut($tableName)
+    {
+        $sql = "SELECT chronique_id, (MIN(date) || ' UTC') as min, (MAX(date) || ' UTC') as max, " .
+            "FROM $tableName GROUP BY chronique_id";
+
+        $results = $this->_em->getConnection()->fetchAll($sql);
+        $valuesOut = [];
+
+        // For each 'chronique', returns first and last dates, and number of controles concerned.
+        foreach ($results as $result) {
+            $valuesOut[$result['chronique_id']] = [
+                'first' => new \DateTime($result['min']),
+                'last'  => new \DateTime($result['max']),
+            ];
+        }
+
+        return $valuesOut;
+    }
+
+    /***************************************************************************
+     * Methods returning a QueryBuilder.
+     **************************************************************************/
+
+    public function createSimpleQueryBuilder()
+    {
+        return parent::createQueryBuilder('c')
+            ->select("c.id, c.chronique, CONCAT(c.date, ' UTC') as date, c.valeur, c.minimum, c.maximum");
+    }
+
+    /**
+     * @param ChroniqueContinue $chronique
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createQueryBuilderByChronique(ChroniqueContinue $chronique)
+    {
+        return $this->createSimpleQueryBuilder()
+            ->select("CONCAT(c.date, ' UTC') as date, c.valeur, c.minimum, c.maximum")
+            ->leftJoin('c.chronique', 'ch')
+            ->where('ch.id = ' . $chronique->getId())
+            ->orderBy('c.date', 'ASC');
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     */
+    public function createQueryBuilder($alias = 'c', $indexBy = null)
+    {
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return self::createSimpleQueryBuilder();
+        }
+
+        return self::createSimpleQueryBuilder()
+            ->leftJoin('c.chronique', 'ch')
+            ->leftJoin('ch.station', 'st')
+            ->leftJoin('st.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Returns a QueryBuilder pre-selecting the first and last dates.
+     */
+    public function createFirstLastDates()
+    {
+        return $this->createQueryBuilder()
+            ->select("CONCAT(MIN(c.date),' UTC') as first, CONCAT(MAX(c.date), ' UTC') as last");
+    }
+
+    /***************************************************************************
+     * Methods using Doctrine ORM
+     **************************************************************************/
+
+    /**
+     * From a given 'chronique', retrieves all 'Controle' beetween two given dates.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $begin     SQL date
+     * @param string            $end       SQL date
+     *
+     * @return array
+     */
+    public function getControlesFromDates(ChroniqueContinue $chronique, $begin, $end)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique);
+
+        if ($begin) {
+            $qb->andWhere("c.date >= '$begin'");
+        }
+        if ($end) {
+            $qb->andWhere("c.date <= '$end'");
+        }
+
+        return $qb->getQuery()->getArrayResult();
+    }
+
+    /**
+     * From a given 'chronique', retrieves the immediat previous 'Controle' to a given date.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $date      SQL date
+     *
+     * @return mixed
+     */
+    public function getPreviousControle(ChroniqueContinue $chronique, $date)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique)
+            ->andWhere("c.date < '$date'")
+            ->orderBy('c.date', 'DESC')
+            ->setMaxResults(1);
+
+        $result = $qb->getQuery()->getArrayResult();
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * From a given 'chronique', retrieves the immediat next 'Controle' to a given date.
+     *
+     * @param ChroniqueContinue $chronique
+     * @param string            $date      SQL date
+     *
+     * @return mixed
+     */
+    public function getNextControle(ChroniqueContinue $chronique, $date)
+    {
+        $qb = $this->createQueryBuilderByChronique($chronique)
+            ->andWhere("c.date > '$date'")
+            ->orderBy('c.date', 'ASC')
+            ->setMaxResults(1);
+
+        $result = $qb->getQuery()->getArrayResult();
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * @param $chronique
+     *
+     * @return array
+     */
+    public function getFirstLastDates($chronique)
+    {
+        $qb = $this->createQueryBuilder()
+            ->select("CONCAT(MIN(c.date),' UTC') as first, CONCAT(MAX(c.date), ' UTC') as last, count(c) as number")
+            ->andWhere('c.chronique =:chronique')
+            ->setParameter('chronique', $chronique);
+
+        $result = $qb->getQuery()->getResult();
+
+        return $result ? $result[0] : ['first' => null, 'last' => null, 'number' => 0];
+    }
+
+    /**
+     * @param $chronique
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     */
+    public function deleteFromChronique($chronique)
+    {
+        $this->_em->getConnection()->exec('DELETE FROM pointcontrole WHERE chronique_id = ' . $chronique->getId());
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/QualiteRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/QualiteRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..a8ee3b493f0c2400480a40b6427971c012270928
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/QualiteRepository.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class QualiteRepository.
+ */
+class QualiteRepository extends EntityRepository
+{
+    /**
+     * @return array
+     */
+    public function securedOrdresToCodes()
+    {
+        $jeu = $this->getCurrentObservatoire()->getJeu();
+        $result = $this->createQueryBuilder('q')
+            ->where('q.jeu = :jeu')
+            ->andWhere("q.code <> 'gap'")
+            ->setParameter('jeu', $jeu)
+            ->getQuery()->getResult();
+
+        $ordreToQualite = [];
+        foreach ($result as $qualite) {
+            $ordreToQualite[$qualite->getOrdre()] = $qualite->getCode();
+        }
+
+        return $ordreToQualite;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/SiteExperimentalRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/SiteExperimentalRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..3bd7c92fbfffa9b850ba7216af9997d4a042c15c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/SiteExperimentalRepository.php
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+
+/**
+ * Class SiteExperimentalRepository.
+ */
+class SiteExperimentalRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        $qb = parent::createQueryBuilder($alias, $indexBy = null);
+
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return $qb;
+        }
+
+        return $qb
+            ->where($alias . '.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'
+     * on which current user has sufficient rights.
+     *
+     * @param mixed $user
+     * @param mixed $alias
+     *
+     * @return QueryBuilder
+     */
+    public function createSecuredQueryBuilder($user, $alias = 'si')
+    {
+        $qb = $this->createQueryBuilder($alias);
+
+        if ($user instanceof Utilisateur) {
+            $rolesOnSites = $user->getRolesSite();
+            $rolesOnObs = $user->getRolesObservatoire();
+
+            $clauses = [];
+            $params = [];
+
+            if ($rolesOnSites instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnSites as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE) {
+                        $site = $role->getSite();
+                        $clauses[] = 'si = :site' . $i;
+                        $params['site' . $i++] = $site;
+                    }
+                }
+            }
+
+            //This is a little too much ; kept here only for "logic explanation"
+            //Only actual useful test would be against Observatoire::getCurrent()
+            if ($rolesOnObs instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnObs as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE) {
+                        $obs = $role->getObservatoire();
+                        $clauses[] = 'si.observatoire = :obs' . $i;
+                        $params['obs' . $i++] = $obs;
+                    }
+                }
+            }
+
+            if ([] !== $clauses) {
+                $qb = $qb->andWhere(implode(' or ', $clauses));
+                foreach ($params as $key => $param) {
+                    $qb = $qb->setParameter($key, $param);
+                }
+            } else { //No right => no site to be returned
+                $qb = $qb->andWhere('true = false');
+            }
+        } else { //No user => no site to be returned
+            $qb = $qb->andWhere('true = false');
+        }
+
+        return $qb;
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('si')->orderBy('si.slug', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * @param $user
+     *
+     * @return array
+     */
+    public function securedFindAll($user)
+    {
+        return $this->createSecuredQueryBuilder($user, 'si')->orderBy('si.slug', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * Returns the 'chroniques' number, for all 'SiteExperimental' of current 'Observatoire'.
+     *
+     * Returns an array whose structure is :
+     *      => Key   = id. of SiteExperimental ;
+     *      => Value = number of linked chroniques
+     */
+    public function countChroniquesBySite()
+    {
+        $sql = 'SELECT si.id, COUNT(ch) ' .
+            'FROM siteexperimental as si ' .
+            'LEFT OUTER JOIN stations_sites as ss ON si.id = ss.site_id ' .
+            'LEFT OUTER JOIN chronique as ch ON ch.station_id = ss.station_id ' .
+            'WHERE si.observatoire_id = ' . $this->getCurrentObservatoire()->getId() . ' ' .
+            'GROUP BY si.id';
+
+        $results = $this->_em->getConnection()->fetchAll($sql);
+
+        $countChroniques = [];
+
+        foreach ($results as $result) {
+            $countChroniques[$result['id']] = $result['count'];
+        }
+
+        return $countChroniques;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/StationRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/StationRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..f24e7a9d58db68c8aac7088d49ab4ae0a9f64df2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/StationRepository.php
@@ -0,0 +1,362 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+use Doctrine\ORM\QueryBuilder;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+
+/**
+ * Class StationRepository.
+ */
+class StationRepository extends EntityRepository
+{
+    /**
+     * Selects only entities linked to the current 'observatoire'.
+     *
+     * @param mixed      $alias
+     * @param mixed|null $indexBy
+     *
+     * @return QueryBuilder
+     */
+    public function createQueryBuilder($alias, $indexBy = null)
+    {
+        $qb = parent::createQueryBuilder($alias, $indexBy);
+
+        if (!$currentObs = $this->getCurrentObservatoire()) {
+            return $qb;
+        }
+
+        return $qb
+            ->leftJoin($alias . '.sites', 'si')
+            ->where('si.observatoire = :observatoire')
+            ->setParameter('observatoire', $currentObs);
+    }
+
+    /**
+     * Selects only entities linked to the current 'observatoire'
+     * on which current user has rights to import data.
+     *
+     * @param mixed      $user
+     * @param mixed      $alias
+     * @param mixed|null $qb
+     *
+     * @return QueryBuilder
+     */
+    public function createSecuredQueryBuilderForMesure($user, $alias = 'st', $qb = null)
+    {
+        $needSite = false;
+        if ($qb === null) {
+            $qb = $this->createQueryBuilder($alias);
+        } else {
+            $needSite = true;
+        }
+
+        if ($user instanceof Utilisateur) {
+            $rolesOnSites = $user->getRolesSite();
+            $rolesOnObs = $user->getRolesObservatoire();
+
+            $clauses = [];
+            $params = [];
+
+            if ($rolesOnSites instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnSites as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE || $role->getValeur() === Role::CONTRIBUTEUR) {
+                        $site = $role->getSite();
+                        $clauses[] = 'si = :site' . $i;
+                        $params['site' . $i++] = $site;
+                    }
+                }
+            }
+
+            //This is a little too much ; kept here only for "logic explanation"
+            //Only actual useful test would be against Observatoire::getCurrent()
+            if ($rolesOnObs instanceof \Traversable) {
+                $i = 0;
+                foreach ($rolesOnObs as $role) {
+                    if ($role->getValeur() === Role::GESTIONNAIRE) {
+                        $obs = $role->getObservatoire();
+                        $clauses[] = 'si.observatoire = :obs' . $i;
+                        $params['obs' . $i++] = $obs;
+                    }
+                }
+            }
+
+            if ([] !== $clauses) {
+                if ($needSite) {
+                    $qb = $qb->leftJoin($alias . '.sites', 'si');
+                }
+                $qb = $qb->andWhere(implode(' or ', $clauses));
+                foreach ($params as $key => $param) {
+                    $qb = $qb->setParameter($key, $param);
+                }
+            } else { //No right => no station to be returned
+                $qb = $qb->andWhere('true = false');
+            }
+        } else { //No user => no station to be returned
+            $qb = $qb->andWhere('true = false');
+        }
+
+        $qb->orderBy('st.nom', 'ASC');
+
+        return $qb;
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('st')->orderBy('st.nom', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * @param $user
+     *
+     * @return array
+     */
+    public function securedFindAllForMesure($user)
+    {
+        return $this->createSecuredQueryBuilderForMesure($user, 'st')->orderBy('st.nom', 'ASC')->getQuery()->getResult();
+    }
+
+    /**
+     * @param string $code
+     *
+     * @throws \Exception
+     *
+     * @return Station
+     */
+    public function findOneByCode($code)
+    {
+        return $this->createQueryBuilder('st')
+            ->andWhere('st.code = :code')->setParameter('code', $code)
+            ->getQuery()
+            ->getSingleResult();
+    }
+
+    /**
+     * Gets the first and last dates by 'chronique', for a given 'station'.
+     *
+     * @param Station $station
+     *
+     * @return array Key = 'chronique' id. ; Value = array of ['first', 'last'].
+     */
+    public function getFirstLastDatesByChronique(Station $station)
+    {
+        // First and last dates by 'chronique', only for 'ChroniqueContinue'
+        $qbMesure = $this->getBdohRepo('Mesure')
+            ->createFirstLastDates()
+            ->addSelect('ch.id')->groupBy('ch.id')
+            ->andWhere('st.id = :station')->setParameter('station', $station);
+
+        $datesMesure = $qbMesure->getQuery()->getResult();
+
+        // First and last dates by 'chronique', only for 'ChroniqueDiscontinue'
+        $qbPlage = $this->getBdohRepo('Plage')
+            ->createFirstLastDates()
+            ->addSelect('ch.id')->groupBy('ch.id')
+            ->andWhere('st.id = :station')->setParameter('station', $station);
+
+        $datesPlage = $qbPlage->getQuery()->getResult();
+
+        // Puts the result in form : Key = 'chronique' id. ; Value = array of ['first', 'last']
+        $results = array_merge($datesMesure, $datesPlage);
+        $dates = [];
+
+        foreach ($results as $result) {
+            $dates[$result['id']] = [
+                'first' => $result['first'],
+                'last'  => $result['last'],
+            ];
+        }
+
+        return $dates;
+    }
+
+    /**
+     * @param $station
+     *
+     * @throws \Doctrine\ORM\OptimisticLockException
+     */
+    public function updatePosition($station)
+    {
+        if ($station instanceof Station) {
+            if ($station->getLatitude() !== null && $station->getLongitude() !== null) {
+                $station->setPoint(
+                    'SRID=' . Station::SRID . ';POINT(' . $station->getLatitude() . ' ' . $station->getLongitude() . ')'
+                );
+            } else {
+                $station->setLatitude(null);
+                $station->setLongitude(null);
+                $station->setPoint(null);
+            }
+            $this->_em->persist($station);
+            $this->_em->flush();
+        }
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @return array
+     */
+    public function getDataFromShapeTable($tableName)
+    {
+        try {
+            // récupération des stations de l'observatoire courant
+            $allStations = $this->findAll();
+            $allStationsCodes = [];
+            $allStationsGeoCodes = [];
+            foreach ($allStations as $station) {
+                /* @var Station $station */
+                $allStationsCodes[] = $station->getCode();
+                if ($station->getPoint() !== null) {
+                    $allStationsGeoCodes[] = $station->getCode();
+                }
+            }
+
+            // requêtes d'analyse des stations importées dans la table temporaire crée par shp2pgsql
+
+            // requête de base
+            $baseQuery =
+                "SELECT UPPER(code) AS code, ST_X(ST_GeometryN(geom, 1)) AS latitude, ST_Y(ST_GeometryN(geom, 1)) AS longitude
+                FROM $tableName";
+            $baseCodeOk = ' AND code IS NOT NULL';
+            $baseOrderBy = ' ORDER BY code ASC';
+
+            // requête sur les station existantes SANS position géographique
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $stationsQuery = $baseQuery;
+            if ($allStationsCodes !== []) {
+                $stationsQuery .= ' WHERE UPPER(code) IN (?)';
+                $sqlParamsArray[] = $allStationsCodes;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+                if ($allStationsGeoCodes !== []) {
+                    $stationsQuery .= ' AND UPPER(code) NOT IN (?)';
+                    $sqlParamsArray[] = $allStationsGeoCodes;
+                    $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+                }
+            } else {
+                $stationsQuery .= ' WHERE FALSE';
+            }
+            $stationsQuery .= $baseCodeOk . $baseOrderBy;
+            $stations = $this->_em->getConnection()->fetchAll($stationsQuery, $sqlParamsArray, $sqlTypesArray);
+
+            // requête sur les station existantes AVEC position géographique
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $stationsGeoQuery = $baseQuery;
+            if ($allStationsGeoCodes !== []) {
+                $stationsGeoQuery .= ' WHERE UPPER(code) IN (?)';
+                $sqlParamsArray[] = $allStationsGeoCodes;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $stationsGeoQuery .= ' WHERE FALSE';
+            }
+            $stationsGeoQuery .= $baseCodeOk . $baseOrderBy;
+            $stationsGeo = $this->_em->getConnection()->fetchAll($stationsGeoQuery, $sqlParamsArray, $sqlTypesArray);
+
+            // requête sur les station inexistantes
+            $sqlParamsArray = [];
+            $sqlTypesArray = [];
+            $stationsNopeQuery = $baseQuery;
+            if ($allStationsCodes !== []) {
+                $stationsNopeQuery .= ' WHERE UPPER(code) NOT IN (?)';
+                $sqlParamsArray[] = $allStationsCodes;
+                $sqlTypesArray[] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
+            } else {
+                $stationsNopeQuery .= ' WHERE TRUE';
+            }
+            $stationsNopeQuery .= $baseCodeOk . $baseOrderBy;
+            $stationsNope = $this->_em->getConnection()->fetchAll($stationsNopeQuery, $sqlParamsArray, $sqlTypesArray);
+        } catch (\Exception $e) {
+            $this->dropTemporaryShapeTable($tableName);
+
+            return ['error' => 'station'];
+        }
+
+        return [
+            'cible'                    => 'station',
+            'existingWithData'         => $stationsGeo,
+            'countExistingWithData'    => count($stationsGeo),
+            'existingWithoutData'      => $stations,
+            'countExistingWithoutData' => count($stations),
+            'nonExisting'              => $stationsNope,
+            'countNonExisting'         => count($stationsNope),
+        ];
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeKeepExistingImport($tableName)
+    {
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requêtes de mise à jour des stations de l'observatoire courant SANS position géographique uniquement
+        // et à partir des stations importées dans la table temporaire crée par shp2pgsql
+        $updateQuery = <<<SQL
+UPDATE station st SET point = ST_GeometryN(t.geom, 1), latitude=ST_X(ST_GeometryN(t.geom, 1)), longitude=ST_Y(ST_GeometryN(t.geom, 1))
+FROM $tableName t, stations_sites ss, siteexperimental si
+WHERE UPPER(t.code)=st.code AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId AND st.point IS NULL
+SQL;
+
+        $inserts = $this->_em->getConnection()->executeUpdate($updateQuery);
+
+        return [$inserts, 0];
+    }
+
+    /**
+     * @param string $tableName
+     *
+     * @throws \Doctrine\DBAL\DBALException
+     *
+     * @return array
+     */
+    public function shapeOverwriteExistingImport($tableName)
+    {
+        // récupération de l'id de l'observatoire courant
+        $currentObsId = $this->getCurrentObservatoire()->getId();
+
+        // requêtes de mise à jour des stations de l'observatoire courant AVEC et SANS position géographique
+        // et à partir des stations importées dans la table temporaire crée par shp2pgsql
+        $updateQuery = <<<SQL
+UPDATE station st SET point = ST_GeometryN(t.geom, 1), latitude=ST_X(ST_GeometryN(t.geom, 1)), longitude=ST_Y(ST_GeometryN(t.geom, 1))
+FROM $tableName t, stations_sites ss, siteexperimental si
+WHERE UPPER(t.code)=st.code AND st.id = ss.station_id AND ss.site_id = si.id AND si.observatoire_id = $currentObsId AND st.point IS NOT NULL
+SQL;
+
+        // faire l'update avant l'insert sinon le résultat est faussé
+        $updates = $this->_em->getConnection()->executeUpdate($updateQuery);
+
+        return [$this->shapeKeepExistingImport($tableName)[0], $updates];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/TheiaCategoriesRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/TheiaCategoriesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..36392d4b0abe956f6459c02b6a3c71e7fe24b7ad
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/TheiaCategoriesRepository.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+class TheiaCategoriesRepository extends EntityRepository
+{
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createQueryBuilder('tc')->getQuery()->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/TypeParametreRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/TypeParametreRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef0a4b5006a08d91ac07b30784a46bada3766d01
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/TypeParametreRepository.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * TypeParametreRepository.
+ */
+class TypeParametreRepository extends EntityRepository
+{
+    /**
+     * Returns all 'TypeParametre' entities that are linked with the given unite.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Unite $unite
+     *
+     * @return array
+     */
+    public function findByUnite($unite)
+    {
+        return $this->createQueryBuilder('p')
+            ->leftJoin('p.unites', 'u')
+            ->where('u = :unite')
+            ->setParameter('unite', $unite)
+            ->getQuery()
+            ->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Repository/UniteRepository.php b/src/Irstea/BdohDataBundle/Entity/Repository/UniteRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..0da42537c267e7d5db9dddf69682324683973c38
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Repository/UniteRepository.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity\Repository;
+
+/**
+ * Class UniteRepository.
+ */
+class UniteRepository extends EntityRepository
+{
+    /**
+     * @param string $alias
+     * @param null   $indexBy
+     *
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function createOrderedQueryBuilder($alias = 'u', $indexBy = null)
+    {
+        return parent::createQueryBuilder($alias, $indexBy)->orderBy($alias . '.libelle', 'ASC');
+    }
+
+    /**
+     * @return array
+     */
+    public function findAll()
+    {
+        return $this->createOrderedQueryBuilder()->getQuery()->getResult();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/SiteExperimental.php b/src/Irstea/BdohDataBundle/Entity/SiteExperimental.php
new file mode 100644
index 0000000000000000000000000000000000000000..19c1592d9859c81e3703dd94d2737d77d3d0a3d9
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/SiteExperimental.php
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Irstea\BdohDataBundle\Entity\SiteExperimental.
+ *
+ * @UniqueEntity(fields="slug", message="SiteExperimental.slug.alreadyExists")
+ */
+class SiteExperimental implements SiteRelatedInterface
+{
+    use SiteRelatedTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $slug;
+
+    /**
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * @var string
+     */
+    protected $descriptionEn;
+
+    /**
+     * @var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * @var Collection
+     */
+    protected $stations;
+
+    /**
+     * SiteExperimental constructor.
+     */
+    public function __construct()
+    {
+        $this->stations = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->setSlug($nom);
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set slug.
+     *
+     * @param string $slug
+     */
+    public function setSlug($slug)
+    {
+        $this->slug = IrsteaBdohDataBundle::slugify($slug);
+    }
+
+    /**
+     * Get slug.
+     *
+     * @return string
+     */
+    public function getSlug()
+    {
+        return $this->slug;
+    }
+
+    /**
+     * Set description.
+     *
+     * @param string $description
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * Get description.
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Set descriptionEn.
+     *
+     * @param string $descriptionEn
+     */
+    public function setDescriptionEn($descriptionEn)
+    {
+        $this->descriptionEn = $descriptionEn;
+    }
+
+    /**
+     * Get descriptionEn.
+     *
+     * @return string
+     */
+    public function getDescriptionEn()
+    {
+        return $this->descriptionEn;
+    }
+
+    /**
+     * Set observatoire.
+     *
+     * @param Observatoire $observatoire
+     */
+    public function setObservatoire(Observatoire $observatoire)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * Add stations.
+     *
+     * @param Station $stations
+     */
+    public function addStation(Station $stations)
+    {
+        $this->stations[] = $stations;
+    }
+
+    /**
+     * Remove stations.
+     *
+     * @param Station $stations
+     */
+    public function removeStation(Station $stations)
+    {
+        $this->stations->removeElement($stations);
+    }
+
+    /**
+     * Set stations.
+     *
+     * @param Collection $stations
+     */
+    public function setStations(Collection $stations)
+    {
+        $this->stations = $stations;
+    }
+
+    /**
+     * Get stations.
+     *
+     * @return Collection
+     */
+    public function getStations()
+    {
+        return $this->stations;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSites()
+    {
+        return [$this];
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/SiteRelatedInterface.php b/src/Irstea/BdohDataBundle/Entity/SiteRelatedInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2428cecbe3f43e1462946a316c5c250df794edd
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/SiteRelatedInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Interface SiteRelatedInterface.
+ */
+interface SiteRelatedInterface extends ObservatoireRelatedInterface
+{
+    /**
+     * @return SiteExperimental[]
+     */
+    public function getSites();
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/SiteRelatedTrait.php b/src/Irstea/BdohDataBundle/Entity/SiteRelatedTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..e48fc76faa860887ded6ca52125878c239900fd5
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/SiteRelatedTrait.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Trait SiteRelatedTrait.
+ */
+trait SiteRelatedTrait
+{
+    /**
+     * @return SiteExperimental[]|Collection
+     */
+    abstract public function getSites();
+
+    /**
+     * @return Observatoire|null
+     */
+    public function getObservatoire()
+    {
+        $sites = $this->getSites();
+        if ($sites instanceof Collection) {
+            return $sites->isEmpty() ? null : $sites->first()->getObservatoire();
+        }
+
+        return empty($sites) ? null : $sites[0]->getObservatoire();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Station.php b/src/Irstea/BdohDataBundle/Entity/Station.php
new file mode 100644
index 0000000000000000000000000000000000000000..6084f564860ab660847893031ea9d9ac1e3b0964
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Station.php
@@ -0,0 +1,560 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * @UniqueEntity(fields="nom",  message="Station.nom.alreadyExists")
+ * @UniqueEntity(fields="code", message="Station.code.alreadyExists")
+ */
+class Station implements SiteRelatedInterface
+{
+    use SiteRelatedTrait;
+
+    /**
+     * Some constants to retrieve a specific alternative code.
+     */
+    const ALT_CODE_SEPARATOR = ';';
+
+    const ALT_CODE_KEYVALUE_SEPARATOR = '=';
+
+    public const SRID = '2154'; // RGF93 / Lambert-93 -- France
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $code;
+
+    /**
+     * @var string
+     */
+    protected $codeAlternatif;
+
+    /**
+     * @var float
+     */
+    protected $altitude;
+
+    /**
+     * @var bool
+     */
+    protected $estActive = true;
+
+    /**
+     * @var string
+     */
+    protected $commentaire;
+
+    /**
+     * @var string
+     */
+    protected $commentaireEn;
+
+    /**
+     * @var Commune
+     */
+    protected $commune;
+
+    /**
+     * @var Collection
+     * @Assert\Count(min=1)
+     */
+    protected $sites;
+
+    /**
+     * @var Collection
+     */
+    protected $chroniques;
+
+    /*
+     * @var string
+     */
+    /**
+     * @var
+     */
+    protected $point;
+
+    /*
+     * @var float
+     */
+    /**
+     * @var
+     */
+    protected $latitude;
+
+    /*
+     * @var float
+     */
+    /**
+     * @var
+     */
+    protected $longitude;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->sites = new ArrayCollection();
+        $this->chroniques = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return Station
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set code.
+     *
+     * @param string $code
+     *
+     * @return Station
+     */
+    public function setCode($code)
+    {
+        $this->code = IrsteaBdohDataBundle::slugify($code);
+
+        return $this;
+    }
+
+    /**
+     * Get code.
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * Set altitude.
+     *
+     * @param float $altitude
+     *
+     * @return Station
+     */
+    public function setAltitude($altitude)
+    {
+        $this->altitude = $altitude;
+
+        return $this;
+    }
+
+    /**
+     * Get altitude.
+     *
+     * @return float
+     */
+    public function getAltitude()
+    {
+        return $this->altitude;
+    }
+
+    /**
+     * Set estActive.
+     *
+     * @param bool $estActive
+     *
+     * @return Station
+     */
+    public function setEstActive($estActive)
+    {
+        $this->estActive = $estActive;
+
+        return $this;
+    }
+
+    /**
+     * Get estActive.
+     *
+     * @return bool
+     */
+    public function getEstActive()
+    {
+        return $this->estActive;
+    }
+
+    /**
+     * Set commentaire.
+     *
+     * @param string $commentaire
+     *
+     * @return Station
+     */
+    public function setCommentaire($commentaire)
+    {
+        $this->commentaire = $commentaire;
+
+        return $this;
+    }
+
+    /**
+     * Get commentaire.
+     *
+     * @return string
+     */
+    public function getCommentaire()
+    {
+        return $this->commentaire;
+    }
+
+    /**
+     * @return string
+     */
+    public function getCommentaireEn()
+    {
+        return $this->commentaireEn;
+    }
+
+    /**
+     * @param string $commentaireEn
+     *
+     * @return Station
+     */
+    public function setCommentaireEn($commentaireEn)
+    {
+        $this->commentaireEn = $commentaireEn;
+
+        return $this;
+    }
+
+    /**
+     * Set commune.
+     *
+     * @param Commune|null $commune
+     *
+     * @return Station
+     */
+    public function setCommune(Commune $commune = null)
+    {
+        $this->commune = $commune;
+
+        return $this;
+    }
+
+    /**
+     * Get commune.
+     *
+     * @return Commune
+     */
+    public function getCommune()
+    {
+        return $this->commune;
+    }
+
+    /**
+     * Add site.
+     *
+     * @param SiteExperimental $site
+     *
+     * @return Station
+     */
+    public function addSite(SiteExperimental $site)
+    {
+        $this->sites[] = $site;
+        $this->validateSites();
+
+        return $this;
+    }
+
+    /**
+     * Remove sites.
+     *
+     * @param SiteExperimental $sites
+     */
+    public function removeSite(SiteExperimental $sites)
+    {
+        $this->sites->removeElement($sites);
+    }
+
+    /**
+     * Set sites.
+     *
+     * @param Collection $sites
+     *
+     * @return Station
+     */
+    public function setSites(Collection $sites)
+    {
+        $this->sites = $sites;
+        $this->validateSites();
+
+        return $this;
+    }
+
+    /**
+     * Valide que les sites sont dans le même observatoire.
+     */
+    private function validateSites()
+    {
+        if ($this->sites->isEmpty()) {
+            return;
+        }
+        /** @var Observatoire $obs */
+        $obs = $this->getObservatoire();
+        /** @var SiteExperimental $site */
+        foreach ($this->sites as $site) {
+            if ($obs->getId() !== $site->getObservatoire()->getId()) {
+                throw new \InvalidArgumentException('Cannot assign a station to sites from different observatories');
+            }
+        }
+    }
+
+    /**
+     * Get sites.
+     *
+     * @return Collection|SiteExperimental[]
+     */
+    public function getSites()
+    {
+        return $this->sites;
+    }
+
+    /**
+     * Set codeAlternatif.
+     *
+     * @param string $codeAlternatif
+     *
+     * @return Station
+     */
+    public function setCodeAlternatif($codeAlternatif)
+    {
+        $this->codeAlternatif = $codeAlternatif;
+
+        return $this;
+    }
+
+    /**
+     * Get codeAlternatif.
+     *
+     * @return string
+     */
+    public function getCodeAlternatif()
+    {
+        return $this->codeAlternatif;
+    }
+
+    /**
+     * @return float
+     */
+    public function getLatitude()
+    {
+        return $this->latitude;
+    }
+
+    /**
+     * @param float $latitude
+     *
+     * @return self
+     */
+    public function setLatitude($latitude)
+    {
+        $this->latitude = $latitude;
+
+        return $this;
+    }
+
+    /**
+     * @return float
+     */
+    public function getLongitude()
+    {
+        return $this->longitude;
+    }
+
+    /**
+     * @param $longitude
+     *
+     * @return self
+     */
+    public function setLongitude($longitude)
+    {
+        $this->longitude = $longitude;
+
+        return $this;
+    }
+
+    /**
+     * Gets one specific 'CodeAlternative'.
+     * If several codes have the same key, returns the last.
+     * If no code found for this key, returns null.
+     *
+     * @param string $key Key of the code to retrieve
+     *
+     * @return string|null
+     */
+    public function getOneCodeAlternatif($key)
+    {
+        if ($this->getCodeAlternatif()) {
+            foreach (\explode(self::ALT_CODE_SEPARATOR, $this->getCodeAlternatif()) as $subCode) {
+                $keyAndValue = \explode(self::ALT_CODE_KEYVALUE_SEPARATOR, $subCode);
+                if (\sizeof($keyAndValue) > 1 && \strtolower(\trim($keyAndValue[0])) === $key) {
+                    return \trim($keyAndValue[1]);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * To string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+
+    /**
+     * Add sites.
+     *
+     * @param SiteExperimental $sites
+     *
+     * @return self
+     */
+    public function addSiteExperimental(SiteExperimental $sites)
+    {
+        $this->sites[] = $sites;
+
+        return $this;
+    }
+
+    /**
+     * Add chronique.
+     *
+     * @param Chronique $chronique
+     *
+     * @return self
+     */
+    public function addChronique(Chronique $chronique)
+    {
+        $this->chroniques[] = $chronique;
+
+        return $this;
+    }
+
+    /**
+     * Remove chroniques.
+     *
+     * @param Chronique $chroniques
+     *
+     * @return self
+     */
+    public function removeChronique(Chronique $chroniques)
+    {
+        $this->chroniques->removeElement($chroniques);
+
+        return $this;
+    }
+
+    /**
+     * Set chroniques.
+     *
+     * @param Collection $chroniques
+     *
+     * @return self
+     */
+    public function setChroniques(Collection $chroniques)
+    {
+        $this->chroniques = $chroniques;
+
+        return $this;
+    }
+
+    /**
+     * Get chroniques.
+     *
+     * @return Collection
+     */
+    public function getChroniques()
+    {
+        return $this->chroniques;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPoint()
+    {
+        return $this->point;
+    }
+
+    /**
+     * @param string $point
+     *
+     * @return self
+     */
+    public function setPoint($point)
+    {
+        $this->point = $point;
+
+        return $this;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/TauxRemplissage.php b/src/Irstea/BdohDataBundle/Entity/TauxRemplissage.php
new file mode 100644
index 0000000000000000000000000000000000000000..e57ca0d5c31e60a9c0e92e5100f951579bd7589f
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/TauxRemplissage.php
@@ -0,0 +1,198 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+/**
+ * Class TauxRemplissage.
+ */
+class TauxRemplissage implements ChroniqueRelatedInterface
+{
+    use ChroniqueRelatedTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var datetimems
+     */
+    protected $debut;
+
+    /**
+     * @var datetimems
+     */
+    protected $fin;
+
+    /**
+     * @var float
+     */
+    protected $taux;
+
+    /**
+     * @var float
+     */
+    protected $poids;
+
+    /**
+     * @var ChroniqueContinue
+     */
+    protected $chronique;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set debut.
+     *
+     * @param datetimems $debut
+     *
+     * @return TauxRemplissage
+     */
+    public function setDebut($debut)
+    {
+        $this->debut = $debut;
+
+        return $this;
+    }
+
+    /**
+     * Get debut.
+     *
+     * @return datetimems
+     */
+    public function getDebut()
+    {
+        return $this->debut;
+    }
+
+    /**
+     * Set fin.
+     *
+     * @param datetimems $fin
+     *
+     * @return TauxRemplissage
+     */
+    public function setFin($fin)
+    {
+        $this->fin = $fin;
+
+        return $this;
+    }
+
+    /**
+     * Get fin.
+     *
+     * @return datetimems
+     */
+    public function getFin()
+    {
+        return $this->fin;
+    }
+
+    /**
+     * Set taux.
+     *
+     * @param float $taux
+     *
+     * @return TauxRemplissage
+     */
+    public function setTaux($taux)
+    {
+        $this->taux = $taux;
+
+        return $this;
+    }
+
+    /**
+     * Get taux.
+     *
+     * @return float
+     */
+    public function getTaux()
+    {
+        return $this->taux;
+    }
+
+    /**
+     * Set poids.
+     *
+     * @param float $poids
+     *
+     * @return TauxRemplissage
+     */
+    public function setPoids($poids)
+    {
+        $this->poids = $poids;
+
+        return $this;
+    }
+
+    /**
+     * Get poids.
+     *
+     * @return float
+     */
+    public function getPoids()
+    {
+        return $this->poids;
+    }
+
+    /**
+     * Set chronique.
+     *
+     * @param ChroniqueContinue $chronique
+     *
+     * @return TauxRemplissage
+     */
+    public function setChronique(ChroniqueContinue $chronique = null)
+    {
+        $this->chronique = $chronique;
+
+        return $this;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return ChroniqueContinue
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->taux . '%';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/TheiaCategories.php b/src/Irstea/BdohDataBundle/Entity/TheiaCategories.php
new file mode 100644
index 0000000000000000000000000000000000000000..1218f0e91f143a8e9ea4c4ae4fcea65479ab714b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/TheiaCategories.php
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class TheiaCategories
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var FamilleParametres
+     */
+    protected $familleParametre;
+
+    /**
+     * @var Milieu
+     */
+    protected $milieu;
+
+    /**
+     * @var string[]
+     */
+    protected $uriOzcarTheia = [];
+
+    //-----------------getter et settter--------------------------------------------------------------
+
+    /**
+     * @return int
+     */
+    public function getId(): int
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getNom(): ?string
+    {
+        return $this->nom = $this->getMilieu() . ' / ' . $this->getFamilleParametre();
+    }
+
+    /**
+     * @param string $nom
+     */
+    public function setNom(string $nom)
+    {
+        $this->nom = $this->getMilieu() . ' / ' . $this->getFamilleParametre();
+    }
+
+    /**
+     * @return FamilleParametres|null
+     */
+    public function getFamilleParametre(): ?FamilleParametres
+    {
+        return $this->familleParametre;
+    }
+
+    /**
+     * @param FamilleParametres $familleParametre
+     */
+    public function setFamilleParametre(FamilleParametres $familleParametre): void
+    {
+        $this->familleParametre = $familleParametre;
+    }
+
+    /**
+     * @return Milieu|null
+     */
+    public function getMilieu(): ?Milieu
+    {
+        return $this->milieu;
+    }
+
+    /**
+     * @param Milieu $milieu
+     */
+    public function setMilieu(Milieu $milieu): void
+    {
+        $this->milieu = $milieu;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getUriOzcarTheia(): array
+    {
+        return $this->uriOzcarTheia;
+    }
+
+    /**
+     * @param string[] $uriOzcarTheia
+     */
+    public function setUriOzcarTheia(array $uriOzcarTheia): void
+    {
+        $this->uriOzcarTheia = $uriOzcarTheia;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/TopicCategory.php b/src/Irstea/BdohDataBundle/Entity/TopicCategory.php
new file mode 100644
index 0000000000000000000000000000000000000000..f01cc17c1de5ceba4e0c174269e2f3649a973e7c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/TopicCategory.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class TopicCategory
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Transformation.php b/src/Irstea/BdohDataBundle/Entity/Transformation.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c8a95ae367df42b60b6c8cf38a409c81df5cbbd
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Transformation.php
@@ -0,0 +1,180 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+/**
+ * Class Transformation.
+ */
+class Transformation implements ChroniqueRelatedInterface
+{
+    use ChroniqueRelatedTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var JeuBareme|null
+     */
+    protected $jeuBaremeActuel;
+
+    /**
+     * @var Collection|JeuBareme[]
+     */
+    protected $jeuBaremesHistoriques;
+
+    /**
+     * @var ChroniqueContinue|null
+     */
+    private $entree;
+
+    /**
+     * @var ChroniqueCalculee|null
+     */
+    private $sortie;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->jeuBaremesHistoriques = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set jeuBaremeActuel.
+     *
+     * @param JeuBareme|null $jeuBaremeActuel
+     *
+     * @return Transformation
+     */
+    public function setJeuBaremeActuel(JeuBareme $jeuBaremeActuel = null)
+    {
+        $this->jeuBaremeActuel = $jeuBaremeActuel;
+
+        return $this;
+    }
+
+    /**
+     * Get jeuBaremeActuel.
+     *
+     * @return JeuBareme|null
+     */
+    public function getJeuBaremeActuel()
+    {
+        return $this->jeuBaremeActuel;
+    }
+
+    /**
+     * Add jeuBaremesHistoriques.
+     *
+     * @param JeuBareme $jeuBaremesHistoriques
+     *
+     * @return Transformation
+     */
+    public function addJeuBaremesHistorique(JeuBareme $jeuBaremesHistoriques)
+    {
+        $this->jeuBaremesHistoriques[] = $jeuBaremesHistoriques;
+
+        return $this;
+    }
+
+    /**
+     * Get jeuBaremesHistoriques.
+     *
+     * @return Collection|JeuBareme[]
+     */
+    public function getJeuBaremesHistoriques()
+    {
+        return $this->jeuBaremesHistoriques;
+    }
+
+    /**
+     * Set entree.
+     *
+     * @param ChroniqueContinue|null $entree
+     *
+     * @return Transformation
+     */
+    public function setEntree(ChroniqueContinue $entree = null)
+    {
+        $this->entree = $entree;
+
+        return $this;
+    }
+
+    /**
+     * Get entree.
+     *
+     * @return ChroniqueContinue|null
+     */
+    public function getEntree()
+    {
+        return $this->entree;
+    }
+
+    /**
+     * Set sortie.
+     *
+     * @param ChroniqueCalculee|null $sortie
+     *
+     * @return Transformation
+     */
+    public function setSortie($sortie = null)
+    {
+        $this->sortie = $sortie;
+
+        return $this;
+    }
+
+    /**
+     * Get sortie.
+     *
+     * @return ChroniqueCalculee|null
+     */
+    public function getSortie()
+    {
+        return $this->sortie;
+    }
+
+    /**
+     * @return Chronique
+     */
+    public function getChronique()
+    {
+        return $this->getSortie();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/TypeFunding.php b/src/Irstea/BdohDataBundle/Entity/TypeFunding.php
new file mode 100644
index 0000000000000000000000000000000000000000..8304b77b1531f698c64da04a1ffd8cb5d85650c2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/TypeFunding.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+class TypeFunding
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+    //--------------------getter et setter
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @param $id
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * @param $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/TypeParametre.php b/src/Irstea/BdohDataBundle/Entity/TypeParametre.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ceb3286ad0c4302ddf40250da077484333994de
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/TypeParametre.php
@@ -0,0 +1,276 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ *TypeParametre.
+ *
+ * @UniqueEntity(fields="nom")
+ * @UniqueEntity(fields="nomEn")
+ */
+class TypeParametre
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     */
+    protected $nomEn;
+
+    /**
+     * @var string
+     */
+    protected $code;
+
+    /**
+     * @var FamilleParametres
+     */
+    protected $familleParametres;
+
+    /**
+     * @var Collection
+     */
+    protected $unites;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->unites = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     *
+     * @return TypeParametre
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+
+        return $this;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set nomEn.
+     *
+     * @param string $nomEn
+     *
+     * @return TypeParametre
+     */
+    public function setNomEn($nomEn)
+    {
+        $this->nomEn = $nomEn;
+
+        return $this;
+    }
+
+    /**
+     * Get nomEn.
+     *
+     * @return string
+     */
+    public function getNomEn()
+    {
+        return $this->nomEn;
+    }
+
+    /**
+     * Set code.
+     *
+     * @param string $code
+     *
+     * @return TypeParametre
+     */
+    public function setCode($code)
+    {
+        $this->code = $code;
+
+        return $this;
+    }
+
+    /**
+     * Get code.
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * Set familleParametres.
+     *
+     * @param FamilleParametres $familleParametres
+     *
+     * @return TypeParametre
+     */
+    public function setFamilleParametres($familleParametres)
+    {
+        $this->familleParametres = $familleParametres;
+
+        return $this;
+    }
+
+    /**
+     * Get familleParametres.
+     *
+     * @return FamilleParametres
+     */
+    public function getFamilleParametres()
+    {
+        return $this->familleParametres;
+    }
+
+    /**
+     * Add unites.
+     *
+     * @param Unite $unites
+     *
+     * @return TypeParametre
+     */
+    public function addUnite(Unite $unites)
+    {
+        $this->unites[] = $unites;
+
+        return $this;
+    }
+
+    /**
+     * Remove unites.
+     *
+     * @param Unite $unites
+     */
+    public function removeUnite(Unite $unites)
+    {
+        $this->unites->removeElement($unites);
+    }
+
+    /**
+     * Set unites.
+     *
+     * @param Collection $unites
+     *
+     * @return TypeParametre
+     */
+    public function setUnites(Collection $unites)
+    {
+        $this->unites = $unites;
+
+        return $this;
+    }
+
+    /**
+     * Get unites.
+     *
+     * @return Collection
+     */
+    public function getUnites()
+    {
+        return $this->unites;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getNom() ?: '';
+    }
+
+    /**
+     * @var Collection
+     */
+    protected $chroniques;
+
+    /**
+     * Add chroniques.
+     *
+     * @param Chronique $chroniques
+     *
+     * @return TypeParametre
+     */
+    public function addChronique(Chronique $chroniques)
+    {
+        $this->chroniques[] = $chroniques;
+
+        return $this;
+    }
+
+    /**
+     * Remove chroniques.
+     *
+     * @param Chronique $chroniques
+     */
+    public function removeChronique(Chronique $chroniques)
+    {
+        $this->chroniques->removeElement($chroniques);
+    }
+
+    /**
+     * Get chroniques.
+     *
+     * @return Collection
+     */
+    public function getChroniques()
+    {
+        return $this->chroniques;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Entity/Unite.php b/src/Irstea/BdohDataBundle/Entity/Unite.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae2c7957154636bc83a08043e7f5f1b8bdbf23d7
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Entity/Unite.php
@@ -0,0 +1,174 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Unite.
+ *
+ * @UniqueEntity(fields="libelle")
+ */
+class Unite
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $libelle;
+
+    /**
+     * @var string
+     */
+    protected $libelleEn;
+
+    /**
+     * @var Collection
+     */
+    protected $parametres;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->parametres = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set libelle.
+     *
+     * @param string $libelle
+     *
+     * @return Unite
+     */
+    public function setLibelle($libelle)
+    {
+        $this->libelle = $libelle;
+
+        return $this;
+    }
+
+    /**
+     * Get libelle.
+     *
+     * @return string
+     */
+    public function getLibelle()
+    {
+        return $this->libelle;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLibelleEn()
+    {
+        return $this->libelleEn;
+    }
+
+    /**
+     * @param string $libelleEn
+     *
+     * @return Unite
+     */
+    public function setLibelleEn($libelleEn)
+    {
+        $this->libelleEn = $libelleEn;
+
+        return $this;
+    }
+
+    /**
+     * Add parametres.
+     *
+     * @param TypeParametre $parametres
+     *
+     * @return Unite
+     */
+    public function addParametre(TypeParametre $parametres)
+    {
+        $this->parametres[] = $parametres;
+
+        return $this;
+    }
+
+    /**
+     * Remove parametres.
+     *
+     * @param TypeParametre $parametres
+     */
+    public function removeParametre(TypeParametre $parametres)
+    {
+        $this->parametres->removeElement($parametres);
+    }
+
+    /**
+     * Set parametres.
+     *
+     * @param Collection $parametres
+     *
+     * @return Unite
+     */
+    public function setParametres(Collection $parametres)
+    {
+        $this->parametres = $parametres;
+
+        return $this;
+    }
+
+    /**
+     * Get parametres.
+     *
+     * @return Collection
+     */
+    public function getParametres()
+    {
+        return $this->parametres;
+    }
+
+    /**
+     * To String.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getLibelle() ?: '';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/EventListener/ChronicleListener.php b/src/Irstea/BdohDataBundle/EventListener/ChronicleListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..b531ac5b2aaa5ef97a7deb6c730846ce517c527b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/EventListener/ChronicleListener.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\EventListener;
+
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Events as BdohEvents;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+/**
+ * Class ChronicleListener.
+ *
+ * @DI\Service()
+ */
+class ChronicleListener
+{
+    /**
+     * @var JobManagerInterface
+     */
+    private $jobManager;
+
+    /**
+     * @var RegistryInterface
+     */
+    private $doctrine;
+
+    /**
+     * ChronicleListener constructor.
+     *
+     * @param JobManagerInterface $jobManager
+     * @param RegistryInterface   $doctrine
+     * @DI\InjectParams({
+     *  "jobManager"=@DI\Inject("irstea_bdoh.job_manager"),
+     *  "doctrine"=@DI\Inject("doctrine")
+     * })
+     */
+    public function __construct(JobManagerInterface $jobManager, RegistryInterface $doctrine)
+    {
+        $this->jobManager = $jobManager;
+        $this->doctrine = $doctrine;
+    }
+
+    /**
+     * @param MeasuresUpdateEvent $event
+     * @DI\Observe(BdohEvents::MEASURES_UPDATE)
+     */
+    public function onMeasuresUpdate(MeasuresUpdateEvent $event)
+    {
+        if (!$event->doesPropagate()) {
+            return;
+        }
+
+        $chronique = $event->getChronique();
+
+        // gestion des chroniques filles ayant 2 fois la même mère -> ne lance le calcul qu'une fois
+        $sorties = [];
+        foreach ($chronique->getTransformations() as $transfo) {
+            if (!in_array($transfo->getSortie(), $sorties)) {
+                $sorties[] = $transfo->getSortie();
+                if ($transfo->getSortie()->isCalculee()) {
+                    $this->jobManager->enqueueChronicleComputation($transfo->getSortie(), $event->getUser(), true);
+                }
+                if ($transfo->getSortie()->isConvertie()) {
+                    $this->jobManager->enqueueChronicleConversion($transfo->getSortie(), $event->getUser(), true);
+                }
+            }
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/EventListener/FillingRateListener.php b/src/Irstea/BdohDataBundle/EventListener/FillingRateListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..5043a2a1ca17c2d707ff1a6c4733d9579e628d97
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/EventListener/FillingRateListener.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\EventListener;
+
+use Irstea\BdohBundle\Manager\JobManagerInterface;
+use Irstea\BdohDataBundle\Events as BdohEvents;
+use JMS\DiExtraBundle\Annotation as DI;
+
+/**
+ * Class FillingRateListener.
+ *
+ * @DI\Service()
+ */
+class FillingRateListener
+{
+    /**
+     * @var JobManagerInterface
+     *
+     * @DI\Inject("irstea_bdoh.job_manager")
+     */
+    public $jobManager;
+
+    /**
+     * @param MeasuresUpdateEvent $event
+     *
+     * @DI\Observe(BdohEvents::MEASURES_UPDATE)
+     */
+    public function onMeasuresUpdate(MeasuresUpdateEvent $event)
+    {
+        $chronique = $event->getChronique();
+        if ($chronique->isContinue()) {
+            $this->jobManager->enqueueComputeFillingRates(
+                $chronique,
+                $event->getDebut(),
+                $event->getFin()
+            );
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/EventListener/MeasuresMetadataListener.php b/src/Irstea/BdohDataBundle/EventListener/MeasuresMetadataListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..74e2c90c5f516e31e705c9323a10a464d4f8090d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/EventListener/MeasuresMetadataListener.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\EventListener;
+
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Events as BdohEvents;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+/**
+ * Class MeasuresMetadataListener.
+ *
+ * @DI\Service()
+ */
+class MeasuresMetadataListener
+{
+    /**
+     * @var RegistryInterface
+     *
+     * @DI\Inject("doctrine")
+     */
+    public $doctrine;
+
+    /**
+     * @param MeasuresUpdateEvent $event
+     *
+     * @DI\Observe(BdohEvents::MEASURES_UPDATE)
+     */
+    public function onMeasuresUpdate(MeasuresUpdateEvent $event)
+    {
+        $chronique = $event->getChronique();
+
+        /** @var ChroniqueRepository $repo */
+        $repo = $this->doctrine
+            ->getEntityManagerForClass(get_class($chronique))
+            ->getRepository(get_class($chronique));
+
+        $repo->updateMeasuresMetadata($chronique);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/EventListener/MeasuresUpdateEvent.php b/src/Irstea/BdohDataBundle/EventListener/MeasuresUpdateEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..0151f84a9c4768ec5863c8ef05a40a5258315e94
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/EventListener/MeasuresUpdateEvent.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\EventListener;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * {@inheritdoc}
+ */
+class MeasuresUpdateEvent extends Event
+{
+    /**
+     * @var Chronique
+     */
+    private $chronique;
+
+    /**
+     * @var Utilisateur
+     */
+    private $user;
+
+    /**
+     * @var \DateTime|null
+     */
+    private $debut;
+
+    /**
+     * @var \DateTime|null
+     */
+    private $fin;
+
+    /**
+     * @var bool
+     */
+    private $propagate;
+
+    /**
+     * MeasuresUpdateEvent constructor.
+     *
+     * @param Chronique   $chronique
+     * @param Utilisateur $user
+     * @param \DateTime   $debut
+     * @param \DateTime   $fin
+     * @param bool        $propagate
+     */
+    public function __construct(Chronique $chronique, Utilisateur $user, \DateTime $debut = null, \DateTime $fin = null, $propagate = false)
+    {
+        $this->chronique = $chronique;
+        $this->user = $user;
+        $this->debut = $debut;
+        $this->fin = $fin;
+        $this->propagate = $propagate;
+    }
+
+    /** Get chronique.
+     * @return Chronique
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /** Get user.
+     * @return Utilisateur
+     */
+    public function getUser()
+    {
+        return $this->user;
+    }
+
+    /** Get debut.
+     * @return \DateTime
+     */
+    public function getDebut()
+    {
+        return $this->debut;
+    }
+
+    /** Get fin.
+     * @return \DateTime
+     */
+    public function getFin()
+    {
+        return $this->fin;
+    }
+
+    /** Get propagate.
+     * @return bool
+     */
+    public function doesPropagate()
+    {
+        return $this->propagate;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Events.php b/src/Irstea/BdohDataBundle/Events.php
new file mode 100644
index 0000000000000000000000000000000000000000..4905b9ff6b86f88c0aca6bc1f54c3f343a25fda7
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Events.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle;
+
+final class Events
+{
+    const MEASURES_UPDATE = 'bdoh.measures_update';
+
+    private function __construct()
+    {
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Exception/StopExportException.php b/src/Irstea/BdohDataBundle/Exporter/Exception/StopExportException.php
new file mode 100644
index 0000000000000000000000000000000000000000..91a760291fdb3c8b79038875d2d7cb6fe500d3c5
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Exception/StopExportException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Exception;
+
+class StopExportException extends \Exception
+{
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownExtractorException.php b/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownExtractorException.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3b53129086f87e78025eb3f04ed2d67ea7fa633
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownExtractorException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Exception;
+
+class UnknownExtractorException extends \Exception
+{
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownFormatException.php b/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownFormatException.php
new file mode 100644
index 0000000000000000000000000000000000000000..fee2870d404762bc405e9c9d8140fd188e9db774
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Exception/UnknownFormatException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Exception;
+
+class UnknownFormatException extends \Exception
+{
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ConsoleArchiver.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ConsoleArchiver.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5cb64e0da64084a6a8e5338af50c004345df0c7
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ConsoleArchiver.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Archiver;
+
+use Irstea\BdohDataBundle\Exporter\Measure\ArchiverInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ConsoleArchiver implements ArchiverInterface
+{
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+
+    /**
+     * ConsoleArchiver constructor.
+     *
+     * @param OutputInterface $output
+     */
+    public function __construct(OutputInterface $output)
+    {
+        $this->output = $output;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addFile($path, $name = null)
+    {
+        if ($name === null) {
+            $name = basename($path);
+        }
+        if (substr($name, strlen($name) - 4) === '.pdf') {
+            $this->output->writeln("\n<info># Ignoring $name</info>\n");
+
+            return;
+        }
+        $this->output->writeln("\n<info># Printing $name from $path</info>\n");
+        $handle = fopen($path, 'rb');
+        try {
+            while ($line = fgets($handle)) {
+                $this->output->write($line);
+            }
+        } finally {
+            fclose($handle);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArchivePath()
+    {
+        return '/dev/null';
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ZipArchiver.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ZipArchiver.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b7e801bd18fc59b680d3f802654949a44ad4ca6
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Archiver/ZipArchiver.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Archiver;
+
+use Irstea\BdohDataBundle\Exporter\Measure\ArchiverInterface;
+use RuntimeException;
+
+class ZipArchiver implements ArchiverInterface
+{
+    /**
+     * @var string
+     */
+    private $filePath;
+
+    /**
+     * @var \ZipArchive
+     */
+    private $archive;
+
+    /**
+     * ZipArchiver constructor.
+     *
+     * @param string $filePath
+     */
+    public function __construct($filePath = null)
+    {
+        $this->filePath = $filePath ?: tempnam(sys_get_temp_dir(), 'bdoh-archive-');
+        @unlink($this->filePath);
+
+        $this->archive = new \ZipArchive();
+
+        $error = $this->archive->open($this->filePath, \ZipArchive::CREATE | \ZipArchive::EXCL);
+        if (true !== $error) {
+            throw new RuntimeException(sprintf('%s: %d', $this->filePath, $error));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addFile($path, $name = null)
+    {
+        if ($name === null) {
+            $name = basename($path);
+        }
+        if (!$this->archive->addFile($path, $name)) {
+            throw new RuntimeException(
+                sprintf('Adding %s (%s) to %s: %s', $path, $name, $this->filePath, $this->archive->getStatusString())
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->archive->close();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArchivePath()
+    {
+        return $this->filePath;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/ArchiverInterface.php b/src/Irstea/BdohDataBundle/Exporter/Measure/ArchiverInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f6037dbfbb1c57faea8179ceb9679e51ab22be5
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/ArchiverInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+interface ArchiverInterface
+{
+    /**
+     * @param string      $path
+     * @param string|null $name
+     */
+    public function addFile($path, $name = null);
+
+    public function close();
+
+    /**
+     * @return string
+     */
+    public function getArchivePath();
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Exporter.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Exporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a25dbc839012249225785bf48661c278b683f81
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Exporter.php
@@ -0,0 +1,243 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+class Exporter implements ExporterInterface
+{
+    /**
+     * @var ExtractorInterface
+     */
+    private $extractor;
+
+    /**
+     * @var ReporterInterface
+     */
+    private $reporter;
+
+    /**
+     * @var ArchiverInterface
+     */
+    private $archiver;
+
+    /**
+     * @var string[]
+     */
+    private $tempFiles = [];
+
+    /**
+     * @var string
+     */
+    private $documentBasePath;
+
+    /**
+     * @var string
+     */
+    private $defaultTosPath;
+
+    /**
+     * @var string
+     */
+    private $formatDocPath;
+
+    /** Set extractor.
+     * @param ExtractorInterface $extractor
+     *
+     * @return self
+     */
+    public function setExtractor($extractor)
+    {
+        $this->extractor = $extractor;
+
+        return $this;
+    }
+
+    /** Set reporter.
+     * @param ReporterInterface $reporter
+     *
+     * @return self
+     */
+    public function setReporter($reporter)
+    {
+        $this->reporter = $reporter;
+
+        return $this;
+    }
+
+    /** Set archiver.
+     * @param ArchiverInterface $archiver
+     *
+     * @return self
+     */
+    public function setArchiver($archiver)
+    {
+        $this->archiver = $archiver;
+
+        return $this;
+    }
+
+    /** Set documentBasePath.
+     * @param string $documentBasePath
+     *
+     * @return self
+     */
+    public function setDocumentBasePath($documentBasePath)
+    {
+        $this->documentBasePath = $documentBasePath;
+
+        return $this;
+    }
+
+    /** Set defaultTosPath.
+     * @param string $defaultTosPath
+     *
+     * @return self
+     */
+    public function setDefaultTosPath($defaultTosPath)
+    {
+        $this->defaultTosPath = $defaultTosPath;
+
+        return $this;
+    }
+
+    /** Set formatDocPath.
+     * @param string $formatDocPath
+     *
+     * @return self
+     */
+    public function setFormatDocPath($formatDocPath)
+    {
+        $this->formatDocPath = $formatDocPath;
+
+        return $this;
+    }
+
+    public function __destruct()
+    {
+        foreach ($this->tempFiles as $file) {
+            @unlink($file);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function export(array $chroniques)
+    {
+        /** @var Observatoire $observatoire */
+        $observatoire = $chroniques[0]->getObservatoire();
+
+        $this->addTermsOfUse($observatoire);
+
+        $this->addExportDoc();
+
+        foreach ($chroniques as $chronique) {
+            $this->addMeasures($chronique);
+        }
+
+        $this->addReport();
+
+        $this->archiver->close();
+    }
+
+    /**
+     * @param Observatoire $observatoire
+     */
+    private function addTermsOfUse(Observatoire $observatoire)
+    {
+        $observtoryTosPath = $observatoire->getConditionsUtilisation();
+        $this->archiver->addFile(
+            $this->documentBasePath . DIRECTORY_SEPARATOR . ($observtoryTosPath ?: $this->defaultTosPath)
+        );
+    }
+
+    private function addExportDoc()
+    {
+        $this->archiver->addFile($this->documentBasePath . DIRECTORY_SEPARATOR . $this->formatDocPath);
+    }
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return bool
+     */
+    private function addMeasures(Chronique $chronique)
+    {
+        $filename = sprintf('%s_%s.txt', $chronique->getStation()->getCode(), $chronique->getCode());
+
+        return $this->generateFile(
+            $filename,
+            function ($output) use ($chronique, $filename) {
+                try {
+                    $report = $this->extractor->extract($chronique, $output);
+                    $report['filename'] = $filename;
+                } catch (\Exception $ex) {
+                    $report = ['number' => 0, 'error' => $ex->getMessage()];
+                }
+                $this->reporter->addChronique($chronique, $report);
+
+                return $report['number'] > 0;
+            }
+        );
+    }
+
+    /**
+     * @return bool
+     */
+    private function addReport()
+    {
+        return $this->generateFile(
+            'Report.txt',
+            function ($output) {
+                $this->reporter->writeTo($output);
+
+                return true;
+            }
+        );
+    }
+
+    /**
+     * @param string   $name
+     * @param callable $callback
+     *
+     * @return bool
+     */
+    private function generateFile($name, callable $callback)
+    {
+        $path = tempnam(sys_get_temp_dir(), 'bdoh-exporter-');
+        $this->tempFiles[] = $path;
+
+        $handle = fopen($path, 'wb');
+        try {
+            $success = $callback($handle);
+        } finally {
+            fclose($handle);
+        }
+        if ($success) {
+            $this->archiver->addFile($path, $name);
+        }
+
+        return $success;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterBuilder.php b/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a3a00402a3f6ee486ddb4c4f70ef05643d8abf0
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterBuilder.php
@@ -0,0 +1,188 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+use Irstea\BdohDataBundle\Entity\JeuQualite;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Exporter\Measure\Extractor\Factory as ExtractorFactory;
+use Irstea\BdohDataBundle\Exporter\Measure\Formatter\Factory as FormatterFactory;
+use Irstea\BdohDataBundle\Exporter\Measure\Reporter\LoggerDecorator;
+use Irstea\BdohDataBundle\Exporter\Measure\Reporter\Twig;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+use Irstea\BdohLoggerBundle\Logger\BdohLogger;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Bridge\Twig\TwigEngine;
+
+/**
+ * Class ExporterBuilder.
+ *
+ * @DI\Service("irstea_bdoh.export.builder")
+ */
+class ExporterBuilder
+{
+    /**
+     * @var FormatterFactory
+     *
+     * @DI\Inject("irstea_bdoh.export.formatter.factory")
+     */
+    public $formatterFactory;
+
+    /**
+     * @var ExtractorFactory
+     *
+     * @DI\Inject("irstea_bdoh.export.extractor.factory")
+     */
+    public $extractorFactory;
+
+    /**
+     * @var TwigEngine
+     *
+     * @DI\Inject("templating")
+     */
+    public $twigEngine;
+
+    /**
+     * @var BdohLogger
+     * @DI\Inject("irstea_bdoh_logger.logger")
+     */
+    public $bdohLogger;
+
+    /**
+     * @var RegistryInterface
+     *
+     * @DI\Inject
+     */
+    public $doctrine;
+
+    /**
+     * @var string
+     * @DI\Inject("%irstea_bdoh_data.measure_export.document_base_path%")
+     */
+    public $documentBasePath;
+
+    /**
+     * @var string
+     * @DI\Inject("%irstea_bdoh_data.measure_export.formats_export_file%")
+     */
+    public $formatDocPath;
+
+    /**
+     * @var string
+     * @DI\Inject("%irstea_bdoh_data.measure_export.default_termofuses_file%")
+     */
+    public $defaultTosPath;
+
+    /**
+     * @param array $parameters
+     *
+     * @return ExporterInterface
+     */
+    public function getExporter(array $parameters, ArchiverInterface $archiver)
+    {
+        $formatter = $this->createFormatter($parameters['format'], $parameters['observatoire']);
+        $extractor = $this->createExtractor($parameters['extractor'], $formatter, $parameters);
+        $reporter = $this->createReporter($parameters);
+
+        return $this->createExporter($extractor, $reporter, $archiver);
+    }
+
+    /**
+     * @param string       $format
+     * @param Observatoire $observatoire
+     *
+     * @return FormatterInterface
+     */
+    private function createFormatter($format, Observatoire $observatoire)
+    {
+        $formatter = $this->formatterFactory->create($format);
+        $formatter->setJeuToJeu($this->createJeuToJeu($observatoire, $formatter));
+
+        return $formatter;
+    }
+
+    /**
+     * @param FormatterInterface $formatter
+     *
+     * @return JeuToJeu
+     */
+    private function createJeuToJeu(Observatoire $observatoire, FormatterInterface $formatter)
+    {
+        $manager = $this->doctrine->getEntityManagerForClass(JeuQualite::class);
+
+        $jeuObservatoire = $observatoire->getJeu()->getNom();
+        $jeuFormatter = $formatter->resolveJeuQualite($jeuObservatoire);
+
+        return new JeuToJeu($manager, $jeuObservatoire, $jeuFormatter);
+    }
+
+    /**
+     * @param string             $type
+     * @param FormatterInterface $formatter
+     * @param array              $parameters
+     *
+     * @return ExtractorInterface
+     */
+    private function createExtractor($type, FormatterInterface $formatter, array $parameters)
+    {
+        return $this->extractorFactory->create($type, $formatter, $parameters);
+    }
+
+    /**
+     * @param array $parameters
+     *
+     * @return ReporterInterface
+     */
+    private function createReporter(array $parameters)
+    {
+        $reporter = new Twig($this->twigEngine);
+        if (isset($parameters['user'])) {
+            $reporter = new LoggerDecorator($this->bdohLogger, $reporter);
+        }
+        $reporter->addParameters($parameters);
+
+        return $reporter;
+    }
+
+    /**
+     * @param ExtractorInterface $extractor
+     * @param ReporterInterface  $reporter
+     * @param ArchiverInterface  $archiver
+     *
+     * @return ExporterInterface
+     */
+    private function createExporter(
+        ExtractorInterface $extractor,
+        ReporterInterface $reporter,
+        ArchiverInterface $archiver
+    ) {
+        $exporter = new Exporter();
+
+        return $exporter
+            ->setExtractor($extractor)
+            ->setReporter($reporter)
+            ->setArchiver($archiver)
+            ->setFormatDocPath($this->formatDocPath)
+            ->setDocumentBasePath($this->documentBasePath)
+            ->setDefaultTosPath($this->defaultTosPath);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterInterface.php b/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..45189d6cee2e7b77289c51162786de4d25433bb8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/ExporterInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+interface ExporterInterface
+{
+    /**
+     * @param array $chroniques
+     */
+    public function export(array $chroniques);
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/AbstractExtractor.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/AbstractExtractor.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a4904710bbb51a9d311f698b9b6e0e213f4842d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/AbstractExtractor.php
@@ -0,0 +1,162 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Exporter\Measure\ExtractorInterface;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+abstract class AbstractExtractor implements ExtractorInterface
+{
+    /**
+     * @var RegistryInterface
+     */
+    private $doctrine;
+
+    /**
+     * @var FormatterInterface
+     */
+    protected $formatter;
+
+    /**
+     * @var \DateTime
+     */
+    protected $begin;
+
+    /**
+     * @var \DateTime
+     */
+    protected $end;
+
+    /**
+     * @var \DateTimeZone
+     */
+    protected $timezone;
+
+    /**
+     * @var array
+     */
+    protected $report;
+
+    /**
+     * @var int
+     */
+    protected $precision;
+
+    /**
+     * AbstractExtractor constructor.
+     *
+     * @param RegistryInterface  $doctrine
+     * @param FormatterInterface $formatter
+     * @param array              $parameters
+     */
+    public function __construct(RegistryInterface $doctrine, FormatterInterface $formatter, array $parameters)
+    {
+        $this->doctrine = $doctrine;
+
+        assert($this->supportsFormatter($formatter));
+        $this->formatter = $formatter;
+
+        $this->begin = $parameters['begin'];
+        $this->end = $parameters['end'];
+        $this->timezone = $parameters['timezone'];
+        $this->precision = $parameters['precision'] ?? 3;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function extract(Chronique $chronique, $output)
+    {
+        assert($this->supportsChronique($chronique));
+
+        /** @var ChroniqueRepository $repo */
+        $repo = $this->doctrine->getRepository(get_class($chronique));
+
+        $this->report = [
+            'isRange'    => !$chronique->isContinue(),
+            'isContinue' => $chronique->isContinue(),
+            'isComputed' => $chronique->isCalculee(),
+            'timezone'   => $this->timezone,
+            'unite'      => $this->getUnite($chronique),
+        ];
+
+        list($measures, $report) = $this->extractMeasures($repo, $chronique);
+
+        $this->report = array_merge($this->report, $report);
+
+        $this->formatter->start($chronique, $output, $this->report);
+
+        foreach ($measures as $measure) {
+            $this->writeMeasure($measure);
+        }
+
+        $formatterReport = $this->formatter->done();
+
+        return array_merge($this->report, $formatterReport);
+    }
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return string
+     */
+    protected function getUnite(Chronique $chronique)
+    {
+        return $chronique->getUnite();
+    }
+
+    /**
+     * @param ChroniqueRepository $repo
+     * @param Chronique           $chronique
+     *
+     * @return array
+     */
+    abstract protected function extractMeasures(ChroniqueRepository $repo, Chronique $chronique);
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function writeMeasure(array $measure)
+    {
+        $this->formatter->writeMeasure(
+            $measure['debut'] ?? $measure['date'],
+            $measure['fin'] ?? null,
+            $this->formatNumber($measure['valeur']),
+            $measure['qualite'],
+            isset($measure['minimum']) ? $this->formatNumber($measure['minimum']) : null,
+            isset($measure['maximum']) ? $this->formatNumber($measure['maximum']) : null
+        );
+    }
+
+    /**
+     * @param mixed $value
+     *
+     * @return string
+     */
+    private function formatNumber($value)
+    {
+        return is_numeric($value) ? number_format($value, $this->precision, '.', '') : null;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Cumulative.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Cumulative.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9b29307df0d72b766f09a1e47aa12f5fe2ee4ef
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Cumulative.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+
+class Cumulative extends Mean
+{
+    /**
+     * @param Chronique $chronique
+     *
+     * @return string
+     */
+    protected function getUnite(Chronique $chronique)
+    {
+        /* @var ChroniqueContinue $chronique */
+        return $chronique->getUniteCumul();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doExtractMeasure(ChroniqueContinueRepository $repo, ChroniqueContinue $chronique)
+    {
+        return $repo->getDataChangeStepCumulative(
+            $chronique,
+            $this->begin,
+            $this->end,
+            $this->timestep,
+            $this->timezone
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Factory.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Factory.php
new file mode 100644
index 0000000000000000000000000000000000000000..dad7f1a45b879838469c9c644898991884d03229
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Factory.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Exporter\Exception\UnknownExtractorException;
+use Irstea\BdohDataBundle\Exporter\Measure\ExtractorInterface;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+/**
+ * Class Factory.
+ *
+ * @DI\Service("irstea_bdoh.export.extractor.factory")
+ */
+class Factory
+{
+    /**
+     * @var RegistryInterface
+     *
+     * @DI\Inject("doctrine")
+     */
+    public $doctrine;
+
+    /**
+     * @var string[]
+     */
+    private static $classes = [
+        'identical'     => Identical::class,
+        'instantaneous' => Instantaneous::class,
+        'mean'          => Mean::class,
+        'cumulative'    => Cumulative::class,
+    ];
+
+    /**
+     * @param $extraction
+     * @param FormatterInterface $formatter
+     * @param array              $parameters
+     *
+     * @throws UnknownExtractorException
+     *
+     * @return ExtractorInterface
+     */
+    public function create($extraction, FormatterInterface $formatter, array $parameters)
+    {
+        $class = self::$classes[$extraction];
+        if (!$class) {
+            throw new UnknownExtractorException($extraction);
+        }
+
+        return new $class($this->doctrine, $formatter, $parameters);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Identical.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Identical.php
new file mode 100644
index 0000000000000000000000000000000000000000..057e6ed35b73231c39c88086473f520f0efb48ad
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Identical.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+
+class Identical extends AbstractExtractor
+{
+    /**
+     * @param Chronique $chronique
+     *
+     * @return bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameters)
+     */
+    public function supportsChronique(Chronique $chronique)
+    {
+        return true;
+    }
+
+    /**
+     * @param FormatterInterface $formatter
+     *
+     * @return bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameters)
+     */
+    public function supportsFormatter(FormatterInterface $formatter)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function extractMeasures(ChroniqueRepository $repo, Chronique $chronique)
+    {
+        return $repo->getMeasuresForExport(
+            $chronique,
+            $this->begin,
+            $this->end,
+            $this->timezone
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Instantaneous.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Instantaneous.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ba5c50e79896c51eb5f33a0d83cac96d2a3529b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Instantaneous.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+class Instantaneous extends Identical
+{
+    /**
+     * @var int
+     */
+    protected $timestep;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(RegistryInterface $doctrine, FormatterInterface $formatter, array $parameters)
+    {
+        parent::__construct($doctrine, $formatter, $parameters);
+        $this->timestep = $parameters['timestep'];
+    }
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameters)
+     */
+    public function supportsChronique(Chronique $chronique)
+    {
+        return $chronique->isContinue();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function extractMeasures(ChroniqueRepository $repo, Chronique $chronique)
+    {
+        assert($repo instanceof ChroniqueContinueRepository);
+        assert($chronique instanceof ChroniqueContinue);
+
+        /* @var ChroniqueContinueRepository $repo */
+        return $repo->getDataChangeStepInstant(
+            $chronique,
+            $this->begin,
+            $this->end,
+            $this->timestep,
+            $this->timezone
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Mean.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Mean.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a90c860fec03fcdf67588f5fd9ac0d73d462573
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Extractor/Mean.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Extractor;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+class Mean extends AbstractExtractor
+{
+    /**
+     * @var PasEchantillonnage
+     */
+    protected $timestep;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(RegistryInterface $doctrine, FormatterInterface $formatter, array $parameters)
+    {
+        parent::__construct($doctrine, $formatter, $parameters);
+        $this->timestep = $parameters['timestep'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsChronique(Chronique $chronique)
+    {
+        return $chronique->isContinue();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsFormatter(FormatterInterface $formatter)
+    {
+        return $formatter->supportsRange();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function extractMeasures(ChroniqueRepository $repo, Chronique $chronique)
+    {
+        assert($repo instanceof ChroniqueContinueRepository);
+        assert($chronique instanceof ChroniqueContinue);
+
+        $result = $this->doExtractMeasure($repo, $chronique);
+        $result[1]['isRange'] = true;
+
+        return $result;
+    }
+
+    /**
+     * @param ChroniqueContinueRepository $repo
+     * @param ChroniqueContinue           $chronique
+     *
+     * @return array
+     */
+    protected function doExtractMeasure(ChroniqueContinueRepository $repo, ChroniqueContinue $chronique)
+    {
+        /* @var ChroniqueContinueRepository $repo */
+        return $repo->getDataChangeStepMean(
+            $chronique,
+            $this->begin,
+            $this->end,
+            $this->timestep,
+            $this->timezone
+        );
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/ExtractorInterface.php b/src/Irstea/BdohDataBundle/Exporter/Measure/ExtractorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..20c0202718a6359aec1fe0d79af016dd6996028b
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/ExtractorInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+
+interface ExtractorInterface
+{
+    /**
+     * @param Chronique $chronique
+     * @param resource  $output
+     *
+     * @return array
+     */
+    public function extract(Chronique $chronique, $output);
+
+    /**
+     * @param Chronique $chronique
+     *
+     * @return bool
+     */
+    public function supportsChronique(Chronique $chronique);
+
+    /**
+     * @param FormatterInterface $formatter
+     *
+     * @return bool
+     */
+    public function supportsFormatter(FormatterInterface $formatter);
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/AbstractFormatter.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/AbstractFormatter.php
new file mode 100644
index 0000000000000000000000000000000000000000..e18630b0cd93dfc2f090cdf2738e040645aa0b31
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/AbstractFormatter.php
@@ -0,0 +1,165 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Formatter;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+
+abstract class AbstractFormatter implements FormatterInterface
+{
+    /**
+     * @var
+     */
+    private $file;
+
+    /**
+     * @var JeuToJeu
+     */
+    protected $jeuToJeu;
+
+    /**
+     * @var Chronique
+     */
+    protected $chronique;
+
+    /**
+     * @var array
+     */
+    protected $extractorReport;
+
+    /**
+     * @var int
+     */
+    protected $lineCount;
+
+    /**
+     * @var int
+     */
+    protected $measureCount;
+
+    /**
+     * @var int
+     */
+    protected $gapCount;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start(Chronique $chronique, $resource, array $extractorReport)
+    {
+        $this->chronique = $chronique;
+        $this->file = $resource;
+        $this->extractorReport = $extractorReport;
+        $this->lineCount = 0;
+        $this->gapCount = 0;
+        $this->measureCount = 0;
+
+        $this->writeHeader();
+    }
+
+    protected function writeHeader()
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeMeasure($debut, $fin, $valeur, $qualite, $minimum = null, $maximum = null)
+    {
+        if ($valeur === null || $this->jeuToJeu->isGapType($qualite)) {
+            $this->writeGap($debut, $fin);
+            ++$this->gapCount;
+
+            return;
+        }
+
+        $qualite = $this->jeuToJeu->codeToCode($qualite);
+        $this->doWriteMeasure($debut, $fin, $valeur, $qualite, $minimum, $maximum);
+        ++$this->measureCount;
+    }
+
+    /**
+     * @param string      $debut
+     * @param string|null $fin
+     * @param float       $valeur
+     * @param string      $qualite
+     * @param float null  $minimum
+     * @param float       $maximum
+     */
+    abstract protected function doWriteMeasure($debut, $fin, $valeur, $qualite, $minimum = null, $maximum = null);
+
+    /**
+     * @param string      $debut
+     * @param string|null $fin
+     */
+    abstract protected function writeGap($debut, $fin);
+
+    /**
+     * {@inheritdoc}
+     */
+    public function done()
+    {
+        $this->writeFooter();
+
+        return [
+            'count' => [
+                'lines'    => $this->lineCount,
+                'gaps'     => $this->gapCount,
+                'measures' => $this->measureCount,
+            ],
+        ];
+    }
+
+    protected function writeFooter()
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setJeuToJeu(JeuToJeu $jeuToJeu)
+    {
+        $this->jeuToJeu = $jeuToJeu;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function resolveJeuQualite($default)
+    {
+        return $default;
+    }
+
+    /**
+     * @param string[] $values
+     *
+     * @return self
+     */
+    protected function writeCsv(...$values)
+    {
+        fwrite($this->file, implode(';', $values) . "\n");
+        ++$this->lineCount;
+
+        return $this;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Bdoh.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Bdoh.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9d5603359cd1c1992a35ae3ce10e56b0bb08a53
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Bdoh.php
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Formatter;
+
+use Irstea\BdohBundle\DataTransformer\FromDateTimeMsTransformer;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+
+/**
+ * Class Bdoh.
+ */
+class Bdoh extends AbstractFormatter
+{
+    const GAP_VALUE = -9999;
+
+    /**
+     * @var string
+     */
+    private $gapCode;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsRange()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setJeuToJeu(JeuToJeu $jeuToJeu)
+    {
+        parent::setJeuToJeu($jeuToJeu);
+        $this->gapCode = $this->jeuToJeu->getDefaultGapQualite() ?
+            $this->jeuToJeu->getDefaultGapQualite()->getCode() : '';
+    }
+
+    protected function writeHeader()
+    {
+        $this->writeCsv('Station', 'Fuseau', 'Chronique', 'Unite');
+
+        /** @var \DateTimeZone $timeZone */
+        $timeZone = $this->extractorReport['timezone'];
+
+        $this->writeCsv(
+            $this->chronique->getStation()->getCode(),
+            sprintf('UTC%+03d', $timeZone->getOffset(new \DateTime('00:00:00Z')) / 3600),
+            $this->chronique->getCode(),
+            $this->extractorReport['unite']
+        );
+
+        if ($this->extractorReport['isRange']) {
+            $this->writeCsv('Debut', 'Fin', 'Valeur', 'Qualite', 'Min', 'Max');
+        } else {
+            $this->writeCsv('DateHeure', 'Valeur', 'Qualite', 'Min', 'Max');
+        }
+    }
+
+    /**
+     * @param string      $debut
+     * @param string|null $fin
+     * @param float       $valeur
+     * @param string      $qualite
+     * @param null        $minimum
+     * @param null        $maximum
+     *
+     * @SuppressWarnings(PHPMD.StaticAccess)
+     */
+    protected function doWriteMeasure($debut, $fin, $valeur, $qualite, $minimum = null, $maximum = null)
+    {
+        $line = [FromDateTimeMsTransformer::toFrenchDateTimeMs($debut)];
+        if ($fin !== null) {
+            $line[] = FromDateTimeMsTransformer::toFrenchDateTimeMs($fin);
+        }
+        $line[] = $valeur;
+        $line[] = $qualite;
+        $line[] = $minimum !== null ? $minimum : '';
+        $line[] = $maximum !== null ? $maximum : '';
+
+        $this->writeCsv(...$line);
+    }
+
+    /**
+     * @param string      $debut
+     * @param string|null $fin
+     */
+    protected function writeGap($debut, $fin)
+    {
+        $this->doWriteMeasure($debut, $fin, self::GAP_VALUE, $this->gapCode);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Factory.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Factory.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf6c1a8495ab149204d149d1b6bbc6c3984ffe42
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Factory.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Formatter;
+
+use Irstea\BdohDataBundle\Exporter\Exception\UnknownFormatException;
+use Irstea\BdohDataBundle\Exporter\Measure\FormatterInterface;
+use JMS\DiExtraBundle\Annotation as DI;
+
+/**
+ * Class Factory.
+ *
+ * @DI\Service("irstea_bdoh.export.formatter.factory")
+ */
+class Factory
+{
+    /**
+     * @var array
+     */
+    private static $classes = [
+        'bdoh'      => Bdoh::class,
+        'qtvar'     => Qtvar::class,
+    ];
+
+    /**
+     * @param $format
+     *
+     * @return FormatterInterface
+     */
+    public function create($format)
+    {
+        $class = self::$classes[$format];
+        if (!$class) {
+            throw new UnknownFormatException($format);
+        }
+
+        return new $class();
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Qtvar.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Qtvar.php
new file mode 100644
index 0000000000000000000000000000000000000000..1511007ba124333c75f50dc5fe8cccc51d8019fa
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Formatter/Qtvar.php
@@ -0,0 +1,179 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Formatter;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+
+class Qtvar extends AbstractFormatter
+{
+    const ALT_CODE_KEY = 'hydro2';
+
+    /**
+     * @var bool
+     */
+    private $wasGap;
+
+    /**
+     * @var string
+     */
+    private $codeStation;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function resolveJeuQualite($default)
+    {
+        return 'Hydro2';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start(Chronique $chronique, $resource, array $extractorReport)
+    {
+        $this->codeStation = $chronique->getStation()->getOneCodeAlternatif(self::ALT_CODE_KEY);
+        if (!$this->codeStation) {
+            $this->codeStation = $chronique->getStation()->getCode();
+            //throw new \RuntimeException(sprintf("Missing %s code for %s", self::ALT_CODE_KEY, $station));
+        }
+        $this->wasGap = false;
+
+        parent::start($chronique, $resource, $extractorReport);
+    }
+
+    /**
+     * {@ionh.
+     */
+    protected function writeHeader()
+    {
+        $unite = IrsteaBdohDataBundle::slugify($this->extractorReport['unite']);
+
+        /*$beginEnd = $this->getBdohRepo('Chronique')->getFirstLastDates($this->chronique);
+        $beginDateAndTime = self::getHydro2DateTime($beginEnd[0]);
+        $endDateAndTime = self::getHydro2DateTime($beginEnd[1]);*/
+        $beginEnd = [
+            $this->extractorReport['first'],
+            $this->extractorReport['last'],
+        ];
+
+        $this
+            ->writeCsv(
+                'DEC',
+                '. 6 13'
+            )
+            ->writeCsv(
+                'DEB',
+                'EXP-HYDRO',
+                'EXPORT DE DONNEES A PARTIR DE BDOH',
+                date('Ymd'),
+                'IRSTEA',
+                '1997-1',
+                '',
+                '',
+                ''
+            )
+            ->writeCsv(
+                '950',
+                $this->codeStation,
+                IrsteaBdohDataBundle::slugify($this->chronique->getStation()->getNom()),
+                $this->chronique->getStation()->getAltitude(),
+                null, // surface BV
+                null, // surface,
+                null, // num producteur,
+                ''
+            )
+            ->writeCsv(
+                '919',
+                '1',
+                null, // unknown date
+                $this->codeStation,
+                $this->codeStation,
+                'QTVAR',
+                $this->formatDateTime($beginEnd[0]),
+                $this->formatDateTime($beginEnd[1]),
+                '5',
+                $unite,
+                ''
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWriteMeasure($debut, $fin, $valeur, $qualite, $minimum = null, $maximum = null)
+    {
+        $this->writeCsv(
+            '920',
+            '1',
+            $this->codeStation,
+            $this->formatDateTime($debut),
+            $valeur,
+            $qualite,
+            $this->wasGap ? '1' : '2',
+            // Comment column ; present in example file but not in specification...
+            ''
+        );
+        $this->wasGap = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function writeGap($debut, $fin)
+    {
+        $this->wasGap = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsRange()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function writeFooter()
+    {
+        $this->writeCsv('FIN', 'EXP-HYDRO', $this->measureCount, '');
+    }
+
+    /**
+     * Format d'entrée : YYYY-MM-AA hh:mm:ss
+     * Format de sortie : YYYYMMAA;hh:mm.
+     *
+     * @param string $datetime
+     *
+     * @return string
+     */
+    protected function formatDateTime($datetime)
+    {
+        return substr($datetime, 0, 4)
+            . substr($datetime, 5, 2)
+            . substr($datetime, 8, 2)
+            . ';'
+            . substr($datetime, 11, 5);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/FormatterInterface.php b/src/Irstea/BdohDataBundle/Exporter/Measure/FormatterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7cd14a317881022e992883981b3a7791aceb3bc
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/FormatterInterface.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Util\JeuToJeu;
+
+/**
+ * Interface FormatterInterface.
+ */
+interface FormatterInterface
+{
+    /**
+     * @param Chronique $chronique
+     * @param resource  $resource
+     * @param array     $extractorReport
+     */
+    public function start(Chronique $chronique, $resource, array $extractorReport);
+
+    /**
+     * @param string      $debut
+     * @param string|null $fin
+     * @param float       $valeur
+     * @param string      $qualite
+     * @param float null  $minimum
+     * @param float       $maximum
+     */
+    public function writeMeasure($debut, $fin, $valeur, $qualite, $minimum = null, $maximum = null);
+
+    /**
+     * @return array
+     */
+    public function done();
+
+    /**
+     * @param mixed $codeJeu
+     *
+     * @return string
+     */
+    public function resolveJeuQualite($codeJeu);
+
+    /**
+     * @param JeuToJeu $jeuToJeu
+     */
+    public function setJeuToJeu(JeuToJeu $jeuToJeu);
+
+    /**
+     * @return bool
+     */
+    public function supportsRange();
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/LoggerDecorator.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/LoggerDecorator.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfbe130cc8a760cb85bf60f7f6b3278683524656
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/LoggerDecorator.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Reporter;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\PasEchantillonnage;
+use Irstea\BdohDataBundle\Exporter\Measure\ReporterInterface;
+use Irstea\BdohLoggerBundle\Logger\BdohLogger;
+
+/**
+ * Class LoggerDecorator.
+ */
+class LoggerDecorator implements ReporterInterface
+{
+    /**
+     * @var BdohLogger
+     */
+    private $logger;
+
+    /**
+     * @var ReporterInterface
+     */
+    private $inner;
+
+    /**
+     * @var array
+     */
+    private $parameters = [];
+
+    /**
+     * LoggerDecorator constructor.
+     *
+     * @param BdohLogger        $logger
+     * @param ReporterInterface $inner
+     */
+    public function __construct(BdohLogger $logger, ReporterInterface $inner)
+    {
+        $this->logger = $logger;
+        $this->inner = $inner;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addChronique(Chronique $chronique, array $report)
+    {
+        $this->inner->addChronique($chronique, $report);
+
+        if (empty($report['number'])) {
+            return;
+        }
+
+        $timestep = ['libelle' => '', 'libelleEn' => ''];
+        if (isset($this->parameters['timestep'])) {
+            if (is_integer($this->parameters['timestep'])) {
+                $minutes = ' minute';
+                if ($this->parameters['timestep'] > 1) {
+                    $minutes = ' minutes';
+                }
+                $timestep['libelle'] = $this->parameters['timestep'] . $minutes;
+                $timestep['libelleEn'] = $this->parameters['timestep'] . $minutes;
+            } elseif ($this->parameters['timestep'] instanceof PasEchantillonnage) {
+                $timestep['libelle'] = $this->parameters['timestep']->getLibelle();
+                $timestep['libelleEn'] = $this->parameters['timestep']->getLibelleEn();
+            }
+        }
+
+        $this->logger->createHistoriqueDonneesExport(
+            $this->parameters['user'],
+            $this->parameters['date'],
+            $chronique->getObservatoire(),
+            $chronique,
+            $this->parameters['begin']->format(\DateTime::ATOM),
+            $this->parameters['end']->format(\DateTime::ATOM),
+            $report['number'],
+            $this->parameters['format'],
+            $this->parameters['extractor'],
+            \json_encode($timestep),
+            $this->parameters['timezone']->getName()
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addParameters(array $parameters)
+    {
+        $this->parameters = array_merge($this->parameters, $parameters);
+        $this->inner->addParameters($parameters);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeTo($resource)
+    {
+        $this->inner->writeTo($resource);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/Twig.php b/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/Twig.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6a7f8d50491c371f0d04385826c6b169a8071b1
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/Reporter/Twig.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure\Reporter;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Exporter\Measure\ReporterInterface;
+use Symfony\Bridge\Twig\TwigEngine;
+
+/**
+ * Class Twig.
+ */
+class Twig implements ReporterInterface
+{
+    /**
+     * @var TwigEngine
+     */
+    private $twig;
+
+    /**
+     * @var array
+     */
+    private $parameters = ['chroniques' => []];
+
+    /**
+     * Twig constructor.
+     *
+     * @param TwigEngine $twig
+     */
+    public function __construct(TwigEngine $twig)
+    {
+        $this->twig = $twig;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addChronique(Chronique $chronique, array $report)
+    {
+        $this->parameters['chroniques'][] = ['chronique' => $chronique, 'report' => $report];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addParameters(array $parameters)
+    {
+        $this->parameters = array_replace($this->parameters, $parameters);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeTo($resource)
+    {
+        $lines = explode("\n", $this->twig->render('@IrsteaBdohData/Exporter/report.text.twig', $this->parameters));
+        $lines = array_map('rtrim', $lines);
+        fwrite($resource, implode("\n", $lines));
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Exporter/Measure/ReporterInterface.php b/src/Irstea/BdohDataBundle/Exporter/Measure/ReporterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..565840f55a6f0a06fc2d349cb3cc1468bfad71f2
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Exporter/Measure/ReporterInterface.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Exporter\Measure;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+
+interface ReporterInterface
+{
+    /**
+     * @param Chronique $chronique
+     * @param array     $report
+     */
+    public function addChronique(Chronique $chronique, array $report);
+
+    /**
+     * @param array $parameters
+     *
+     * @return self
+     */
+    public function addParameters(array $parameters);
+
+    /**
+     * @param resource $resource
+     */
+    public function writeTo($resource);
+}
diff --git a/src/Irstea/BdohDataBundle/IrsteaBdohDataBundle.php b/src/Irstea/BdohDataBundle/IrsteaBdohDataBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..458af1295b6fa88d58121ae6f34cbd7d8671dee0
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/IrsteaBdohDataBundle.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle;
+
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohDataBundle extends Bundle
+{
+    const LOCAL = 'fr_FR.UTF-8';
+
+    /**
+     * Modifies a string to remove all non ASCII characters and spaces.
+     *
+     * @param mixed $text
+     */
+    public static function slugify($text)
+    {
+        // replace non letter or digits by -
+        $text = preg_replace('~[^\\pL\d]+~u', '-', $text);
+
+        // trim
+        $text = trim($text, '-');
+
+        // transliterate
+        setlocale(LC_ALL, self::LOCAL); // Alter //TRANSLIT result
+        $text = iconv('utf-8', 'ascii//TRANSLIT', $text);
+
+        // remove unwanted characters
+        $text = preg_replace('~[^-\w]+~', '', $text);
+
+        if (empty($text)) {
+            return 'n-a';
+        }
+
+        return strtoupper($text);
+    }
+
+    /**
+     * Uploading function :
+     *  1) If $path points to an existing file (relative to $rootDir), removes it.
+     *  2) Moves the $file in the directory "$rootDir.$destDir"
+     *     with a new file name randomly generated or the provided one if any.
+     *  3) Stores its new path (relative to $rootDir) in $path.
+     *  4) Then, clears $file variable.
+     *
+     * @var string
+     * @var string
+     * @var \Symfony\Component\HttpFoundation\File\UploadedFile|null (reference)
+     * @var string                                                   (reference)
+     * @var string
+     *
+     * @param mixed      $rootDir
+     * @param mixed      $destDir
+     * @param mixed|null $fileName
+     * @param mixed      $file
+     * @param mixed      $path
+     */
+    public static function uploadFile($rootDir, $destDir, &$file, &$path, $fileName = null)
+    {
+        // Nothing to do without $file to upload !
+        if (null === $file || !($file instanceof UploadedFile)) {
+            return;
+        }
+
+        // Nothing to do without a directory where to upload !
+        if (!$rootDir || !$destDir) {
+            return;
+        }
+
+        // Removes file at $path
+        self::removeFile($rootDir, $path);
+
+        // New file name randomly generated
+        if (!$extension = $file->guessExtension()) {
+            $extension = 'bin';
+        }
+        if (null !== $fileName) {
+            $newFileName = $fileName . '.' . $extension;
+        } else {
+            $newFileName = rand(1, 9999999) . '.' . $extension;
+        }
+
+        @$file->move($rootDir . $destDir, $newFileName);
+        $path = $destDir . $newFileName;
+        $file = null;
+    }
+
+    /**
+     * Removes file at "$rootDir.$path" and clears $path.
+     *
+     * @var string
+     * @var string (reference)
+     *
+     * @param mixed $rootDir
+     * @param mixed $path
+     */
+    public static function removeFile($rootDir, &$path)
+    {
+        if ($path) {
+            @unlink($rootDir . $path);
+            $path = '';
+        }
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Resources/assets/entries/job/all.js b/src/Irstea/BdohDataBundle/Resources/assets/entries/job/all.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c1a5b099b422aea5a21abf2b39fcc28f96c2782
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/assets/entries/job/all.js
@@ -0,0 +1,4 @@
+const $ = require('jquery');
+require('@IrsteaBdohBundle/lib/datatables');
+
+$(() => $('#jobs').DataTable({/*'pageLength':25, */'order': [[0, 'desc']]}));
diff --git a/src/Irstea/BdohDataBundle/Resources/config/doctrine/mapping.orm.yml b/src/Irstea/BdohDataBundle/Resources/config/doctrine/mapping.orm.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4061010bd8cc4862815dd4f7c51c8dcfaa16bdac
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/config/doctrine/mapping.orm.yml
@@ -0,0 +1,1490 @@
+################################################################################
+# Empty class because of "the first line bug".
+################################################################################
+#
+# WARNING : entities used in a discriminatorMap MUST EXIST !!!
+# This can require an entities generation in two steps (the first, without the discriminatorMap).
+#
+################################################################################
+#
+# OVERVIEW :
+#   Observatoire
+#   Doi
+#   Partenaire
+#   SiteExperimental
+#   Station
+#   Chronique
+#   ChroniqueDiscontinue
+#   ChroniqueContinue
+#   ChroniqueCalculee
+#   ChroniqueConvertie
+#   TauxRemplissage
+#   Commune
+#   FamilleParametres
+#   TypeParametre
+#   Unite
+#   Mesure
+#   PointControle
+#   Echantillonnage
+#   Transformation
+#   Bareme
+#   BaremeJeuBareme
+#   JeuBareme
+#   Conversion
+#   JeuConversion
+#   Plage
+#   Qualite
+#   JeuQualite
+#   QualiteJeuQualite
+#   Bassin
+#   CoursEau
+#   PasEchantillonnage
+#   OptionEchantillonnageSortie
+#
+################################################################################
+
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Observatoire:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    entityListeners:
+        Irstea\BdohDataBundle\Doctrine\Listener\ObservatoireStylesheetListener: ~
+        Irstea\BdohDataBundle\Doctrine\Listener\DocumentedEntityListener: ~
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        theiaCode :
+            type: string
+            unique: TRUE
+            nullable: TRUE
+            length: 4
+        theiaPassword:
+            type: string
+            nullable: TRUE
+        titre:
+            type: string
+            nullable: TRUE
+        titreEn:
+            type: string
+            nullable: TRUE
+        email:
+            type: string
+            nullable: TRUE
+        slug:
+            type: string
+            unique: TRUE
+        conditionsUtilisation:
+            type: string
+            nullable: TRUE
+        description:
+            type: text
+            nullable: TRUE
+        descriptionEn:
+            type: text
+            nullable: TRUE
+        lien:
+            type: string
+            nullable: TRUE
+        couleurPrimaire:
+            type: string
+            nullable: TRUE
+        couleurSecondaire:
+            type: string
+            nullable: TRUE
+        pathPhotoPrincipale:
+            type: string
+            nullable: TRUE
+        pathPhotoSecondaire:
+            type: string
+            nullable: TRUE
+        pathLogo:
+            type: string
+            nullable: TRUE
+        miseAJourAutomatique:
+            type: boolean
+            nullable: FALSE
+    oneToOne:
+        doiPrincipal:
+            targetEntity: Irstea\BdohDataBundle\Entity\Doi
+    oneToMany:
+        sites:
+            targetEntity: Irstea\BdohDataBundle\Entity\SiteExperimental
+            mappedBy: observatoire
+            nullable: TRUE
+        dois:
+            targetEntity: Irstea\BdohDataBundle\Entity\Doi
+            mappedBy: observatoire
+        dataSets:
+            targetEntity: Irstea\BdohDataBundle\Entity\DataSet
+            mappedBy: observatoire
+        partenaires:
+            targetEntity: Irstea\BdohDataBundle\Entity\Partenaire
+            mappedBy: observatoire
+    manyToOne:
+        jeu:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuQualite
+        projectLeader:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+    manyToMany:
+        dataManagers:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            joinTable:
+                name: observatoires_data_manager
+                nullable: FALSE
+                joinColumns:
+                    observatoire_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ObservatoireRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\TopicCategory:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\TypeFunding:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\CriteriaClimat:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\CriteriaGeology:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\Milieu:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\DataConstraint:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\InspireTheme:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+################################################################################
+Irstea\BdohDataBundle\Entity\PersonneTheia:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+        prenom:
+            type: string
+            nullable: FALSE
+        email:
+            type: string
+            nullable: FALSE
+    manyToOne:
+        partenaire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Partenaire
+            nullable: FALSE
+            joinColumn:
+                name: partenaire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            nullable: TRUE
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\PersonneTheiaRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\DataSet:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        uuid:
+            type: string
+            nullable: TRUE
+        titre:
+            type: string
+            nullable: FALSE
+        description:
+            type: string
+            length: 4000
+            nullable: FALSE
+        genealogie:
+            type: string
+            length: 4000
+            nullable: FALSE
+        titreEn:
+            type: string
+            nullable: TRUE
+        descriptionEn:
+            type: string
+            length: 4000
+            nullable: TRUE
+        genealogieEn:
+            type: string
+            length: 4000
+            nullable: TRUE
+    manyToMany:
+        topicCategories:
+            targetEntity: Irstea\BdohDataBundle\Entity\TopicCategory
+            nullable: FALSE
+            joinTable:
+                name: topic_category_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+                inverseJoinColumns:
+                    topiccategory_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+        portailSearchCriteriaGeology:
+            targetEntity: Irstea\BdohDataBundle\Entity\CriteriaGeology
+            nullable: FALSE
+            joinTable:
+                name: criteria_geology_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+                inverseJoinColumns:
+                    criteriageology_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+        portailSearchCriteriaClimat:
+            targetEntity: Irstea\BdohDataBundle\Entity\CriteriaClimat
+            nullable: FALSE
+            joinTable:
+                name: criteria_climat_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+                inverseJoinColumns:
+                    criteriaclimat_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+        dataManagers:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            nullable: FALSE
+            joinTable:
+                name: data_manager_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    partenaire_id:
+                        referencedColumnName: id
+        principalInvestigators:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            nullable: FALSE
+            joinTable:
+                name: principal_investigator_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    partenaire_id:
+                        referencedColumnName: id
+        dataCollectors:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            nullable: FALSE
+            joinTable:
+                name: data_collector_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    partenaire_id:
+                        referencedColumnName: id
+        projectMembers:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            nullable: FALSE
+            joinTable:
+                name: project_member_dataSet
+                joinColumns:
+                    dataset_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    partenaire_id:
+                        referencedColumnName: id
+    manyToOne:
+        dataConstraint:
+            targetEntity: Irstea\BdohDataBundle\Entity\DataConstraint
+            nullable: FALSE
+            joinColumn:
+                name: dataconstraint_id
+                referenceColumnName: id
+        inspireTheme:
+            targetEntity: Irstea\BdohDataBundle\Entity\InspireTheme
+            nullable: FALSE
+            joinColumn:
+                name: inspiretheme_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            inversedBy: dataSet
+            nullable: FALSE
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        doi:
+            targetEntity: Irstea\BdohDataBundle\Entity\Doi
+    oneToMany:
+        chroniques:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            mappedBy: dataset
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\DataSetRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Doi:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        identifiant:
+            type: string
+            nullable: FALSE
+        description:
+            type: string
+            length: 750
+            nullable: TRUE
+        descriptionEn:
+            type: string
+            length: 750
+            nullable: TRUE
+    manyToOne:
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            inversedBy: dois
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\DoiRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\TheiaCategories:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+        uriOzcarTheia:
+            type: json_array
+            nullable: FALSE
+    manyToOne:
+        familleParametre:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+        milieu:
+            targetEntity: Irstea\BdohDataBundle\Entity\Milieu
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Partenaire:
+    type: entity
+    entityListeners:
+        Irstea\BdohDataBundle\Doctrine\Listener\DocumentedEntityListener: ~
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+        lien:
+            type: string
+            nullable: TRUE
+        pathLogo:
+            type: string
+            nullable: TRUE
+        estFinanceur: # default = TRUE
+            type: boolean
+        iso:
+            type: string
+            nullable: TRUE
+        scanR:
+            type: string
+            nullable: TRUE
+    manyToOne:
+        typeFundings:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeFunding
+            joinColumn:
+                name: typefundings_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            inversedBy: partenaires
+            cascade: [ "persist" ]
+    uniqueConstraints:
+        unique_partenaire_by_obs:
+            columns: [ nom, observatoire_id ]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\PartenaireRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\SiteExperimental:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        slug:
+            type: string
+            unique: TRUE
+        description:
+            type: text
+            nullable: TRUE
+        descriptionEn:
+            type: text
+            nullable: TRUE
+    manyToOne:
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            inversedBy: sites
+    manyToMany:
+        stations:
+            targetEntity: Irstea\BdohDataBundle\Entity\Station
+            mappedBy: sites
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\SiteExperimentalRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Station:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        code:
+            type: string
+            unique: TRUE
+        altitude:
+            type: float
+            nullable: TRUE
+        estActive: # default = TRUE
+            type: boolean
+        codeAlternatif:
+            type: string
+            nullable: TRUE
+        commentaire:
+            type: string
+            nullable: TRUE
+            length: 4000
+        commentaireEn:
+            type: string
+            nullable: TRUE
+            length: 4000
+        point:
+            type: geometry
+            nullable: TRUE
+        latitude:
+            type: float
+            nullable: TRUE
+        longitude:
+            type: float
+            nullable: TRUE
+    manyToOne:
+        commune:
+            targetEntity: Irstea\BdohDataBundle\Entity\Commune
+            joinColumn:
+                name: commune_id
+                referenceColumnName: id
+                onDelete: SET NULL
+    oneToMany:
+        chroniques:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            mappedBy: station
+    manyToMany:
+        sites:
+            targetEntity: Irstea\BdohDataBundle\Entity\SiteExperimental
+            inversedBy: stations
+            joinTable:
+                name: stations_sites
+                joinColumns:
+                    station_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    site_id:
+                        referencedColumnName: id
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\StationRepository
+
+################################################################################
+# Note : => the pair [station, code] should be unique.
+#        => this is checked by "src/Irstea/BdohDataBundle/Entity/Chronique.php" class.
+#
+Irstea\BdohDataBundle\Entity\Chronique:
+    type: entity
+    inheritanceType: SINGLE_TABLE
+    discriminatorMap:
+        simple:      Chronique
+        continue:    ChroniqueContinue
+        discontinue: ChroniqueDiscontinue
+        calculee:    ChroniqueCalculee
+        convertie:   ChroniqueConvertie
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        code:
+            type: string
+        libelle:
+            type: string
+        libelleEn:
+            type: string
+            nullable: TRUE
+        description:
+            type: text
+            nullable: TRUE
+        genealogie:
+            type: string
+            nullable: TRUE
+            length: 4000
+        genealogieEn:
+            type: string
+            nullable: TRUE
+            length: 4000
+        estVisible: # default = TRUE
+            type: boolean
+        minimumValide:
+            nullable: TRUE
+            type: float
+        maximumValide:
+            nullable: TRUE
+            type: float
+        dateDebutMesures:
+            nullable: TRUE
+            type: datetimems    # with milliseconds
+        dateFinMesures:
+            nullable: TRUE
+            type: datetimems    # with milliseconds
+        nbMesures:
+            nullable: TRUE
+            type: integer
+        echantillonageSet: # default = FALSE
+            nullable: TRUE
+            type: boolean
+        allowValueLimits:
+            nullable: TRUE
+            type: boolean
+    manyToOne:
+        unite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+        producteur:
+            targetEntity: Irstea\BdohDataBundle\Entity\Partenaire
+            joinColumn:
+                name: producteur_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        parametre:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeParametre
+            inversedBy: chroniques
+        milieu:
+            targetEntity: Irstea\BdohDataBundle\Entity\Milieu
+            joinColumn:
+                name: milieu_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        station:
+            targetEntity: Irstea\BdohDataBundle\Entity\Station
+            inversedBy: chroniques
+        dataset:
+            targetEntity: Irstea\BdohDataBundle\Entity\DataSet
+            inversedBy: chroniques
+            joinColumn:
+                name: dataset_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue:
+    type: entity
+    extends: Chronique
+    oneToMany:
+        plages:
+            targetEntity: Irstea\BdohDataBundle\Entity\Plage
+            mappedBy: chronique
+        conversions:
+            targetEntity: Irstea\BdohDataBundle\Entity\Conversion
+            mappedBy: entree
+            fetch: EXTRA_LAZY
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ChroniqueDiscontinueRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\ChroniqueContinue:
+    type: entity
+    extends: Chronique
+    fields:
+        directionMesure:
+            type: string
+            nullable: true
+    manyToOne:
+        echantillonnage:
+            targetEntity: Irstea\BdohDataBundle\Entity\Echantillonnage
+        uniteCumul:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+    oneToMany:
+        pointsControle:
+            targetEntity: Irstea\BdohDataBundle\Entity\PointControle
+            mappedBy: chronique
+            fetch: EXTRA_LAZY
+        mesures:
+            targetEntity: Irstea\BdohDataBundle\Entity\Mesure
+            mappedBy: chronique
+            fetch: EXTRA_LAZY
+        tauxRemplissage:
+            targetEntity: Irstea\BdohDataBundle\Entity\TauxRemplissage
+            mappedBy: chronique
+            fetch: EXTRA_LAZY
+        transformations:
+            targetEntity: Irstea\BdohDataBundle\Entity\Transformation
+            mappedBy: entree
+            fetch: EXTRA_LAZY
+
+    manyToMany:
+        echantillonnagesSortieLicites:
+            targetEntity: Irstea\BdohDataBundle\Entity\Echantillonnage
+            nullable: TRUE
+            joinTable:
+                name: EchantillonnageSortieLicite_Chronique
+                joinColumns:
+                    chronique_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    echantillonnage_id:
+                        referencedColumnName: id
+        optionsEchantillonnageSortie:
+            targetEntity: Irstea\BdohDataBundle\Entity\OptionEchantillonnageSortie
+            nullable: TRUE
+            joinTable:
+                name: optionEchantillonnageSortie_chronique
+                joinColumns:
+                    chronique_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    optionEchantillonnageSortie_id:
+                        referencedColumnName: id
+
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ChroniqueContinueRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\ChroniqueCalculee:
+    type: entity
+    extends: ChroniqueContinue
+    fields:
+        facteurMultiplicatif: # default = 1
+            type: float
+        miseAJour:
+            type: datetime
+            nullable: true
+
+    oneToOne:
+        premiereEntree:
+            targetEntity: Irstea\BdohDataBundle\Entity\Transformation
+            cascade: ["persist"]
+        secondeEntree:
+            targetEntity: Irstea\BdohDataBundle\Entity\Transformation
+            cascade: ["persist"]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ChroniqueCalculeeRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\ChroniqueConvertie:
+    type: entity
+    extends: ChroniqueContinue
+    fields:
+        miseAJour:
+            type: datetime
+            nullable: true
+
+    oneToOne:
+        conversion:
+            targetEntity: Irstea\BdohDataBundle\Entity\Conversion
+            cascade: ["persist"]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\ChroniqueConvertieRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\TauxRemplissage:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    uniqueConstraints:
+        unique_chro_date:
+          columns:
+            - chronique_id
+            - debut
+    fields:
+        debut:
+            type: datetimems  # with milliseconds
+        fin:
+            type: datetimems  # with milliseconds
+        taux:
+            type: float
+        poids:
+            type: float
+    manyToOne:
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueContinue
+            inversedBy: tauxRemplissage
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: CASCADE
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Commune:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+        codePostal:
+            type: string
+            nullable: TRUE
+            length: 5
+        codeInsee:
+            type: string
+            nullable: TRUE
+            length: 5
+
+    uniqueConstraints:
+        unique_codes:
+            columns: [ codePostal, codeInsee ]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\CommuneRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\FamilleParametres:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        nomEn:
+            type: string
+            unique: TRUE
+        prefix:
+            type: string
+            nullable: TRUE
+    manyToOne:
+        familleParente:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            inversedBy: famillesFilles
+            joinColumn:
+                name: familleParente_id
+                referenceColumnName: id
+                onDelete: RESTRICT
+    oneToMany:
+        typesParametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeParametre
+            mappedBy: familleParametres
+        famillesFilles:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            mappedBy: familleParente
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\FamilleParametresRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\TypeParametre:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        nomEn:
+            type: string
+            unique: TRUE
+        code:
+            type: string
+    manyToMany:
+        unites:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+            inversedBy: parametres
+            joinTable:
+                name: parametres_unites
+                joinColumns:
+                    parametre_id:
+                        referencedColumnName: id
+                inverseJoinColumns:
+                    unite_id:
+                        referencedColumnName: id
+    manyToOne:
+        familleParametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            inversedBy: typesParametres
+            joinColumn:
+                name: familleParametres_id
+                referenceColumnName: id
+                onDelete: RESTRICT
+    oneToMany:
+        chroniques:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            mappedBy: parametre
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\TypeParametreRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Unite:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        libelle:
+            type: string
+            unique: TRUE
+        libelleEn:
+            type: string
+            nullable: TRUE
+            unique: TRUE
+    manyToMany:
+        parametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeParametre
+            mappedBy: unites
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\UniteRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Mesure:
+    type: entity
+    id:
+        id:
+            type: bigint
+            generator:
+                strategy: AUTO
+    fields:
+        date:
+            type: datetimems    # with milliseconds
+        valeur:
+            type: float
+            nullable: TRUE
+        minimum:
+            nullable: TRUE
+            type: float
+        maximum:
+            nullable: TRUE
+            type: float
+        estCalculee: # default = FALSE
+            type: boolean
+    manyToOne:
+        qualite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueContinue
+            inversedBy: mesures
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: CASCADE
+
+    uniqueConstraints:
+        idx_mesure_chronique_date:
+          columns: [ chronique_id, date ]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\MesureRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\PointControle:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        date:
+            type: datetimems    # with milliseconds
+        valeur:
+            type: float
+            nullable: TRUE
+        minimum:
+            nullable: TRUE
+            type: float
+        maximum:
+            nullable: TRUE
+            type: float
+    manyToOne:
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueContinue
+            inversedBy: pointsControle
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        qualite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+            nullable: TRUE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\PointControleRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Echantillonnage:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        code:
+            type: string
+            unique: TRUE
+            nullable: TRUE
+        nom:
+            type: string
+            unique: TRUE
+        nomEn:
+            type: string
+            unique: TRUE
+            nullable: TRUE
+        ordreSortie:
+            type: integer
+            unique: TRUE
+            nullable: TRUE
+        hasDirection:
+            type: boolean
+            nullable: TRUE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\EchantillonnageRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Transformation:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+
+    oneToOne:
+        jeuBaremeActuel:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuBareme
+            cascade: ["persist"]
+            fetch: EXTRA_LAZY
+
+    oneToMany:
+        jeuBaremesHistoriques:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuBareme
+            fetch: EXTRA_LAZY
+            mappedBy: transformation
+            orderBy:
+                dateCreation: DESC
+    manyToOne:
+        entree:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueContinue
+            inversedBy: transformations
+        sortie:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueCalculee
+            joinColumn:
+                onDelete: CASCADE
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Bareme:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+        commentaire:
+            type: string
+            nullable: TRUE
+            length: 4000
+        valeurs:
+            type: bareme #Map with an array in Postgres
+        dateCreation:
+            type: datetime
+    manyToOne:
+        uniteEntree:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+        uniteSortie:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\BaremeRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\BaremeJeuBareme:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        debutValidite:
+            type: datetime
+            nullable: true
+        finValidite:
+            type: datetime
+            nullable: true
+    manyToOne:
+        bareme:
+            targetEntity: Irstea\BdohDataBundle\Entity\Bareme
+        jeuBareme:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuBareme
+            inversedBy: baremeJeuBaremes
+            joinColumn:
+                onDelete: CASCADE
+
+################################################################################
+Irstea\BdohDataBundle\Entity\JeuBareme:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        dateCreation:
+            type: datetime
+            nullable: true
+        delaiPropagation:
+            type: float
+            nullable: true
+        valueLimitTransformationType:
+            type: string
+            nullable: true
+        valueLimitPlaceholder:
+            type: float
+            nullable: true
+    manyToOne:
+        transformation:
+            targetEntity: Irstea\BdohDataBundle\Entity\Transformation
+            inversedBy: jeuBaremesHistoriques
+            joinColumn:
+                onDelete: CASCADE
+    oneToMany:
+        baremeJeuBaremes:
+            targetEntity: Irstea\BdohDataBundle\Entity\BaremeJeuBareme
+            mappedBy: jeuBareme
+            cascade: ["persist"]
+            orderBy:
+                debutValidite: ASC
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Conversion:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    oneToOne:
+        jeuConversionActuel:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuConversion
+            cascade: ["persist"]
+            fetch: EXTRA_LAZY
+    oneToMany:
+        jeuConversionsHistoriques:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuConversion
+            fetch: EXTRA_LAZY
+            mappedBy: conversion
+            orderBy:
+                dateCreation: DESC
+    manyToOne:
+        entree:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+            inversedBy: conversions
+            joinColumn:
+                name: entree_id
+                onDelete: CASCADE
+        sortie:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueConvertie
+            joinColumn:
+                name: sortie_id
+                onDelete: CASCADE
+    uniqueConstraints:
+        unique_conversion:
+            columns: [ entree_id, sortie_id ]
+
+################################################################################
+Irstea\BdohDataBundle\Entity\JeuConversion:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        dateCreation:
+            type: datetime
+        paramConversion:
+            type: integer
+    manyToOne:
+        conversion:
+            targetEntity: Irstea\BdohDataBundle\Entity\Conversion
+            inversedBy: jeuConversionsHistoriques
+            joinColumn:
+                name: conversion_id
+                onDelete: CASCADE
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Plage:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        debut:
+            type: datetimems    # with milliseconds
+        fin:
+            type: datetimems    # with milliseconds
+        valeur:
+            type: float
+            nullable: TRUE
+        minimum:
+            nullable: TRUE
+            type: float
+        maximum:
+            nullable: TRUE
+            type: float
+    manyToOne:
+        qualite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+            inversedBy: plages
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: CASCADE
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\PlageRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Qualite:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        code:
+            type: string
+        libelle:
+            type: string
+            nullable: TRUE
+        libelleEn:
+            type: string
+            nullable: TRUE
+        ordre:
+            type: integer
+            nullable: TRUE
+        type:
+            type: string
+            nullable: TRUE
+        style:
+            type: json_array
+            nullable: TRUE
+    oneToMany:
+        traductions:
+            targetEntity: Irstea\BdohDataBundle\Entity\QualiteJeuQualite
+            mappedBy: qualite
+    manyToOne:
+        jeu:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuQualite
+            inversedBy: qualites
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\QualiteRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\JeuQualite:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            unique: TRUE
+        estAffectable:
+            type: boolean
+        checkpointStyle:
+            type: json_array
+            nullable: TRUE
+        discontinuousStyle:
+            type: json_array
+            nullable: TRUE
+    oneToMany:
+        qualites:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+            mappedBy: jeu
+            indexBy: code
+            cascade: ["persist"]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\JeuQualiteRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\QualiteJeuQualite:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    manyToOne:
+        traduction:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+        jeu:
+            targetEntity: Irstea\BdohDataBundle\Entity\JeuQualite
+        qualite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Qualite
+            inversedBy: traductions
+
+################################################################################
+Irstea\BdohDataBundle\Entity\Bassin:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+        aire:
+            type: float
+            nullable: TRUE
+        perimetre:
+            type: geometry
+            nullable: TRUE
+    manyToOne:
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+                nullable: FALSE
+        stationExutoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Station
+            joinColumn:
+                name: stationexutoire_id
+                referenceColumnName: id
+                onDelete: SET NULL
+    uniqueConstraints:
+      uniqueBassinObservatoire:
+        columns: [ nom, observatoire_id ]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\BassinRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\CoursEau:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        nom:
+            type: string
+            nullable: FALSE
+        codeHydro:
+            type: string
+            nullable: TRUE
+        classification:
+            type: integer
+            nullable: TRUE
+        trace:
+            type: geometry
+            nullable: TRUE
+    manyToOne:
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+                nullable: FALSE
+    uniqueConstraints:
+      uniqueCoursEauObservatoire:
+        columns: [ nom, observatoire_id ]
+
+    repositoryClass: Irstea\BdohDataBundle\Entity\Repository\CoursEauRepository
+
+################################################################################
+Irstea\BdohDataBundle\Entity\PasEchantillonnage:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        unite:
+            type: string
+        valeur:
+            type: integer
+        approxSecondes:
+            type: integer
+            nullable: TRUE
+        libelle:
+            type: string
+            nullable: TRUE
+        libelleEn:
+            type: string
+            nullable: TRUE
+    uniqueConstraints:
+        uniqueUnitValuePair:
+            columns: [ unite, valeur ]
+
+################################################################################
+Irstea\BdohDataBundle\Entity\OptionEchantillonnageSortie:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+
+    manyToOne:
+        echantillonnageEntree:
+            targetEntity: Irstea\BdohDataBundle\Entity\Echantillonnage
+        pasEchantillonnage:
+            targetEntity: Irstea\BdohDataBundle\Entity\PasEchantillonnage
+
+    uniqueConstraints:
+        uniqueSamplingOption:
+            columns: [ echantillonnageEntree_id, pasEchantillonnage_id ]
+
+################################################################################
diff --git a/src/Irstea/BdohDataBundle/Resources/config/routing.yml b/src/Irstea/BdohDataBundle/Resources/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..86a591045b029b686064e9d527760a4a4c7aeb1a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/config/routing.yml
@@ -0,0 +1,11 @@
+bdoh_data_chronique_measures:
+    path:  /chronique/{id}/measures
+    defaults: { _controller: IrsteaBdohDataBundle:DataProviding:getChroniqueMeasures }
+
+bdoh_data_observatoire_conditions_export:
+    path: /conditions
+    defaults: { _controller: IrsteaBdohDataBundle:Download:conditions }
+
+_annotated_controllers:
+    resource: "@IrsteaBdohDataBundle/Controller"
+    type:     annotation
diff --git a/src/Irstea/BdohDataBundle/Resources/config/services.yml b/src/Irstea/BdohDataBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1b55991be07a6ec1bda13d9eb3b1dc08b2bf6447
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/config/services.yml
@@ -0,0 +1,23 @@
+parameters:
+    irstea_bdoh_data.measure_export.document_base_path: "%kernel.root_dir%/../web"
+
+    # The description file of measures export formats (relative to the web dir)
+    irstea_bdoh_data.measure_export.formats_export_file: documents/FormatsExport.pdf
+
+    # The description file of measures export formats (relative to the web dir)
+    irstea_bdoh_data.measure_export.default_termofuses_file: documents/ConditionsGeneralesUtilisation.pdf
+
+    # A map of formats and their specific exporters
+    irstea_bdoh_data.measure_export.exporters:
+        # General
+        Bdoh      : Irstea\BdohDataBundle\Exporter\Measure\BdohExporter
+        Qtvar     : Irstea\BdohDataBundle\Exporter\Measure\QtvarExporter
+        Vigilance : Irstea\BdohDataBundle\Exporter\Measure\VigilanceExporter
+
+     # A map of formats for discontinuous chronicles and their specific exporters
+    irstea_bdoh_data.measure_discontinuous_export.exporters:
+        # General
+        Bdoh      : Irstea\BdohDataBundle\Exporter\Measure\BdohExporter
+
+    # Parameters for the viewers
+    irstea_bdoh_data.viewers.max_valid_display_points: 50000
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.en.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..689b8008e3400ddc3b76755f06398770b4102394
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.en.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'Observatories',
+    'Doi'                                                   => 'DOI',
+    'Partenaire'                                            => 'Partners',
+    'SiteExperimental'                                      => 'Experimental sites',
+    'Station'                                               => 'Stations',
+    'Chronique'                                             => 'All Time series',
+    'ChroniqueDiscontinue'                                  => 'Discontinuous time series',
+    'ChroniqueContinue'                                     => 'Continuous time series',
+    'ChroniqueCalculee'                                     => 'Calculated time series',
+    'ChroniqueConvertie'                                    => 'Converted time series',
+    'Commune'                                               => 'Towns',
+    'FamilleParametres'                                     => 'Parameter categories',
+    'TypeParametre'                                         => 'Parameter types',
+    'Unite'                                                 => 'Units',
+    'Mesure'                                                => 'Data points',
+    'PointControle'                                         => 'Checkpoints',
+    'Echantillonnage'                                       => 'Sampling',
+    'PasEchantillonnage'                                    => 'Time steps',
+    'LigneCalcul'                                           => 'Calculation lines',
+    'Bareme'                                                => 'Scales',
+    'PeriodeValidite'                                       => 'Validity periods',
+    'Plage'                                                 => 'Ranges',
+    'Qualite'                                               => 'Qualities',
+    'JeuQualite'                                            => 'Sets of qualities',
+    'Bassin'                                                => 'Basins',
+    'CoursEau'                                              => 'Rivers',
+    'TauxRemplissage'                                       => 'Data completeness',
+    'DataSet'                                               => 'Datasets',
+    'Milieu'                                                => 'Environments',
+    'DataConstraint'                                        => 'Data Constraints',
+    'CriteriaGeology'                                       => 'Criteria Geologies',
+    'CriteriaClimat'                                        => 'Criteria Climates',
+    'InspireTheme'                                          => 'INSPIRE Themes',
+    'TopicCategory'                                         => 'INSPIRE Topic Categories',
+    'TypeFunding'                                           => 'Type Fundings',
+    'ContactOrganisationRole'                               => 'Organisations Roles',
+    'RolePersonneTheia'                                     => 'Users Roles',
+    'PersonneTheia'                                         => 'Theia Users',
+    'TheiaCategories'                                       => 'Connections TheiaCategories',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1f64e91e52b6b7f0de67c7316b922b2fd162644
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesPlurals.fr.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'Observatoires',
+    'Doi'                                                   => 'DOI',
+    'Partenaire'                                            => 'Partenaires',
+    'SiteExperimental'                                      => 'Sites expérimentaux',
+    'Station'                                               => 'Stations',
+    'Chronique'                                             => 'Ensembles des chroniques',
+    'ChroniqueDiscontinue'                                  => 'Chroniques discontinues',
+    'ChroniqueContinue'                                     => 'Chroniques continues',
+    'ChroniqueCalculee'                                     => 'Chroniques calculées',
+    'ChroniqueConvertie'                                    => 'Chroniques converties',
+    'Commune'                                               => 'Communes',
+    'FamilleParametres'                                     => 'Familles de paramètres',
+    'TypeParametre'                                         => 'Types de paramètre',
+    'Unite'                                                 => 'Unités',
+    'Mesure'                                                => 'Mesures',
+    'PointControle'                                         => 'Points de contrôle',
+    'Echantillonnage'                                       => 'Échantillonnages',
+    'PasEchantillonnage'                                    => 'Pas de temps',
+    'LigneCalcul'                                           => 'Lignes de calculs',
+    'Bareme'                                                => 'Barèmes',
+    'PeriodeValidite'                                       => 'Périodes de validité',
+    'Plage'                                                 => 'Plages',
+    'Qualite'                                               => 'Qualités',
+    'JeuQualite'                                            => 'Jeux de qualités',
+    'Bassin'                                                => 'Bassins',
+    'CoursEau'                                              => "Cours d'eau",
+    'TauxRemplissage'                                       => 'Taux de remplissage',
+    'DataSet'                                               => 'Jeux de données',
+    'DataConstraint'                                        => 'Contraintes données',
+    'CriteriaGeology'                                       => 'Critères géologiques',
+    'CriteriaClimat'                                        => 'Critères climatiques',
+    'InspireTheme'                                          => 'Thèmes INSPIRE',
+    'TopicCategory'                                         => 'Catégories Thématiques INSPIRE',
+    'TypeFunding'                                           => 'Types de financeurs',
+    'TheiaCategories'                                       => 'Correspondances TheiaCategories',
+    'ContactOrganisationRole'                               => 'Roles des Organisations',
+    'RolePersonneTheia'                                     => 'Roles des Personnes',
+    'PersonneTheia'                                         => 'Personnes pour Theia',
+    'Milieu'                                                => 'Milieux',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.en.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..56de8f513321cb791a7dd37a57c786bb7cadb632
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.en.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'Observatory',
+    'Doi'                                                   => 'DOI',
+    'Partenaire'                                            => 'Partner',
+    'SiteExperimental'                                      => 'Experimental site',
+    'Station'                                               => 'Station',
+    'Chronique'                                             => 'Time series',
+    'ChroniqueDiscontinue'                                  => 'Discontinuous time series',
+    'ChroniqueContinue'                                     => 'Continuous time series',
+    'ChroniqueCalculee'                                     => 'Calculated time series',
+    'ChroniqueConvertie'                                    => 'Converted time series',
+    'Commune'                                               => 'Town',
+    'FamilleParametres'                                     => 'Parameter category',
+    'TypeParametre'                                         => 'Parameter type',
+    'Unite'                                                 => 'Unit',
+    'Mesure'                                                => 'Data point',
+    'PointControle'                                         => 'Checkpoint',
+    'Echantillonnage'                                       => 'Sampling',
+    'PasEchantillonnage'                                    => 'Time step',
+    'LigneCalcul'                                           => 'Calculation line',
+    'Bareme'                                                => 'Scale',
+    'PeriodeValidite'                                       => 'Validity period',
+    'Plage'                                                 => 'Range',
+    'Qualite'                                               => 'Quality',
+    'JeuQualite'                                            => 'Set of qualities',
+    'Bassin'                                                => 'Basin',
+    'CoursEau'                                              => 'River',
+    'TauxRemplissage'                                       => 'Data completeness',
+    'DataSet'                                               => 'Dataset',
+    'Milieu'                                                => 'Environment',
+    'DataConstraint'                                        => 'Data Constraint',
+    'CriteriaGeology'                                       => 'Criteria Geology',
+    'CriteriaClimat'                                        => 'Criteria Climat',
+    'InspireTheme'                                          => 'INSPIRE Theme',
+    'TopicCategory'                                         => 'INSPIRE Topic Category',
+    'TypeFunding'                                           => 'Type Funding',
+    'ContactOrganisationRole'                               => 'Organisations Role',
+    'RolePersonneTheia'                                     => 'User Theia/OZCAR Role',
+    'PersonneTheia'                                         => 'Theia User',
+    'TheiaCategories'                                       => 'Correspondance TheiaCategories',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c98cc64cd798086061737a5554f300b140af642
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingulars.fr.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'Observatoire',
+    'Doi'                                                   => 'DOI',
+    'Partenaire'                                            => 'Partenaire',
+    'SiteExperimental'                                      => 'Site expérimental',
+    'Station'                                               => 'Station',
+    'Chronique'                                             => 'Chronique',
+    'ChroniqueDiscontinue'                                  => 'Chronique discontinue',
+    'ChroniqueContinue'                                     => 'Chronique continue',
+    'ChroniqueCalculee'                                     => 'Chronique calculée',
+    'ChroniqueConvertie'                                    => 'Chronique convertie',
+    'Commune'                                               => 'Commune',
+    'FamilleParametres'                                     => 'Famille de paramètres',
+    'TypeParametre'                                         => 'Type de paramètre',
+    'Unite'                                                 => 'Unité',
+    'Mesure'                                                => 'Mesure',
+    'PointControle'                                         => 'Point de contrôle',
+    'Echantillonnage'                                       => 'Échantillonnage',
+    'PasEchantillonnage'                                    => 'Pas de temps',
+    'LigneCalcul'                                           => 'Ligne de calculs',
+    'Bareme'                                                => 'Barème',
+    'PeriodeValidite'                                       => 'Période de validité',
+    'Plage'                                                 => 'Plage',
+    'Qualite'                                               => 'Qualité',
+    'JeuQualite'                                            => 'Jeu de qualités',
+    'Bassin'                                                => 'Bassin',
+    'CoursEau'                                              => "Cours d'eau",
+    'TauxRemplissage'                                       => 'Taux de remplissage',
+    'DataSet'                                               => 'Jeu de données',
+    'DataConstraint'                                        => 'Contrainte données',
+    'CriteriaGeology'                                       => 'Critère géologique',
+    'CriteriaClimat'                                        => 'Critère climatique',
+    'InspireTheme'                                          => 'Thème INSPIRE',
+    'TopicCategory'                                         => 'Catégorie de Thématiques INSPIRE',
+    'TypeFunding'                                           => 'Type de financeurs',
+    'ContactOrganisationRole'                               => 'Role des Organisations',
+    'RolePersonneTheia'                                     => 'Role des Personnes',
+    'PersonneTheia'                                         => 'Personne pour Theia/OZCAR',
+    'Milieu'                                                => 'Milieu',
+    'TheiaCategories'                                       => 'Connection TheiaCategories',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.en.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfee074fd64d5a86e0eaa9630daafcd272a20d34
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.en.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'an',
+    'Doi'                                                   => 'a',
+    'Partenaire'                                            => 'a',
+    'SiteExperimental'                                      => 'an',
+    'Station'                                               => 'a',
+    'Chronique'                                             => 'a',
+    'ChroniqueDiscontinue'                                  => 'a',
+    'ChroniqueContinue'                                     => 'a',
+    'ChroniqueCalculee'                                     => 'a',
+    'ChroniqueConvertie'                                    => 'a',
+    'Commune'                                               => 'a',
+    'FamilleParametres'                                     => 'a',
+    'TypeParametre'                                         => 'a',
+    'Unite'                                                 => 'a',
+    'Mesure'                                                => 'a',
+    'PointControle'                                         => 'a',
+    'Echantillonnage'                                       => 'a',
+    'PasEchantillonnage'                                    => 'a',
+    'LigneCalcul'                                           => 'a',
+    'Bareme'                                                => 'a',
+    'PeriodeValidite'                                       => 'a',
+    'Plage'                                                 => 'a',
+    'Qualite'                                               => 'a',
+    'JeuQualite'                                            => 'a',
+    'Bassin'                                                => 'a',
+    'CoursEau'                                              => 'a',
+    'TauxRemplissage'                                       => 'a',
+    'DataSet'                                               => 'a',
+    'Milieu'                                                => 'an',
+    'DataConstraint'                                        => 'a',
+    'CriteriaGeology'                                       => 'a',
+    'CriteriaClimat'                                        => 'a',
+    'InspireTheme'                                          => 'an',
+    'TopicCategory'                                         => 'a',
+    'TypeFunding'                                           => 'a',
+    'ContactOrganisationRole'                               => 'a',
+    'RolePersonneTheia'                                     => 'a',
+    'PersonneTheia'                                         => 'a',
+    'TheiaCategories'                                       => 'a',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..bab5550698b8e1741ce5752d5eef604ab202a84a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsArticles.fr.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'un',
+    'Doi'                                                   => 'un',
+    'Partenaire'                                            => 'un',
+    'SiteExperimental'                                      => 'un',
+    'Station'                                               => 'une',
+    'Chronique'                                             => 'une',
+    'ChroniqueDiscontinue'                                  => 'une',
+    'ChroniqueContinue'                                     => 'une',
+    'ChroniqueCalculee'                                     => 'une',
+    'ChroniqueConvertie'                                    => 'une',
+    'Commune'                                               => 'une',
+    'FamilleParametres'                                     => 'une',
+    'TypeParametre'                                         => 'un',
+    'Unite'                                                 => 'une',
+    'Mesure'                                                => 'une',
+    'PointControle'                                         => 'un',
+    'Echantillonnage'                                       => 'un',
+    'PasEchantillonnage'                                    => 'un',
+    'LigneCalcul'                                           => 'une',
+    'Bareme'                                                => 'un',
+    'PeriodeValidite'                                       => 'une',
+    'Plage'                                                 => 'une',
+    'Qualite'                                               => 'une',
+    'JeuQualite'                                            => 'un',
+    'Bassin'                                                => 'un',
+    'CoursEau'                                              => 'un',
+    'TauxRemplissage'                                       => 'un',
+    'DataSet'                                               => 'un',
+    'Milieu'                                                => 'un',
+    'DataConstraint'                                        => 'une',
+    'CriteriaGeology'                                       => 'un',
+    'CriteriaClimat'                                        => 'un',
+    'InspireTheme'                                          => 'un',
+    'TopicCategory'                                         => 'une',
+    'TypeFunding'                                           => 'un',
+    'ContactOrganisationRole'                               => 'un',
+    'RolePersonneTheia'                                     => 'un',
+    'PersonneTheia'                                         => 'un',
+    'TheiaCategories'                                       => 'une',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..9940cbc8acf3b461815377191db7532db060f838
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => 'of the ',
+    'Doi'                                                   => 'of the ',
+    'Partenaire'                                            => 'of the ',
+    'SiteExperimental'                                      => 'of the ',
+    'Station'                                               => 'of the ',
+    'Chronique'                                             => 'of the ',
+    'ChroniqueDiscontinue'                                  => 'of the ',
+    'ChroniqueContinue'                                     => 'of the ',
+    'ChroniqueCalculee'                                     => 'of the ',
+    'ChroniqueConvertie'                                    => 'of the ',
+    'Commune'                                               => 'of the ',
+    'FamilleParametres'                                     => 'of the ',
+    'TypeParametre'                                         => 'of the ',
+    'Unite'                                                 => 'of the ',
+    'Mesure'                                                => 'of the ',
+    'PointControle'                                         => 'of the ',
+    'Echantillonnage'                                       => 'of the ',
+    'PasEchantillonnage'                                    => 'of the ',
+    'LigneCalcul'                                           => 'of the ',
+    'Bareme'                                                => 'of the ',
+    'PeriodeValidite'                                       => 'of the ',
+    'Plage'                                                 => 'of the ',
+    'Qualite'                                               => 'of the ',
+    'JeuQualite'                                            => 'of the ',
+    'Bassin'                                                => 'of the ',
+    'CoursEau'                                              => 'of the ',
+    'TauxRemplissage'                                       => 'of the ',
+    'DataSet'                                               => 'of the ',
+    'Milieu'                                                => 'of the ',
+    'DataConstraint'                                        => 'of the ',
+    'CriteriaGeology'                                       => 'of the ',
+    'CriteriaClimat'                                        => 'of the ',
+    'InspireTheme'                                          => 'of the ',
+    'TopicCategory'                                         => 'of the ',
+    'TypeFunding'                                           => 'of the ',
+    'ContactOrganisationRole'                               => 'of the ',
+    'RolePersonneTheia'                                     => 'of the ',
+    'PersonneTheia'                                         => 'of the ',
+    'TheiaCategories'                                       => 'of the ',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..711b8c7dcc953f3882169ae4db622bfd281b6a5a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire'                                          => "de l'",
+    'Doi'                                                   => 'du ',
+    'Partenaire'                                            => 'du ',
+    'SiteExperimental'                                      => 'du ',
+    'Station'                                               => 'de la ',
+    'Chronique'                                             => 'de la ',
+    'ChroniqueDiscontinue'                                  => 'de la ',
+    'ChroniqueContinue'                                     => 'de la ',
+    'ChroniqueCalculee'                                     => 'de la ',
+    'ChroniqueConvertie'                                    => 'de la ',
+    'Commune'                                               => 'de la ',
+    'FamilleParametres'                                     => 'de la ',
+    'TypeParametre'                                         => 'du ',
+    'Unite'                                                 => "de l'",
+    'Mesure'                                                => 'de la ',
+    'PointControle'                                         => 'du ',
+    'Echantillonnage'                                       => "de l'",
+    'PasEchantillonnage'                                    => 'du ',
+    'LigneCalcul'                                           => 'de la ',
+    'Bareme'                                                => 'du ',
+    'PeriodeValidite'                                       => 'de la ',
+    'Plage'                                                 => 'de la ',
+    'Qualite'                                               => 'de la ',
+    'JeuQualite'                                            => 'du ',
+    'Bassin'                                                => 'du ',
+    'CoursEau'                                              => 'du ',
+    'TauxRemplissage'                                       => 'du ',
+    'DataSet'                                               => 'du ',
+    'Milieu'                                                => 'du ',
+    'DataConstraint'                                        => 'du ',
+    'CriteriaGeology'                                       => 'du ',
+    'CriteriaClimat'                                        => 'du ',
+    'InspireTheme'                                          => 'du ',
+    'TopicCategory'                                         => 'de la ',
+    'TypeFunding'                                           => 'du ',
+    'ContactOrganisationRole'                               => 'du ',
+    'RolePersonneTheia'                                     => 'du ',
+    'PersonneTheia'                                         => 'de la ',
+    'TheiaCategories'                                       => 'de la ',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/fields.en.php b/src/Irstea/BdohDataBundle/Resources/translations/fields.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..78774ff8c7d1eb91f92cc043b4455761406ed4d3
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/fields.en.php
@@ -0,0 +1,223 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    /* Common fields */
+    'code'                             => 'Code',
+    'chronique(s)'                     => 'Time series',
+    'description'                      => 'Description',
+    'descriptionEn'                    => 'Description (english)',
+    'file'                             => 'File',
+    'fileLogo'                         => 'Logo',
+    'format'                           => 'Format',
+    'id'                               => 'Id.',
+    'libelle'                          => 'Label',
+    'libelleEn'                        => 'Label (english)',
+    'lien'                             => 'Web site',
+    'nom'                              => 'Name',
+    'nomEn'                            => 'Name (english)',
+    'timezone'                         => 'Time zone',
+    'stationExutoire'                  => 'Outlet station',
+    'noboby'                           => 'N.A.',
+    'utilisateur'                      => 'BDOH User',
+
+    /* Baremes */
+    'uniteEntree'                      => 'Input unit',
+    'uniteSortie'                      => 'Output unit',
+
+    /* Bassins */
+    'surface'                          => 'Area (m²)',
+
+    /* CoursEau */
+    'observatoires'                    => 'Observatories',
+    'codeHydro'                        => 'Hydro code',
+    'classifica'                       => 'Strahler number',
+
+    /* Theia categories*/
+    'milieu'                           => 'Environment',
+    'familleParametre'                 => 'Parameter categories',
+    'uriOzcarTheia'                    => 'Theia/Ozcar thesaurus',
+
+    /* Dataset */
+    'dataSet'                          => 'Dataset',
+    'dataset'                          => 'Dataset',
+    'dataSets'                         => 'Datasets',
+    'chroniques'                       => 'Chronicles',
+
+    /* Observatoire */
+    'fileConditionsUtilisation'                  => 'Terms of use',
+    'partenaires'                                => 'Partners',
+    'partenaire'                                 => 'Partner',
+    'jeu'                                        => 'Quality codes',
+    'financeur'                                  => 'Fundings',
+    'couleurPrimaire'                            => 'Primary color',
+    'couleurSecondaire'                          => 'Secondary color',
+    'filePhotoPrincipale'                        => 'Picture n°1',
+    'filePhotoSecondaire'                        => 'Picture n°2',
+    'theiaCode'                                  => 'Theia/OZCAR Identifier',
+    'theiaPassword'                              => 'Theia/OZCAR Password',
+
+    /* Partenaire */
+    'typeFundings'                      => 'Type of Fundings/Organisations',
+    'scanR'                             => 'ScanR Identifier (if Country = FRANCE)',
+    'iso'                               => 'Country',
+    'estFinanceur'                      => 'He is a funding ?',
+    'roleOrgansation'                   => 'Organisation role',
+    'Pays'                              => 'Country',
+
+    /* DOI */
+    'identifiant'                      => 'Identifier',
+
+    /* SiteExperimental */
+    'observatoire'                     => 'Observatory',
+
+    /* DataSet */
+    'titre'                               => 'Title',
+    'titreEn'                             => 'Title (english)',
+    'dataConstraint'                      => 'Data Constraint',
+    'topicCategories'                     => 'INSPIRE Topic Categories',
+    'inspireTheme'                        => 'INSPIRE Theme',
+    'portailSearchCriteriaGeology'        => 'Criteria Geology',
+    'portailSearchCriteriaClimat'         => 'Criteria Climat',
+    'dataManagers'                        => 'Data Manager',
+    'principalInvestigators'              => 'Principal Investigator',
+    'dataCollectors'                      => 'Data Collector',
+    'projectMembers'                      => 'Project Member',
+    'doi'                                 => 'DOI',
+    'keywords'                            => 'KeyWords',
+    'contact'                             => 'Contact',
+    'info'                                => 'Major Information',
+
+    /* Station */
+    'codeAlternatif'                     => 'Alternative code',
+    'altitude'                           => 'Altitude (m)',
+    'commune'                            => 'Town',
+    'sites'                              => 'Experimental sites',
+    'commentaire'                        => 'Comment',
+    'commentaireEn'                      => 'Comment (english)',
+    'bassin'                             => 'Basin',
+    'sousBassin'                         => 'Sub-basin',
+    'coursEau'                           => 'River',
+    'onBassin'                           => 'Basin',
+    'onCoursEau'                         => 'River',
+    'estActive'                          => 'Active?',
+    'station.estActive'                  => 'Active station',
+
+    /* Chronique */
+    'chronique.code'                   => 'Time series code',
+    'estVisible'                       => 'Is visible?',
+    'minimumValide'                    => 'Valid minimum',
+    'maximumValide'                    => 'Valid maximum',
+    'parametre'                        => 'Parameter',
+    'station'                          => 'Station',
+    'stations'                         => 'Stations',
+    'genealogie'                       => 'Genealogy',
+    'genealogieEn'                     => 'Genealogy (english)',
+    'unite'                            => 'Unit',
+    'producteur'                       => 'Producer (Partners)',
+    'measures'                         => 'Data',
+    'measuresShort'                    => 'Data',
+    'allowValueLimits'                 => 'This time series may contain limits of quantification / detection (lq/ld)',
+    'valueLimitTransformationType'     => 'Transformation of quantification / detection limits',
+    'valueLimitPlaceholder'            => 'Placeholder value',
+    'chronique.lq_ld'                  => [
+        'forced_allow_already_present' => 'This field cannot be edited because this time series already contains lq/ld.',
+        'legacy_parent_time_series'    => 'This field cannot be edited on converted time series, it is derectly inherited from the parent time series during the conversion.',
+        'legacy_and_already_present'   => 'This field cannot be edited on converted time series, it is derectly inherited from the parent time series during the conversion. Besides, this time series already contains lq/ld.',
+        'options'                      => [
+            'true_value'               => 'Use the original values',
+            'half_value'               => 'Divide the values by 2',
+            'placeholder'              => 'Use a placeholder value',
+            'gap'                      => 'Process as invalid data',
+        ],
+    ],
+
+    /* ChroniqueContinue */
+    'echantillonnage'                  => 'Sampling',
+    'exportsLicites'                   => 'Allowed download types',
+    'directionMesure'                  => 'Time ranges covered by data',
+    'period.ahead'                     => 'ahead',
+    'period.backward'                  => 'past',
+    'echantillonnagesSortieLicites'    => 'Allowed download types at regular time step',
+    'optionsEchantillonnageSortie'     => 'Allowed time steps for download of mean and cumulative values',
+    'uniteCumul'                       => 'Unit for acccumulations',
+
+    /* ChroniqueCalculee */
+    'CalculChroniques'                 => 'Time series calculation',
+
+    /* ChroniqueConvertie */
+    'ConversionChroniques'             => 'Time series conversion',
+
+    /* Commune */
+    'departement'                      => 'County',
+    'codePostal'                       => 'Zip code',
+    'codeInsee'                        => 'INSEE code',
+    'latitude'                         => 'Geo. coord. (X)',
+    'longitude'                        => 'Geo. coord. (Y)',
+
+    /* FamilleParametres */
+    'prefix'                           => 'Prefix',
+    'familleParente'                   => 'Parent category',
+
+    /* TypeParametre */
+    'familleParametres'                => 'Parameter category',
+    'unites'                           => 'Valid units',
+
+    /* JeuQualite */
+    'estAffectable'                    => 'Assignable to an observatory',
+    'qualites'                         => 'Qualities',
+
+    /* Mesure and Plage */
+    'date'                             => 'Date',
+    'debut'                            => 'Start',
+    'fin'                              => 'End',
+    'valeur'                           => 'Value',
+    'qualite'                          => 'Quality',
+    'minimum'                          => 'Minimum',
+    'maximum'                          => 'Maximum',
+
+    /* Transformation */
+    'coefficientMultiplicateur'        => 'Multiplying coefficient',
+    'miseAJour'                        => 'Update',
+    'dateCreation'                     => 'Creation date',
+
+    /* Ponctuation */
+    'deux_points'                      => ':',
+    'point_virgule'                    => ';',
+    'point_interogation'               => '?',
+    'point_exclamation'                => '!',
+    'open_quote'                       => "“\u{a0}",
+    'close_quote'                      => "\u{a0}”",
+
+    /* Date Formats */
+    'formatDate'                       => 'd-m-Y',
+    'formatDateTime'                   => 'd-m-Y H:i:s',
+    'formatDateTimeJS'                 => 'DD-MM-YYYY HH:mm:ss',
+    'dateSeparator'                    => '-',
+    'dateDayShort'                     => 'd',
+    'oneHour'                          => '1 hour',
+    'oneDay'                           => '1 day',
+    'nSeconds(%n%)'                    => '%n% seconds',
+    'jour'                             => 'day|days',
+    'heure'                            => 'hour|hours',
+    'minute'                           => 'minute|minutes',
+    'seconde'                          => 'second|seconds',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/fields.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/fields.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..746c6bf274302b388f8d288b6b3b72a7351e23a6
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/fields.fr.php
@@ -0,0 +1,226 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    /* Common fields */
+    'code'                             => 'Code',
+    'chronique(s)'                     => 'Chronique|Chroniques',
+    'description'                      => 'Description',
+    'descriptionEn'                    => 'Description (anglais)',
+    'file'                             => 'Fichier',
+    'fileLogo'                         => 'Logo',
+    'format'                           => 'Format',
+    'id'                               => 'Id.',
+    'libelle'                          => 'Libellé',
+    'libelleEn'                        => 'Libellé (anglais)',
+    'lien'                             => 'Adresse web',
+    'nom'                              => 'Nom',
+    'nomEn'                            => 'Nom (anglais)',
+    'timezone'                         => 'Fuseau horaire',
+    'stationExutoire'                  => 'Station exutoire',
+    'personneTheia'                    => 'Personne Theia',
+    'rolePersonneTheia'                => 'Rôle de la Personne Theia',
+    'utilisateur'                      => 'Utilisateur BDOH',
+    'chronique'                        => 'Chronique',
+
+    /* Partenaire */
+    'typeFundings'                      => 'Type de financeur/organisation',
+    'scanR'                             => 'Identifiant ScanR (si Pays = FRANCE)',
+    'iso'                               => 'Pays',
+    'estFinanceur'                      => 'Est-il un financeur ?',
+    'roleOrgansation'                   => "Rôle de l'organisme",
+
+    /* DataSet */
+    'titre'                               => 'Titre',
+    'titreEn'                             => 'Titre (anglais)',
+    'dataConstraint'                      => 'Data Constraint',
+    'topicCategories'                     => 'Catégories thématiques INSPIRE',
+    'inspireTheme'                        => 'Thème INSPIRE',
+    'portailSearchCriteriaGeology'        => 'Critères Géologiques',
+    'portailSearchCriteriaClimat'         => 'Critères Climatiques',
+    'dataManagers'                        => 'Data Managers',
+    'principalInvestigators'              => 'Principal Investigators',
+    'dataCollectors'                      => 'Data Collectors',
+    'projectMembers'                      => 'Project Members',
+    'doi'                                 => 'DOI',
+    'keywords'                            => 'Mots Clés',
+    'contact'                             => 'Contacts',
+    'info'                                => 'Informations Principales',
+
+    /* Baremes */
+    'uniteEntree'                      => "Unité d'entrée",
+    'uniteSortie'                      => 'Unité de sortie',
+
+    /* Bassins */
+    'surface'                          => 'Superficie (m²)',
+
+    /* CoursEau */
+    'observatoires'                    => 'Observatoires',
+    'codeHydro'                        => 'Code hydro',
+    'classifica'                       => 'Nombre de Strahler',
+
+    /* Observatoire */
+    'fileConditionsUtilisation'                  => "Conditions d'utilisation",
+    'partenaires'                                => 'Partenaires',
+    'partenaire'                                 => 'Partenaire',
+    'jeu'                                        => 'Codes qualité',
+    'couleurPrimaire'                            => 'Couleur primaire',
+    'couleurSecondaire'                          => 'Couleur secondaire',
+    'filePhotoPrincipale'                        => 'Photo n°1',
+    'filePhotoSecondaire'                        => 'Photo n°2',
+    'theiaCode'                                  => 'Identifiant Theia/OZCAR',
+    'theiaPassword'                              => 'Mot de passe Theia/OZCAR',
+    'projectLeader'                              => 'Project Leader',
+    'dataSets'                                   => 'Jeux de données',
+    'dataSet'                                    => 'Jeu(x) de données',
+    'doiPrincipal'                               => 'DOI principal',
+
+    /* Theia categories*/
+    'milieu'                           => 'Milieu',
+    'familleParametre'                 => 'Famille de paramètre',
+    'uriOzcarTheia'                    => 'Variable du thesaurus Theia/Ozcar',
+
+    /* DOI */
+    'identifiant'                      => 'Identifiant',
+
+    /* SiteExperimental */
+    'observatoire'                     => 'Observatoire',
+
+    /* Station */
+    'codeAlternatif'                   => 'Code alternatif',
+    'altitude'                         => 'Altitude (m)',
+    'commune'                          => 'Commune',
+    'sites'                            => 'Sites expérimentaux',
+    'commentaire'                      => 'Commentaire',
+    'commentaireEn'                    => 'Commentaire (anglais)',
+    'bassin'                           => 'Bassin',
+    'sousBassin'                       => 'Sous-bassin',
+    'coursEau'                         => "Cours d'eau",
+    'onBassin'                         => 'Bassin',
+    'onCoursEau'                       => "Cours d'eau",
+    'estActive'                        => 'En activité ?',
+    'station.estActive'                => 'Station en activité',
+
+    /* Chronique */
+    'dataset'                                               => 'Jeu de données',
+    'chronique.code'                                        => 'Code chronique',
+    'estVisible'                                            => 'Est visible ?',
+    'minimumValide'                                         => 'Minimum valide',
+    'maximumValide'                                         => 'Maximum valide',
+    'dateDebutMesures'                                      => 'Début des mesures',
+    'dateFinMesures'                                        => 'Fin des mesures',
+    'parametre'                                             => 'Paramètre',
+    'parametre.familleParametres'                           => 'Famille Paramètre',
+    'station'                                               => 'Station',
+    'stations'                                              => 'Stations',
+    'station.sites'                                         => 'Site',
+    'genealogie'                                            => 'Généalogie',
+    'genealogieEn'                                          => 'Généalogie (en anglais)',
+    'unite'                                                 => 'Unité',
+    'producteur'                                            => 'Producteur (Partenaire)',
+    'measures'                                              => 'Nb mesures',
+    'measuresShort'                                         => 'Mesures',
+    'allowValueLimits'                                      => 'Cette chronique peut contenir des des limites de quantification et de détection (lq/ld)',
+    'valueLimitTransformationType'                          => 'Transformation des limites de quantification / détection',
+    'valueLimitPlaceholder'                                 => 'Valeur de remplacement',
+    'chronique.lq_ld'                                       => [
+        'forced_allow_already_present' => 'Ce champ ne peut pas être édité car cette chronique contient déjà des lq/ld.',
+        'legacy_parent_time_series'    => "Pour les chroniques converties ce champ n'est pas éditable, il est directement hérité de la chronique mère à chaque conversion.",
+        'legacy_and_already_present'   => "Pour les chroniques converties ce champ n'est pas éditable, il est directement hérité de la chronique mère à chaque conversion. De plus cette chronique contient déjà des lq/ld.",
+        'options'                      => [
+            'true_value'               => "Utiliser les valeurs d'origine",
+            'half_value'               => 'Diviser les valeurs par 2',
+            'placeholder'              => 'Remplacer par une valeur constante',
+            'gap'                      => 'Traiter comme des mesures invalides',
+        ],
+    ],
+
+    /* ChroniqueContinue */
+    'echantillonnage'                  => 'Échantillonnage',
+    'exportsLicites'                   => 'Exports licites',
+    'directionMesure'                  => 'Période couverte par les mesures',
+    'period.ahead'                     => 'à venir',
+    'period.backward'                  => 'écoulée',
+    'echantillonnagesSortieLicites'    => "Types d'export permis à pas de temps fixe",
+    'optionsEchantillonnageSortie'     => 'Pas de temps permis pour exports de moyennes et cumuls',
+    'uniteCumul'                       => 'Unité pour les cumuls',
+
+    /* ChroniqueCalculee */
+    'CalculChroniques'                 => 'Calcul de chroniques',
+
+    /* ChroniqueConvertie */
+    'ConversionChroniques'             => 'Conversion de chroniques',
+
+    /* Commune */
+    'departement'                      => 'Département',
+    'codePostal'                       => 'Code postal',
+    'codeInsee'                        => 'Code INSEE',
+    'latitude'                         => 'Coord. géo. (X)',
+    'longitude'                        => 'Coord. géo. (Y)',
+
+    /* FamilleParametres */
+    'prefix'                           => 'Préfixe',
+    'familleParente'                   => 'Famille mère',
+
+    /* TypeParametre */
+    'familleParametres'                => 'Famille de paramètres',
+    'unites'                           => 'Unités valides',
+
+    /* JeuQualite */
+    'estAffectable'                    => 'Affectable à un observatoire',
+    'qualites'                         => 'Qualités',
+
+    /* Mesure and Plage */
+    'date'                             => 'Date',
+    'debut'                            => 'Début',
+    'fin'                              => 'Fin',
+    'valeur'                           => 'Valeur',
+    'qualite'                          => 'Qualité',
+    'minimum'                          => 'Minimum',
+    'maximum'                          => 'Maximum',
+
+    /* Transformation */
+    'coefficientMultiplicateur'        => 'Coefficient multiplicateur',
+    'miseAJour'                        => 'Mise à jour',
+    'dateCreation'                     => 'Date de création',
+
+    /* Ponctuation */
+    'deux_points'                      => ' :',
+    'point_virgule'                    => ' ;',
+    'point_interogation'               => ' ?',
+    'point_exclamation'                => ' !',
+    'open_quote'                       => "«\u{a0}",
+    'close_quote'                      => "\u{a0}»",
+
+    /* Date Formats */
+    'formatDate'                       => 'd/m/Y',
+    'formatDateTime'                   => 'd/m/Y H:i:s',
+    'formatDateTimeJS'                 => 'DD/MM/YYYY HH:mm:ss',
+    'dateSeparator'                    => '/',
+    'dateDayShort'                     => 'j',
+    'oneHour'                          => '1 heure',
+    'oneDay'                           => '1 jour',
+    'nSeconds(%n%)'                    => '%n% secondes',
+    'jour'                             => 'jour|jours',
+    'heure'                            => 'heure|heures',
+    'minute'                           => 'minute|minutes',
+    'seconde'                          => 'seconde|secondes',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/messages.en.php b/src/Irstea/BdohDataBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..accb4bcfd9db88f220ef3f8592741520d8ec2aa6
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/messages.en.php
@@ -0,0 +1,264 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$entities = require __DIR__ . '/entitiesSingulars.en.php';
+$fields = require __DIR__ . '/fields.en.php';
+
+/*************************************************
+ * 'CHRONIQUE' TYPES
+ ************************************************/
+
+$chroniqueTypes = [
+    'chronique.type.continue'    => 'Continuous time series',
+    'chronique.type.discontinue' => 'Discontinuous time series',
+    'chronique.type.calculee'    => 'Calculated time series',
+    'chronique.type.convertie'   => 'Converted time series',
+    'type.continue'              => 'continuous',
+    'type.discontinue'           => 'discontinuous',
+    'type.calculee'              => 'calculated',
+    'type.convertie'             => 'converted',
+];
+
+/*************************************************
+ * FILE FORMATS
+ ************************************************/
+
+$fileFormats = [
+    'export' => [
+        'Bdoh'      => 'BDOH',
+        'Qtvar'     => 'Hydro2 - QTVAR',
+        'Vigilance' => 'Vigilance',
+    ],
+];
+
+/*************************************************
+ * EXPORTS
+ ************************************************/
+
+$export = [
+    'measure.export'  => [
+        'title'        => '[0,1] Download this time series | ]1,Inf] Download the time series',
+        'help'         => 'Help',
+        'help-title'   => 'Help - Download time series',
+        'help-content' => <<<HELP
+<ul>
+    <li>The time zone for the selection of start/end dates and hours is UTC.</li>
+    <li>The default option for download is "identical time step":
+        <ul>
+            <li>the original time step of the time series is conserved (it is potentially variable)</li>
+            <li>several time series belonging to a same station can be downloaded at the same time</li>
+            <li>the file is directly downloaded from BDOH without any size restriction.</li>
+        </ul>
+    </li>
+    <li>Some time series can be downloaded with an option for fixed time step calculation (using linear interpolation, mean calculation or sum calculation):</li>
+    <ul>
+        <li>only one time series can be downloaded at a time</li>
+        <li>in order not to block the server, each download is limited to a maximum span of 2 years per minute of time step, i.e. 1051200 values (~ 10<sup>6</sup> lines)</li>
+        <li>if a calculation is needed on a longer span, the download must be performed onto a series of smaller spans</li>
+        <li>data are sent by e-mail as attached file</li>
+        <li>the options for fiexed time step calculation are: (i) for linear interpolation, a time step between 1 and 1440 minutes; (ii) for mean and sum calculations, one of the time steps available in the drop-down list. The interpolated values start at a round time. Option “\u{a0}event\u{a0}” calculates the mean or sum of the values in the time range of the event (1 output value).</li>
+    </ul>
+    <li>One separate file is downloaded for each time series.</li>
+    <li>For downloads of continuous time series with identical time step or linear interpolation, several file formats are available (BDOH standard or Hydro2 QTVAR).</li>
+    <li>For fix time steps with mean/sum calculation options, the only possible file format is "BDOH discontinu".</li>
+</ul>
+HELP
+        ,
+        'underway'     => 'The download of the time series is underway. You will shortly receive the result by e-mail.',
+        'error'        => [
+            'abort'                               => "For technical reasons the download couldn't be achieved.",
+            'badExportType'                       => 'Download of the time series: incorrect time step for extraction.',
+            'badTimeStep'                         => 'Download of the time series: incorrect time step.',
+            'badTimeStep(%min%, %max%)'           => 'Download of the time series: the time step must be between %min% and %max%.',
+            'badTimeStepForExportType'            => 'Download of the time series: incorrect time step for this extraction type.',
+            'badTimezone'                         => 'Download of the time series: incorrect time zone.',
+            'badBeginDate'                        => 'Download of the time series: incorrect start date.',
+            'badCumulStartTime'                   => 'Download of the time series: bad start time of accumulations.',
+            'badEndDate'                          => 'Download of the time series: incorrect end date.',
+            'badFormat'                           => 'Download of the time series: incorrect format.',
+            'noChronique'                         => 'Download of the time series: no selected time series.',
+            'badChronique(%chroniqueId%)'         => "The time series %chroniqueId% does not exist or is not available.\n",
+            'isNotSupported(%chronique%, Plage)'  => "The continuous time series “\u{a0}%chronique%\u{a0}” can not be downloaded with this format.\n",
+            'isNotSupported(%chronique%, Mesure)' => "The discontinuous time series “\u{a0}%chronique%\u{a0}” can not be downloaded with this format.\n",
+            'measureDirectionNotSpecified'        => 'Choice of dates for extraction (at the beginning or end of time intervals) not specified.',
+            'timeStepNotSpecified'                => 'Time step not specified.',
+            'noStartingTime'                      => 'Please specify at which type of instant the extracted data must start.',
+        ],
+        'job_queued(%job_id%)' => 'The download of the time series is underway. You will shortly receive the result by e-mail. (Job #%job_id%)',
+        'report'               => [
+            'headline' => [
+                '1(%format%, %date%)' => "Download from %date% UTC in the format “\u{a0}%format%\u{a0}”",
+                '2(%begin%, %end%)'   => 'Requested period: from %begin% UTC to %end% UTC',
+                '3(%timezone%)'       => 'Timezone: %timezone% ',
+            ],
+
+            'chronique(%chronique%)' => "Time series “\u{a0}%chronique%\u{a0}”:",
+
+            'chroniqueCalculee(%chronique%)' => "Calculated time series “\u{a0}%chronique%\u{a0}”:",
+
+            'measures(%number%,%first%,%last%)' => '[0,0]No data points found|' .
+                '[1,1]One data point found|' .
+                ']1,Inf]%number% data points found, from %first% to %last%',
+
+            'file(%file%)' => 'File: %file%',
+
+            'doi' => [
+                'header(%observatoire%)'    => "DOI related to the observatory “\u{a0}%observatoire%\u{a0}”:",
+                'item(%doi%,%description%}' => 'dx.doi.org/%doi% [ %description% ]',
+            ],
+
+            'resampled' => [
+                'header'                   => 'Download made with fixed time steps',
+                'type(%type%)'             => 'Sampling type: %type%',
+                'timestep'                 => 'Time step:',
+                'timestep-var(%timestep%)' => '[0,1]%timestep% minute|]1,Inf]%timestep% minutes',
+                'count(%count%)'           => '[0,0]No data points extracted|' .
+                    '[1,1]One data point extracted|' .
+                    ']1,Inf]%count% data points extracted',
+                'types'                    => [
+                    'instantaneous' => 'linear interpolation',
+                    'mean'          => 'mean',
+                    'cumulative'    => 'accumulation',
+                ],
+            ],
+
+            'chronique.lq_ld'               => [
+                'options'                      => [
+                    'true_value'  => 'use of the original values',
+                    'half_value'  => 'values divided by 2',
+                    'placeholder' => 'values replaced by the placeholder value ',
+                    'gap'         => 'values processed as invalid data',
+                ],
+            ],
+
+            'calculated' => [
+                'input'                       => [
+                    'unique(%chronique%)'     => "Single parent time series: “\u{a0}%chronique%\u{a0}”",
+                    'first(%chronique%)'      => "First parent time series: “\u{a0}%chronique%\u{a0}”",
+                    'second(%chronique%)'     => "Second parent time series: “\u{a0}%chronique%\u{a0}”",
+                ],
+                'limit_policy(%limitPolicy%)' => 'Transformation of quantification/detection limits: %limitPolicy%',
+
+                'bareme' => [
+                    'header(%bareme%)'             => "Scale “\u{a0}%bareme%\u{a0}”",
+                    'created(%dateCreation%)'      => ', as of %dateCreation% UTC',
+                    'applied'                      => ', applied ',
+                    'from(%dateDebut%)'            => 'from %dateDebut% UTC onward',
+                    'range(%dateDebut%,%dateFin%)' => 'from %dateDebut% UTC to %dateFin% UTC',
+                ],
+            ],
+
+            'error'                  => 'An error happened during the extraction:',
+            'chronique.noHydro2Code' => "    -> WARNING: no “\u{a0}Hydro2 code\u{a0}” found; “\u{a0}station code\u{a0}” used instead.\n\n",
+        ],
+    ],
+    'controle.export' => [
+        'title' => 'Exporting checkpoints',
+    ],
+    'bareme.export'   => [
+        'report' => [
+            'main(%format%, %date%, %chronicle%)' => "Download from %date% UTC for the calculated time series “\u{a0}%chronicle%\u{a0}”\n" .
+                "Qualities are in the format “\u{a0}%format%\u{a0}”",
+            'bareme'                              => [
+                'base(%bareme%, %dateCreation%, %inputUnit%, %outputUnit%, %number%, %min%, %max%)' => "\n\nScale “\u{a0}%bareme%\u{a0}” created the %dateCreation% UTC\n" .
+                    "    -> Input unit: %inputUnit%\n" .
+                    "    -> Output unit: %outputUnit%\n" .
+                    "    -> %number% downloaded lines for values in abscissa ranging from %min% to %max%\n",
+                'parentChronicle(%parentChronicle%)'                                                => "    -> Parent time series: “\u{a0}%parentChronicle%\u{a0}”\n",
+                'applyFromTo(%dateBegin%, %dateEnd%)'                                               => "    -> Apply from %dateBegin% UTC to %dateEnd% UTC\n",
+                'applyFrom(%dateBegin%)'                                                            => "    -> Apply from %dateBegin% UTC\n",
+                'notApplied'                                                                        => "    -> Not applied for this calculated time series\n",
+                'outputFile(%file%)'                                                                => '    -> File: %file%',
+            ],
+        ],
+        'error'  => [
+            'badBareme(%id%)' => 'Scale #%id% unknown',
+        ],
+    ],
+];
+
+$jobs = [
+    'job'             => [
+        'title'         => [
+            'list'       => 'Jobs',
+            'show(%id%)' => 'Job #%id%',
+        ],
+        'state'         => [
+            'new'        => 'New',
+            'pending'    => 'Pending',
+            'ready'      => 'Ready',
+            'canceled'   => 'Canceled',
+            'running'    => 'Running',
+            'finished'   => 'Finished',
+            'failed'     => 'Failed',
+            'terminated' => 'Timed out',
+            'incomplete' => 'Error',
+        ],
+        'state.tooltip' => [
+            'new'        => 'The job has just been created.',
+            'pending'    => 'The job is pending its programmed date or another job.',
+            'ready'      => 'The job will be run as soon as possible.',
+            'canceled'   => 'The job has been canceled by the user or an administrator.',
+            'running'    => 'The job is running.',
+            'finished'   => 'The job has succesfully finished.',
+            'failed'     => 'The job failed.',
+            'terminated' => 'The job ran longer than its allowed duration.',
+            'incomplete' => 'An indenpendent error happened during the job processing.',
+        ],
+        'id'            => 'Number',
+        'owner'         => 'Requester',
+        'observatoire'  => 'Observatory',
+        'chronicles'    => 'Time series',
+        'created_at'    => 'Created at',
+        'started_at'    => 'Started at',
+        'closed_at'     => 'Closed at',
+        'queue'         => 'Queue',
+        'priority'      => 'Priority',
+        'command'       => 'Command',
+        'arguments'     => 'Arguments',
+        'runtime'       => 'Run time (s)',
+        'output'        => 'Message(s)',
+        'error_output'  => 'Error message(s)',
+        'exit_code'     => 'Exit code',
+        'actions'       => 'Actions',
+        'button.retry'  => 'Retry',
+        'description'   => [
+            'bdoh:compute:filling_rates' => 'Data completenes calculation',
+            'bdoh:compute:chronique'     => 'Time series calculation',
+            'bdoh:convert:chronique'     => 'Time series conversion',
+            'bdoh:export:identical'      => 'Data download as is',
+            'bdoh:export:instantaneous'  => 'Data download with linear interpolation',
+            'bdoh:export:mean'           => 'Data download with mean calculation',
+            'bdoh:export:cumulative'     => 'Data download with sum calculation',
+        ],
+        'refreshInfo'   => 'Please remember to refresh the page to view the jobs progression.',
+        'refreshPage'   => 'Refresh the page',
+        'jobList'       => 'Job list',
+    ],
+    'job.description' => 'Description',
+    'job.state'       => 'State',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entities, $fields, $chroniqueTypes, $fileFormats, $export, $jobs);
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae1d13363a3e5674b91f2b94a4e20f0cce99d550
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,265 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$entities = require __DIR__ . '/entitiesSingulars.fr.php';
+$fields = require __DIR__ . '/fields.fr.php';
+
+/*************************************************
+ * 'CHRONIQUE' TYPES
+ ************************************************/
+
+$chroniqueTypes = [
+    'chronique.type.continue'    => 'Chronique continue',
+    'chronique.type.discontinue' => 'Chronique discontinue',
+    'chronique.type.calculee'    => 'Chronique calculée',
+    'chronique.type.convertie'   => 'Chronique convertie',
+    'type.continue'              => 'continue',
+    'type.discontinue'           => 'discontinue',
+    'type.calculee'              => 'calculée',
+    'type.convertie'             => 'convertie',
+];
+
+/*************************************************
+ * FILE FORMATS
+ ************************************************/
+
+$fileFormats = [
+    'export' => [
+        'Bdoh'      => 'BDOH',
+        'Qtvar'     => 'Hydro2 - QTVAR',
+        'Vigilance' => 'Vigilance',
+    ],
+];
+
+/*************************************************
+ * EXPORTS
+ ************************************************/
+
+$export = [
+    'measure.export'  => [
+        'title'        => '[0,1] Exporter la chronique | ]1,Inf] Exporter les chroniques',
+        'help'         => 'Aide',
+        'help-title'   => 'Aide - Export de chroniques',
+        'help-content' => <<<HELP
+<ul>
+    <li>Le choix des dates/heures de début et fin de la ou des chronique(s) à exporter\u{a0}est exprimé en UTC.</li>
+    <li>L'export par défaut est l'export à l'identique :
+        <ul>
+            <li>pas de modification du pas de temps par rapport à la chronique stockée (le pas de temps est potentiellement variable)</li>
+            <li>on peut exporter plusieurs chroniques d'une même station</li>
+            <li>il n'y a pas de limitation de longueur des chroniques et l'export se fait par téléchargement direct.</li>
+        </ul>
+    </li>
+    <li>Un export à pas de temps fixe (avec interpolation linéaire ou calcul de moyenne ou de cumul) est possible pour certaines chroniques :</li>
+    <ul>
+        <li>on ne peut exporter qu'une chronique à la fois</li>
+        <li>de façon à limiter l'encombrement du serveur qui réalise les calculs, la longueur maximale d'un export est de 2 ans par minute de pas de temps, soit 1051200 valeurs (~ 10<sup>6</sup> lignes)</li>
+        <li>en cas de besoin d'export de chronique plus long, il faudra réaliser l'export en plusieurs fois</li>
+        <li>le fichier est envoyé par e-mail en pièce jointe</li>
+        <li>Les options pour l'export à pas de temps fixe sont : (i) pour l'export avec interpolation linéaire, un pas de temps compris entre 1 et 1440 minutes ; (ii) pour l'export avec calcul de moyenne ou cumul, un des pas de temps proposés dans la liste déroulante. L'export commence à une heure ronde. L'option «\u{a0}événement\u{a0}» calcule la moyenne ou le cumul sur toute la durée de l'événement (1 seule valeur résultat).</li>
+    </ul>
+    <li>On exporte un fichier par chronique.</li>
+    <li>Pour l'export de chroniques continues à l'identique ou à pas de temps fixe avec interpolation linéaire, plusieurs formats de fichier sont possibles (BDOH standard ou Hydro2 QTVAR).</li>
+    <li>Pour l'export de moyennes, cumuls ou chroniques discontinues, le format unique est le format BDOH discontinu.</li>
+</ul>
+HELP
+        ,
+        'underway'     => "L'export de chronique est en cours. Vous recevrez prochainement le fichier par e-mail.",
+        'error'        => [
+            'abort'                               => "Pour des raisons techniques l'export de mesures n'a pas pu se faire.",
+            'badExportType'                       => "Export de chronique(s) : échantillonnage à l'export incorrect.",
+            'badTimeStep'                         => 'Export de chronique(s) : Pas de temps incorrect.',
+            'badTimeStep(%min%, %max%)'           => 'Export de chronique(s) : Le pas de temps doit être compris entre %min% et %max%.',
+            'badTimeStepForExportType'            => "Export de chronique(s) : Pas de temps incorrect pour ce type d'export.",
+            'badTimezone'                         => 'Export de chronique(s) : fuseau horaire incorrect.',
+            'badBeginDate'                        => 'Export de chronique(s) : date de début incorrecte.',
+            'badCumulStartTime'                   => 'Export de chronique(s) : heure de début des cumuls incorrecte.',
+            'badEndDate'                          => 'Export de chronique(s) : date de fin incorrecte.',
+            'badFormat'                           => 'Export de chronique(s) : format incorrect.',
+            'noChronique'                         => 'Export de chronique(s) : aucune chronique sélectionnée.',
+            'badChronique(%chroniqueId%)'         => "La chronique %chroniqueId% n'existe pas ou n'est pas accessible.\n",
+            'isNotSupported(%chronique%, Plage)'  => "La chronique continue «\u{a0}%chronique%\u{a0}» n'est pas supportée par ce format d'export.\n",
+            'isNotSupported(%chronique%, Mesure)' => "La chronique discontinue «\u{a0}%chronique%\u{a0}» n'est pas supportée par ce format d'export.\n",
+            'measureDirectionNotSpecified'        => 'Choix des date à exporter (en début ou fin des intervalles) non spécifié.',
+            'timeStepNotSpecified'                => 'Pas de temps non spécifié.',
+            'noStartingTime'                      => "Veuillez préciser à quel type d'instant les mesures exportées doivent commencer.",
+        ],
+        'job_queued(%job_id%)' => "L'export de chronique est en cours. Vous recevrez prochainement le fichier par e-mail. (Job #%job_id%)",
+        'report'               => [
+            'headline' => [
+                '1(%format%, %date%)' => "Export du %date% UTC au format «\u{a0}%format%\u{a0}»",
+                '2(%begin%, %end%)'   => "Période d'extraction : du %begin% UTC au %end% UTC",
+                '3(%timezone%)'       => 'Fuseau horaire : %timezone% ',
+            ],
+
+            'chronique(%chronique%)' => "Chronique «\u{a0}%chronique%\u{a0}» :",
+
+            'chroniqueCalculee(%chronique%)' => "Chronique calculée «\u{a0}%chronique%\u{a0}» :",
+
+            'measures(%number%,%first%,%last%)' => '[0,0]Aucune mesure présente|' .
+                '[1,1]Une mesure présente|' .
+                ']1,Inf]%number% mesures présentes, du %first% au %last%',
+
+            'file(%file%)' => 'Fichier : %file%',
+
+            'doi' => [
+                'header(%observatoire%)'    => "DOI associés à l'observatoire «\u{a0}%observatoire%\u{a0}» :",
+                'item(%doi%,%description%}' => 'dx.doi.org/%doi% [ %description% ]',
+            ],
+
+            'resampled' => [
+                'header'                   => 'Export réalisé à pas de temps fixe',
+                'type(%type%)'             => "Type d'échantillonnage : %type%",
+                'timestep'                 => 'Pas de temps :',
+                'timestep-var(%timestep%)' => '[0,1]%timestep% minute|]1,Inf]%timestep% minutes',
+                'count(%count%)'           => '[0,0]Aucune mesure exportée|' .
+                    '[1,1]Une mesure exportée|' .
+                    ']1,Inf]%count% mesures exportées',
+                'types'                    => [
+                    'instantaneous' => 'interpolation linéaire',
+                    'mean'          => 'moyenne',
+                    'cumulative'    => 'cumul',
+                ],
+            ],
+
+            'chronique.lq_ld'               => [
+                'options'                      => [
+                    'true_value'  => "utilisation des valeurs d'origine",
+                    'half_value'  => 'valeurs divisées par 2',
+                    'placeholder' => 'valeurs remplacées par la constante ',
+                    'gap'         => 'valeurs traitées comme des mesures invalides',
+                ],
+            ],
+
+            'calculated' => [
+                'input'                       => [
+                    'unique(%chronique%)'     => "Chronique mère unique : «\u{a0}%chronique%\u{a0}»",
+                    'first(%chronique%)'      => "Première chronique mère : «\u{a0}%chronique%\u{a0}»",
+                    'second(%chronique%)'     => "Seconde chronique mère : «\u{a0}%chronique%\u{a0}»",
+                ],
+                'limit_policy(%limitPolicy%)' => 'Transformation des limites de quantification / détection : %limitPolicy%',
+
+                'bareme' => [
+                    'header(%bareme%)'             => "Barème «\u{a0}%bareme%\u{a0}»",
+                    'created(%dateCreation%)'      => ', crée le %dateCreation% UTC',
+                    'applied'                      => ', appliqué ',
+                    'from(%dateDebut%)'            => 'à partir du %dateDebut% UTC',
+                    'range(%dateDebut%,%dateFin%)' => 'du %dateDebut% UTC au %dateFin% UTC',
+                ],
+            ],
+
+            'error'                  => "Une erreur s'est produite pendant l'export :",
+            'chronique.noHydro2Code' => "    -> ATTENTION : aucun «\u{a0}code Hydro2\u{a0}» trouvé ; «\u{a0}code station\u{a0}» utilisé.\n\n",
+        ],
+    ],
+    'controle.export' => [
+        'title' => 'Exportation de points de contrôle',
+    ],
+    'bareme.export'   => [
+        'report' => [
+            'main(%format%, %date%, %chronicle%)' => "Export du %date% UTC pour la chronique calculée «\u{a0}%chronicle%\u{a0}»\n" .
+                "Les qualités sont au format «\u{a0}%format%\u{a0}»",
+            'bareme'                              => [
+                'base(%bareme%, %dateCreation%, %inputUnit%, %outputUnit%, %number%, %min%, %max%)' => "\n\nBarème «\u{a0}%bareme%\u{a0}» créé le %dateCreation% UTC\n" .
+                    "    -> Unité d'entrée : %inputUnit%\n" .
+                    "    -> Unité de sortie : %outputUnit%\n" .
+                    "    -> %number% lignes exportées pour des valeurs en abscisse allant de %min% à %max%\n",
+                'parentChronicle(%parentChronicle%)'                                                => "    -> Chronique mère : «\u{a0}%parentChronicle%\u{a0}»\n",
+                'applyFromTo(%dateBegin%, %dateEnd%)'                                               => "    -> Appliqué du %dateBegin% au %dateEnd%\n",
+                'applyFrom(%dateBegin%)'                                                            => "    -> Appliqué à partir du %dateBegin%\n",
+                'notApplied'                                                                        => "    -> Non appliqué pour cette chronique calculée\n",
+                'outputFile(%file%)'                                                                => '    -> Fichier : %file%',
+            ],
+        ],
+        'error'  => [
+            'badBareme(%id%)' => 'Barème n°%id% inconnu',
+        ],
+    ],
+];
+
+$jobs = [
+    'job'             => [
+        'title'         => [
+            'list'       => 'Jobs',
+            'show(%id%)' => 'Job n°%id%',
+        ],
+        'state'         => [
+            'new'        => 'Nouveau',
+            'pending'    => 'En attente',
+            'ready'      => 'Prêt',
+            'canceled'   => 'Annulé',
+            'running'    => 'En cours',
+            'finished'   => 'Réussi',
+            'failed'     => 'Échec',
+            'terminated' => 'Temps limite dépassé',
+            'incomplete' => 'Erreur',
+        ],
+        'state.tooltip' => [
+            'new'        => "Le job vient d'être créé.",
+            'pending'    => 'Le job attends sa date programmée ou la fin des jobs dont il dépend.',
+            'ready'      => 'Le job sera exécuté dès que possible.',
+            'canceled'   => 'Le job a été annulé par son propriétaire ou un administrateur.',
+            'running'    => "Le job est en cours d'exécution.",
+            'finished'   => 'Le job a été exécuté avec succès.',
+            'failed'     => 'Le job a échoué.',
+            'terminated' => 'Le job a dépassé la limite de temps imparti.',
+            'incomplete' => "Une erreur indépendante du job s'est produite.",
+        ],
+        'id'            => 'Numéro',
+        'owner'         => 'Demandeur',
+        'observatoire'  => 'Observatoire',
+        'chronicles'    => 'Chronique(s)',
+        'created_at'    => 'Créé le',
+        'started_at'    => 'Commencé le',
+        'closed_at'     => 'Terminé le',
+        'queue'         => 'Queue',
+        'priority'      => 'Priorité',
+        'command'       => 'Commande',
+        'arguments'     => 'Arguments',
+        'runtime'       => "Temps d'exécution (s)",
+        'output'        => 'Message(s)',
+        'error_output'  => "Message(s) d'erreur",
+        'exit_code'     => 'Code de sortie',
+        'actions'       => 'Actions',
+        'button.retry'  => 'Relancer',
+        'description'   => [
+            'bdoh:compute:filling_rates' => 'Calcul des taux de remplissage',
+            'bdoh:compute:chronique'     => "Calcul d'une chronique",
+            'bdoh:convert:chronique'     => "Conversion d'une chronique",
+            'bdoh:export:identical'      => "Export de mesures à l'identique",
+            'bdoh:export:instantaneous'  => 'Export de mesures avec interpolation linéaire',
+            'bdoh:export:mean'           => 'Export de mesures avec calcul de moyennes',
+            'bdoh:export:cumulative'     => 'Export de mesures avec calcul de cumuls',
+            'theia:send:json:data'       => "Envoi du JSON de l'observatoire à Theia/OZCAR",
+        ],
+        'refreshInfo'   => "Pensez à rafraîchir la page pour visualiser l'évolution des jobs.",
+        'refreshPage'   => 'Rafraîchir la page',
+        'jobList'       => 'Liste des jobs',
+    ],
+    'job.description' => 'Description',
+    'job.state'       => 'État',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entities, $fields, $chroniqueTypes, $fileFormats, $export, $jobs);
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/validators.en.php b/src/Irstea/BdohDataBundle/Resources/translations/validators.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..00ce0a60b7760b9f409f0637cef61a16ed7da89a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/validators.en.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire.slug.alreadyExists'                                                       => 'The chosen name is identical or too close to the one of an existing observatory.',
+    'SiteExperimental.slug.alreadyExists'                                                   => 'The chosen name is identical or too close to the one of an existing site.',
+    'Observatoire.theiaCode.alreadyExists'                                                  => "The chosen name is identical or too close to theia's code of an existing observatory.",
+    'Station.nom.alreadyExists'                                                             => 'The station name already exists.',
+    'Station.code.alreadyExists'                                                            => 'The station code already exists.',
+    'Chronique.code.alreadyExists'                                                          => 'This code already exists for this station.',
+    'Bassin.nom.alreadyExists'                                                              => 'This basin already exists for this observatory.',
+    'CoursEau.nom.alreadyExists'                                                            => 'This river already exists for this observatory.',
+    'FamilleParametres.nom.alreadyExists'                                                   => 'This parameter category already exists.',
+    'This file is not a valid image'                                                        => 'This file is not a valid image.',
+    'The file is too large. Allowed maximum size is {{ limit }}'                            => 'The file is too large (Allowed maximum size is {{ limit }})',
+    'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}' => 'The mime type of the file is invalid ({{ type }}). Allowed mime types are: {{ types }}',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/translations/validators.fr.php b/src/Irstea/BdohDataBundle/Resources/translations/validators.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..8235469fbd9c2dca3e21bb8c86dc370499c24c32
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/translations/validators.fr.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Observatoire.slug.alreadyExists'                                                        => "Le nom choisi est identique ou trop proche de celui d'un observatoire existant.",
+    'SiteExperimental.slug.alreadyExists'                                                    => "Le nom choisi est identique ou trop proche de celui d'un site existant.",
+    'Observatoire.theiaCode.alreadyExists'                                                   => "Le nom choisi est identique ou trop proche de celui d'un Code Theia d'un autre observatoire.",
+    'Station.nom.alreadyExists'                                                              => 'Ce nom de station existe déjà.',
+    'Station.code.alreadyExists'                                                             => 'Ce code de station existe déjà.',
+    'Chronique.code.alreadyExists'                                                           => 'Ce code existe déjà pour cette station.',
+    'Bassin.nom.alreadyExists'                                                               => 'Ce bassin existe déjà pour cet observatoire.',
+    'CoursEau.nom.alreadyExists'                                                             => "Ce cours d'eau existe déjà pour cet observatoire.",
+    'FamilleParametres.nom.alreadyExists'                                                    => 'Cette famille de paramètres existe déjà.',
+    'This file is not a valid image'                                                         => "Le fichier envoyé n'était pas une image valide.",
+    'The file is too large. Allowed maximum size is {{ limit }}'                             => 'Le fichier envoyé était trop volumineux (taille supérieure à {{ limit }})',
+    'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}'  => 'Le fichier envoyé est de type incorect ({{ type }}). Les fichiers autorisés sont : {{ types }}',
+];
diff --git a/src/Irstea/BdohDataBundle/Resources/views/Exporter/report.text.twig b/src/Irstea/BdohDataBundle/Resources/views/Exporter/report.text.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e77c8a68cb7233399f534cd2c05bed56827ab1fc
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/views/Exporter/report.text.twig
@@ -0,0 +1,179 @@
+{%- autoescape false -%}
+    {%- import _self as report_macros -%}
+    {# Attention, le placement des retours à la ligne et des indentations jouent énormément sur le résultat. #}
+{{- report_macros.header(format, date, begin, end, timezone) -}}
+    {%- if observatoire.dois.count > 0 %}
+
+
+
+{{ report_macros.doi(observatoire) -}}
+    {%- endif -%}
+    {%- for entry in chroniques -%}
+        {%- set chronique = entry.chronique -%}
+        {%- set report = entry.report %}
+
+
+
+{{ report_macros.chronique_header(chronique, chronique.calculee) -}}
+        {%- if report.error is defined %}
+
+
+    {{ report_macros.chronique_error(report.error) -}}
+        {%- else %}
+
+
+    {{ report_macros.chronique_report(chronique, report.number, report.first, report.last, report.filename, timezone) -}}
+            {%- if chronique.genealogie is not empty %}
+
+
+    {{ report_macros.genealogie(chronique.genealogie) -}}
+            {%- endif -%}
+            {%- if extractor != 'identical' %}
+
+
+    {{ report_macros.resample_info(extractor, timestep, report.count.measures + report.count.gaps) -}}
+            {%- endif -%}
+            {%- if chronique.calculee %}
+
+
+    {{ report_macros.transformations(chronique) -}}
+            {%- endif -%}
+        {%- endif -%}
+    {%- endfor -%}
+{%- endautoescape -%}
+
+{####################}
+
+{%- macro header(format, date, begin, end, timezone) -%}
+    {%- set date = date|date('transformation.bareme.dateBareme'|trans, false) -%}
+    {%- set begin = begin|date('transformation.bareme.dateBareme'|trans, false) -%}
+    {%- set end = end|date('transformation.bareme.dateBareme'|trans, false) -%}
+    {%- set timezone = 'UTC'|trans ~ timezone.name -%}
+    {%- set format = ('export.'~format|capitalize)|trans -%}
+    {%- trans -%}measure.export.report.headline.1(%format%, %date%){% endtrans %}
+
+{% trans %}measure.export.report.headline.2(%begin%, %end%){% endtrans %}
+
+{% trans %}measure.export.report.headline.3(%timezone%){%- endtrans -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro doi(observatoire) -%}
+    {%- set dois = observatoire.dois -%}
+    {%- trans -%}measure.export.report.doi.header(%observatoire%){%- endtrans -%}
+    {%- for item in dois -%}
+        {%- set doi = item.identifiant -%}
+        {%- set description = item.description %}
+
+ - {% trans %}measure.export.report.doi.item(%doi%,%description%}{%- endtrans -%}
+    {%- endfor -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro chronique_header(chronique, calculee) -%}
+    {%  if calculee -%}
+    {%- trans -%}measure.export.report.chroniqueCalculee(%chronique%){%- endtrans -%}
+    {%- else -%}
+    {%- trans -%}measure.export.report.chronique(%chronique%){%- endtrans -%}
+    {%- endif -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro chronique_error(error) -%}
+{%- trans -%}measure.export.report.error{% endtrans %}
+
+    {{ error|raw -}}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro chronique_report(chronique, number, first, last, file, timezone) -%}
+    {%- set first = first|date('transformation.bareme.dateBareme'|trans, timezone.name) ~ ' ' ~ 'UTC'|trans ~ timezone.name -%}
+    {%- set last = last|date('transformation.bareme.dateBareme'|trans, timezone.name) ~ ' ' ~ 'UTC'|trans ~ timezone.name -%}
+    {%- transchoice number %}measure.export.report.measures(%number%,%first%,%last%){%- endtranschoice -%}
+    {%- if number > 0 %}
+
+
+    {% trans %}measure.export.report.file(%file%){%- endtrans -%}
+    {%- endif -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro genealogie(genealogie) -%}
+    {%- trans -%}genealogie{% endtrans %}
+
+        {{ genealogie|replace({'\n': '\n        '}) -}}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro resample_info(extractor, timestep, count) -%}
+    {%- set type = ('measure.export.report.resampled.types.' ~ extractor)|trans -%}
+{%- trans -%}measure.export.report.resampled.header{% endtrans %}
+
+        {% trans %}measure.export.report.resampled.type(%type%){% endtrans %}
+
+        {% trans %}measure.export.report.resampled.timestep{%- endtrans -%}
+    {%- if extractor == 'instantaneous' %}
+ {% transchoice timestep -%}measure.export.report.resampled.timestep-var(%timestep%){%- endtranschoice -%}
+    {%- else %}
+ {{ timestep -}}
+{%- endif %}
+
+        {% transchoice count -%}measure.export.report.resampled.count(%count%){%- endtranschoice -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro transformations(chronique) -%}
+    {%- import _self as report_macros -%}
+    {%- if chronique.secondeEntree is not empty -%}
+        {{- report_macros.transformation('first', chronique.premiereEntree) }}
+
+    {{ report_macros.transformation('second', chronique.secondeEntree) -}}
+    {%- else -%}
+        {{- report_macros.transformation('unique', chronique.premiereEntree) }}
+    {%- endif -%}
+{%- endmacro -%}
+
+{####################}
+
+{%- macro transformation(libelle, transfo) -%}
+    {%- set chronique = transfo.entree -%}
+    {%- set jeuBareme = transfo.jeuBaremeActuel -%}
+    {{- ('measure.export.report.calculated.input.' ~ libelle ~ '(%chronique%)') | trans({'%chronique%': chronique})|raw -}}
+    {%- set limitPolicy = jeuBareme.valueLimitTransformationType | default(null) -%}
+    {%- if limitPolicy is not empty %}
+
+        {% trans with { '%limitPolicy%': ('measure.export.report.' ~ limitPolicy) | trans } %}measure.export.report.calculated.limit_policy(%limitPolicy%){%- endtrans -%}
+        {%- if limitPolicy == constant('LQ_LD_PLACEHOLDER', jeuBareme) -%} {{ jeuBareme.valueLimitPlaceholder }}{%- endif -%}
+    {%- endif -%}
+
+    {%- for bjb in jeuBareme.baremeJeuBaremes -%}
+        {%- set bareme = bjb.bareme -%}
+        {%- set dateDebut = bjb.debutValidite|date('transformation.bareme.dateBareme'|trans, false) -%}
+        {%- if bareme.observatoire is not empty -%}
+            {%- set nom = bareme.nom -%}
+            {%- set dateCreation = bareme.dateCreation|date('transformation.bareme.dateBareme'|trans, false) -%}
+        {%- else -%}
+            {%- set nom = ('transformation.bareme.baremeTechnique.' ~ bareme.nom) | trans -%}
+            {%- set dateCreation = null -%}
+        {%- endif %}
+
+        {% trans with {'%bareme%': nom} %}measure.export.report.calculated.bareme.header(%bareme%){%- endtrans -%}
+        {%- if dateCreation is not empty -%}
+            {%- trans -%}measure.export.report.calculated.bareme.created(%dateCreation%){%- endtrans -%}
+        {%- endif -%}
+            {%- trans -%}measure.export.report.calculated.bareme.applied{%- endtrans -%}
+        {%- if bjb.finValidite is not empty -%}
+            {%- set dateFin = bjb.finValidite|date('transformation.bareme.dateBareme'|trans, false) -%}
+            {%- trans -%}measure.export.report.calculated.bareme.range(%dateDebut%,%dateFin%){%- endtrans -%}
+        {%- else -%}
+            {%- trans -%}measure.export.report.calculated.bareme.from(%dateDebut%){%- endtrans -%}
+        {%- endif -%}
+    {%- endfor -%}
+{%- endmacro -%}
diff --git a/src/Irstea/BdohDataBundle/Resources/views/Job/all.html.twig b/src/Irstea/BdohDataBundle/Resources/views/Job/all.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7d9e36a12ba952fda0e07baa262dd4f52149e84a
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/views/Job/all.html.twig
@@ -0,0 +1,66 @@
+{% extends '::layout.html.twig' %}
+{% import '@IrsteaBdohData/Job/macros.html.twig' as Job %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('job.title.list'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{% trans %}home{% endtrans %}</a></li>
+        <li class="active">{% trans %}job.title.list{% endtrans %}</li>
+    </ul>
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/data/job/all.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/data/job/all.css') }}"/>
+    <style type="text/css">
+        button.btn-refresh-page{
+            margin:-7.5px -7.5px 0 0;
+            background-image:initial;
+        }
+    </style>
+{% endblock %}
+
+{% block main %}
+    <div class="alert alert-info">
+        {{ 'job.refreshInfo'|trans }}
+        <button class="btn btn-info pull-right btn-refresh-page" onclick="window.location.reload(true);">
+            {{ 'job.refreshPage'|trans }}
+        </button>
+    </div>
+    <h1>{% trans %}job.title.list{% endtrans %}</h1>
+    <table id="jobs" class="table">
+        <thead>
+        <tr>
+            <th>{% trans %}job.id{% endtrans %}</th>
+            <th>{% trans %}job.description{% endtrans %}</th>
+            <th>{% trans %}job.observatoire{% endtrans %}</th>
+            <th>{% trans %}job.chronicles{% endtrans %}</th>
+            <th>{% trans %}job.created_at{% endtrans %} [{{ 'UTC'|trans }}]</th>
+            <th>{% trans %}job.owner{% endtrans %}</th>
+            <th class="text-right">{% trans %}job.state{% endtrans %}</th>
+        </tr>
+        </thead>
+        <tbody>
+        {%- for job in jobs %}
+            <tr>
+                <td data-order="{{ job.entity.id }}" data-search="{{ job.entity.id }}">{{ Job.id(job) }}</td>
+                <td>{{ Job.describe(job.entity) }}</td>
+                <td>{{ Job.observatory(job) }}</td>
+                <td>{{ Job.chronicles(job) }}</td>
+                <td data-order="{{ job.entity.createdAt.timestamp }}">{{ Job.created_at(job.entity) }}</td>
+                <td>{{ job.owner }}</td>
+                <td class="text-right">{{ Job.state(job) }}</td>
+            </tr>
+        {%- endfor %}
+        </tbody>
+    </table>
+{% endblock main %}
diff --git a/src/Irstea/BdohDataBundle/Resources/views/Job/macros.html.twig b/src/Irstea/BdohDataBundle/Resources/views/Job/macros.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..36cb16c440bb312cdcec64e442ce09a737e4243d
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/views/Job/macros.html.twig
@@ -0,0 +1,133 @@
+{% macro id(job) %}
+    {%- set id = job.entity.id %}
+    {%- if job.showable %}<a href="{{ path('bdoh_job_show', {id: id}) }}">{% endif %}
+    {% trans %}job.title.show(%id%){% endtrans %}
+    {%- if job.showable %}</a>{% endif %}
+{%- endmacro %}
+
+{% macro describe(job) %}
+    {{- ('job.description.' ~ job.command) | trans | default('?') -}}
+{%- endmacro %}
+
+{% macro observatory(job) %}
+    {%- if job.observatoire is not empty %}
+        <a href="{{ path('bdoh_home', {_observatoire: job.observatoire.slug}) }}">
+            {{- job.observatoire -}}
+        </a>
+    {%- else %}
+        ?
+    {%- endif %}
+{%- endmacro %}
+
+{% macro chronicle(chro) %}
+    {% from 'IrsteaBdohConsultBundle::macros.html.twig' import chronique_isVisible %}
+    {% if is_granted('CONSULT_TIMESERIES', chro) %}
+        <a href="{{ path('bdoh_consult_chronique', {'_observatoire' : chro.observatoire.slug, station: chro.station.code, chronique: chro.code}) }}">
+            {{- chro -}}
+        </a>
+    {% else %}
+        {{- chro -}}
+    {% endif %}
+    {{ chronique_isVisible(chro) }}
+{%- endmacro %}
+
+{% macro chronicles(job) %}
+    {%- import _self as macros %}
+    {%- if job.observatoire is not empty %}
+        <div style="max-height:3em;overflow-y:auto">
+            {%- for c in job.chroniques -%}
+                {{- macros.chronicle(c) -}}
+                {%- if not loop.last %}<br/>{% endif -%}
+            {%- endfor -%}
+        </div>
+    {%- else %}
+        ?
+    {%- endif %}
+{%- endmacro %}
+
+{% macro state(job) %}
+    {%- set state_colors = {
+    new: 'info',
+    pending: 'info',
+    ready: 'info',
+    canceled: 'default',
+    running: 'primary',
+    finished: 'success',
+    failed: 'danger',
+    terminated: 'danger',
+    incomplete: 'danger'
+    } -%}
+    {% set state_icons = {
+    new: 'asterisk',
+    pending: 'time',
+    ready: 'ok-circle',
+    canceled: 'ban-circle',
+    running: 'cog',
+    finished: 'ok',
+    failed: 'remove',
+    terminated: 'hourglass',
+    incomplete: 'alert'
+    } -%}
+    <span class="label label-{{ state_colors[job.state]|default('default') }}"
+          title="{{ ('job.state.tooltip.' ~ job.state) |trans }}">
+        <i class="glyphicon glyphicon-{{ state_icons[job.state]|default("") }}"></i>
+        &nbsp;{{- ('job.state.' ~ job.state)|trans -}}
+    </span>
+{%- endmacro %}
+
+{% macro opt_date(date) %}
+    {%- if date is not null %}
+        {{- date|date('transformation.bareme.dateBareme'|trans, 'UTC') -}}
+    {%- else %}
+        -
+    {%- endif -%}
+{% endmacro %}
+
+{% macro created_at(job) %}
+    {%- import _self as macros %}
+    {{ macros.opt_date(job.createdAt) }}
+{% endmacro %}
+
+{% macro started_at(job) %}
+    {%- import _self as macros %}
+    {{ macros.opt_date(job.startedAt) }}
+{% endmacro %}
+
+{% macro closed_at(job) %}
+    {%- import _self as macros %}
+    {{ macros.opt_date(job.closedAt) }}
+{% endmacro %}
+
+{% macro runtime(job) %}
+    {{- job.runtime|default('-') -}}
+{%- endmacro %}
+
+{% macro action_button(action, label, disabled, icon, color, size) %}
+    <button name="action" value="{{ action }}"
+            class="btn btn-{{ size|default('sm') }} btn-{{ color }}
+        {%- if disabled %} disabled{% endif %}"
+        {% if disabled %} disabled{% endif %}
+    >
+        <i class="glyphicon glyphicon-{{ icon }}"></i>&nbsp;
+        {{- label|trans -}}
+    </button>
+{%- endmacro %}
+
+{% macro actions(job, size) %}
+    {%- import _self as macros %}
+    <form action="{{ path('bdoh_job_update', {id: job.entity.id}) }}" method="POST">
+        {% set list_button_margin='0' %}
+        {%- if job.retriable -%}
+            {% set list_button_margin='9px' %}
+            {{ macros.action_button('retry', 'job.button.retry', not job.retry_granted, 'repeat', 'success', size) }}
+        {%- endif -%}
+        {%- if job.cancelable %}
+            {% set list_button_margin='9px' %}
+            {{ macros.action_button('cancel', 'cancel', not job.cancel_granted, 'ban-circle', 'danger', size) }}
+        {%- endif -%}
+        <a class="btn btn-{{ size|default('sm') }} btn-info" href="{{ path('bdoh_job_list') }}" style="margin-left:{{ list_button_margin }};">
+            <i class="glyphicon glyphicon-list"></i>&nbsp;
+            {{ 'job.jobList'|trans }}
+        </a>
+    </form>
+{%- endmacro %}
diff --git a/src/Irstea/BdohDataBundle/Resources/views/Job/show.html.twig b/src/Irstea/BdohDataBundle/Resources/views/Job/show.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8f9392f6ec351887134af58b236df7579859c54c
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Resources/views/Job/show.html.twig
@@ -0,0 +1,83 @@
+{% extends '::layout.html.twig' %}
+{% import '@IrsteaBdohData/Job/macros.html.twig' as Job %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% set id = job.entity.id %}
+{% set technical = (app.user.isAManagerOfCurrentObservatory() or app.user.isGestionnaireDesObservatoires) %}
+
+{% block htmlmeta %}
+    {{ parent() }}
+    {% if not job.final %}
+        <meta http-equiv="Refresh" content="30"/>
+    {% endif %}
+{% endblock %}
+
+{% block title %}
+    {% trans %}job.title.show(%id%){% endtrans %}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{% trans %}home{% endtrans %}</a></li>
+        <li><a href="{{ path('bdoh_job_list') }}">{% trans %}job.title.list{% endtrans %}</a></li>
+        <li class="active">{% trans %}job.title.show(%id%){% endtrans %}</li>
+    </ul>
+{% endblock %}
+
+{% macro field(width, label, utc=false) %}
+<div class="col-md-{{ width }}"><h2>{{ ('job.'~label)|trans }}{%  if utc %} <span style="font-size:smaller;"><sup>[{{ 'UTC'|trans }}]</sup></span>{% endif %}</h2>
+    <p>
+        {% endmacro %}
+
+        {% macro endfield() %}</p></div>{% endmacro %}
+
+{% block main %}
+    {%- import _self as macros %}
+
+    <div id="job-show">
+        <div class="toolbox-btns pull-right">
+            <div>{{ Job.actions(job) }}</div>
+        </div>
+
+        <h1>{% trans %}job.title.show(%id%){% endtrans %}</h1>
+
+        <div class="row">
+            {{ macros.field(4, 'id') }}{{ job.entity.id }}{{ macros.endfield() }}
+            {{ macros.field(4, 'description') }}{{ Job.describe(job.entity) }}{{ macros.endfield() }}
+            {{ macros.field(4, 'observatoire') }}{{ Job.observatory(job) }}{{ macros.endfield() }}
+            {{ macros.field(4, 'chronicles') }}{{ Job.chronicles(job) }}{{ macros.endfield() }}
+            {{ macros.field(4, 'owner') }}{{ job.owner }}{{ macros.endfield() }}
+            {{ macros.field(4, 'state') }}{{ Job.state(job) }}{{ macros.endfield() }}
+        </div>
+
+        <div class="row">
+            {{ macros.field(6, 'created_at', 'utc') }}{{ Job.created_at(job.entity) }}{{ macros.endfield() }}
+            {{ macros.field(6, 'started_at', 'utc') }}{{ Job.started_at(job.entity) }}{{ macros.endfield() }}
+            {{ macros.field(6, 'closed_at', 'utc') }}{{ Job.closed_at(job.entity)|default('-') }}{{ macros.endfield() }}
+            {{ macros.field(6, 'runtime') }}{{ Job.runtime(job.entity)|default('-') }}{{ macros.endfield() }}
+        </div>
+
+        {% if technical %}
+            <div class="row">
+                {{ macros.field(6, 'queue') }}<code>{{ job.entity.queue }}</code>{{ macros.endfield() }}
+                {{ macros.field(6, 'priority') }}{{ job.entity.priority }}{{ macros.endfield() }}
+                {{ macros.field(6, 'exit_code') }}{{ job.entity.exitCode|default('-') }}{{ macros.endfield() }}
+            </div>
+
+            <div class="row">
+                {{ macros.field(4, 'command') }}<code>{{ job.entity.command }}</code>{{ macros.endfield() }}
+                {{ macros.field(20, 'arguments') }}<code>{{ job.entity.args|join(" ") }}</code>{{ macros.endfield() }}
+            </div>
+
+            <div class="row">
+                {{ macros.field(24, 'output') }}
+                <pre>{{ job.entity.output }}</pre>{{ macros.endfield() }}
+            </div>
+
+            <div class="row">
+                {{ macros.field(24, 'error_output') }}
+                <pre>{{ job.entity.errorOutput }}</pre>{{ macros.endfield() }}
+            </div>
+        {% endif %}
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohDataBundle/Tests/Entity/ObservatoireTest.php b/src/Irstea/BdohDataBundle/Tests/Entity/ObservatoireTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..be96eb87187d032bcdc2b0b0997f6892c145d790
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Tests/Entity/ObservatoireTest.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Tests\Entity;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+
+/**
+ * @backupStaticAttributes disabled
+ * @group unit
+ */
+class ObservatoireTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \Observatoire::defineAsCurrent
+     * @covers \Observatoire::isCurrent
+     */
+    public function testIsCurrent()
+    {
+        $currObs = new Observatoire();
+        $currObs->defineAsCurrent();
+        $this->assertTrue($currObs->isCurrent());
+
+        $otherObs = new Observatoire();
+        $this->assertFalse($otherObs->isCurrent());
+    }
+
+    /**
+     * @covers \Observatoire::defineAsCurrent
+     * @covers \Observatoire::getCurrent
+     */
+    public function testIntegrityOfCurrent()
+    {
+        $obs = new Observatoire();
+        $obs->defineAsCurrent();
+        $obs->setNom('Foo bar');
+        $this->assertSame($obs, Observatoire::getCurrent());
+    }
+
+    /**
+     * @covers \Observatoire::defineAsCurrent
+     * @covers \Observatoire::isCurrent
+     */
+    public function testUnicityOfCurrent()
+    {
+        $oldObs = new Observatoire();
+        $oldObs->defineAsCurrent();
+
+        $newObs = new Observatoire();
+        $newObs->defineAsCurrent();
+
+        $this->assertFalse($oldObs->isCurrent());
+        $this->assertTrue($newObs->isCurrent());
+    }
+
+    /**
+     * @covers \Observatoire::resetCurrent
+     * @covers \Observatoire::getCurrent
+     */
+    public function testNoCurrent()
+    {
+        Observatoire::resetCurrent();
+        $this->assertNull(Observatoire::getCurrent());
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Tests/Entity/StationRepositoryTest.php b/src/Irstea/BdohDataBundle/Tests/Entity/StationRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1da1abba9bbb81f775d8a9a8f5eeb440f85a9f8
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Tests/Entity/StationRepositoryTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Tests\Entity;
+
+use Irstea\BdohBundle\Tests\ORMTestCase;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\StationRepository;
+
+/**
+ * Class StationRepositoryTest.
+ *
+ * @group database
+ */
+class StationRepositoryTest extends ORMTestCase
+{
+    /**
+     * @var StationRepository
+     */
+    public $repo;
+
+    public function setUp()
+    {
+        $this->repo = self::$entityManager->getRepository('IrsteaBdohDataBundle:Station');
+        Observatoire::resetCurrent();
+    }
+
+    public function testCreatequerybuilderWithoutObservatoireDoesNotModifyBuilder()
+    {
+        $qb = $this->repo->createQueryBuilder('alias');
+
+        $this->assertNull($qb->getParameter('observatoire'));
+    }
+
+    public function testCreatequerybuilderWithObservatoireRestrictQuery()
+    {
+        $obs = new Observatoire();
+        $obs->defineAsCurrent();
+
+        $qb = $this->repo->createQueryBuilder('alias');
+        $this->assertSame($obs, $qb->getParameter('observatoire')->getValue());
+    }
+
+    public function testFindallReturnsOnlyStationsOfCurrentObservatoire()
+    {
+        return $this->markTestSkipped('Nécessite des fixtures.');
+
+        $obs = self::$entityManager
+            ->getRepository('IrsteaBdohDataBundle:Observatoire')
+            ->findOneByNom("Lônes de l'Ain");
+        $obs->defineAsCurrent();
+
+        $this->assertCount(15, $this->repo->findAll());
+    }
+
+    public function testFindallReturnsAllStationsIfNoCurrentObservatoire()
+    {
+        return $this->markTestSkipped('Nécessite des fixtures.');
+        $this->assertCount(199, $this->repo->findAll());
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Tests/IrsteaBdohBundleTest.php b/src/Irstea/BdohDataBundle/Tests/IrsteaBdohBundleTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..514da97cf1646944c9ea96f773462177b4e12552
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Tests/IrsteaBdohBundleTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Tests;
+
+use Irstea\BdohDataBundle\IrsteaBdohDataBundle;
+use org\bovigo\vfs\vfsStream;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+
+/**
+ * Class ObservatoireTest.
+ *
+ * @group unit
+ */
+class IrsteaBdohBundleTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider slugifyProvider
+     *
+     * @param mixed $slug
+     * @param mixed $text
+     */
+    public function testSlugifyWorking($slug, $text)
+    {
+        $this->assertEquals($slug, IrsteaBdohDataBundle::slugify($text));
+    }
+
+    public function slugifyProvider()
+    {
+        return [
+            ['n-a', ' '],
+            ['EFOOE', 'éFooè'],
+            ['EFOOE', 'efooe'],
+            ['OEAE-CUI-OAE', "œæ çûî/\ôÂÊ"],
+            ['BAC-A-SABLE', 'Bac à sable'],
+            // TODO: add other tests
+        ];
+    }
+
+    public function testRemoveFile()
+    {
+        $root = vfsStream::setup('/tmp');
+
+        // Creation of a deletable file in /tmp directory
+        $filePath = 'foo.txt';
+        $file = vfsStream::newFile($filePath, 0644);
+        $root->addChild($file);
+
+        IrsteaBdohDataBundle::removeFile('vfs://tmp/', $filePath);
+        $this->assertFileNotExists('vfs://tmp/foo.txt');    // deleted
+        $this->assertEmpty($filePath);                      // should be empty
+    }
+
+    public function testUploadFile()
+    {
+        // File structure : /tmp/uploaded_file.txt and /tmp/uploads/old_file.txt
+        $root = vfsStream::setUp(
+            '/tmp',
+            0755,
+            [
+                'uploaded_file.txt' => "I'm a fucking uploaded file !",
+                'uploads'           => ['old_file.txt' => "I'm the old old file. My name is Luc."],
+            ]
+        );
+
+        $uploadedFile = new UploadedFile('vfs://tmp/uploaded_file.txt', 'uploaded_file.txt', 'txt', 0, 0, true);
+        $path = 'uploads/old_file.txt';
+        IrsteaBdohDataBundle::uploadFile('vfs://tmp/', 'uploads/', $uploadedFile, $path);
+
+        $this->assertFileNotExists('vfs://tmp/uploads/old_file.txt');
+        $this->assertFileNotExists('vfs://tmp/uploaded_file.txt');
+        $this->assertFileExists('vfs://tmp/' . $path);
+        $this->assertEquals($root->getChild($path)->getContent(), "I'm a fucking uploaded file !");
+        $this->assertNull($uploadedFile);
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Util/JeuToJeu.php b/src/Irstea/BdohDataBundle/Util/JeuToJeu.php
new file mode 100644
index 0000000000000000000000000000000000000000..ba8bf1bb9a86aabf74f4e02874ef7f5536697bfe
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Util/JeuToJeu.php
@@ -0,0 +1,253 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Util;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohBundle\Exception\NotFoundEntityException;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Qualite;
+
+/**
+ * This class allows to retrieve the 'traduction' of a 'qualite',
+ * from a source 'JeuQualite' to a destination 'JeuQualite'.
+ */
+class JeuToJeu
+{
+    /**
+     * 'Qualites' of the source 'JeuQualite'.
+     * Array structure :
+     *    index === 'qualite' code
+     *    value === 'qualite' id.
+     *
+     * @var array
+     */
+    protected $qualitesSource = [];
+
+    /**
+     * 'Traductions' OF the source 'JeuQualite' FOR the destination 'JeuQualite'.
+     * Array structure :
+     *    index === 'qualite' id.
+     *    value === 'traduction' entity.
+     *
+     * @var array
+     */
+    protected $traductions = [];
+
+    /**
+     * 'Qualites' of the source having type = Qualite::gap or Qualite::invalid.
+     * Array structure :
+     *    index === 'qualite' id
+     *    value === 'qualite' code.
+     *
+     * @var array
+     */
+    protected $qualitesGap = [];
+
+    /**
+     * 'Qualites' of the source corresponding to value limits.
+     * Array structure :
+     *    index === 'qualite' id
+     *    value === 'qualite' code.
+     *
+     * @var array
+     */
+    protected $qualitesLimites = [];
+
+    /**
+     * Default gap quality of the traduction set.
+     *
+     * @var Qualite
+     */
+    protected $defaultGapQualite;
+
+    /**
+     * @param Doctrine\ORM\EntityManager $em
+     * @param string                     $codeJeuSource
+     * @param string                     $codeJeuDestination
+     *
+     * NOTE : if any of given 'JeuQualite' is null, 'JeuQualite' of current 'Observatoire' is used instead
+     */
+    public function __construct(EntityManager $em, $codeJeuSource = null, $codeJeuDestination = null)
+    {
+        $repJeu = $em->getRepository('IrsteaBdohDataBundle:JeuQualite');
+        $repQualite = $em->getRepository('IrsteaBdohDataBundle:Qualite');
+        $repQjq = $em->getRepository('IrsteaBdohDataBundle:QualiteJeuQualite');
+
+        // Gets entities of source and destination 'JeuQualite'
+        $jeuSource = $codeJeuSource ? $repJeu->findOneByNom($codeJeuSource)->getId()
+            : Observatoire::getCurrent()->getJeu()->getId();
+        $jeuDestination = $codeJeuDestination ? $repJeu->findOneByNom($codeJeuDestination)->getId()
+            : Observatoire::getCurrent()->getJeu()->getId();
+
+        // If no 'JeuQualite' exists => exception !
+        if (null === $jeuSource || null === $jeuDestination) {
+            throw new NotFoundEntityException(
+                'JeuQualite',
+                [
+                'code = '    => $codeJeuSource,
+                'OR code = ' => $codeJeuDestination,
+            ]
+            );
+        }
+
+        // Get the default gap quality
+        $this->defaultGapQualite = $repJeu->findOneById($jeuDestination)->getDefaultGapQualite();
+
+        // Loads all 'qualites' of $jeuSource
+        $qualites = $repQualite->findByJeu($jeuSource);
+        foreach ($qualites as $qualite) {
+            $this->qualitesSource[$qualite->getCode()] = $qualite->getId();
+        }
+
+        /**
+         * Loads all 'traductions' of $jeuSource for $jeuDestination.
+         */
+        $qjqs = $repQjq->findByJeu($jeuDestination);
+        foreach ($qjqs as $qjq) {
+            if (array_key_exists($qjq->getQualite()->getCode(), $this->qualitesSource)) {
+                $this->traductions[$qjq->getQualite()->getId()] = $qjq->getTraduction();
+            }
+        }
+
+        // Sets which qualities must be considered as gaps or invalid
+        foreach ($qualites as $qualite) {
+            $id = $qualite->getId();
+            $ordre = $qualite->getOrdre();
+
+            if (!\is_numeric($ordre) && array_key_exists($id, $this->traductions)) {
+                $ordre = $this->traductions[$id]->getOrdre();
+            }
+
+            if (\is_numeric($ordre) && \in_array($ordre, Qualite::$ordresInvalides)) {
+                $this->qualitesGap[$id] = $qualite->getCode();
+            }
+
+            if (\is_numeric($ordre) && \in_array($ordre, Qualite::$ordresLimites)) {
+                $this->qualitesLimites[$id] = $qualite->getCode();
+            }
+        }
+    }
+
+    /**
+     * Determines if a 'qualite' is in the source 'JeuQualite'.
+     *
+     * @param mixed $codeQualite
+     */
+    public function isInSource($codeQualite)
+    {
+        return array_key_exists($codeQualite, $this->qualitesSource);
+    }
+
+    /**
+     * From a "code of qualite", returns the code of its 'traduction'.
+     * Returns null if 'qualite' :
+     *    => is not in the source 'JeuQualite' ;
+     *    => has no 'traduction' for the destination 'JeuQualite' .
+     *
+     * @param mixed $codeQualite
+     *
+     * @return string|null
+     */
+    public function codeToCode($codeQualite)
+    {
+        if (false === array_key_exists($codeQualite, $this->qualitesSource)) {
+            return null;
+        }
+        $idQualite = $this->qualitesSource[$codeQualite];
+
+        if (false === array_key_exists($idQualite, $this->traductions)) {
+            return null;
+        }
+
+        return $this->traductions[$idQualite]->getCode();
+    }
+
+    /**
+     * From a "code of qualite", returns the id. of its 'traduction'.
+     * Returns null if 'qualite' :
+     *    => is not in the source 'JeuQualite' ;
+     *    => has no 'traduction' for the destination 'JeuQualite' .
+     *
+     * @param mixed $codeQualite
+     *
+     * @return int|null
+     */
+    public function codeToId($codeQualite)
+    {
+        if (false === array_key_exists($codeQualite, $this->qualitesSource)) {
+            return null;
+        }
+        $idQualite = $this->qualitesSource[$codeQualite];
+
+        if (false === array_key_exists($idQualite, $this->traductions)) {
+            return null;
+        }
+
+        return $this->traductions[$idQualite]->getId();
+    }
+
+    /**
+     * From a source Qualite code,
+     * asserts if the code is from GAP type or not.
+     *
+     * @param mixed $codeQualite
+     */
+    public function isGapType($codeQualite)
+    {
+        return in_array($codeQualite, $this->qualitesGap) || $codeQualite === 'gap';
+    }
+
+    /**
+     * From the source, get the ids of Qualite with 'gap' type.
+     */
+    public function getGapTypeIds()
+    {
+        return array_keys($this->qualitesGap);
+    }
+
+    /**
+     * From a source Qualite code,
+     * assesses whether the code is of "value limit" type.
+     *
+     * @param mixed $codeQualite
+     */
+    public function isLimitType($codeQualite)
+    {
+        return in_array($codeQualite, $this->qualitesLimites);
+    }
+
+    /**
+     * From the source, get the ids of "limit-type" Qualites.
+     */
+    public function getLimitTypeIds()
+    {
+        return array_keys($this->qualitesLimites);
+    }
+
+    /**
+     * @return Qualite|null
+     */
+    public function getDefaultGapQualite()
+    {
+        return $this->defaultGapQualite;
+    }
+}
diff --git a/src/Irstea/BdohDataBundle/Util/MathUtil.php b/src/Irstea/BdohDataBundle/Util/MathUtil.php
new file mode 100644
index 0000000000000000000000000000000000000000..a442eba8723064b3080371040174ac1c138bbf77
--- /dev/null
+++ b/src/Irstea/BdohDataBundle/Util/MathUtil.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohDataBundle\Util;
+
+class MathUtil
+{
+    /**
+     * Performs a linear interpolation of a value as a function of time.
+     *
+     * @param array  $dateValue1 Array containing the 1st date as a 1st element, and the associated value as a 2nd element
+     * @param array  $dateValue2 Same as $dateValue1 but for the 2nd date
+     * @param string $dateInterp Date at which the value must be interpolated
+     *
+     * @return float Interpolated value
+     */
+    public static function interpolate($dateValue1, $dateValue2, $dateInterp)
+    {
+        //abs(strtotime($date2) - strtotime($date1));
+        $x = ((float) (strtotime($dateInterp) - strtotime($dateValue1[0])))
+            / (strtotime($dateValue2[0]) - strtotime($dateValue1[0]));
+
+        return $x * ((float) $dateValue2[1]) + (1.0 - $x) * ((float) $dateValue1[1]);
+    }
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/Controller/InternationalisationController.php b/src/Irstea/BdohInternationalisationBundle/Controller/InternationalisationController.php
new file mode 100644
index 0000000000000000000000000000000000000000..46dd3c6307f4074c134b59ce6b0d2c4d0e4952fe
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Controller/InternationalisationController.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohInternationalisationBundle\Controller;
+
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+class InternationalisationController extends Controller
+{
+    public function selectLangAction($langue = null)
+    {
+        if ($langue !== null) {
+            $this->get('session')->set('_locale', $langue);
+        }
+
+        $url = $this->container->get('request')->headers->get('referer');
+        if (empty($url)) {
+            $url = $this->container->get('router')->generate('bdoh_home');
+        }
+
+        return new RedirectResponse($url);
+    }
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/EventListener/LocaleListener.php b/src/Irstea/BdohInternationalisationBundle/EventListener/LocaleListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5e368c4c9a0684eebfd2f4f1ca131d97f75f114
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/EventListener/LocaleListener.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohInternationalisationBundle\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+class LocaleListener implements EventSubscriberInterface
+{
+    private $defaultLocale;
+
+    public function __construct($defaultLocale = 'fr')
+    {
+        $this->defaultLocale = $defaultLocale;
+    }
+
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $request = $event->getRequest();
+        if (!$request->hasPreviousSession()) {
+            return;
+        }
+
+        // try to see if the locale has been set as a _locale routing parameter
+        if ($locale = $request->attributes->get('_locale')) {
+            $request->getSession()->set('_locale', $locale);
+        } else {
+            // if no explicit locale has been set on this request, use one from the session
+            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return [
+            // must be registered before the default Locale listener
+            KernelEvents::REQUEST => [['onKernelRequest', 17]],
+        ];
+    }
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/IrsteaBdohInternationalisationBundle.php b/src/Irstea/BdohInternationalisationBundle/IrsteaBdohInternationalisationBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..f763222f4f8f262796631e8a0035a290e91f4759
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/IrsteaBdohInternationalisationBundle.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohInternationalisationBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohInternationalisationBundle extends Bundle
+{
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/English.json b/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/English.json
new file mode 100644
index 0000000000000000000000000000000000000000..0afd707ffc2250477802759fc98ed46d8ace4f67
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/English.json
@@ -0,0 +1,23 @@
+{
+  "sEmptyTable":     "No data available in table.",
+  "sInfo":           "Showing _START_ to _END_ of _TOTAL_ entries",
+  "sInfoEmpty":      "Showing 0 to 0 of 0 entries",
+  "sInfoFiltered":   "(filtered from _MAX_ total entries)",
+  "sInfoPostFix":    "",
+  "sInfoThousands":  ",",
+  "sLengthMenu":     "Show _MENU_ entries per page",
+  "sLoadingRecords": "Loading...",
+  "sProcessing":     "Processing...",
+  "sSearch":         "Search:",
+  "sZeroRecords":    "No matching records found.",
+  "oPaginate": {
+    "sFirst":    "First",
+    "sLast":     "Last",
+    "sNext":     "Next",
+    "sPrevious": "Previous"
+  },
+  "oAria": {
+    "sSortAscending":  ": activate to sort column ascending",
+    "sSortDescending": ": activate to sort column descending"
+  }
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/French.json b/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/French.json
new file mode 100644
index 0000000000000000000000000000000000000000..b5a6d8980b011cd78e37a25609cc9e6df415301d
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/assets/DataTables/French.json
@@ -0,0 +1,23 @@
+{
+  "sEmptyTable":     "Aucune donnée à afficher.",
+  "sInfo":           "Lignes _START_ à _END_ sur _TOTAL_",
+  "sInfoEmpty":      "Aucune ligne affichée",
+  "sInfoFiltered":   "(recherche effectuée sur _MAX_ lignes)",
+  "sInfoPostFix":    "",
+  "sInfoThousands":  " ",
+  "sLengthMenu":     "Afficher _MENU_ lignes par page",
+  "sLoadingRecords": "Chargement en cours...",
+  "sProcessing":     "Traitement en cours...",
+  "sSearch":         "Mots-clés&nbsp;:",
+  "sZeroRecords":    "Aucune ligne ne correspond au critère de recherche.",
+  "oPaginate": {
+    "sFirst":      "Premier",
+    "sLast":       "Dernier",
+    "sNext":       "Suivant",
+    "sPrevious":   "Pr&eacute;c&eacute;dent"
+  },
+  "oAria": {
+    "sSortAscending":  ": activer pour trier la colonne par ordre croissant",
+    "sSortDescending": ": activer pour trier la colonne par ordre d&eacute;croissant"
+  }
+}
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/en.js b/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/en.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6b7396103c3e5d15985a331e8c57d415430cd9c
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/en.js
@@ -0,0 +1,20 @@
+const _ = require('lodash');
+
+// BazingaJsTranslation
+const Translator = require('translator');
+Translator.fromJSON(
+    _.merge(
+        require('../translations/config.json'),
+        require('../translations/en.json')
+    )
+);
+
+// Datatables
+const dt = require('datatables.net');
+//dt.defaults.language = require('drmonty-datatables-plugins/i18n/English.json');
+dt.defaults.language = require('../DataTables/English.json');
+
+// Globals
+module.exports = 'en';
+global.locale = 'en';
+window.locale = 'en';
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/fr.js b/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/fr.js
new file mode 100644
index 0000000000000000000000000000000000000000..e90901cb28c50fb2834ac42358d9535430fa0e5e
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/assets/locales/fr.js
@@ -0,0 +1,23 @@
+const _ = require('lodash');
+
+// BazingaJsTranslation
+const Translator = require('translator');
+Translator.fromJSON(
+    _.merge(
+        require('../translations/config.json'),
+        require('../translations/fr.json')
+    )
+);
+
+// Moment
+require('moment/locale/fr');
+
+// Datatables
+const dt = require('datatables.net');
+//dt.defaults.language = require('drmonty-datatables-plugins/i18n/French.json');
+dt.defaults.language = require('../DataTables/French.json');
+
+// Globals
+module.exports = 'fr';
+global.locale = 'fr';
+window.locale = 'fr';
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/config/routing.yml b/src/Irstea/BdohInternationalisationBundle/Resources/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..15944c85c191102233ad16d04b550c9fcc16df05
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/config/routing.yml
@@ -0,0 +1,5 @@
+irstea_bdoh_internationalisation:
+    path:  /select_lang/{_locale}
+    defaults: { _controller: IrsteaBdohInternationalisationBundle:Internationalisation:selectLang }
+    requirements:
+        _locale:  en|fr
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/config/services.yml b/src/Irstea/BdohInternationalisationBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..76516fccdaf9d92cac3ff3de97de165f6f03c6bb
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/config/services.yml
@@ -0,0 +1,6 @@
+services:
+    bdoh_locale.locale_listener:
+        class: Irstea\BdohInternationalisationBundle\EventListener\LocaleListener
+        arguments: ["%kernel.default_locale%"]
+        tags:
+            - { name: kernel.event_subscriber }
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.en.php b/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..cefe3a0eb1bd7cdc9c802c690bea913ffb5832c5
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.en.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$internationalisation = [
+    'lang.selector' => 'English',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($internationalisation);
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..18e81595b889d53d6dccba99ef15bdc59df5e88a
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$internationalisation = [
+    'lang.selector' => 'Français',
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($internationalisation);
diff --git a/src/Irstea/BdohInternationalisationBundle/Resources/views/select-lang.html.twig b/src/Irstea/BdohInternationalisationBundle/Resources/views/select-lang.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f3b75607b7c42f1688d25405d04a9bd9a04a6054
--- /dev/null
+++ b/src/Irstea/BdohInternationalisationBundle/Resources/views/select-lang.html.twig
@@ -0,0 +1,21 @@
+<li class="dropdown">
+    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+        {% if app.session.get('_locale')=='en' %}
+            <img src="{{ asset('images/i18n/gb.png') }}">
+        {% else %}
+            <img src="{{ asset('images/i18n/fr.png') }}">
+        {% endif %}
+        <small>{{ 'lang.selector'|trans }}</small>
+        <b class="caret"></b></a>
+    <ul class="dropdown-menu">
+        {% if app.session.get('_locale')=='en' %}
+            <li><a href="{{ path('irstea_bdoh_internationalisation', {'_locale' : 'fr'}) }}"><img src="{{ asset('images/i18n/fr.png') }}">
+                    <small>Français</small>
+                </a></li>
+        {% else %}
+            <li><a href="{{ path('irstea_bdoh_internationalisation', {'_locale' : 'en'}) }}"><img src="{{ asset('images/i18n/gb.png') }}">
+                    <small>English</small>
+                </a></li>
+        {% endif %}
+    </ul>
+</li>
diff --git a/src/Irstea/BdohLoggerBundle/Controller/LoggerController.php b/src/Irstea/BdohLoggerBundle/Controller/LoggerController.php
new file mode 100644
index 0000000000000000000000000000000000000000..18190eb7b8b618d13bfddf2b6505d27365a50537
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Controller/LoggerController.php
@@ -0,0 +1,226 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueCalculsChroniques;
+use Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueRepository;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class LoggerController.
+ *
+ * @Security("is_granted('ROLE_ADMIN')")
+ */
+class LoggerController extends Controller
+{
+    /**
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function advancedSearchAction(Request $request)
+    {
+        return $this->renderAdvancedSearch($request);
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function advancedSearchRecentAction(Request $request)
+    {
+        return $this->renderAdvancedSearch($request, true);
+    }
+
+    /**
+     * @param Request $request
+     * @param bool    $recent
+     *
+     * @throws \Doctrine\ORM\ORMException
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    private function renderAdvancedSearch(Request $request, $recent = false)
+    {
+        // Map: key => "IrsteaBdohLoggerBundle:Historique".value repository
+        $entitySuffixes = [
+            'all'                          => '',
+            'admin'                        => 'Administration',
+            'adminObservatoire'            => 'AdministrationObservatoire',
+            'adminSiteExperimental'        => 'AdministrationSiteExperimental',
+            'adminStation'                 => 'AdministrationStation',
+            'adminChronique'               => 'AdministrationChronique',
+            'adminBareme'                  => 'AdministrationBareme', // there is no such thing in real life so no menu for it
+            'adminBassin'                  => 'AdministrationBassin',
+            'adminCoursEau'                => 'AdministrationCoursEau',
+            'adminCommune'                 => 'AdministrationCommune',
+            'adminDoi'                     => 'AdministrationDoi',
+            'adminDataset'                 => 'AdministrationDataset',
+            'adminPartenaire'              => 'AdministrationPartenaire',
+            'adminFamilleParametres'       => 'AdministrationFamilleParametres',
+            'adminTypeParametre'           => 'AdministrationTypeParametre',
+            'adminTypeFunding'             => 'AdministrationTypeFunding',
+            'adminTopicCategory'           => 'AdministrationTopicCategory',
+            'adminTheiaCategories'         => 'AdministrationTheiaCategories',
+            'adminInspireTheme'            => 'AdministrationInspireTheme',
+            'adminDataConstraint'          => 'AdministrationDataConstraint',
+            'adminCriteriaGeology'         => 'AdministrationCriteriaGeology',
+            'adminCriteriaClimate'         => 'AdministrationCriteriaClimate',
+            'adminMilieu'                  => 'AdministrationMilieu',
+            'adminPersonneTheia'           => 'AdministrationPersonneTheia',
+            'adminUnite'                   => 'AdministrationUnite',
+            'adminUtilisateur'             => 'AdministrationUtilisateur',
+            'donnees'                      => 'Donnees',
+            'donneesExport'                => 'DonneesExport',
+            'donneesImport'                => 'DonneesImport',
+            'donneesSuppression'           => 'DonneesSuppression',
+            'donneesPointControle'         => 'DonneesPointControle',
+            'transformations'              => 'Transformations',
+            'baremesImport'                => 'BaremesImport',
+            'baremesExport'                => 'BaremesExport',
+            'calculsChroniques'            => 'CalculsChroniques',
+            'conversionsChroniques'        => 'ConversionsChroniques',
+            'sig'                          => 'Sig',
+        ];
+
+        $observatoire = $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent();
+
+        // $historiques will be a map: "historiques".key => history from repository (see $entitySuffixes)
+        // This map will be used to render the TWIG template
+        $historiques = [];
+        $years = null;
+        $year = 0;
+
+        if ($recent) {
+            $date = new \DateTime('now', new \DateTimeZone('UTC'));
+            // P for period, 2M for 2 months (Y for year, M for Month, D for day)
+            $date->sub(new \DateInterval('P2M'));
+            foreach ($entitySuffixes as $key => $suffix) {
+                $historiques[$key] = $this->getHistoriqueRepo($suffix)
+                    ->findByObservatoire($observatoire, 0, $date);
+            }
+        } else {
+            $years = $this->getHistoriqueRepo('')->getYears($observatoire);
+            $year = max($years);
+            if ($request->query->has('year')) {
+                $yearQuery = (int) $request->query->get('year');
+                if (\in_array($yearQuery, $years, true)) {
+                    $year = $yearQuery;
+                }
+            }
+            foreach ($entitySuffixes as $key => $suffix) {
+                $historiques[$key] = $this->getHistoriqueRepo($suffix)
+                    ->findByObservatoire($observatoire, $year);
+            }
+        }
+
+        // Specific case: the description for chronicle computations must be converted to HTML data
+        foreach ($historiques['all'] as $historique) {
+            if ($historique instanceof HistoriqueCalculsChroniques) {
+                $this->convertCalculDescription($historique);
+            }
+        }
+
+        foreach ($historiques['transformations'] as $historique) {
+            if ($historique instanceof HistoriqueCalculsChroniques) {
+                $this->convertCalculDescription($historique);
+            }
+        }
+        foreach ($historiques['calculsChroniques'] as $historique) {
+            $this->convertCalculDescription($historique);
+        }
+
+        // Merge measure imports into transformation log for computed time series
+        // Also, fill a sub-array of $historique with these imports
+        $historiques['donneesImportManuel'] = [];
+        foreach ($historiques['donneesImport'] as $historique) {
+            if ($historique->getChronique() instanceof ChroniqueCalculee) {
+                // Create a 'clone' log rather than using the original one
+                $historiqueClone = new \Irstea\BdohLoggerBundle\Entity\HistoriqueTransformations();
+                $historiqueClone->setAction('historique.actions.ImportManuelMesure');
+                $historiqueClone->setAuteur($historique->getAuteur());
+                $historiqueClone->setDate($historique->getDate());
+                $historiqueClone->setDescription(
+                    $this->getTranslator()->trans('historique.action') .
+                    $this->getTranslator()->trans('deux_points') . ' ' .
+                    $this->getTranslator()->trans('historique.actions.ImportManuelMesure') . "\n" .
+                    preg_replace("/^.*\n/", '', $historique->getDescription())
+                );
+                $historiqueClone->setLien($historique->getLien());
+                $historiqueClone->setObservatoire($historique->getObservatoire());
+
+                $historiques['transformations'][] = $historiqueClone;
+                $historiques['donneesImportManuel'][] = $historiqueClone;
+            }
+        }
+
+        $historiques['derniereConnection'] =
+            $this->getSecurityRepo('Utilisateur')->findDerniereConnection($observatoire);
+
+        // Eventually, return the HTML page
+        return $this->render(
+            'IrsteaBdohLoggerBundle::index.html.twig',
+            [
+                'historiques' => $historiques,
+                'filters'     => json_encode($request->query->all()),
+                'recent'      => $recent,
+                'years'       => $years,
+                'year'        => $year,
+            ]
+        );
+    }
+
+    /**
+     * @param $suffix
+     *
+     * @return \Doctrine\ORM\EntityRepository|HistoriqueRepository
+     */
+    private function getHistoriqueRepo($suffix)
+    {
+        return $this->getRepository('IrsteaBdohLoggerBundle:Historique' . $suffix);
+    }
+
+    /**
+     * @param $historique
+     */
+    private function convertCalculDescription($historique)
+    {
+        // If the description does not start with the header prefix string, then it has already been processed.
+        if (\strpos($historique->getDescription(), HistoriqueCalculsChroniques::TRANSFO_HEADER) === 0) {
+            $description = $historique->unserializeDescription();
+            $historique->setDescription(
+                str_replace(
+                    "\n",
+                    '',
+                    $this->renderView(
+                        'IrsteaBdohLoggerBundle::descriptionHistoriqueCalculChronique.html.twig',
+                        ['description' => $description, 'random' => \mt_rand()]
+                    )
+                )
+            );
+        }
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Historique.php b/src/Irstea/BdohLoggerBundle/Entity/Historique.php
new file mode 100644
index 0000000000000000000000000000000000000000..43822ab826de62b6ffc04c5158691e40d3b93af4
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Historique.php
@@ -0,0 +1,204 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\ObservatoireRelatedInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Historique.
+ */
+class Historique implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var \DateTime
+     */
+    protected $date;
+
+    /**
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * @var string
+     */
+    protected $lien;
+
+    /**
+     * @var \Irstea\BdohSecurityBundle\Entity\Utilisateur
+     */
+    protected $auteur;
+
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set date.
+     *
+     * @param \DateTime $date
+     *
+     * @return Historique
+     */
+    public function setDate($date)
+    {
+        $this->date = $date;
+
+        return $this;
+    }
+
+    /**
+     * Get date.
+     *
+     * @return \DateTime
+     */
+    public function getDate()
+    {
+        return $this->date;
+    }
+
+    /**
+     * Set description.
+     *
+     * @param string $description
+     *
+     * @return Historique
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+
+    /**
+     * Get description.
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Set lien.
+     *
+     * @param string $lien
+     *
+     * @return Historique
+     */
+    public function setLien($lien)
+    {
+        $this->lien = $lien;
+
+        return $this;
+    }
+
+    /**
+     * Get lien.
+     *
+     * @return string
+     */
+    public function getLien()
+    {
+        return $this->lien;
+    }
+
+    /**
+     * Set auteur.
+     *
+     * @param \Irstea\BdohSecurityBundle\Entity\Utilisateur $auteur
+     *
+     * @return Historique
+     */
+    public function setAuteur(\Irstea\BdohSecurityBundle\Entity\Utilisateur $auteur = null)
+    {
+        $this->auteur = $auteur;
+
+        return $this;
+    }
+
+    /**
+     * Get auteur.
+     *
+     * @return \Irstea\BdohSecurityBundle\Entity\Utilisateur
+     */
+    public function getAuteur()
+    {
+        return $this->auteur;
+    }
+
+    /**
+     * Set observatoire.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Observatoire $observatoire
+     *
+     * @return Historique
+     */
+    public function setObservatoire(\Irstea\BdohDataBundle\Entity\Observatoire $observatoire = null)
+    {
+        $this->observatoire = $observatoire;
+
+        return $this;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        //Do nothing ; is supposed to be overwritten by subclasses.
+    }
+
+    public function constructLien()
+    {
+        //Do nothing ; is supposed to be overwritten by subclasses.
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministration.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministration.php
new file mode 100644
index 0000000000000000000000000000000000000000..48b74890b83a7cea6c1272ccacfef6cf7462e484
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministration.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministration.
+ */
+class HistoriqueAdministration extends Historique
+{
+    /**
+     * @var string
+     */
+    protected $action;
+
+    /**
+     * Set action.
+     *
+     * @param string $action
+     *
+     * @return HistoriqueAdministration
+     */
+    public function setAction($action)
+    {
+        $this->action = $action;
+
+        return $this;
+    }
+
+    /**
+     * Get action.
+     *
+     * @return string
+     */
+    public function getAction()
+    {
+        return $this->action;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans($this->getAction())
+        );
+        //To be overwritten by subclasses.
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBareme.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBareme.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3a04e6849bb8f0c1226cec7afb650f4f1b52ec1
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBareme.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationBareme.
+ */
+class HistoriqueAdministrationBareme extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Bareme
+     */
+    protected $bareme;
+
+    /**
+     * Set bareme.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Bareme $bareme
+     *
+     * @return HistoriqueAdministrationBareme
+     */
+    public function setBareme(\Irstea\BdohDataBundle\Entity\Bareme $bareme = null)
+    {
+        $this->bareme = $bareme;
+
+        return $this;
+    }
+
+    /**
+     * Get bareme.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Bareme
+     */
+    public function getBareme()
+    {
+        return $this->bareme;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.bareme') . $translator->trans('deux_points') . ' ' .
+            $this->getBareme()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBassin.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBassin.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae273caa868bb0c240590bbf7cee7ba6d227c947
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationBassin.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationBassin.
+ */
+class HistoriqueAdministrationBassin extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Bassin
+     */
+    protected $bassin;
+
+    /**
+     * Set bassin.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Bassin $bassin
+     *
+     * @return HistoriqueAdministrationBassin
+     */
+    public function setBassin(\Irstea\BdohDataBundle\Entity\Bassin $bassin = null)
+    {
+        $this->bassin = $bassin;
+
+        return $this;
+    }
+
+    /**
+     * Get bassin.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Bassin
+     */
+    public function getBassin()
+    {
+        return $this->bassin;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.bassin') . $translator->trans('deux_points') . ' ' .
+            $this->getBassin()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationChronique.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationChronique.php
new file mode 100644
index 0000000000000000000000000000000000000000..44b8a891b86da0b9b6aef9b58acce8280d61ede3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationChronique.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationChronique.
+ */
+class HistoriqueAdministrationChronique extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Chronique
+     */
+    protected $chronique;
+
+    /**
+     * Set chronique.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Chronique $chronique
+     *
+     * @return HistoriqueAdministrationChronique
+     */
+    public function setChronique(\Irstea\BdohDataBundle\Entity\Chronique $chronique = null)
+    {
+        $this->chronique = $chronique;
+
+        return $this;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Chronique
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.chronique') . $translator->trans('deux_points') . ' ' .
+            $this->getChronique()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCommune.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCommune.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9c4880e7d12349f70baaffe2e287d79b4a6f092
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCommune.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationCommune.
+ */
+class HistoriqueAdministrationCommune extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Commune
+     */
+    protected $commune;
+
+    /**
+     * Set commune.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Commune $commune
+     *
+     * @return HistoriqueAdministrationCommune
+     */
+    public function setCommune(\Irstea\BdohDataBundle\Entity\Commune $commune = null)
+    {
+        $this->commune = $commune;
+
+        return $this;
+    }
+
+    /**
+     * Get commune.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Commune
+     */
+    public function getCommune()
+    {
+        return $this->commune;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.commune') . $translator->trans('deux_points') . ' ' .
+            $this->getCommune()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCoursEau.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCoursEau.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7ab01f6f7d00565b351b5f4b7f6e1f579696cc6
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCoursEau.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationCoursEau.
+ */
+class HistoriqueAdministrationCoursEau extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\CoursEau
+     */
+    protected $coursEau;
+
+    /**
+     * Set CoursEau.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\CoursEau $coursEau
+     *
+     * @return HistoriqueAdministrationCoursEau
+     */
+    public function setCoursEau(\Irstea\BdohDataBundle\Entity\CoursEau $coursEau = null)
+    {
+        $this->coursEau = $coursEau;
+
+        return $this;
+    }
+
+    /**
+     * Get CoursEau.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\CoursEau
+     */
+    public function getCoursEau()
+    {
+        return $this->coursEau;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.coursEau') . $translator->trans('deux_points') . ' ' .
+            $this->getCoursEau()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaClimate.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaClimate.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b7178b30746f91a6c4b35a45a8ce4a6fd288d98
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaClimate.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\CriteriaClimat;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationCriteriaClimate extends HistoriqueAdministration
+{
+    /**
+     * @var CriteriaClimat
+     */
+    protected $criteriaClimat;
+
+    /**
+     * @return CriteriaClimat
+     */
+    public function getCriteriaClimat(): CriteriaClimat
+    {
+        return $this->criteriaClimat;
+    }
+
+    /**
+     * @param CriteriaClimat $criteriaClimat
+     */
+    public function setCriteriaClimat(CriteriaClimat $criteriaClimat = null)
+    {
+        $this->criteriaClimat = $criteriaClimat;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.criteriaclimate') . $translator->trans('deux_points') . ' ' .
+            $this->getCriteriaClimat()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaGeology.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaGeology.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fb2254066dc3426bf1bb360370860b64d4fa9d3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationCriteriaGeology.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\CriteriaGeology;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationCriteriaGeology extends HistoriqueAdministration
+{
+    /**
+     * @var CriteriaGeology
+     */
+    protected $criteriaGeology;
+
+    /**
+     * @return CriteriaGeology
+     */
+    public function getCriteriaGeology(): CriteriaGeology
+    {
+        return $this->criteriaGeology;
+    }
+
+    /**
+     * @param CriteriaGeology $criteriaGeology
+     */
+    public function setCriteriaGeology(CriteriaGeology $criteriaGeology = null)
+    {
+        $this->criteriaGeology = $criteriaGeology;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.criteriageology') . $translator->trans('deux_points') . ' ' .
+            $this->getCriteriaGeology()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataConstraint.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..41c29789721a0200e11e52f89083bd40dfd0aa50
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataConstraint.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\DataConstraint;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationDataConstraint extends HistoriqueAdministration
+{
+    /**
+     * @var DataConstraint
+     */
+    protected $dataConstraint;
+
+    /**
+     * @return DataConstraint
+     */
+    public function getDataConstraint(): DataConstraint
+    {
+        return $this->dataConstraint;
+    }
+
+    /**
+     * @param DataConstraint $dataConstraint
+     *
+     * @return HistoriqueAdministrationDataConstraint
+     */
+    public function setDataConstraint(DataConstraint $dataConstraint = null)
+    {
+        $this->dataConstraint = $dataConstraint;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.dataconstraint') . $translator->trans('deux_points') . ' ' .
+            $this->getDataConstraint()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataSet.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataSet.php
new file mode 100644
index 0000000000000000000000000000000000000000..98515c1be66558a838b6d37aaa8e791b6d046020
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDataSet.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationDataSet extends HistoriqueAdministration
+{
+    /**
+     * @var DataSet
+     */
+    protected $dataSet;
+
+    /**
+     * @return DataSet
+     */
+    public function getDataSet()
+    {
+        return $this->dataSet;
+    }
+
+    /**
+     * @param DataSet $dataSet
+     *
+     * @return HistoriqueAdministrationDataSet
+     */
+    public function setDataSet(DataSet $dataSet = null)
+    {
+        $this->dataSet = $dataSet;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.dataset') . $translator->trans('deux_points') . ' ' .
+            $this->getDataSet()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDoi.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDoi.php
new file mode 100644
index 0000000000000000000000000000000000000000..2105a3cfebe1756632f4b7540f80e7a999347d61
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationDoi.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\Doi;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Description of HistoriqueAdministrationDoi.
+ */
+class HistoriqueAdministrationDoi extends HistoriqueAdministration
+{
+    /**
+     * @var Doi
+     */
+    protected $doi;
+
+    /**
+     * set DOI.
+     *
+     * @param Doi $doi
+     *
+     * @return self
+     */
+    public function setDoi(Doi $doi = null)
+    {
+        $this->doi = $doi;
+
+        return $this;
+    }
+
+    /**
+     * Get DOI.
+     *
+     * @return Doi
+     */
+    public function getDoi()
+    {
+        return $this->doi;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.doi') . $translator->trans('deux_points') . ' ' .
+            $this->getDoi()->getIdentifiant()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationFamilleParametres.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationFamilleParametres.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fa617c035a812c54defbe1bf1c1c917dd96f465
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationFamilleParametres.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationFamilleParametres.
+ */
+class HistoriqueAdministrationFamilleParametres extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    protected $familleParametres;
+
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    protected $familleParente;
+
+    /**
+     * Set familleParametres.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\FamilleParametres $familleParametres
+     *
+     * @return HistoriqueAdministrationFamilleParametres
+     */
+    public function setFamilleParametres(\Irstea\BdohDataBundle\Entity\FamilleParametres $familleParametres = null)
+    {
+        $this->familleParametres = $familleParametres;
+
+        return $this;
+    }
+
+    /**
+     * Get familleParametres.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    public function getFamilleParametres()
+    {
+        return $this->familleParametres;
+    }
+
+    /**
+     * Set familleParente.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\FamilleParametres $familleParente
+     *
+     * @return HistoriqueAdministrationFamilleParametres
+     */
+    public function setFamilleParente(\Irstea\BdohDataBundle\Entity\FamilleParametres $familleParente = null)
+    {
+        $this->familleParente = $familleParente;
+
+        return $this;
+    }
+
+    /**
+     * Get familleParente.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    public function getFamilleParente()
+    {
+        return $this->familleParente;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $inEnglish = \strpos($translator->getLocale(), 'en') === 0;
+        $famille = $inEnglish ? $this->getFamilleParametres()->getNomEn() : $this->getFamilleParametres()->getNom();
+        $parente = $this->getFamilleParente() ?
+            ($inEnglish ? $this->getFamilleParente()->getNomEn() : $this->getFamilleParente()->getNom()) :
+            $translator->trans('historique.noFamilleParente');
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.familleParametres') . $translator->trans('deux_points') . ' ' .
+            $famille . "\n" .
+            $translator->trans('historique.familleParente') . $translator->trans('deux_points') . ' ' .
+            $parente
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationInspireTheme.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationInspireTheme.php
new file mode 100644
index 0000000000000000000000000000000000000000..5238daaa1ff8550a7e6fc4862ae663a74a0a8b6d
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationInspireTheme.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\InspireTheme;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationInspireTheme extends HistoriqueAdministration
+{
+    /**
+     * @var InspireTheme
+     */
+    protected $inspireTheme;
+
+    /**
+     * @return InspireTheme
+     */
+    public function getInspireTheme(): InspireTheme
+    {
+        return $this->inspireTheme;
+    }
+
+    /**
+     * @param InspireTheme $inspireTheme
+     *
+     * @return HistoriqueAdministrationInspireTheme
+     */
+    public function setInspireTheme(InspireTheme $inspireTheme)
+    {
+        $this->inspireTheme = $inspireTheme;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.inspireTheme') . $translator->trans('deux_points') . ' ' .
+            $this->getInspireTheme()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationMilieu.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationMilieu.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a52c8e06792f6c7e0d54a0744eb41bfa41f88c4
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationMilieu.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\Milieu;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationMilieu extends HistoriqueAdministration
+{
+    /**
+     * @var Milieu
+     */
+    protected $milieu;
+
+    /**
+     * @return Milieu
+     */
+    public function getMilieu(): Milieu
+    {
+        return $this->milieu;
+    }
+
+    /**
+     * @param Milieu $milieu
+     *
+     * @return HistoriqueAdministrationMilieu
+     */
+    public function setMilieu(Milieu $milieu = null)
+    {
+        $this->milieu = $milieu;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.milieu') . $translator->trans('deux_points') . ' ' .
+            $this->getMilieu()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationObservatoire.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationObservatoire.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc27bebc88fbac7a69dafdd3c16f841360365dac
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationObservatoire.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationObservatoire.
+ */
+class HistoriqueAdministrationObservatoire extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Observatoire
+     */
+    protected $observatoireCible;
+
+    /**
+     * Set observatoireCible.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Observatoire $observatoireCible
+     *
+     * @return HistoriqueAdministrationObservatoire
+     */
+    public function setObservatoireCible(Observatoire $observatoireCible = null)
+    {
+        $this->observatoireCible = $observatoireCible;
+
+        return $this;
+    }
+
+    /**
+     * Get observatoireCible.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Observatoire
+     */
+    public function getObservatoireCible()
+    {
+        return $this->observatoireCible;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.observatoire') . $translator->trans('deux_points') . ' ' .
+            $this->getObservatoireCible()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPartenaire.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPartenaire.php
new file mode 100644
index 0000000000000000000000000000000000000000..90bb9b7e06cccd64f8756279335760eb5c83abe4
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPartenaire.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationPartenaire.
+ */
+class HistoriqueAdministrationPartenaire extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Partenaire
+     */
+    protected $partenaire;
+
+    /**
+     * Set partenaire.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Partenaire $partenaire
+     *
+     * @return HistoriqueAdministrationPartenaire
+     */
+    public function setPartenaire(\Irstea\BdohDataBundle\Entity\Partenaire $partenaire = null)
+    {
+        $this->partenaire = $partenaire;
+
+        return $this;
+    }
+
+    /**
+     * Get partenaire.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Partenaire
+     */
+    public function getPartenaire()
+    {
+        return $this->partenaire;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.partenaire') . $translator->trans('deux_points') . ' ' .
+            $this->getPartenaire()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPersonneTheia.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPersonneTheia.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b2353edf3bd624279a18f723a65fc6363aae626
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationPersonneTheia.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\PersonneTheia;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationPersonneTheia extends HistoriqueAdministration
+{
+    /**
+     * @var PersonneTheia
+     */
+    protected $personneTheia;
+
+    /**
+     * @return PersonneTheia
+     */
+    public function getPersonneTheia()
+    {
+        return $this->personneTheia;
+    }
+
+    /**
+     * @param PersonneTheia $personneTheia
+     *
+     * @return HistoriqueAdministrationPersonneTheia
+     */
+    public function setPersonneTheia(PersonneTheia $personneTheia = null)
+    {
+        $this->personneTheia = $personneTheia;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.personneTheia') . $translator->trans('deux_points') . ' ' .
+            $this->getPersonneTheia()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationSiteExperimental.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationSiteExperimental.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9885d5da57a00a353edc0a9e4df5d1823b90d7b
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationSiteExperimental.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationSiteExperimental.
+ */
+class HistoriqueAdministrationSiteExperimental extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\SiteExperimental
+     */
+    protected $siteExperimental;
+
+    /**
+     * Set siteExperimental.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\SiteExperimental $siteExperimental
+     *
+     * @return HistoriqueAdministrationSiteExperimental
+     */
+    public function setSiteExperimental(\Irstea\BdohDataBundle\Entity\SiteExperimental $siteExperimental = null)
+    {
+        $this->siteExperimental = $siteExperimental;
+
+        return $this;
+    }
+
+    /**
+     * Get siteExperimental.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\SiteExperimental
+     */
+    public function getSiteExperimental()
+    {
+        return $this->siteExperimental;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.siteExperimental') . $translator->trans('deux_points') . ' ' .
+            $this->getSiteExperimental()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationStation.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationStation.php
new file mode 100644
index 0000000000000000000000000000000000000000..613177217c573d3abad9da1cbafa417f6cdcceaf
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationStation.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationStation.
+ */
+class HistoriqueAdministrationStation extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Station
+     */
+    protected $station;
+
+    /**
+     * Set station.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Station $station
+     *
+     * @return HistoriqueAdministrationStation
+     */
+    public function setStation(\Irstea\BdohDataBundle\Entity\Station $station = null)
+    {
+        $this->station = $station;
+
+        return $this;
+    }
+
+    /**
+     * Get station.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Station
+     */
+    public function getStation()
+    {
+        return $this->station;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.station') . $translator->trans('deux_points') . ' ' .
+            $this->getStation()->getNom() . ' (' . $this->getStation()->getCode() . ')'
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTheiaCategories.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTheiaCategories.php
new file mode 100644
index 0000000000000000000000000000000000000000..2cfd7dd8cee978848edc042ca700e9c0af224752
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTheiaCategories.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\TheiaCategories;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationTheiaCategories extends HistoriqueAdministration
+{
+    /**
+     * @var TheiaCategories
+     */
+    protected $theiaCategories;
+
+    /**
+     * @return TheiaCategories
+     */
+    public function getTheiaCategories()
+    {
+        return $this->theiaCategories;
+    }
+
+    /**
+     * @param TheiaCategories $theiaCategories
+     *
+     * @return HistoriqueAdministrationTheiaCategories
+     */
+    public function setTheiaCategories(TheiaCategories $theiaCategories)
+    {
+        $this->theiaCategories = $theiaCategories;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.theiaCategories') . $translator->trans('deux_points') . ' ' .
+            $this->getTheiaCategories()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTopicCategory.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTopicCategory.php
new file mode 100644
index 0000000000000000000000000000000000000000..41d803a93b85941df577f42acf75441892851fc0
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTopicCategory.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\TopicCategory;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationTopicCategory extends HistoriqueAdministration
+{
+    /**
+     * @var TopicCategory
+     */
+    protected $topicCategory;
+
+    /**
+     * @return TopicCategory
+     */
+    public function getTopicCategory()
+    {
+        return $this->topicCategory;
+    }
+
+    /**
+     * @param TopicCategory $topicCategory
+     *
+     * @return HistoriqueAdministrationTopicCategory
+     */
+    public function setTopicCategory(TopicCategory $topicCategory)
+    {
+        $this->topicCategory = $topicCategory;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.topicCategory') . $translator->trans('deux_points') . ' ' .
+            $this->getTopicCategory()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeFunding.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeFunding.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbd7872d4eb4da8ddcd640eb9957b07ba7883a2e
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeFunding.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\TypeFunding;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class HistoriqueAdministrationTypeFunding extends HistoriqueAdministration
+{
+    /**
+     * @var TypeFunding
+     */
+    protected $typefunding;
+
+    /**
+     * @return TypeFunding|null
+     */
+    public function getTypefunding()
+    {
+        return $this->typefunding;
+    }
+
+    /**
+     * @param TypeFunding $typefunding
+     *
+     * @return HistoriqueAdministrationTypeFunding
+     */
+    public function setTypefunding(TypeFunding $typefunding = null)
+    {
+        $this->typefunding = $typefunding;
+
+        return $this;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.typefunding') . $translator->trans('deux_points') . ' ' .
+            $this->getTypefunding()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeParametre.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeParametre.php
new file mode 100644
index 0000000000000000000000000000000000000000..4382fe7cf1acedbc03b15a31bedc9405f10a732e
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationTypeParametre.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationTypeParametre.
+ */
+class HistoriqueAdministrationTypeParametre extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\TypeParametre
+     */
+    protected $typeParametre;
+
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    protected $familleParametres;
+
+    /**
+     * Set typeParametre.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\TypeParametre $typeParametre
+     *
+     * @return HistoriqueAdministrationTypeParametre
+     */
+    public function setTypeParametre(\Irstea\BdohDataBundle\Entity\TypeParametre $typeParametre = null)
+    {
+        $this->typeParametre = $typeParametre;
+
+        return $this;
+    }
+
+    /**
+     * Get typeParametre.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\TypeParametre
+     */
+    public function getTypeParametre()
+    {
+        return $this->typeParametre;
+    }
+
+    /**
+     * Set familleParametres.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\FamilleParametres $familleParametres
+     *
+     * @return HistoriqueAdministrationTypeParametre
+     */
+    public function setFamilleParametres(\Irstea\BdohDataBundle\Entity\FamilleParametres $familleParametres = null)
+    {
+        $this->familleParametres = $familleParametres;
+
+        return $this;
+    }
+
+    /**
+     * Get familleParametres.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\FamilleParametres
+     */
+    public function getFamilleParametres()
+    {
+        return $this->familleParametres;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $inEnglish = \strpos($translator->getLocale(), 'en') === 0;
+        $type = $inEnglish ? $this->getTypeParametre()->getNomEn() : $this->getTypeParametre()->getNom();
+        $famille = $this->getFamilleParametres() ?
+            ($inEnglish ? $this->getFamilleParametres()->getNomEn() : $this->getFamilleParametres()->getNom()) :
+            $translator->trans('historique.noFamilleParametres');
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.typeParametre') . $translator->trans('deux_points') . ' ' .
+            $type . "\n" .
+            $translator->trans('historique.familleParametres') . $translator->trans('deux_points') . ' ' .
+            $famille
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUnite.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUnite.php
new file mode 100644
index 0000000000000000000000000000000000000000..276d87248ac555d9b8aafe93673e257bdd94d6ee
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUnite.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationUnite.
+ */
+class HistoriqueAdministrationUnite extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Unite
+     */
+    protected $unite;
+
+    /**
+     * Set unite.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Unite $unite
+     *
+     * @return HistoriqueAdministrationUnite
+     */
+    public function setUnite(\Irstea\BdohDataBundle\Entity\Unite $unite = null)
+    {
+        $this->unite = $unite;
+
+        return $this;
+    }
+
+    /**
+     * Get unite.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Unite
+     */
+    public function getUnite()
+    {
+        return $this->unite;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.unite') . $translator->trans('deux_points') . ' ' .
+            $this->getUnite()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUtilisateur.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUtilisateur.php
new file mode 100644
index 0000000000000000000000000000000000000000..c4e44479790239ead46e4513d9238633d74f9673
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueAdministrationUtilisateur.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueAdministrationUtilisateur.
+ */
+class HistoriqueAdministrationUtilisateur extends HistoriqueAdministration
+{
+    /**
+     * @var \Irstea\BdohSecurityBundle\Entity\Utilisateur
+     */
+    protected $utilisateur;
+
+    /**
+     * Set utilisateur.
+     *
+     * @param \Irstea\BdohSecurityBundle\Entity\Utilisateur $utilisateur
+     *
+     * @return HistoriqueAdministrationUtilisateur
+     */
+    public function setUtilisateur(\Irstea\BdohSecurityBundle\Entity\Utilisateur $utilisateur = null)
+    {
+        $this->utilisateur = $utilisateur;
+
+        return $this;
+    }
+
+    /**
+     * Get utilisateur.
+     *
+     * @return \Irstea\BdohSecurityBundle\Entity\Utilisateur
+     */
+    public function getUtilisateur()
+    {
+        return $this->utilisateur;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.utilisateur') . $translator->trans('deux_points') . ' ' .
+            $this->getUtilisateur()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremes.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremes.php
new file mode 100644
index 0000000000000000000000000000000000000000..312cb0f6b8e455e679bc25732d99dd13beafdece
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremes.php
@@ -0,0 +1,218 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueBaremes.
+ */
+class HistoriqueBaremes extends HistoriqueTransformations
+{
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @var string
+     */
+    private $inputUnit;
+
+    /**
+     * @var string
+     */
+    private $outputUnit;
+
+    /**
+     * @var float
+     */
+    private $minAbscissa;
+
+    /**
+     * @var float
+     */
+    private $maxAbscissa;
+
+    /**
+     * Set name.
+     *
+     * @param string $name
+     *
+     * @return HistoriqueBaremes
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+
+        return $this;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set inputUnit.
+     *
+     * @param string $inputUnit
+     *
+     * @return HistoriqueBaremes
+     */
+    public function setInputUnit($inputUnit)
+    {
+        $this->inputUnit = $inputUnit;
+
+        return $this;
+    }
+
+    /**
+     * Get inputUnit.
+     *
+     * @return string
+     */
+    public function getInputUnit()
+    {
+        return $this->inputUnit;
+    }
+
+    /**
+     * Set outputUnit.
+     *
+     * @param string $outputUnit
+     *
+     * @return HistoriqueBaremes
+     */
+    public function setOutputUnit($outputUnit)
+    {
+        $this->outputUnit = $outputUnit;
+
+        return $this;
+    }
+
+    /**
+     * Get outputUnit.
+     *
+     * @return string
+     */
+    public function getOutputUnit()
+    {
+        return $this->outputUnit;
+    }
+
+    /**
+     * Set minAbscissa.
+     *
+     * @param float $minAbscissa
+     *
+     * @return HistoriqueBaremes
+     */
+    public function setMinAbscissa($minAbscissa)
+    {
+        $this->minAbscissa = $minAbscissa;
+
+        return $this;
+    }
+
+    /**
+     * Get minAbscissa.
+     *
+     * @return float
+     */
+    public function getMinAbscissa()
+    {
+        return $this->minAbscissa;
+    }
+
+    /**
+     * Set maxAbscissa.
+     *
+     * @param float $maxAbscissa
+     *
+     * @return HistoriqueBaremes
+     */
+    public function setMaxAbscissa($maxAbscissa)
+    {
+        $this->maxAbscissa = $maxAbscissa;
+
+        return $this;
+    }
+
+    /**
+     * Get maxAbscissa.
+     *
+     * @return float
+     */
+    public function getMaxAbscissa()
+    {
+        return $this->maxAbscissa;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     *
+     * @return string
+     */
+    protected function nameLine(TranslatorInterface $translator)
+    {
+        return $translator->trans('historique.bareme') . $translator->trans('deux_points') . ' ' .
+            $this->getName() . "\n";
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     *
+     * @return string
+     */
+    protected function unitsLine(TranslatorInterface $translator)
+    {
+        return $translator->trans(
+            'bareme.units(%inputUnit%, %outputUnit%)',
+            [
+                    '%inputUnit%'  => $this->getInputUnit(),
+                    '%outputUnit%' => $this->getOutputUnit(),
+                ]
+        ) . "\n";
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     *
+     * @return string
+     */
+    protected function minMaxLine(TranslatorInterface $translator)
+    {
+        return $translator->trans(
+            'bareme.xMinMax(%xMin%, %xMax%)',
+            [
+                    '%xMin%' => $this->getMinAbscissa(),
+                    '%xMax%' => $this->getMaxAbscissa(),
+                ]
+        ) . "\n";
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesExport.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesExport.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2d4f620c49e7a6077ee9ecef6789dd84cb0be05
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesExport.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueBaremesExport.
+ */
+class HistoriqueBaremesExport extends HistoriqueBaremes
+{
+    /**
+     * @var \DateTime
+     */
+    private $dateCreation;
+
+    /**
+     * @var int
+     */
+    private $nValues;
+
+    /**
+     * Set dateCreation.
+     *
+     * @param \DateTime $dateCreation
+     *
+     * @return HistoriqueBaremesExport
+     */
+    public function setDateCreation($dateCreation)
+    {
+        $this->dateCreation = $dateCreation;
+
+        return $this;
+    }
+
+    /**
+     * Get dateCreation.
+     *
+     * @return \DateTime
+     */
+    public function getDateCreation()
+    {
+        return $this->dateCreation;
+    }
+
+    /**
+     * Set nValues.
+     *
+     * @param int $nValues
+     *
+     * @return HistoriqueBaremesExport
+     */
+    public function setNValues($nValues)
+    {
+        $this->nValues = $nValues;
+
+        return $this;
+    }
+
+    /**
+     * Get nValues.
+     *
+     * @return int
+     */
+    public function getNValues()
+    {
+        return $this->nValues;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $this->actionLine($translator) .
+            $this->nameLine($translator) .
+            $translator->trans('bareme.dateCreation') . ' ' .
+            $this->getDateCreation()->format($translator->trans('transformation.bareme.dateBareme')) . ' ' .
+            $translator->trans('UTC') . "\n" .
+            $this->unitsLine($translator) .
+            $this->getNValues() . ' ' . $translator->trans('bareme.values') . "\n" .
+            $this->minMaxLine($translator)
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesImport.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesImport.php
new file mode 100644
index 0000000000000000000000000000000000000000..39d7b00f3e74fb1c02c49dfaa3ab2d93c53d7076
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueBaremesImport.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueBaremesImport.
+ */
+class HistoriqueBaremesImport extends HistoriqueBaremes
+{
+    /**
+     * @var \DateTime
+     */
+    private $dateCreation;
+
+    /**
+     * @var int
+     */
+    private $nValues;
+
+    /**
+     * Set dateCreation.
+     *
+     * @param \DateTime $dateCreation
+     *
+     * @return HistoriqueBaremesImport
+     */
+    public function setDateCreation($dateCreation)
+    {
+        $this->dateCreation = $dateCreation;
+
+        return $this;
+    }
+
+    /**
+     * Get dateCreation.
+     *
+     * @return \DateTime
+     */
+    public function getDateCreation()
+    {
+        return $this->dateCreation;
+    }
+
+    /**
+     * Set nValues.
+     *
+     * @param int $nValues
+     *
+     * @return HistoriqueBaremesImport
+     */
+    public function setNValues($nValues)
+    {
+        $this->nValues = $nValues;
+
+        return $this;
+    }
+
+    /**
+     * Get nValues.
+     *
+     * @return int
+     */
+    public function getNValues()
+    {
+        return $this->nValues;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $this->actionLine($translator) .
+            $this->nameLine($translator) .
+            $translator->trans('bareme.dateCreation') . ' ' .
+            $this->getDateCreation()->format($translator->trans('transformation.bareme.dateBareme')) . ' ' .
+            $translator->trans('UTC') . "\n" .
+            $this->unitsLine($translator) .
+            $this->getNValues() . ' ' . $translator->trans('bareme.values') . "\n" .
+            $this->minMaxLine($translator)
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueCalculsChroniques.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueCalculsChroniques.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2d97067ede14f42525a8fd37d96e09e95218e6b
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueCalculsChroniques.php
@@ -0,0 +1,238 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueCalculee;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueCalculsChroniques.
+ */
+class HistoriqueCalculsChroniques extends HistoriqueTransformations
+{
+    const TRANSFO_HEADER = '## ';
+
+    const TRANSFO_SEPARATOR = ' || ';
+
+    const SERIALIZED_DATE_FORMAT = 'Y-m-d H:i:s T';
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $description = $this->getDescription();
+        $this->setDescription(is_array($description) ? implode("\n", $description) : $description);
+    }
+
+    /**
+     * @param ChroniqueCalculee $chronique
+     */
+    public function serializeDescription(ChroniqueCalculee $chronique)
+    {
+        /* @var $transformations \Irstea\BdohDataBundle\Entity\Transformation[] */
+        $transformations = [$chronique->getPremiereEntree()];
+        $hasTwoParents = false;
+        if (($secondTransf = $chronique->getSecondeEntree())) {
+            $transformations[] = $secondTransf;
+            $hasTwoParents = true;
+        }
+
+        $descrArray = [
+            self::TRANSFO_HEADER . 'Action type: computation',
+            self::TRANSFO_HEADER . 'Child time series',
+            $chronique->__toString(),
+            self::TRANSFO_HEADER . 'Parent time series',
+            $transformations[0]->getEntree()->__toString(),
+        ];
+        if ($hasTwoParents) {
+            $descrArray[] = $transformations[1]->getEntree()->__toString();
+        }
+
+        $jeuxBaremes = ['Grading scales for 1st parent time series' => $transformations[0]->getJeuBaremeActuel()];
+        if ($hasTwoParents) {
+            $jeuxBaremes['Grading scales for 2nd parent time series'] = $transformations[1]->getJeuBaremeActuel();
+        }
+        $tempsPropagations = [];
+        /* @var $jeuBareme \Irstea\BdohDataBundle\Entity\JeuBareme */
+        foreach ($jeuxBaremes as $headerText => $jeuBareme) {
+            $tempsPropagations[] = $jeuBareme->getDelaiPropagation();
+            $descrArray[] = self::TRANSFO_HEADER . $headerText;
+            $descrArray[] = self::TRANSFO_HEADER . \implode(self::TRANSFO_SEPARATOR, ['Name', 'Creation date, Apply from, Apply to']);
+            /* @var $bjb \Irstea\BdohDataBundle\Entity\BaremeJeuBareme */
+            foreach ($jeuBareme->getBaremeJeuBaremes() as $bjb) {
+                $bareme = $bjb->getBareme();
+                $descrArray[] = \implode(
+                    self::TRANSFO_SEPARATOR,
+                    [
+                        $bareme->getNom(),
+                        (($dc = $bareme->getDateCreation()) && $bareme->getObservatoire()) ? $dc->format('Y-m-d H:i:s') . ' UTC' : '',
+                        ($dv = $bjb->getDebutValidite()) ? $dv->format('Y-m-d H:i:s') . ' UTC' : '',
+                        ($fv = $bjb->getFinValidite()) ? $fv->format('Y-m-d H:i:s') . ' UTC' : '',
+                    ]
+                );
+            }
+        }
+
+        $descrArray[] = self::TRANSFO_HEADER . 'Coefficient';
+        $descrArray[] = ($coeff = $chronique->getFacteurMultiplicatif()) !== null ? $coeff : '';
+
+        $descrArray[] = self::TRANSFO_HEADER . 'Propagation times';
+        $descrArray[] = $hasTwoParents ? \implode(self::TRANSFO_SEPARATOR, $tempsPropagations) : '';
+
+        $descrArray[] = self::TRANSFO_HEADER . 'Value limit policies';
+        $valueLimitPolicies = [];
+        foreach ($jeuxBaremes as $jeuBareme) {
+            $transformationPolicy = $jeuBareme->getValueLimitTransformationType();
+            $valueLimitPolicies[] = $transformationPolicy ? $transformationPolicy : '';
+            $transformationPlaceholder = $jeuBareme->getValueLimitPlaceholder();
+            $valueLimitPolicies[] = $transformationPlaceholder !== null ? $transformationPlaceholder : '';
+        }
+        $descrArray[] = \implode(self::TRANSFO_SEPARATOR, $valueLimitPolicies);
+
+        $this->setDescription(\implode("\n", $descrArray));
+    }
+
+    /**
+     * @param string $date
+     *
+     * @return \DateTime|null
+     */
+    private function unserializeDate(string $stringDate)
+    {
+        if (!$stringDate) {
+            return null;
+        }
+
+        if (\strpos($stringDate, ' UTC') === false) {
+            // the old serialize date format is Y-m-d
+            $stringDate .= ' 00:00:00 UTC';
+        }
+
+        return \DateTime::createFromFormat(
+            self::SERIALIZED_DATE_FORMAT,
+            $stringDate,
+            new \DateTimeZone('UTC')
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function unserializeDescription()
+    {
+        $transfoData = [];
+        $descriptionArray = \explode("\n", $this->getDescription());
+
+        $iLine = $this->nextNonHeaderLineIndex($descriptionArray, -1);
+        if ($iLine !== false) {
+            $transfoData['chronique_fille'] = $descriptionArray[$iLine];
+        }
+
+        $iLine = $this->nextNonHeaderLineIndex($descriptionArray, $iLine);
+        $hasTwoParents = false;
+        if ($iLine !== false) {
+            $transfoData['chroniques_meres'] = [$descriptionArray[$iLine]];
+            if (!$this->isHeaderLine($descriptionArray[$iLine + 1])) {
+                ++$iLine;
+                $transfoData['chroniques_meres'][] = [$descriptionArray[$iLine]];
+                $hasTwoParents = true;
+            }
+        }
+
+        for ($iParent = 0; $iParent < ($hasTwoParents ? 2 : 1); ++$iParent) {
+            $iLine = $this->nextNonHeaderLineIndex($descriptionArray, $iLine);
+            $baremes = [];
+            while (isset($descriptionArray[$iLine]) && !$this->isHeaderLine($descriptionArray[$iLine])) {
+                $bareme = \explode(self::TRANSFO_SEPARATOR, $descriptionArray[$iLine]);
+                $baremes[] = [
+                    'nom'           => $bareme[0],
+                    'date_creation' => $this->unserializeDate($bareme[1]),
+                    'date_debut'    => $this->unserializeDate($bareme[2]),
+                    'date_fin'      => $this->unserializeDate($bareme[3]),
+                ];
+                ++$iLine;
+            }
+            $transfoData['baremes'][] = $baremes;
+            --$iLine;
+        }
+
+        $iLine = $this->nextNonHeaderLineIndex($descriptionArray, $iLine);
+        if ($iLine !== false) {
+            $coeff = $descriptionArray[$iLine];
+            $transfoData['facteur_multiplicatif'] = $hasTwoParents && \is_numeric($coeff) ? (float) $coeff : null;
+        }
+
+        $iLine = $this->nextNonHeaderLineIndex($descriptionArray, $iLine);
+        if ($iLine !== false) {
+            $times = \explode(self::TRANSFO_SEPARATOR, $descriptionArray[$iLine]);
+            $transfoData['temps_propagation'] = $hasTwoParents ? [
+                \is_numeric($times[0]) ? (float) $times[0] : null,
+                \is_numeric($times[1]) ? (float) $times[1] : null,
+            ] : [null, null];
+        }
+
+        if ($iLine !== false) {
+            $iLine = $this->nextNonHeaderLineIndex($descriptionArray, $iLine);
+            $policies = \explode(self::TRANSFO_SEPARATOR, $descriptionArray[$iLine]);
+            $transfoData['transformations_limites'] = [
+                $policies[0] ? $policies[0] : null,
+                \is_numeric($policies[1]) ? $policies[1] : null,
+            ];
+            if ($hasTwoParents) {
+                $transfoData['transformations_limites'][] = $policies[2] ? $policies[2] : null;
+                $transfoData['transformations_limites'][] = \is_numeric($policies[3]) ? $policies[3] : null;
+            }
+        }
+
+        return $transfoData;
+    }
+
+    /**
+     * @param $line
+     *
+     * @return bool
+     */
+    private function isHeaderLine($line)
+    {
+        return \strpos(\trim($line), self::TRANSFO_HEADER) === 0;
+    }
+
+    /**
+     * @param $descriptionArray
+     * @param $iLine
+     *
+     * @return bool
+     */
+    private function nextNonHeaderLineIndex($descriptionArray, $iLine)
+    {
+        if ($iLine === false) {
+            return false;
+        }
+        ++$iLine;
+        while (isset($descriptionArray[$iLine]) && $this->isHeaderLine($descriptionArray[$iLine])) {
+            ++$iLine;
+        }
+
+        return isset($descriptionArray[$iLine]) ? $iLine : false;
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueConversionsChroniques.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueConversionsChroniques.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6438362f9f179b29789c51f5075ad8e989852bf
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueConversionsChroniques.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Irstea\BdohBundle\Util\DurationFormater;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueConversionsChroniques.
+ */
+class HistoriqueConversionsChroniques extends HistoriqueTransformations
+{
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\ChroniqueConvertie
+     */
+    protected $chroniqueConvertie;
+
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+     */
+    protected $chroniqueMere;
+
+    /**
+     * @var int
+     */
+    protected $paramConversion;
+
+    /**
+     * Set chroniqueConvertie.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\ChroniqueConvertie $chroniqueConvertie
+     *
+     * @return HistoriqueConversionsChroniques
+     */
+    public function setChroniqueConvertie(\Irstea\BdohDataBundle\Entity\ChroniqueConvertie $chroniqueConvertie = null)
+    {
+        $this->chroniqueConvertie = $chroniqueConvertie;
+
+        return $this;
+    }
+
+    /**
+     * Get chroniqueConvertie.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\ChroniqueConvertie
+     */
+    public function getChroniqueConvertie()
+    {
+        return $this->chroniqueConvertie;
+    }
+
+    /**
+     * Set chroniqueMere.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue $chroniqueMere
+     *
+     * @return HistoriqueConversionsChroniques
+     */
+    public function setChroniqueMere(\Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue $chroniqueMere = null)
+    {
+        $this->chroniqueMere = $chroniqueMere;
+
+        return $this;
+    }
+
+    /**
+     * Get chroniqueMere.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+     */
+    public function getChroniqueMere()
+    {
+        return $this->chroniqueMere;
+    }
+
+    /**
+     * Set paramConversion.
+     *
+     * @param int $paramConversion
+     *
+     * @return HistoriqueConversionsChroniques
+     */
+    public function setParamConversion($paramConversion)
+    {
+        $this->paramConversion = $paramConversion;
+
+        return $this;
+    }
+
+    /**
+     * Get paramConversion.
+     *
+     * @return int
+     */
+    public function getParamConversion()
+    {
+        return $this->paramConversion;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $durationFormater = new DurationFormater($translator);
+        $paramConversionMinutes = intdiv($this->getParamConversion(), 60);
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.actions.ConversionChronique') . "\n" .
+            $translator->trans('historique.chronique') . $translator->trans('deux_points') . ' ' .
+            $this->getChroniqueConvertie() . "\n" .
+            $translator->trans('historique.chroniqueMere') . $translator->trans('deux_points') . ' ' .
+            $this->getChroniqueMere() . "\n" .
+            $translator->trans('historique.paramConversion') . $translator->trans('deux_points') . ' ' .
+            $paramConversionMinutes . ' ' . $translator->transchoice('minute', $paramConversionMinutes) .
+            (($paramConversionMinutes >= 60) ? ' (' . $durationFormater->format($this->getParamConversion()) . ')' : '')
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonnees.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonnees.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7bfa972bb66114acb295cfce606b11b592925de
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonnees.php
@@ -0,0 +1,181 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueDonnees.
+ */
+class HistoriqueDonnees extends Historique
+{
+    /**
+     * @var string
+     */
+    protected $debut;
+
+    /**
+     * @var string
+     */
+    protected $fin;
+
+    /**
+     * @var int
+     */
+    protected $nombreMesures;
+
+    /**
+     * @var \Irstea\BdohDataBundle\Entity\Chronique
+     */
+    protected $chronique;
+
+    /**
+     * Set debut.
+     *
+     * @param string $debut
+     *
+     * @return HistoriqueDonnees
+     */
+    public function setDebut($debut)
+    {
+        $this->debut = $debut;
+
+        return $this;
+    }
+
+    /**
+     * Get debut.
+     *
+     * @return string
+     */
+    public function getDebut()
+    {
+        return $this->debut;
+    }
+
+    /**
+     * @return \Datetime
+     */
+    public function getDebutDescription()
+    {
+        return new \DateTime($this->debut);
+    }
+
+    /**
+     * Set fin.
+     *
+     * @param string $fin
+     *
+     * @return HistoriqueDonnees
+     */
+    public function setFin($fin)
+    {
+        $this->fin = $fin;
+
+        return $this;
+    }
+
+    /**
+     * Get fin.
+     *
+     * @return string
+     */
+    public function getFin()
+    {
+        return $this->fin;
+    }
+
+    /**
+     * @return \Datetime
+     */
+    public function getFinDescription()
+    {
+        return new \DateTime($this->fin);
+    }
+
+    /**
+     * Set nombreMesures.
+     *
+     * @param int $nombreMesures
+     *
+     * @return HistoriqueDonnees
+     */
+    public function setNombreMesures($nombreMesures)
+    {
+        $this->nombreMesures = $nombreMesures;
+
+        return $this;
+    }
+
+    /**
+     * Get nombreMesures.
+     *
+     * @return int
+     */
+    public function getNombreMesures()
+    {
+        return $this->nombreMesures;
+    }
+
+    /**
+     * Set chronique.
+     *
+     * @param \Irstea\BdohDataBundle\Entity\Chronique $chronique
+     *
+     * @return HistoriqueDonnees
+     */
+    public function setChronique(\Irstea\BdohDataBundle\Entity\Chronique $chronique = null)
+    {
+        $this->chronique = $chronique;
+
+        return $this;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return \Irstea\BdohDataBundle\Entity\Chronique
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $translator->trans('historique.chronique') . $translator->trans('deux_points') . ' ' .
+            $this->getChronique() . "\n" .
+            $translator->trans('historique.debut') . $translator->trans('deux_points') . ' ' .
+            $this->getDebutDescription()->format($translator->trans('transformation.bareme.dateBareme')) .
+            ' ' . $translator->trans('UTC') . "\n" .
+            $translator->trans('historique.fin') . $translator->trans('deux_points') . ' ' .
+            $this->getFinDescription()->format($translator->trans('transformation.bareme.dateBareme')) .
+            ' ' . $translator->trans('UTC') . "\n" .
+            $translator->trans('historique.nbMesures') . $translator->trans('deux_points') . ' ' .
+            $this->getNombreMesures()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesExport.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesExport.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bd3e87eae40f86ef8ca26fe4857e519d0c4e3c0
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesExport.php
@@ -0,0 +1,175 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueDonneesExport.
+ */
+class HistoriqueDonneesExport extends HistoriqueDonnees
+{
+    /**
+     * @var string
+     */
+    protected $formatExport;
+
+    /**
+     * @var string
+     */
+    protected $typeExport;
+
+    /**
+     * @var string
+     */
+    protected $timestep;
+
+    /**
+     * @var string
+     */
+    protected $fuseau;
+
+    /**
+     * Set formatExport.
+     *
+     * @param string $formatExport
+     *
+     * @return HistoriqueDonneesExport
+     */
+    public function setFormatExport($formatExport)
+    {
+        $this->formatExport = $formatExport;
+
+        return $this;
+    }
+
+    /**
+     * Get formatExport.
+     *
+     * @return string
+     */
+    public function getFormatExport()
+    {
+        return $this->formatExport;
+    }
+
+    /**
+     * Set typeExport.
+     *
+     * @param string $typeExport
+     *
+     * @return HistoriqueDonneesExport
+     */
+    public function setTypeExport($typeExport)
+    {
+        $this->typeExport = $typeExport;
+
+        return $this;
+    }
+
+    /**
+     * Get typeExport.
+     *
+     * @return string
+     */
+    public function getTypeExport()
+    {
+        return $this->typeExport;
+    }
+
+    /**
+     * Set timestep.
+     *
+     * @param string $timestep
+     *
+     * @return HistoriqueDonneesExport
+     */
+    public function setTimestep($timestep)
+    {
+        $this->timestep = $timestep;
+
+        return $this;
+    }
+
+    /**
+     * Get timestep.
+     *
+     * @return string
+     */
+    public function getTimestep()
+    {
+        return $this->timestep;
+    }
+
+    /**
+     * Set fuseau.
+     *
+     * @param string $fuseau
+     *
+     * @return HistoriqueDonneesExport
+     */
+    public function setFuseau($fuseau)
+    {
+        $this->fuseau = $fuseau;
+
+        return $this;
+    }
+
+    /**
+     * Get fuseau.
+     *
+     * @return string
+     */
+    public function getFuseau()
+    {
+        return $this->fuseau;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+
+        $timestep = json_decode($this->getTimestep(), true);
+        if (\strpos($translator->getLocale(), 'en') === 0) {
+            $timestep = $timestep['libelleEn'];
+        } else {
+            $timestep = $timestep['libelle'];
+        }
+
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.actions.MesurePlageExport') . "\n" .
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.formatExport') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('export.' . ucfirst($this->getFormatExport())) . "\n" .
+            $translator->trans('historique.typeExport') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.exportTypes.' . $this->getTypeExport()) . "\n" .
+            ($timestep === '' ? '' :
+                $translator->trans('historique.timestep') . $translator->trans('deux_points') . ' ' .
+                $timestep . "\n") .
+            $translator->trans('historique.fuseau') . $translator->trans('deux_points') . ' ' . $this->getFuseau()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesImport.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesImport.php
new file mode 100644
index 0000000000000000000000000000000000000000..4492547cdfb11c6f1167b8190785c1e9b5e9d37f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesImport.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueDonneesImport.
+ */
+class HistoriqueDonneesImport extends HistoriqueDonnees
+{
+    /**
+     * @var string
+     */
+    protected $formatImport;
+
+    /**
+     * @var string
+     */
+    protected $fuseau;
+
+    /**
+     * Set formatImport.
+     *
+     * @param string $formatImport
+     *
+     * @return HistoriqueDonneesImport
+     */
+    public function setFormatImport($formatImport)
+    {
+        $this->formatImport = $formatImport;
+
+        return $this;
+    }
+
+    /**
+     * Get formatImport.
+     *
+     * @return string
+     */
+    public function getFormatImport()
+    {
+        return $this->formatImport;
+    }
+
+    /**
+     * Set fuseau.
+     *
+     * @param string $fuseau
+     *
+     * @return HistoriqueDonneesImport
+     */
+    public function setFuseau($fuseau)
+    {
+        $this->fuseau = $fuseau;
+
+        return $this;
+    }
+
+    /**
+     * Get fuseau.
+     *
+     * @return string
+     */
+    public function getFuseau()
+    {
+        return $this->fuseau;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.actions.MesurePlageImport') . "\n" .
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.formatImport') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('import.' . $this->getFormatImport()) . "\n" .
+            $translator->trans('historique.fuseau') . $translator->trans('deux_points') . ' ' . $this->getFuseau()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesPointControle.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesPointControle.php
new file mode 100644
index 0000000000000000000000000000000000000000..b34baa0e864181b0b8fa68445643cc814683a83e
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesPointControle.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueDonneesPointControle.
+ */
+class HistoriqueDonneesPointControle extends HistoriqueDonnees
+{
+    /**
+     * @var string
+     */
+    protected $action;
+
+    /**
+     * @var string
+     */
+    protected $fuseau;
+
+    /**
+     * Set action.
+     *
+     * @param string $action
+     *
+     * @return HistoriqueDonneesPointControle
+     */
+    public function setAction($action)
+    {
+        $this->action = $action;
+
+        return $this;
+    }
+
+    /**
+     * Get action.
+     *
+     * @return string
+     */
+    public function getAction()
+    {
+        return $this->action;
+    }
+
+    /**
+     * Set fuseau.
+     *
+     * @param string $fuseau
+     *
+     * @return HistoriqueDonneesPointControle
+     */
+    public function setFuseau($fuseau)
+    {
+        $this->fuseau = $fuseau;
+
+        return $this;
+    }
+
+    /**
+     * Get fuseau.
+     *
+     * @return string
+     */
+    public function getFuseau()
+    {
+        return $this->fuseau;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans($this->getAction()) . "\n" .
+            $this->getDescription() . "\n" .
+            $translator->trans('historique.fuseau') . $translator->trans('deux_points') . ' ' . $this->getFuseau()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesSuppression.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesSuppression.php
new file mode 100644
index 0000000000000000000000000000000000000000..9cca1c1a18763cbae33680b08f26cd0fb69c81c0
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueDonneesSuppression.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * HistoriqueDonneesSuppression.
+ */
+class HistoriqueDonneesSuppression extends HistoriqueDonnees
+{
+    /**
+     * @var bool
+     */
+    protected $changedIntoGap;
+
+    /**
+     * Set changedIntoGap.
+     *
+     * @param bool $changedIntoGap
+     *
+     * @return HistoriqueDonneesSuppression
+     */
+    public function setChangedIntoGap($changedIntoGap)
+    {
+        $this->changedIntoGap = $changedIntoGap;
+
+        return $this;
+    }
+
+    /**
+     * Get changedIntoGap.
+     *
+     * @return bool
+     */
+    public function getChangedIntoGap()
+    {
+        return $this->changedIntoGap;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        parent::constructDescription($translator);
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.actions.MesurePlageSuppression') . "\n" .
+            ($this->changedIntoGap ? $translator->trans('historique.changedIntoGap') . "\n" : '') .
+            $this->getDescription()
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueSig.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueSig.php
new file mode 100644
index 0000000000000000000000000000000000000000..f4008094e90662d98e3ccb5be4dd7483cc381a1f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueSig.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class HistoriqueSig.
+ */
+class HistoriqueSig extends Historique
+{
+    /**
+     * @var
+     */
+    protected $typeShape;
+
+    /**
+     * @var int
+     */
+    protected $nombreInserts;
+
+    /**
+     * @var int
+     */
+    protected $nombreMesures;
+
+    /**
+     * @return int
+     */
+    public function getNombreInserts()
+    {
+        return $this->nombreInserts;
+    }
+
+    /**
+     * @param int $nombreInserts
+     */
+    public function setNombreInserts($nombreInserts)
+    {
+        $this->nombreInserts = $nombreInserts;
+    }
+
+    /**
+     * @return int
+     */
+    public function getNombreMesures()
+    {
+        return $this->nombreMesures;
+    }
+
+    /**
+     * @param int $nombreMesures
+     */
+    public function setNombreMesures($nombreMesures)
+    {
+        $this->nombreMesures = $nombreMesures;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTypeShape()
+    {
+        return $this->typeShape;
+    }
+
+    /**
+     * @param $typeShape
+     */
+    public function setTypeShape($typeShape)
+    {
+        $this->typeShape = $typeShape;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans('historique.actions.ImportGeographique') . "\n" .
+            $translator->trans('historique.typeShape') . $translator->trans('deux_points') . ' ' .
+            $this->getTypeShape() . "\n" .
+            $translator->trans('historique.nbSig') . $translator->trans('deux_points') . ' ' .
+            ($this->getNombreInserts() + $this->getNombreMesures())
+        );
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/HistoriqueTransformations.php b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueTransformations.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f26c79f5e9b01651478a7f26aac94722d5481b0
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/HistoriqueTransformations.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class HistoriqueTransformations.
+ */
+class HistoriqueTransformations extends Historique
+{
+    /**
+     * @var string
+     */
+    private $action;
+
+    /**
+     * Set action.
+     *
+     * @param string $action
+     *
+     * @return HistoriqueTransformations
+     */
+    public function setAction($action)
+    {
+        $this->action = $action;
+
+        return $this;
+    }
+
+    /**
+     * Get action.
+     *
+     * @return string
+     */
+    public function getAction()
+    {
+        return $this->action;
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function constructDescription(TranslatorInterface $translator)
+    {
+        $this->setDescription(
+            $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $this->getAction()
+        );
+        //To be overwritten by subclasses.
+    }
+
+    /**
+     * @param TranslatorInterface $translator
+     *
+     * @return string
+     */
+    public function actionLine(TranslatorInterface $translator)
+    {
+        return $translator->trans('historique.action') . $translator->trans('deux_points') . ' ' .
+            $translator->trans($this->getAction()) . "\n";
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBaremeRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBaremeRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..36d78f9cf9c062854fb8c67adb9136c40f864150
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBaremeRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationBaremeRepository.
+ */
+class HistoriqueAdministrationBaremeRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBassinRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBassinRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..748407141304fa5598652525d421325abc989bb3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationBassinRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationBassinRepository.
+ */
+class HistoriqueAdministrationBassinRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationChroniqueRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationChroniqueRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..734d6a572b654d015171a6a16450c634b70741c6
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationChroniqueRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationChroniqueRepository.
+ */
+class HistoriqueAdministrationChroniqueRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCommuneRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCommuneRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..2dd2eca47cccda7b4252c109f40ff4395653cc42
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCommuneRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationCommuneRepository.
+ */
+class HistoriqueAdministrationCommuneRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCoursEauRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCoursEauRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c7c874bcf24ab3b979715da0aa466900d54b12f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCoursEauRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationCoursEauRepository.
+ */
+class HistoriqueAdministrationCoursEauRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaClimateRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaClimateRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..13f10c98ae7aff90b188831ec0b1f413c96e4d3e
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaClimateRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationCriteriaClimateRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaGeologyRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaGeologyRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ef086b47717c3e2dd36156f5d7e352567bc8c2a
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationCriteriaGeologyRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationCriteriaGeologyRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataConstraintRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataConstraintRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..d6b945fe3e07b3adead4999cb493735dcdf308d7
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataConstraintRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationDataConstraintRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataSetRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataSetRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..35dd676a751e03b2ff45b52847e7c2f30652ff7b
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDataSetRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationDataSetRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDoiRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDoiRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..9642e93af63f6f869db9a67ff2a24988bfe0af23
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationDoiRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationDoiRepository.
+ */
+class HistoriqueAdministrationDoiRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationFamilleParametresRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationFamilleParametresRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e8240baa9120d32370760b8001d4f7cce0e5b3b
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationFamilleParametresRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationFamilleParametresRepository.
+ */
+class HistoriqueAdministrationFamilleParametresRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationInspireThemeRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationInspireThemeRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0a04baa9c13ef5e9079f96a8ab5486a7832e5a9
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationInspireThemeRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationInspireThemeRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationMilieuRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationMilieuRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6dbf2997f945e2f666420ee80da5de8426782c5
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationMilieuRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationMilieuRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationObservatoireRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationObservatoireRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..e52b8b144275c81f0828b1257c5203a8c61787c1
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationObservatoireRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationObservatoireRepository.
+ */
+class HistoriqueAdministrationObservatoireRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPartenaireRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPartenaireRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..17bce35b006b96f84a4f1b58c4216c89ca931c06
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPartenaireRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationPartenaireRepository.
+ */
+class HistoriqueAdministrationPartenaireRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPersonneTheiaRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPersonneTheiaRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..bce4862b6c51277e1be2f9ef366d8ef4a356d4a7
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationPersonneTheiaRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationPersonneTheiaRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7446ee89b333cc75cf20c7895ec02643db2ed55
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationRepository.
+ */
+class HistoriqueAdministrationRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationSiteExperimentalRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationSiteExperimentalRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..580e85d3c3799e90bd7acda6d5dc2b2de799cdff
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationSiteExperimentalRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationSiteExperimentalRepository.
+ */
+class HistoriqueAdministrationSiteExperimentalRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationStationRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationStationRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2357568be7536be166d7b1001e9390dcb1be552
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationStationRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationStationRepository.
+ */
+class HistoriqueAdministrationStationRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTheiaCategoriesRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTheiaCategoriesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbb604921ee570d36004adf4c8357f30e293ff76
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTheiaCategoriesRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationTheiaCategoriesRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTopicCategoryRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTopicCategoryRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..6198080cf0409b6d81d7d7e0b5730f99813f369c
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTopicCategoryRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationTopicCategoryRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeFundingRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeFundingRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..257b1c008d3898b6913bd486054d807441841e0f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeFundingRepository.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+class HistoriqueAdministrationTypeFundingRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeParametreRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeParametreRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c3666fdb6952901eca5b080304bd25ea1103a7c
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationTypeParametreRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationTypeParametreRepository.
+ */
+class HistoriqueAdministrationTypeParametreRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUniteRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUniteRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..2216702c232549a08c817b6c4e50c94a61bddbf1
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUniteRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationUniteRepository.
+ */
+class HistoriqueAdministrationUniteRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUtilisateurRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUtilisateurRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..c50aaa64b4ef4b590f7bd36a51dd4271450a699d
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueAdministrationUtilisateurRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueAdministrationUtilisateurRepository.
+ */
+class HistoriqueAdministrationUtilisateurRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesExportRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesExportRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec48abdcbe94e41812086dcae3e50f9eccadbfc4
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesExportRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueBaremesExportRepository.
+ */
+class HistoriqueBaremesExportRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesImportRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesImportRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e90a9629d992b79d159a4239b63279526608efe
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesImportRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueBaremesImportRepository.
+ */
+class HistoriqueBaremesImportRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8b8e97e5a17cc7d36537c4a682a3ef21a1ee3c2
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueBaremesRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueBaremesRepository.
+ */
+class HistoriqueBaremesRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueCalculsChroniquesRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueCalculsChroniquesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..df1a71032c37305eaacbf31e9c896c273a544031
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueCalculsChroniquesRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueCalculsChroniquesRepository.
+ */
+class HistoriqueCalculsChroniquesRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueConversionsChroniquesRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueConversionsChroniquesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7cacf034533901c88669fcb7a696e716cf8b5b7
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueConversionsChroniquesRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueConversionsChroniquesRepository.
+ */
+class HistoriqueConversionsChroniquesRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesExportRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesExportRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8bb8fd10931bb634e66ef645b76473d6c32eed5
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesExportRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueDonneesExportRepository.
+ */
+class HistoriqueDonneesExportRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesImportRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesImportRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..642610decc79df46c793d3fb6f114035aeef9146
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesImportRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueDonneesImportRepository.
+ */
+class HistoriqueDonneesImportRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesPointControleRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesPointControleRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..44ec03da8743a33936c000c6be49dd3f38d6a97d
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesPointControleRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueDonneesPointControleRepository.
+ */
+class HistoriqueDonneesPointControleRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..503aef1fea8bd31cf62ea9e568ee9342132c8a0f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueDonneesRepository.
+ */
+class HistoriqueDonneesRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesSuppressionRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesSuppressionRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..324fd26f231464bc14f1b4e98a924ab36bfe5575
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueDonneesSuppressionRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueDonneesSuppressionRepository.
+ */
+class HistoriqueDonneesSuppressionRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f475ec244a1425d32edd54d773cbbe7ed22eebb
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueRepository.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+use Doctrine\ORM\EntityRepository as BaseEntityRepository;
+
+/**
+ * HistoriqueRepository.
+ */
+class HistoriqueRepository extends BaseEntityRepository
+{
+    /**
+     * Alteration of the default method 'findByObservatoire'
+     * to chose the order
+     * to limit the results in time
+     * and to chose to get the ones before or after the given date
+     * or to get the ones from the given year.
+     *
+     * $observatoire : observatoire
+     * $year         : the year  to limit the result set
+     * $date         : the date to limit the result set
+     * $after        : true : [date to the most recent entry]; false : [least recent entry to the date[
+     * $order        : 'ASC' or 'DESC'
+     *
+     * @param mixed  $observatoire
+     * @param int    $year
+     * @param mixed  $date
+     * @param bool   $after
+     * @param string $order
+     *
+     * @return mixed
+     */
+    public function findByObservatoire($observatoire, $year = 0, \DateTime $date = null, $after = true, $order = 'DESC')
+    {
+        $parameters = ['observatoire' => $observatoire];
+
+        if (!($order === 'ASC' || $order === 'DESC')) {
+            $order = 'DESC';
+        }
+
+        if (!($after === true || $after === false)) {
+            $after = true;
+        }
+
+        if ($after) {
+            $compareDate = ' AND (h.date >= :date)';
+        } else {
+            $compareDate = ' AND (h.date < :date)';
+        }
+
+        if ($date) {
+            $parameters['date'] = $date;
+        } else {
+            $compareDate = '';
+        }
+
+        if ($year && \is_int($year) && $year >= 1900 && $year < 2100) { // TODO mettre à jour quand on sera en 2100
+            $compareDate = ' AND (h.date >= :date) AND (h.date < :dateEnd)';
+            $date = new \DateTimeImmutable($year . '-01-01', new \DateTimeZone('UTC'));
+            $parameters['date'] = $date;
+            $parameters['dateEnd'] = $date->add(new \DateInterval('P1Y'));
+        }
+
+        $query = $this->createQueryBuilder('h')
+            ->where('(h.observatoire = :observatoire'/* . ' or h.observatoire IS NULL'*/ . ')' . $compareDate)
+            ->setParameters($parameters)
+            ->orderBy('h.date', $order)
+            ->getQuery();
+
+        $result = $query->getResult();
+
+        return $result;
+    }
+
+    /**
+     * La liste des annnées couvertes par les historiques de l'observatoire donné.
+     *
+     * $observatoire : observatoire
+     *
+     * @param mixed $observatoire
+     *
+     * @return array
+     */
+    final public function getYears($observatoire)
+    {
+        $sqlYears = <<<'SQL'
+SELECT DISTINCT EXTRACT(YEAR FROM h.date) as year 
+FROM historique h 
+WHERE h.observatoire_id = :observatoire 
+ORDER BY year DESC;
+SQL;
+        $yearsResult = $this->_em->getConnection()->executeQuery($sqlYears, [$observatoire->getId()])->fetchAll();
+
+        $years = [];
+        foreach ($yearsResult as $row) {
+            $years[] = (int) $row['year'];
+        }
+
+        return $years;
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueSigRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueSigRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ff865dc9924e22185b102050952d3961836775c
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueSigRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueSigRepository.
+ */
+class HistoriqueSigRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueTransformationsRepository.php b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueTransformationsRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..8316fea50bce080422d7e6e0183d90c009489240
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Entity/Repository/HistoriqueTransformationsRepository.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Entity\Repository;
+
+/**
+ * Class HistoriqueTransformationsRepository.
+ */
+class HistoriqueTransformationsRepository extends HistoriqueRepository
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/IrsteaBdohLoggerBundle.php b/src/Irstea/BdohLoggerBundle/IrsteaBdohLoggerBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..41e928338e1479a5678fda605583d7706673b36c
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/IrsteaBdohLoggerBundle.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohLoggerBundle extends Bundle
+{
+}
diff --git a/src/Irstea/BdohLoggerBundle/Logger/BdohLogger.php b/src/Irstea/BdohLoggerBundle/Logger/BdohLogger.php
new file mode 100644
index 0000000000000000000000000000000000000000..028b83dc641bec36b2bad1c63c5122dcd810b5ac
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Logger/BdohLogger.php
@@ -0,0 +1,1090 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohLoggerBundle\Logger;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohDataBundle\Entity\Bareme;
+use Irstea\BdohDataBundle\Entity\Bassin;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueConvertie;
+use Irstea\BdohDataBundle\Entity\Commune;
+use Irstea\BdohDataBundle\Entity\CoursEau;
+use Irstea\BdohDataBundle\Entity\CriteriaClimat;
+use Irstea\BdohDataBundle\Entity\CriteriaGeology;
+use Irstea\BdohDataBundle\Entity\DataConstraint;
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\Doi;
+use Irstea\BdohDataBundle\Entity\FamilleParametres;
+use Irstea\BdohDataBundle\Entity\InspireTheme;
+use Irstea\BdohDataBundle\Entity\Milieu;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Partenaire;
+use Irstea\BdohDataBundle\Entity\PersonneTheia;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\TheiaCategories;
+use Irstea\BdohDataBundle\Entity\TopicCategory;
+use Irstea\BdohDataBundle\Entity\TypeFunding;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+use Irstea\BdohLoggerBundle\Entity\Historique;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministration;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationBareme;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationBassin;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationChronique;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCommune;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCoursEau;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCriteriaClimate;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCriteriaGeology;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDataConstraint;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDataSet;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDoi;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationFamilleParametres;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationInspireTheme;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationMilieu;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationObservatoire;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationPartenaire;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationPersonneTheia;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationSiteExperimental;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationStation;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTheiaCategories;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTopicCategory;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTypeFunding;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTypeParametre;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationUnite;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationUtilisateur;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueBaremesExport;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueBaremesImport;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueCalculsChroniques;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueConversionsChroniques;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueDonnees;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesExport;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesImport;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesPointControle;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesSuppression;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueSig;
+use Irstea\BdohLoggerBundle\Entity\HistoriqueTransformations;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Class BdohLogger.
+ */
+class BdohLogger
+{
+    /**
+     * @var EntityManager
+     */
+    protected $entityManager;
+
+    /**
+     * @var TranslatorInterface
+     */
+    protected $translator;
+
+    /**
+     * BdohLogger constructor.
+     *
+     * @param EntityManager       $entityManager
+     * @param TranslatorInterface $translator
+     */
+    public function __construct(EntityManager $entityManager, TranslatorInterface $translator)
+    {
+        $this->entityManager = $entityManager;
+        $this->translator = $translator;
+    }
+
+    /**
+     * @param Historique   $historique
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param string       $description
+     *
+     * @return Historique
+     */
+    protected function initiateHistorique(
+        Historique $historique,
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $description = null
+    ) {
+        $historique->setAuteur($author);
+        $historique->setDate($date->setTimezone(new \DateTimeZone('UTC')));
+        $historique->setObservatoire($obs);
+
+        //Default description ; usefull only for pure Historique
+        //Will be overwritten by other subtypes by constructDescription (cf completeHistorique)
+        $historique->setDescription($description);
+
+        return $historique;
+    }
+
+    /**
+     * @param Historique $historique
+     */
+    protected function completeHistorique(Historique $historique)
+    {
+        $historique->constructDescription($this->translator);
+        $historique->constructLien();
+        $this->entityManager->persist($historique);
+        $this->entityManager->flush();
+    }
+
+    /**
+     * @param HistoriqueAdministration $historique
+     * @param $action
+     *
+     * @return HistoriqueAdministration
+     */
+    protected function enrichHistoriqueAdministration(HistoriqueAdministration $historique, $action)
+    {
+        $historique->setAction($action);
+
+        return $historique;
+    }
+
+    /**
+     * @param HistoriqueDonnees $historique
+     * @param Chronique         $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     *
+     * @return HistoriqueDonnees
+     */
+    protected function enrichHistoriqueDonnees(HistoriqueDonnees $historique, Chronique $chronique, $debut, $fin, $nombreMesures)
+    {
+        $historique->setChronique($chronique);
+        $historique->setDebut($debut);
+        $historique->setFin($fin);
+        $historique->setNombreMesures($nombreMesures);
+
+        return $historique;
+    }
+
+    /**
+     * @param HistoriqueSig $historique
+     * @param int[]         $stats
+     * @param mixed         $typeShape
+     *
+     * @return HistoriqueSig
+     */
+    protected function enrichHistoriqueSig(HistoriqueSig $historique, $stats, $typeShape)
+    {
+        $historique->setNombreInserts($stats[0]);
+        $historique->setNombreMesures($stats[1]);
+        $historique->setTypeShape($this->translator->trans($typeShape));
+
+        return $historique;
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param null         $description
+     */
+    public function createHistorique(Utilisateur $author, \DateTime $date, Observatoire $obs, $description = null)
+    {
+        $this->completeHistorique(
+            $this->initiateHistorique(new Historique(), $author, $date, $obs, $description)
+        );
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param null $description
+     */
+    public function createHistoriqueAdministration(Utilisateur $author, \DateTime $date, Observatoire $obs, $action, $description = null)
+    {
+        $this->completeHistorique(
+            $this->enrichHistoriqueAdministration(
+                $this->initiateHistorique(new HistoriqueAdministration(), $author, $date, $obs, $description),
+                $action
+            )
+        );
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param Chronique    $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     * @param null $description
+     */
+    public function createHistoriqueDonnees(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        Chronique $chronique,
+        $debut,
+        $fin,
+        $nombreMesures,
+        $description = null
+    ) {
+        $this->completeHistorique(
+            $this->enrichHistoriqueDonnees(
+                $this->initiateHistorique(new HistoriqueDonnees(), $author, $date, $obs, $description),
+                $chronique,
+                $debut,
+                $fin,
+                $nombreMesures
+            )
+        );
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param int[]        $stats
+     * @param mixed        $typeShape
+     * @param null         $description
+     */
+    public function createHistoriqueSig(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $stats,
+        $typeShape,
+        $description = null
+    ) {
+        $this->completeHistorique(
+            $this->enrichHistoriqueSig(
+                $this->initiateHistorique(new HistoriqueSig(), $author, $date, $obs, $description),
+                $stats,
+                $typeShape
+            )
+        );
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Utilisateur $user
+     * @param null        $description
+     */
+    public function createHistoriqueAdministrationUtilisateur(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Utilisateur $user,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationUtilisateur(), $author, $date, $obs, $description);
+        $historique->setUtilisateur($user);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Bareme $bareme
+     * @param null   $description
+     */
+    public function createHistoriqueAdministrationBareme(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Bareme $bareme,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationBareme(), $author, $date, $obs, $description);
+        $historique->setBareme($bareme);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Commune $commune
+     * @param null    $description
+     */
+    public function createHistoriqueAdministrationCommune(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Commune $commune,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationCommune(), $author, $date, $obs, $description);
+        $historique->setCommune($commune);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param CoursEau $coursEau
+     * @param null     $description
+     */
+    public function createHistoriqueAdministrationCoursEau(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        CoursEau $coursEau,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationCoursEau(), $author, $date, $obs, $description);
+        $historique->setCoursEau($coursEau);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Bassin $bassin
+     * @param null   $description
+     */
+    public function createHistoriqueAdministrationBassin(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Bassin $bassin,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationBassin(), $author, $date, $obs, $description);
+        $historique->setBassin($bassin);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param DataSet $dataset
+     * @param null    $description
+     */
+    public function createHistoriqueAdministrationDataSet(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        DataSet $dataset,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationDataSet(), $author, $date, $obs, $description);
+        $historique->setDataSet($dataset);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Milieu $milieu
+     * @param null   $description
+     */
+    public function createHistoriqueAdministrationMilieu(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Milieu $milieu,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationMilieu(), $author, $date, $obs, $description);
+        $historique->setMilieu($milieu);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param PersonneTheia $personneTheia
+     * @param null          $description
+     */
+    public function createHistoriqueAdministrationPersonneTheia(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        PersonneTheia $personneTheia,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationPersonneTheia(), $author, $date, $obs, $description);
+        $historique->setPersonneTheia($personneTheia);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param TypeFunding $typeFunding
+     * @param null        $description
+     */
+    public function createHistoriqueAdministrationTypeFunding(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        TypeFunding $typeFunding,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationTypeFunding(), $author, $date, $obs, $description);
+        $historique->setTypefunding($typeFunding);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param TopicCategory $topicCategory
+     * @param null          $description
+     */
+    public function createHistoriqueAdministrationTopicCategory(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        TopicCategory $topicCategory,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationTopicCategory(), $author, $date, $obs, $description);
+        $historique->setTopicCategory($topicCategory);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param TheiaCategories $theiaCategories
+     * @param null            $description
+     */
+    public function createHistoriqueAdministrationTheiaCategories(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        TheiaCategories $theiaCategories,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationTheiaCategories(), $author, $date, $obs, $description);
+        $historique->setTheiaCategories($theiaCategories);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param InspireTheme $inspireTheme
+     * @param null         $description
+     */
+    public function createHistoriqueAdministrationInspireTheme(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        InspireTheme $inspireTheme,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationInspireTheme(), $author, $date, $obs, $description);
+        $historique->setInspireTheme($inspireTheme);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param DataConstraint $dataconstraint
+     * @param null           $description
+     */
+    public function createHistoriqueAdministrationDataconstraint(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        DataConstraint $dataconstrain,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationDataConstraint(), $author, $date, $obs, $description);
+        $historique->setDataconstraint($dataconstrain);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param CriteriaGeology $criteriageology
+     * @param null            $description
+     */
+    public function createHistoriqueAdministrationCriteriaGeology(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        CriteriaGeology $criteriageology,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationCriteriaGeology(), $author, $date, $obs, $description);
+        $historique->setCriteriaGeology($criteriageology);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param CriteriaClimat $criteriaclimat
+     * @param null           $description
+     */
+    public function createHistoriqueAdministrationCriteriaClimate(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        CriteriaClimat $criteriaclimat,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationCriteriaClimate(), $author, $date, $obs, $description);
+        $historique->setCriteriaClimat($criteriaclimat);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Partenaire $partenaire
+     * @param null       $description
+     */
+    public function createHistoriqueAdministrationPartenaire(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Partenaire $partenaire,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationPartenaire(), $author, $date, $obs, $description);
+        $historique->setPartenaire($partenaire);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Chronique $chronique
+     * @param null      $description
+     */
+    public function createHistoriqueAdministrationChronique(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Chronique $chronique,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationChronique(), $author, $date, $obs, $description);
+        $historique->setChronique($chronique);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Observatoire $cible
+     * @param null         $description
+     */
+    public function createHistoriqueAdministrationObservatoire(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Observatoire $cible,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationObservatoire(), $author, $date, $obs, $description);
+        $historique->setObservatoireCible($cible);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Doi  $doi
+     * @param null $description
+     */
+    public function createHistoriqueAdministrationDoi(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Doi $doi,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationDoi(), $author, $date, $obs, $description);
+        $historique->setDoi($doi);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param SiteExperimental $siteExperimental
+     * @param null             $description
+     */
+    public function createHistoriqueAdministrationSiteExperimental(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        SiteExperimental $siteExperimental,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationSiteExperimental(), $author, $date, $obs, $description);
+        $historique->setSiteExperimental($siteExperimental);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Station $station
+     * @param null    $description
+     */
+    public function createHistoriqueAdministrationStation(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Station $station,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationStation(), $author, $date, $obs, $description);
+        $historique->setStation($station);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur       $author
+     * @param \DateTime         $date
+     * @param Observatoire      $obs
+     * @param mixed             $action
+     * @param FamilleParametres $familleParametres
+     * @param null              $description
+     */
+    public function createHistoriqueAdministrationFamilleParametres(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        FamilleParametres $familleParametres,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationFamilleParametres(), $author, $date, $obs, $description);
+        $historique->setFamilleParametres($familleParametres);
+        $historique->setFamilleParente($familleParametres->getFamilleParente());
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur   $author
+     * @param \DateTime     $date
+     * @param Observatoire  $obs
+     * @param mixed         $action
+     * @param TypeParametre $typeParametre
+     * @param null          $description
+     */
+    public function createHistoriqueAdministrationTypeParametre(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        TypeParametre $typeParametre,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationTypeParametre(), $author, $date, $obs, $description);
+        $historique->setTypeParametre($typeParametre);
+        $historique->setFamilleParametres($typeParametre->getFamilleParametres());
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $action
+     * @param Unite $unite
+     * @param null  $description
+     */
+    public function createHistoriqueAdministrationUnite(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $action,
+        Unite $unite,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueAdministrationUnite(), $author, $date, $obs, $description);
+        $historique->setUnite($unite);
+        $this->completeHistorique($this->enrichHistoriqueAdministration($historique, $action));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param Chronique    $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     * @param $formatExport
+     * @param $typeExport
+     * @param $timestep
+     * @param $fuseau
+     * @param null $description
+     */
+    public function createHistoriqueDonneesExport(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        Chronique $chronique,
+        $debut,
+        $fin,
+        $nombreMesures,
+        $formatExport,
+        $typeExport,
+        $timestep,
+        $fuseau,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueDonneesExport(), $author, $date, $obs, $description);
+        $historique->setFormatExport($formatExport);
+        $historique->setTypeExport($typeExport);
+        $historique->setTimestep($timestep);
+        $historique->setFuseau($fuseau);
+        $this->completeHistorique($this->enrichHistoriqueDonnees($historique, $chronique, $debut, $fin, $nombreMesures));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param Chronique    $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     * @param $formatImport
+     * @param $fuseau
+     * @param null $description
+     */
+    public function createHistoriqueDonneesImport(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        Chronique $chronique,
+        $debut,
+        $fin,
+        $nombreMesures,
+        $formatImport,
+        $fuseau,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueDonneesImport(), $author, $date, $obs, $description);
+        $historique->setFormatImport($formatImport);
+        $historique->setFuseau($fuseau);
+        $this->completeHistorique($this->enrichHistoriqueDonnees($historique, $chronique, $debut, $fin, $nombreMesures));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param Chronique    $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     * @param $changedIntoGap
+     * @param null $description
+     */
+    public function createHistoriqueDonneesSuppression(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        Chronique $chronique,
+        $debut,
+        $fin,
+        $nombreMesures,
+        $changedIntoGap,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueDonneesSuppression(), $author, $date, $obs, $description);
+        $historique->setChangedIntoGap($changedIntoGap);
+        $this->completeHistorique($this->enrichHistoriqueDonnees($historique, $chronique, $debut, $fin, $nombreMesures));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param Chronique    $chronique
+     * @param $debut
+     * @param $fin
+     * @param $nombreMesures
+     * @param string $action
+     * @param mixed  $fuseau
+     * @param null   $description
+     */
+    public function createHistoriqueDonneesPointControle(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        Chronique $chronique,
+        $debut,
+        $fin,
+        $nombreMesures,
+        $action,
+        $fuseau,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueDonneesPointControle(), $author, $date, $obs, $description);
+        $historique->setAction($action);
+        $historique->setFuseau($fuseau);
+        $this->completeHistorique($this->enrichHistoriqueDonnees($historique, $chronique, $debut, $fin, $nombreMesures));
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param null         $description
+     */
+    public function createHistoriqueTransformations(Utilisateur $author, \DateTime $date, Observatoire $obs, $description = null)
+    {
+        $this->completeHistorique($this->initiateHistorique(new HistoriqueTransformations(), $author, $date, $obs, $description));
+    }
+
+    /**
+     * @param $historique
+     * @param $name
+     * @param $inputUnit
+     * @param $outputUnit
+     * @param $xMin
+     * @param $xMax
+     *
+     * @return mixed
+     */
+    public function enrichHistoriqueBaremes($historique, $name, $inputUnit, $outputUnit, $xMin, $xMax)
+    {
+        $historique->setName($name);
+        $historique->setInputUnit($inputUnit);
+        $historique->setOutputUnit($outputUnit);
+        $historique->setMinAbscissa($xMin);
+        $historique->setMaxAbscissa($xMax);
+
+        return $historique;
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $baremeName
+     * @param $inputUnit
+     * @param $outputUnit
+     * @param $xMin
+     * @param $xMax
+     * @param $dateCreation
+     * @param $nValues
+     * @param null $description
+     */
+    public function createHistoriqueBaremesImport(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $baremeName,
+        $inputUnit,
+        $outputUnit,
+        $xMin,
+        $xMax,
+        $dateCreation,
+        $nValues,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueBaremesImport(), $author, $date, $obs, $description);
+        $historique->setAction('historique.actions.BaremeImport');
+        $this->completeHistorique(
+            $this->enrichHistoriqueBaremesImport(
+                $this->enrichHistoriqueBaremes($historique, $baremeName, $inputUnit, $outputUnit, $xMin, $xMax),
+                $dateCreation,
+                $nValues
+            )
+        );
+    }
+
+    /**
+     * @param HistoriqueBaremesImport $historique
+     * @param $dateCreation
+     * @param $nValues
+     *
+     * @return HistoriqueBaremesImport
+     */
+    protected function enrichHistoriqueBaremesImport(HistoriqueBaremesImport $historique, $dateCreation, $nValues)
+    {
+        $historique->setDateCreation($dateCreation);
+        $historique->setNValues($nValues);
+
+        return $historique;
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $baremeName
+     * @param $inputUnit
+     * @param $outputUnit
+     * @param $xMin
+     * @param $xMax
+     * @param $dateCreation
+     * @param $nValues
+     * @param null $description
+     */
+    public function createHistoriqueBaremesExport(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        $baremeName,
+        $inputUnit,
+        $outputUnit,
+        $xMin,
+        $xMax,
+        $dateCreation,
+        $nValues,
+        $description = null
+    ) {
+        $historique = $this->initiateHistorique(new HistoriqueBaremesExport(), $author, $date, $obs, $description);
+        $historique->setAction('historique.actions.BaremeExport');
+        $this->completeHistorique(
+            $this->enrichHistoriqueBaremesExport(
+                $this->enrichHistoriqueBaremes($historique, $baremeName, $inputUnit, $outputUnit, $xMin, $xMax),
+                $dateCreation,
+                $nValues
+            )
+        );
+    }
+
+    /**
+     * @param HistoriqueBaremesExport $historique
+     * @param $dateCreation
+     * @param $nValues
+     *
+     * @return HistoriqueBaremesExport
+     */
+    protected function enrichHistoriqueBaremesExport(HistoriqueBaremesExport $historique, $dateCreation, $nValues)
+    {
+        $historique->setDateCreation($dateCreation);
+        $historique->setNValues($nValues);
+
+        return $historique;
+    }
+
+    /**
+     * @param Utilisateur  $author
+     * @param \DateTime    $date
+     * @param Observatoire $obs
+     * @param $chroniqueCalculee
+     */
+    public function createHistoriqueCalculChronique(Utilisateur $author, \DateTime $date, Observatoire $obs, $chroniqueCalculee)
+    {
+        /** @var HistoriqueCalculsChroniques $historique */
+        $historique = $this->initiateHistorique(new HistoriqueCalculsChroniques(), $author, $date, $obs);
+        $historique->serializeDescription($chroniqueCalculee);
+        $historique->setAction('historique.actions.CalculChronique');
+        $this->completeHistorique($historique);
+    }
+
+    /**
+     * @param Utilisateur        $author
+     * @param \DateTime          $date
+     * @param Observatoire       $obs
+     * @param ChroniqueConvertie $chroniqueConvertie
+     * @param null               $description
+     */
+    public function createHistoriqueConversionChronique(
+        Utilisateur $author,
+        \DateTime $date,
+        Observatoire $obs,
+        ChroniqueConvertie $chroniqueConvertie,
+        $description = null
+    ) {
+        /** @var HistoriqueConversionsChroniques $historique */
+        $historique = $this->initiateHistorique(new HistoriqueConversionsChroniques(), $author, $date, $obs, $description);
+        $historique->setAction('historique.actions.ConversionChronique');
+        $historique->setChroniqueConvertie($chroniqueConvertie);
+        $historique->setChroniqueMere($chroniqueConvertie->getConversion()->getEntree());
+        $historique->setParamConversion($chroniqueConvertie->getConversion()->getJeuConversionActuel()->getParamConversion());
+        $this->completeHistorique($historique);
+    }
+}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/assets/entries/index.js b/src/Irstea/BdohLoggerBundle/Resources/assets/entries/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..e9f15c0343cc93419ecf778e6bea7e9a73fc5f07
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/assets/entries/index.js
@@ -0,0 +1,34 @@
+/**
+ * Javascript definitions for 'IrsteaBdohLoggerBundle:Main:index.html.twig' template.
+ */
+const $ = require('jquery');
+require('@IrsteaBdohBundle/lib/select2');
+require('@IrsteaBdohBundle/lib/datatables');
+
+$(() => {
+    $('.log-tab').each((_, tab) => {
+        const $tab = $(tab);
+        const selector = `#${tab.id}`;
+        const init = () => {
+            // dernières connexions -> tri par date desc sur la colonne 1
+            $tab.find('.table.last-logins').DataTable({'order': [[ 1, 'desc' ]]});
+            // logs normaux -> tri par date desc sur la colonne 2
+            $tab.find('.table:not(.last-logins)').DataTable({'order': [[ 2, 'desc' ]]})
+        };
+
+        if ($tab.hasClass('active')) {
+            init();
+        } else {
+            $(`a[data-toggle="tab"][href="${selector}"]`).one('shown.bs.tab', init);
+        }
+    });
+    const $historiqueYear = $('#historiqueYear');
+    if($historiqueYear) {
+        $historiqueYear.select2({
+            minimumResultsForSearch: Infinity
+        });
+        $historiqueYear.on('change', () => {
+            window.location.href = `${$historiqueYear.data('url')}?year=${$historiqueYear.val()}`;
+        });
+    }
+});
diff --git a/src/Irstea/BdohLoggerBundle/Resources/config/doctrine/mapping.orm.yml b/src/Irstea/BdohLoggerBundle/Resources/config/doctrine/mapping.orm.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6a4292c614e4c78a93006cb466e1a10c766dea94
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/config/doctrine/mapping.orm.yml
@@ -0,0 +1,624 @@
+Empty:
+################################################################################
+# Empty class because of "the first line bug".
+################################################################################
+#
+# WARNING : entities used in a discriminatorMap MUST EXIST !!!
+# This can require an entities generation in two steps (the first, without the discriminatorMap).
+#
+################################################################################
+
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\Historique:
+    type: entity
+    inheritanceType: SINGLE_TABLE
+    discriminatorMap:
+        simple:                          Historique
+        administration:                  HistoriqueAdministration
+        administrationUtilisateur:       HistoriqueAdministrationUtilisateur
+        administrationBareme:            HistoriqueAdministrationBareme
+        administrationCommune:           HistoriqueAdministrationCommune
+        administrationCoursEau:          HistoriqueAdministrationCoursEau
+        administrationBassin:            HistoriqueAdministrationBassin
+        administrationObservatoire:      HistoriqueAdministrationObservatoire
+        administrationFamilleParametres: HistoriqueAdministrationFamilleParametres
+        administrationTypeParametre:     HistoriqueAdministrationTypeParametre
+        administrationTypeFunding: HistoriqueAdministrationTypeFunding
+        administrationUnite:             HistoriqueAdministrationUnite
+        administrationStation:           HistoriqueAdministrationStation
+        administrationSite:              HistoriqueAdministrationSiteExperimental
+        administrationChronique:         HistoriqueAdministrationChronique
+        administrationDoi:               HistoriqueAdministrationDoi
+        administrationDataset:           HistoriqueAdministrationDataSet
+        administrationPartenaire:        HistoriqueAdministrationPartenaire
+        administrationMilieu:            HistoriqueAdministrationMilieu
+        administrationPersonneTheia:     HistoriqueAdministrationPersonneTheia
+        administrationTopicCategory:     HistoriqueAdministrationTopicCategory
+        administrationTheiaCategories:   HistoriqueAdministrationTheiaCategories
+        administrationInspireTheme:      HistoriqueAdministrationInspireTheme
+        administrationDataConstraint:    HistoriqueAdministrationDataConstraint
+        administrationCriteriaGeology:   HistoriqueAdministrationCriteriaGeology
+        administrationCriteriaClimate:   HistoriqueAdministrationCriteriaClimate
+        donnees:                         HistoriqueDonnees
+        donneesPointControle:            HistoriqueDonneesPointControle
+        donneesExport:                   HistoriqueDonneesExport
+        donneesImport:                   HistoriqueDonneesImport
+        donneesSuppression:              HistoriqueDonneesSuppression
+        transformations:                 HistoriqueTransformations
+        baremes:                         HistoriqueBaremes
+        baremesImport:                   HistoriqueBaremesImport
+        baremesExport:                   HistoriqueBaremesExport
+        calculsChroniques:               HistoriqueCalculsChroniques
+        conversionsChroniques:           HistoriqueConversionsChroniques
+        sig:                             HistoriqueSig
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        date:
+            type:     datetime
+            nullable: true
+        description:
+            type: text
+        lien:
+            type: string
+            nullable: TRUE
+    manyToOne:
+        auteur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            joinColumn:
+                name: auteur_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministration:
+    type: entity
+    extends: Historique
+    fields:
+        action:
+            type:     string
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueDonnees:
+    type: entity
+    extends: Historique
+    fields:
+        debut:
+            type:     datetimems
+            nullable: true
+        fin:
+            type:     datetimems
+            nullable: true
+        nombreMesures:
+            type: integer
+            nullable: true
+    manyToOne:
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueDonneesRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueSig:
+    type: entity
+    extends: Historique
+    fields:
+        nombreInserts:
+            type: integer
+            nullable: true
+        nombreMesures:
+            type: integer
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueSigRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesPointControle:
+    type: entity
+    extends: HistoriqueDonnees
+    fields:
+        action:
+            type:     string
+            nullable: true
+        fuseau:
+            type:     string
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueDonneesPointControleRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesExport:
+    type: entity
+    extends: HistoriqueDonnees
+    fields:
+        formatExport:
+            type:     string
+            nullable: true
+        typeExport:
+            type:     string
+            nullable: true
+        timestep:
+            type:     string
+            nullable: true
+        fuseau:
+            type:     string
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueDonneesExportRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesImport:
+    type: entity
+    extends: HistoriqueDonnees
+    fields:
+        formatImport:
+            type:     string
+            nullable: true
+        fuseau:
+            type:     string
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueDonneesImportRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueDonneesSuppression:
+    type: entity
+    extends: HistoriqueDonnees
+    fields:
+        changedIntoGap:
+            type:     boolean
+            nullable: true
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueDonneesImportRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationUtilisateur:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationUtilisateurRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationBareme:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        bareme:
+            targetEntity: Irstea\BdohDataBundle\Entity\Bareme
+            joinColumn:
+                name: bareme_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationBaremeRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCommune:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        commune:
+            targetEntity: Irstea\BdohDataBundle\Entity\Commune
+            joinColumn:
+                name: commune_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationCommuneRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCoursEau:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        coursEau:
+            targetEntity: Irstea\BdohDataBundle\Entity\CoursEau
+            joinColumn:
+                name: courseau_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationCoursEauRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationBassin:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        bassin:
+            targetEntity: Irstea\BdohDataBundle\Entity\Bassin
+            joinColumn:
+                name: bassin_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationBassinRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationPartenaire:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        partenaire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Partenaire
+            joinColumn:
+                name: partenaire_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationPartenaireRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationObservatoire:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        observatoireCible:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoirecible_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationObservatoireRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDataSet:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        dataSet:
+            targetEntity: Irstea\BdohDataBundle\Entity\DataSet
+            joinColumn:
+                name: dataset_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationDataSetRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTypeFunding:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        typefunding:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeFunding
+            joinColumn:
+                name: typefunding_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationTypeFundingRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTopicCategory:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        topicCategory:
+            targetEntity: Irstea\BdohDataBundle\Entity\TopicCategory
+            joinColumn:
+                name: topiccategory_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationTopicCategoryRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationInspireTheme:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        inspireTheme:
+            targetEntity: Irstea\BdohDataBundle\Entity\InspireTheme
+            joinColumn:
+                name: inspiretheme_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationInspireThemeRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTheiaCategories:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        theiaCategories:
+            targetEntity: Irstea\BdohDataBundle\Entity\TheiaCategories
+            joinColumn:
+                name: theiacategories_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationTheiaCategoriesRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDataConstraint:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        dataConstraint:
+            targetEntity: Irstea\BdohDataBundle\Entity\DataConstraint
+            joinColumn:
+                name: dataconstraint
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationDataConstraintRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCriteriaGeology:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        criteriaGeology:
+            targetEntity: Irstea\BdohDataBundle\Entity\CriteriaGeology
+            joinColumn:
+                name: criteriageology
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationCriteriaGeologyRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationCriteriaClimate:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        criteriaClimat:
+            targetEntity: Irstea\BdohDataBundle\Entity\CriteriaClimat
+            joinColumn:
+                name: criteriaclimate
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationCriteriaClimateRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationMilieu:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        milieu:
+            targetEntity: Irstea\BdohDataBundle\Entity\Milieu
+            joinColumn:
+                name: milieu_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationMilieuRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationPersonneTheia:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        personneTheia:
+            targetEntity: Irstea\BdohDataBundle\Entity\PersonneTheia
+            joinColumn:
+                name: personnetheia_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationPersonneTheiaRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationDoi:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        doi:
+            targetEntity: Irstea\BdohDataBundle\Entity\Doi
+            joinColumn:
+                name: doi_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationDoiRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationFamilleParametres:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        familleParametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            joinColumn:
+                name: familleparametres_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        familleParente:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            joinColumn:
+                name: familleparente_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationFamilleParametresRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationTypeParametre:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        typeParametre:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeParametre
+            joinColumn:
+                name: typeparametre_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        familleParametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\FamilleParametres
+            joinColumn:
+                name: familleparametres_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationTypeParametreRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationUnite:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        unite:
+            targetEntity: Irstea\BdohDataBundle\Entity\Unite
+            joinColumn:
+                name: unite_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationUniteRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationStation:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        station:
+            targetEntity: Irstea\BdohDataBundle\Entity\Station
+            joinColumn:
+                name: station_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationStationRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationSiteExperimental:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        siteExperimental:
+            targetEntity: Irstea\BdohDataBundle\Entity\SiteExperimental
+            joinColumn:
+                name: siteexperimental_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationSiteExperimentalRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueAdministrationChronique:
+    type: entity
+    extends: HistoriqueAdministration
+    manyToOne:
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueAdministrationChroniqueRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueTransformations:
+    type: entity
+    extends: Historique
+    fields:
+        action:
+            type: string
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueTransformationsRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueBaremes:
+    type: entity
+    extends: HistoriqueTransformations
+    fields:
+        name:
+            type: string
+        inputUnit:
+            type: string
+        outputUnit:
+            type: string
+        minAbscissa:
+            type: float
+        maxAbscissa:
+            type: float
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueBaremesRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueBaremesImport:
+    type: entity
+    extends: HistoriqueBaremes
+    fields:
+        nValues:
+            type: integer
+        dateCreation:
+            type: datetime
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueBaremesImportRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueBaremesExport:
+    type: entity
+    extends: HistoriqueBaremes
+    fields:
+        nValues:
+            type: integer
+        dateCreation:
+            type: datetime
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueBaremesExportRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueCalculsChroniques:
+    type: entity
+    extends: HistoriqueTransformations
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueCalculsChroniquesRepository
+
+################################################################################
+Irstea\BdohLoggerBundle\Entity\HistoriqueConversionsChroniques:
+    type: entity
+    extends: HistoriqueTransformations
+    fields:
+        paramConversion:
+            type: integer
+    manyToOne:
+        chroniqueConvertie:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueConvertie
+            joinColumn:
+                name: chroniqueconvertie_id
+                referenceColumnName: id
+                onDelete: SET NULL
+        chroniqueMere:
+            targetEntity: Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue
+            joinColumn:
+                name: chroniquemere_id
+                referenceColumnName: id
+                onDelete: SET NULL
+
+    repositoryClass: Irstea\BdohLoggerBundle\Entity\Repository\HistoriqueConversionsChroniquesRepository
+
+################################################################################
+
diff --git a/src/Irstea/BdohLoggerBundle/Resources/config/routing.yml b/src/Irstea/BdohLoggerBundle/Resources/config/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..469423b81d100ebfe7be088fd419c493bedc7ed7
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/config/routing.yml
@@ -0,0 +1,7 @@
+irstea_bdoh_logger_advancedSearch:
+    path:  /historique
+    defaults: { _controller: IrsteaBdohLoggerBundle:Logger:advancedSearch }
+
+irstea_bdoh_logger_advancedSearch_recent:
+    path:  /historique/recent
+    defaults: { _controller: IrsteaBdohLoggerBundle:Logger:advancedSearchRecent }
diff --git a/src/Irstea/BdohLoggerBundle/Resources/config/services.yml b/src/Irstea/BdohLoggerBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ce361c97e716503dabb1ea439ddc3188c6f713a3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/config/services.yml
@@ -0,0 +1,7 @@
+services:
+    # BDOH class for log management
+    irstea_bdoh_logger.logger:
+        class: Irstea\BdohLoggerBundle\Logger\BdohLogger
+        arguments:
+            - "@doctrine.orm.entity_manager"
+            - "@translator"
diff --git a/src/Irstea/BdohLoggerBundle/Resources/doc/index.rst b/src/Irstea/BdohLoggerBundle/Resources/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohLoggerBundle/Resources/translations/messages.en.php b/src/Irstea/BdohLoggerBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..34206dfea79b569500b96f407d8dbbbc94c7c952
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/translations/messages.en.php
@@ -0,0 +1,313 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$messages = [
+    'historique' => [
+        'title' => [
+            'all(%recent%, %from%)'                                   => 'All%recent% logs%from%',
+            'admin(%recent%, %from%)'                                 => 'All administration%recent% logs%from%',
+            'adminObservatoire(%recent%, %from%)'                     => 'Observatory%recent% logs%from%',
+            'adminSiteExperimental(%recent%, %from%)'                 => 'Experimental site%recent% logs%from%',
+            'adminStation(%recent%, %from%)'                          => 'Station%recent% logs%from%',
+            'adminChronique(%recent%, %from%)'                        => 'Time series%recent% logs%from%',
+            'adminBareme(%recent%, %from%)'                           => 'Scale%recent% logs%from%',
+            'adminFamilleParametres(%recent%, %from%)'                => 'Parameter category%recent% logs%from%',
+            'adminTypeParametre(%recent%, %from%)'                    => 'Parameter type%recent% logs%from%',
+            'adminUnite(%recent%, %from%)'                            => 'Unit%recent% logs%from%',
+            'adminBassin(%recent%, %from%)'                           => 'Basin%recent% logs%from%',
+            'adminCoursEau(%recent%, %from%)'                         => 'River%recent% logs%from%',
+            'adminCommune(%recent%, %from%)'                          => 'Town%recent% logs%from%',
+            'adminDoi(%recent%, %from%)'                              => 'DOI%recent% logs%from%',
+            'adminDataset(%recent%, %from%)'                          => 'Dataset%recent% logs%from%',
+            'adminMilieu(%recent%, %from%)'                           => 'Environment%recent% logs%from%',
+            'adminPersonneTheia(%recent%, %from%)'                    => 'Theia/OZCAR user%recent% logs%from%',
+            'adminTypeFunding(%recent%, %from%)'                      => 'Type fundings%recent% logs%from%',
+            'adminTopicCategory(%recent%, %from%)'                    => 'INSPIRE Topic Categories%recent% logs%from%',
+            'adminPartenaire(%recent%, %from%)'                       => 'Partner%recent% logs%from%',
+            'adminTheiaCategories(%recent%, %from%)'                  => 'Connections TheiaCategories%recent% logs%from%',
+            'adminInspireTheme(%recent%, %from%)'                     => 'INSPIRE themes%recent% logs%from%',
+            'adminDataConstraint(%recent%, %from%)'                   => 'Data constraint%recent% logs%from%',
+            'adminCriteriaGeology(%recent%, %from%)'                  => 'Criteria geology%recent% logs%from%',
+            'adminCriteriaClimate(%recent%, %from%)'                  => 'Criteria climate%recent% logs%from%',
+            'adminUtilisateur(%recent%, %from%)'                      => 'User%recent% logs%from%',
+            'derniereConnection(%recent%, %from%)'                    => 'Last logins logs',
+            'donnees(%recent%, %from%)'                               => 'All data%recent% logs%from%',
+            'donneesImport(%recent%, %from%)'                         => 'Data upload%recent% logs%from%',
+            'donneesExport(%recent%, %from%)'                         => 'Data download%recent% logs%from%',
+            'donneesSuppression(%recent%, %from%)'                    => 'Data removal%recent% logs%from%',
+            'donneesPointControle(%recent%, %from%)'                  => 'Checkpoint%recent% logs%from%',
+            'transformations(%recent%, %from%)'                       => 'All calculation and conversion%recent% logs%from%',
+            'baremesImport(%recent%, %from%)'                         => 'Scale upload%recent% logs%from%',
+            'baremesExport(%recent%, %from%)'                         => 'Scale download%recent% logs%from%',
+            'calculsChroniques(%recent%, %from%)'                     => 'Time series calculation%recent% logs%from%',
+            'donneesImportManuel(%recent%, %from%)'                   => 'Manual data upload%recent% logs%from%',
+            'conversionsChroniques(%recent%, %from%)'                 => 'Time series conversion%recent% logs%from%',
+            'sig(%recent%, %from%)'                                   => 'All geographic data%recent% logs%from%',
+        ],
+        'menu' => [
+            'title' => [
+                'all(%recent%)'   => 'All%recent% logs',
+                'admin'           => 'Administration',
+                'donnees'         => 'Data',
+                'transformations' => 'Calculation and conversion',
+                'sig'             => 'Geographic data',
+            ],
+            'admin'                             => 'All',
+            'adminObservatoire'                 => 'Observatories',
+            'adminSiteExperimental'             => 'Experimental sites',
+            'adminStation'                      => 'Stations',
+            'adminChronique'                    => 'Time series',
+            'adminBareme'                       => 'Scales',
+            'adminFamilleParametres'            => 'Parameter categories',
+            'adminTypeParametre'                => 'Parameter types',
+            'adminUnite'                        => 'Units',
+            'adminBassin'                       => 'Basins',
+            'adminCoursEau'                     => 'Rivers',
+            'adminCommune'                      => 'Towns',
+            'adminDoi'                          => 'DOIs',
+            'adminDataset'                      => 'Datasets',
+            'adminMilieu'                       => 'Environments',
+            'adminTypeFunding'                  => 'Type Fundings',
+            'adminTopicCategory'                => 'INSPIRE Topic Categories',
+            'adminTheiaCategories'              => 'Connections TheiaCategories',
+            'adminInspireTheme'                 => 'INSPIRE Themes ',
+            'adminPersonneTheia'                => 'Theia/OZCAR users',
+            'adminDataConstraint'               => 'Data Constraint',
+            'adminCriteriaGeology'              => 'Criteria geology',
+            'adminCriteriaClimate'              => 'Criteria climate',
+            'adminPartenaire'                   => 'Partners',
+            'adminUtilisateur'                  => 'Users',
+            'derniereConnection'                => 'Last logins',
+            'donnees'                           => 'All',
+            'donneesImport'                     => 'Data upload',
+            'donneesExport'                     => 'Data download',
+            'donneesSuppression'                => 'Data removal',
+            'donneesPointControle'              => 'Checkpoints',
+            'transformations'                   => 'All',
+            'baremesImport'                     => 'Scale upload',
+            'baremesExport'                     => 'Scale download',
+            'calculsChroniques'                 => 'Time series calculation',
+            'donneesImportManuel'               => 'Manual data upload',
+            'conversionsChroniques'             => 'Time series conversion',
+        ],
+        'actions' => [
+            'ObservatoireCreate'                        => 'Observatory creation',
+            'ObservatoireUpdate'                        => 'Observatory update',
+            'ObservatoireRemove'                        => 'Observatory deletion',
+            'SiteExperimentalCreate'                    => 'Experimental site creation',
+            'SiteExperimentalUpdate'                    => 'Experimental site update',
+            'SiteExperimentalRemove'                    => 'Experimental site deletion',
+            'StationCreate'                             => 'Station creation',
+            'StationUpdate'                             => 'Station update',
+            'StationRemove'                             => 'Station deletion',
+            'ChroniqueCreate'                           => 'Time series creation',
+            'ChroniqueUpdate'                           => 'Time series update',
+            'ChroniqueRemove'                           => 'Time series deletion',
+            'BassinUpdate'                              => 'Basin update',
+            'BassinRemove'                              => 'Basin deletion',
+            'CoursEauUpdate'                            => 'River update',
+            'CoursEauRemove'                            => 'River deletion',
+            'CommuneCreate'                             => 'Town creation',
+            'CommuneUpdate'                             => 'Town update',
+            'CommuneRemove'                             => 'Town deletion',
+            'DatasetCreate'                             => 'Dataset creation',
+            'DatasetUpdate'                             => 'Dataset update',
+            'DatasetRemove'                             => 'Dataset deletion',
+            'DoiCreate'                                 => 'DOI creation',
+            'DoiUpdate'                                 => 'DOI update',
+            'DoiRemove'                                 => 'DOI deletion',
+            'MilieuCreate'                              => 'Environment creation',
+            'MilieuUpdate'                              => 'Environment update',
+            'MilieuRemove'                              => 'Environment deletion',
+            'PersonneTheiaCreate'                       => 'Theia/OZCAR creation',
+            'PersonneTheiaUpdate'                       => 'Theia/OZCAR update',
+            'PersonneTheiaRemove'                       => 'Theia/OZCAR deletion',
+            'TypeFundingCreate'                         => 'Type Fundings creation',
+            'TypeFundingUpdate'                         => 'Type Fundings update',
+            'TypeFundingRemove'                         => 'Type Fundings deletion',
+            'TopicCategoryCreate'                       => 'INSPIRE Topic Categories creation',
+            'TopicCategoryUpdate'                       => 'INSPIRE Topic Categories update',
+            'TopicCategoryRemove'                       => 'INSPIRE Topic Categories deletion',
+            'TheiaCategoriesCreate'                     => 'Connections TheiaCategories creation',
+            'TheiaCategoriesUpdate'                     => 'Connections TheiaCategories update',
+            'TheiaCategoriesRemove'                     => 'Connections TheiaCategories deletion',
+            'InspireThemeCreate'                        => 'INSPIRE theme creation',
+            'InspireThemeUpdate'                        => 'INSPIRE theme update',
+            'InspireThemeRemove'                        => 'INSPIRE theme deletion',
+            'DataconstraintCreate'                      => 'Data Constraint creation',
+            'DataconstraintUpdate'                      => 'Data Constraint update',
+            'DataconstraintRemove'                      => 'Data Constraint deletion',
+            'CriteriaGeologyCreate'                     => 'Criteria geology creation',
+            'CriteriaGeologyUpdate'                     => 'Criteria geology update',
+            'CriteriaGeologyRemove'                     => 'Criteria geology deletion',
+            'CriteriaClimateCreate'                     => 'Criteria climate creation',
+            'CriteriaClimateUpdate'                     => 'Criteria climate update',
+            'CriteriaClimateRemove'                     => 'Criteria climate deletion',
+            'PartenaireCreate'                          => 'Partner creation',
+            'PartenaireUpdate'                          => 'Partner update',
+            'PartenaireRemove'                          => 'Partner deletion',
+            'FamilleParametresCreate'                   => 'Parameter category creation',
+            'FamilleParametresUpdate'                   => 'Parameter category update',
+            'FamilleParametresRemove'                   => 'Parameter category deletion',
+            'TypeParametreCreate'                       => 'Parameter type creation',
+            'TypeParametreUpdate'                       => 'Parameter type update',
+            'TypeParametreRemove'                       => 'Parameter type deletion',
+            'UniteCreate'                               => 'Unit creation',
+            'UniteUpdate'                               => 'Unit update',
+            'UniteRemove'                               => 'Unit deletion',
+            'UtilisateurCreate'                         => 'User creation',
+            'UtilisateurUpdate'                         => 'User update',
+            'UtilisateurRights'                         => 'User right update',
+            'MesurePlageImport'                         => 'Data upload',
+            'MesurePlageExport'                         => 'Data download',
+            'MesurePlageSuppression'                    => 'Data removal',
+            'PointControleImport'                       => 'Checkpoints upload',
+            'PointControleExport'                       => 'Checkpoints download',
+            'BaremeImport'                              => 'Scale upload',
+            'BaremeExport'                              => 'Scale download',
+            'CalculChronique'                           => 'Time series calculation',
+            'ImportManuelMesure'                        => 'Manual data upload',
+            'ImportGeographique'                        => 'Geographic data upload',
+            'ConversionChronique'                       => 'Time series conversion',
+        ],
+        'deleted' => [
+            'Observatoire'              => 'Observatory removed since then',
+            'SiteExperimental'          => 'Experimental site removed since then',
+            'Station'                   => 'Station removed since then',
+            'Chronique'                 => 'Time series removed since then',
+            'Bareme'                    => 'Scale removed since then',
+            'FamilleParametresStrict'   => 'Parameter category removed since then',
+            'FamilleParametres'         => 'No parameter category or category removed since then',
+            'FamilleParente'            => 'No parent category or category removed since then',
+            'TypeParametre'             => 'Parameter type removed since then',
+            'TypeFunding'               => 'Type Fundings removed since then',
+            'TheiaCategories'           => 'Connections TheiaCategories removed since then',
+            'TopicCategory'             => 'INSPIRE Topic Categories removed since then',
+            'InspireTheme'              => 'INSPIRE Themes ',
+            'DataConstraint'            => 'Data Constraint removed since then',
+            'CriteriaGeology'           => 'Criteria Geology removed since then',
+            'CriteriaClimate'           => 'Criteria Climate removed since then',
+            'Unite'                     => 'Unit removed since then',
+            'Bassin'                    => 'Basin removed since then',
+            'CoursEau'                  => 'River removed since then',
+            'Commune'                   => 'Town removed since then',
+            'Doi'                       => 'DOI removed since then',
+            'Dataset'                   => 'Dataset removed since then',
+            'Milieu'                    => 'Environment removed since then',
+            'PersonneTheia'             => 'Theia/OZCAR user removed since then',
+            'Partenaire'                => 'Partner removed since then',
+            'Utilisateur'               => 'User removed since then',
+        ],
+        'advancedSearch'         => 'All logs',
+        'advancedSearchRecent'   => 'Recent logs',
+        'go-to-menus-for-detail' => 'To see the detail of actions please filter the latter with the menus below.',
+        'recent'                 => 'recent',
+        'from'                   => 'from',
+        'action'                 => 'Type of action',
+        'author'                 => 'Author',
+        'debut'                  => 'Start',
+        'fin'                    => 'End',
+        'format'                 => 'Format',
+        'fuseau'                 => 'Time zone',
+        'nbMesures'              => 'Data',
+        'nbSig'                  => 'Data',
+        'nbNewSig'               => 'New',
+        'nbMajSig'               => 'Updates',
+        'typeShape'              => 'Data type',
+        'formatImport'           => 'Upload format',
+        'formatExport'           => 'Download format',
+        'typeExport'             => 'Donwload type',
+        'exportTypes'            => [
+            'identical'     => 'Identical',
+            'instantaneous' => 'Linear interpolation',
+            'mean'          => 'Mean',
+            'cumulative'    => 'Accumulation',
+        ],
+        'timestep'                  => 'Time step',
+        'changedIntoGap'            => 'Replaced with gap values',
+        'dateTime'                  => 'd-m-Y<\\b\\r>H:i:s',
+        'derniereConnection'        => 'last login',
+        'description'               => 'Description',
+        'observatoire'              => 'Observatory',
+        'siteExperimental'          => 'Experimental site',
+        'station'                   => 'Station',
+        'chronique'                 => 'Time series',
+        'chroniqueMere'             => 'Parent time series',
+        'bareme'                    => 'Scale',
+        'familleParametres'         => 'Parameter category',
+        'familleParente'            => 'Parent category',
+        'typeParametre'             => 'Parameter type',
+        'topicCategory'             => 'INSPIRE Topic Categories',
+        'inspireTheme'              => 'INSPIRE Themes ',
+        'unite'                     => 'Unit',
+        'bassin'                    => 'Basin',
+        'coursEau'                  => 'River',
+        'commune'                   => 'Town',
+        'doi'                       => 'DOI',
+        'dataset'                   => 'Dataset',
+        'personneTheia'             => 'Theia/OZCAR user',
+        'dataconstraint'            => 'Data Constraint',
+        'criteriageology'           => 'Criteria geology',
+        'criteriaclimate'           => 'Criteria climate',
+        'milieu'                    => 'Environment',
+        'typefunding'               => 'Type Fundings',
+        'theiaCategories'           => 'Connections TheiaCategories',
+        'partenaire'                => 'Partner',
+        'utilisateur'               => 'User',
+        'paramConversion'           => 'Gap threshold',
+        'noFamilleParametres'       => 'No parameter category',
+        'noFamilleParente'          => 'No parent category',
+    ],
+    'bareme' => [
+        'bareme'                           => 'Scale',
+        'jeuBareme'                        => 'Scale set',
+        'debutApplication'                 => 'Application start',
+        'finApplication'                   => 'Application end',
+        'units(%inputUnit%, %outputUnit%)' => 'Units: from %inputUnit% to %outputUnit%',
+        'values'                           => 'values',
+        'xMinMax(%xMin%, %xMax%)'          => 'Abscissa from %xMin% to %xMax%',
+        'dateCreation'                     => 'Created the',
+        'childChronicle'                   => 'Child time series',
+        'parentChronicle'                  => 'Parent time series',
+        'firstParentChronicle'             => 'First parent time series',
+        'secondParentChronicle'            => 'Seconde parent time series',
+        'valueLimitPolicy'                 => [
+            'label'                               => 'Quantification/detection limits:',
+            'chronique.lq_ld.options.true_value'  => 'original values',
+            'chronique.lq_ld.options.half_value'  => 'divided by 2',
+            'chronique.lq_ld.options.placeholder' => 'replaced by %placeholder%',
+            'chronique.lq_ld.options.gap'         => 'invalidated',
+        ],
+        'seeBaremeLogs'       => 'See the scale set history',
+        'seeBaremes'          => 'Show/hide scales',
+        'noSecondParent'      => 'none',
+        'multFactor'          => 'Multiplicative factor',
+        'propagationTimeAbbr' => 'Propag. time: %time% min',
+        'limitTransfoAbbr'    => [
+            'chronique.lq_ld.options.true_value'  => "Parent time series' Lq/Ld unmodified",
+            'chronique.lq_ld.options.half_value'  => "Parent time series' Lq/Ld divided by 2",
+            'chronique.lq_ld.options.placeholder' => "Parent time series' Lq/Ld replaced by %placeholder%",
+            'chronique.lq_ld.options.gap'         => "Parent time series' Lq/Ld processed as invalid",
+        ],
+    ],
+];
+
+return $messages;
diff --git a/src/Irstea/BdohLoggerBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohLoggerBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b7a26cd5d0d7e7d916b397d2e11cd76e92633a3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,313 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$messages = [
+    'historique' => [
+        'title' => [
+            'all(%recent%, %from%)'                                   => 'Tous les historiques%recent%%from%',
+            'admin(%recent%, %from%)'                                 => "Tous les historiques%recent% d'administration%from%",
+            'adminObservatoire(%recent%, %from%)'                     => 'Historiques%recent% des observatoires%from%',
+            'adminSiteExperimental(%recent%, %from%)'                 => 'Historiques%recent% des sites expérimentaux%from%',
+            'adminStation(%recent%, %from%)'                          => 'Historiques%recent% des stations%from%',
+            'adminChronique(%recent%, %from%)'                        => 'Historiques%recent% des chroniques%from%',
+            'adminBareme(%recent%, %from%)'                           => 'Historiques%recent% des baremes%from%',
+            'adminFamilleParametres(%recent%, %from%)'                => 'Historiques%recent% des familles de paramètres%from%',
+            'adminTypeParametre(%recent%, %from%)'                    => 'Historiques%recent% des types de paramètre%from%',
+            'adminUnite(%recent%, %from%)'                            => 'Historiques%recent% des unités%from%',
+            'adminBassin(%recent%, %from%)'                           => 'Historiques%recent% des bassins%from%',
+            'adminCoursEau(%recent%, %from%)'                         => "Historiques%recent% des cours d'eau%from%",
+            'adminCommune(%recent%, %from%)'                          => 'Historiques%recent% des communes%from%',
+            'adminDoi(%recent%, %from%)'                              => 'Historiques%recent% des DOI%from%',
+            'adminDataset(%recent%, %from%)'                          => 'Historiques%recent% des Jeux de données%from%',
+            'adminMilieu(%recent%, %from%)'                           => 'Historiques%recent% des milieux%from%',
+            'adminTypeFunding(%recent%, %from%)'                      => 'Historiques%recent% des types de financeurs%from%',
+            'adminTopicCategory(%recent%, %from%)'                    => 'Historiques%recent% des categories thématiques INSPIRE%from%',
+            'adminTheiaCategories(%recent%, %from%)'                  => 'Historiques%recent% des correspondances Theia Categories%from%',
+            'adminInspireTheme(%recent%, %from%)'                     => 'Historiques%recent% des Thèmes INSPIRE%from%',
+            'adminPartenaire(%recent%, %from%)'                       => 'Historiques%recent% des partenaires%from%',
+            'adminPersonneTheia(%recent%, %from%)'                    => 'Historiques%recent% des personnes pour Theia/OZCAR%from%',
+            'adminDataConstraint(%recent%, %from%)'                   => 'Historiques%recent% des contraintes de données%from%',
+            'adminCriteriaGeology(%recent%, %from%)'                  => 'Historiques%recent% des critères géologiques%from%',
+            'adminCriteriaClimate(%recent%, %from%)'                  => 'Historiques%recent% des critères climatiques%from%',
+            'adminUtilisateur(%recent%, %from%)'                      => 'Historiques%recent% des utilisateurs%from%',
+            'derniereConnection(%recent%, %from%)'                    => 'Historiques des dernières connexions',
+            'donnees(%recent%, %from%)'                               => 'Tous les historiques%recent% des mesures%from%',
+            'donneesImport(%recent%, %from%)'                         => 'Historiques%recent% des imports de mesures%from%',
+            'donneesExport(%recent%, %from%)'                         => 'Historiques%recent% des exports de mesures%from%',
+            'donneesSuppression(%recent%, %from%)'                    => 'Historiques%recent% des suppressions de mesures%from%',
+            'donneesPointControle(%recent%, %from%)'                  => 'Historiques%recent% des points de contrôle%from%',
+            'transformations(%recent%, %from%)'                       => 'Tous les historiques%recent% des calculs et conversions%from%',
+            'baremesImport(%recent%, %from%)'                         => 'Historiques%recent% des imports de barèmes%from%',
+            'baremesExport(%recent%, %from%)'                         => 'Historiques%recent% des exports de barèmes%from%',
+            'calculsChroniques(%recent%, %from%)'                     => 'Historiques%recent% des calculs de chroniques%from%',
+            'donneesImportManuel(%recent%, %from%)'                   => 'Historiques%recent% des imports manuels de mesures%from%',
+            'conversionsChroniques(%recent%, %from%)'                 => 'Historiques%recent% des conversions de chroniques%from%',
+            'sig(%recent%, %from%)'                                   => 'Tous les historiques%recent% des données géographiques%from%',
+        ],
+        'menu' => [
+            'title' => [
+                'all(%recent%)'   => 'Tous les historiques%recent%',
+                'admin'           => 'Administration',
+                'donnees'         => 'Mesures',
+                'transformations' => 'Calculs et conversions',
+                'sig'             => 'Données géographiques',
+            ],
+            'admin'                             => 'Tous',
+            'adminObservatoire'                 => 'Observatoires',
+            'adminSiteExperimental'             => 'Sites expérimentaux',
+            'adminStation'                      => 'Stations',
+            'adminChronique'                    => 'Chroniques',
+            'adminBareme'                       => 'Baremes',
+            'adminFamilleParametres'            => 'Familles de paramètres',
+            'adminTypeParametre'                => 'Types de paramètre',
+            'adminUnite'                        => 'Unités',
+            'adminBassin'                       => 'Bassins',
+            'adminCoursEau'                     => "Cours d'eau",
+            'adminCommune'                      => 'Communes',
+            'adminDoi'                          => 'DOI',
+            'adminDataset'                      => 'Jeu de données',
+            'adminPersonneTheia'                => 'Personne pour Theia/OZCAR',
+            'adminTypeFunding'                  => 'Type de financeurs',
+            'adminTopicCategory'                => 'Categories thématiques INSPIRE',
+            'adminTheiaCategories'              => 'Correspondance des TheiaCategories',
+            'adminInspireTheme'                 => 'Thèmes INSPIRE',
+            'adminDataConstraint'               => 'Contraintes de données',
+            'adminCriteriaGeology'              => 'Critères Géologiques',
+            'adminCriteriaClimate'              => 'Critères climatiques',
+            'adminMilieu'                       => 'Milieu',
+            'adminPartenaire'                   => 'Partenaires',
+            'adminUtilisateur'                  => 'Utilisateurs',
+            'derniereConnection'                => 'Dernières connexions',
+            'donnees'                           => 'Tous',
+            'donneesImport'                     => 'Imports de mesures',
+            'donneesExport'                     => 'Exports de mesures',
+            'donneesSuppression'                => 'Suppressions de mesures',
+            'donneesPointControle'              => 'Points de contrôle',
+            'transformations'                   => 'Tous',
+            'baremesImport'                     => 'Imports de barèmes',
+            'baremesExport'                     => 'Exports de barèmes',
+            'calculsChroniques'                 => 'Calculs de chroniques',
+            'donneesImportManuel'               => 'Imports manuels de mesures',
+            'conversionsChroniques'             => 'Conversions de chroniques',
+        ],
+        'actions' => [
+            'ObservatoireCreate'                        => "Création d'un observatoire",
+            'ObservatoireUpdate'                        => "Modification d'un observatoire",
+            'ObservatoireRemove'                        => "Suppression d'un observatoire",
+            'SiteExperimentalCreate'                    => "Création d'un site expérimental",
+            'SiteExperimentalUpdate'                    => "Modification d'un site expérimental",
+            'SiteExperimentalRemove'                    => "Suppression d'un site expérimental",
+            'StationCreate'                             => "Création d'une station",
+            'StationUpdate'                             => "Modification d'une station",
+            'StationRemove'                             => "Suppression d'une station",
+            'ChroniqueCreate'                           => "Création d'une chronique",
+            'ChroniqueUpdate'                           => "Modification d'une chronique",
+            'ChroniqueRemove'                           => "Suppression d'une chronique",
+            'BassinUpdate'                              => "Modification d'un bassin",
+            'BassinRemove'                              => "Suppression d'un bassin",
+            'CoursEauUpdate'                            => "Modification d'un cours d'eau",
+            'CoursEauRemove'                            => "Suppression d'un cours d'eau",
+            'CommuneCreate'                             => "Création d'une commune",
+            'CommuneUpdate'                             => "Modification d'une commune",
+            'CommuneRemove'                             => "Suppression d'une commune",
+            'DatasetCreate'                             => "Création d'un Jeu de données",
+            'DatasetUpdate'                             => "Modification d'un Jeu de données",
+            'DatasetRemove'                             => "Suppression d'un Jeu de données",
+            'MilieuCreate'                              => "Création d'un milieu",
+            'MilieuUpdate'                              => "Modification d'un milieu",
+            'MilieuRemove'                              => "Suppression d'un milieu",
+            'PersonneTheiaCreate'                       => "Création d'une personne pour Theia/OZCAR",
+            'PersonneTheiaUpdate'                       => "Modification d'une personne pour Theia/OZCAR",
+            'PersonneTheiaRemove'                       => "Suppression d'une personne pour Theia/OZCAR",
+            'TypeFundingCreate'                         => "Création d'un Type de financeur",
+            'TypeFundingUpdate'                         => "Modification d'un Type de financeur",
+            'TypeFundingRemove'                         => "Suppression d'un Type de financeur",
+            'TopicCategoryCreate'                       => "Création d'une Categorie thématique INSPIRE",
+            'TopicCategoryUpdate'                       => "Modification d'une Categorie thématique INSPIRE",
+            'TopicCategoryRemove'                       => "Suppression d'une Categorie thématique INSPIRE",
+            'TheiaCategoriesCreate'                     => "Création d'une correspondance des TheiaCategories",
+            'TheiaCategoriesUpdate'                     => "Modification d'une correspondance des TheiaCategories",
+            'TheiaCategoriesRemove'                     => "Suppression d'une correspondance des TheiaCategories",
+            'InspireThemeCreate'                        => "Création d'un thème INSPIRE",
+            'InspireThemeUpdate'                        => "Modification d'un thème INSPIRE",
+            'InspireThemeRemove'                        => "Suppression d'un thème INSPIRE",
+            'DataconstraintCreate'                      => "Création d'une contrainte de données",
+            'DataconstraintUpdate'                      => "Modification d'une contrainte de données",
+            'DataconstraintRemove'                      => "Suppression d'une contrainte de données",
+            'CriteriaGeologyCreate'                     => "Création d'un critère géologique",
+            'CriteriaGeologyUpdate'                     => "Modification d'un critère géologique",
+            'CriteriaGeologyRemove'                     => "Suppression d'un critère géologique",
+            'CriteriaClimateCreate'                     => "Création d'un critère climatique",
+            'CriteriaClimateUpdate'                     => "Modification d'un critère climatique",
+            'CriteriaClimateRemove'                     => "Suppression d'un critère climatique",
+            'DoiCreate'                                 => "Création d'un DOI",
+            'DoiUpdate'                                 => "Modification d'un DOI",
+            'DoiRemove'                                 => "Suppression d'un DOI",
+            'PartenaireCreate'                          => "Création d'un partenaire",
+            'PartenaireUpdate'                          => "Modification d'un partenaire",
+            'PartenaireRemove'                          => "Suppression d'un partenaire",
+            'FamilleParametresCreate'                   => "Création d'une famille de paramètres",
+            'FamilleParametresUpdate'                   => "Modification d'une famille de paramètres",
+            'FamilleParametresRemove'                   => "Suppression d'une famille de paramètres",
+            'TypeParametreCreate'                       => "Création d'un type de paramètre",
+            'TypeParametreUpdate'                       => "Modification d'un type de paramètre",
+            'TypeParametreRemove'                       => "Suppression d'un type de paramètre",
+            'UniteCreate'                               => "Création d'une unité",
+            'UniteUpdate'                               => "Modification d'une unité",
+            'UniteRemove'                               => "Suppression d'une unité",
+            'UtilisateurCreate'                         => "Création d'un utilisateur",
+            'UtilisateurUpdate'                         => "Modification d'un utilisateur",
+            'UtilisateurRights'                         => 'Mise à jour des droits',
+            'MesurePlageImport'                         => 'Import de mesures',
+            'MesurePlageExport'                         => 'Export de mesures',
+            'MesurePlageSuppression'                    => 'Suppression de mesures',
+            'PointControleImport'                       => 'Import de points de contrôle',
+            'PointControleExport'                       => 'Export de points de contrôle',
+            'BaremeImport'                              => "Import d'un barème",
+            'BaremeExport'                              => "Export d'un barème",
+            'CalculChronique'                           => "Calcul d'une chronique",
+            'ImportManuelMesure'                        => 'Import manuel de mesures',
+            'ImportGeographique'                        => 'Import de données géographiques',
+            'ConversionChronique'                       => "Conversion d'une chronique",
+        ],
+        'deleted' => [
+            'Observatoire'              => 'Observatoire supprimé depuis',
+            'SiteExperimental'          => 'Site expérimental supprimé depuis',
+            'Station'                   => 'Station supprimée depuis',
+            'Chronique'                 => 'Chronique supprimée depuis',
+            'Bareme'                    => 'Barème supprimé depuis',
+            'FamilleParametresStrict'   => 'Famille de paramètres supprimée depuis',
+            'FamilleParametres'         => 'Pas de famille de paramètres ou famille supprimée depuis',
+            'FamilleParente'            => 'Pas de famille mère ou famille supprimée depuis',
+            'TypeParametre'             => 'Type de paramètre supprimé depuis',
+            'TypeFunding'               => 'Type de financeur supprimé depuis',
+            'TopicCategory'             => 'Categorie thématique INSPIRE supprimée depuis',
+            'TheiaCategories'           => 'Correspondance des TheiaCategories supprimée depuis',
+            'InspireTheme'              => 'Thèmes INSPIRE supprimés depuis',
+            'DataConstraint'            => 'Contrainte de données supprimée depuis',
+            'CriteriaGeology'           => 'Critère Géologique supprimé depuis',
+            'CriteriaClimate'           => 'Critère Climatique supprimé depuis',
+            'Unite'                     => 'Unité supprimée depuis',
+            'Bassin'                    => 'Bassin supprimé depuis',
+            'CoursEau'                  => "Cours d'eau supprimé depuis",
+            'Commune'                   => 'Commune supprimée depuis',
+            'Doi'                       => 'DOI supprimé depuis',
+            'Dataset'                   => 'Jeu de données supprimé depuis',
+            'Milieu'                    => 'Milieu supprimé depuis',
+            'PersonneTheia'             => 'Personne pour Theia/OZCAR supprimée depuis',
+            'Partenaire'                => 'Partenaire supprimé depuis',
+            'Utilisateur'               => 'Utilisateur supprimé depuis',
+        ],
+        'advancedSearch'         => 'Tous les historiques',
+        'advancedSearchRecent'   => 'Historiques récents',
+        'go-to-menus-for-detail' => "Pour voir le détail des actions veuillez filtrer ces dernières à l'aide des menus ci-dessous.",
+        'recent'                 => 'récents',
+        'from'                   => 'de',
+        'action'                 => "Type d'action",
+        'author'                 => 'Auteur',
+        'debut'                  => 'Début',
+        'fin'                    => 'Fin',
+        'format'                 => 'Format',
+        'fuseau'                 => 'Fuseau',
+        'nbMesures'              => 'Mesures',
+        'nbSig'                  => 'Nombre',
+        'nbNewSig'               => 'Nouveaux',
+        'nbMajSig'               => 'Mises à jour',
+        'typeShape'              => 'Type de données',
+        'formatImport'           => "Format d'import",
+        'formatExport'           => "Format d'export",
+        'typeExport'             => "Type d'export",
+        'exportTypes'            => [
+            'identical'     => "À l'identique",
+            'instantaneous' => 'Interpolation linéaire',
+            'mean'          => 'Moyenne',
+            'cumulative'    => 'Cumul',
+        ],
+        'timestep'                  => 'Pas de temps',
+        'changedIntoGap'            => 'Remplacées par des lacunes',
+        'dateTime'                  => 'd/m/Y<\\b\\r>H:i:s',
+        'derniereConnection'        => 'dernière connexion',
+        'description'               => 'Description',
+        'observatoire'              => 'Observatoire',
+        'siteExperimental'          => 'Site expérimental',
+        'station'                   => 'Station',
+        'chronique'                 => 'Chronique',
+        'chroniqueMere'             => 'Chronique mère',
+        'bareme'                    => 'Barème',
+        'familleParametres'         => 'Famille de paramètres',
+        'familleParente'            => 'Famille mère',
+        'typeParametre'             => 'Type de Paramètre',
+        'unite'                     => 'Unité',
+        'bassin'                    => 'Bassin',
+        'coursEau'                  => "Cours d'eau",
+        'commune'                   => 'Commune',
+        'doi'                       => 'DOI',
+        'dataset'                   => 'Jeu de données',
+        'personneTheia'             => 'Personne pour Theia/OZCAR',
+        'theiaCategories'           => 'Correspondance des TheiaCategories',
+        'inspireTheme'              => 'Thèmes INSPIRE',
+        'dataconstraint'            => 'Contrainte de données',
+        'criteriageology'           => 'Critères Géologiques',
+        'criteriaclimate'           => 'Critères climatiques',
+        'milieu'                    => 'Milieu',
+        'typefunding'               => 'Type de financeur',
+        'topicCategory'             => 'Categorie thématique INSPIRE',
+        'partenaire'                => 'Partenaire',
+        'utilisateur'               => 'Utilisateur',
+        'paramConversion'           => 'Seuil de lacune',
+        'noFamilleParametres'       => 'Pas de famille de paramètres',
+        'noFamilleParente'          => 'Pas de famille mère',
+    ],
+    'bareme' => [
+        'bareme'                           => 'Barème',
+        'jeuBareme'                        => 'Jeu de barèmes',
+        'debutApplication'                 => "Début d'application",
+        'finApplication'                   => "Fin d'application",
+        'units(%inputUnit%, %outputUnit%)' => 'Unités : de %inputUnit% vers %outputUnit%',
+        'values'                           => 'valeurs',
+        'xMinMax(%xMin%, %xMax%)'          => 'Abscisses allant de %xMin% à %xMax%',
+        'dateCreation'                     => 'Créé le',
+        'childChronicle'                   => 'Chronique fille',
+        'parentChronicle'                  => 'Chronique mère',
+        'firstParentChronicle'             => 'Première chronique mère',
+        'secondParentChronicle'            => 'Seconde chronique mère',
+        'valueLimitPolicy'                 => [
+            'label'                               => 'Limites de quantification/détection :',
+            'chronique.lq_ld.options.true_value'  => "valeurs d'origine",
+            'chronique.lq_ld.options.half_value'  => 'divisées par 2',
+            'chronique.lq_ld.options.placeholder' => 'remplacées par %placeholder%',
+            'chronique.lq_ld.options.gap'         => 'invalidées',
+        ],
+        'seeBaremeLogs'       => "Voir l'historique des jeux de barèmes",
+        'seeBaremes'          => 'Afficher/masquer les barèmes',
+        'noSecondParent'      => 'aucune',
+        'multFactor'          => 'Coefficient multiplicatif',
+        'propagationTimeAbbr' => 'Tps. propag. : %time% min',
+        'limitTransfoAbbr'    => [
+            'chronique.lq_ld.options.true_value'  => 'Lq/Ld de la chronique mère non modifiées',
+            'chronique.lq_ld.options.half_value'  => 'Lq/Ld de la chronique mère divisées par 2',
+            'chronique.lq_ld.options.placeholder' => 'Lq/Ld de la chronique mère remplacées par %placeholder%',
+            'chronique.lq_ld.options.gap'         => 'Lq/Ld de la chronique mère considérées comme invalides',
+        ],
+    ],
+];
+
+return $messages;
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/baremesHistoriqueCalculChronique.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/baremesHistoriqueCalculChronique.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6747d6296b76a0f921a51dd1f7c93ee49eb16dcd
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/baremesHistoriqueCalculChronique.html.twig
@@ -0,0 +1,22 @@
+{% set idCol = baseId~'_CollapseId' %}
+<a data-toggle="collapse" href="#{{- idCol -}}" class="btn btn-xs btn-info"
+   style="padding:0 5px;margin-left:5px;vertical-align:bottom;" aria-expanded="false" aria-controls="{{- idCol -}}">{{ 'bareme.seeBaremes'|trans }}</a>
+<div id="{{- idCol -}}" class="collapse" style="padding-top:0.4em;padding-bottom:0.4em;">
+    <div class="row">
+        <div class="col-md-9 info-high">{{ 'bareme.bareme'|trans }} [{{ 'UTC'|trans }}]</div>
+        <div class="col-md-6 info-high">{{ 'bareme.debutApplication'|trans }} [{{ 'UTC'|trans }}]</div>
+        <div class="col-md-6 info-high">{{ 'bareme.finApplication'|trans }} [{{ 'UTC'|trans }}]</div>
+    </div>
+    {% for baremeData in baremesData %}
+        <div class="row">
+            <div class="col-md-9">
+                {{ baremeData.nom }}
+                {% if baremeData.date_creation %}
+                    [{{ baremeData.date_creation|date('transformation.bareme.dateBareme'|trans, false) }}]
+                {% endif %}
+            </div>
+            <div class="col-md-6">{{ baremeData.date_debut|date('transformation.bareme.dateBareme'|trans, false) }}</div>
+            <div class="col-md-6">{% if baremeData.date_fin %}{{ baremeData.date_fin|date('transformation.bareme.dateBareme'|trans, false) }}{% else %}&mdash;{% endif %}</div>
+        </div>
+    {% endfor %}
+</div>
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/descriptionHistoriqueCalculChronique.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/descriptionHistoriqueCalculChronique.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..55f53879283e9fc2b5fb6ddc8509e62168d3bac1
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/descriptionHistoriqueCalculChronique.html.twig
@@ -0,0 +1,24 @@
+<div>{{ 'historique.action'|trans }}{{ 'deux_points'|trans }} {{ 'historique.actions.CalculChronique'|trans }}</div>
+<div>{{ 'bareme.childChronicle'|trans }}{{ 'deux_points'|trans }} {{ description.chronique_fille }}</div>
+{% set has_two_parents = description.chroniques_meres|length > 1 %}
+<div style="margin-top:2px;margin-bottom:2px;">
+    {{ ('bareme.'~(has_two_parents ? 'firstParentChronicle' : 'parentChronicle'))|trans }}{{ 'deux_points'|trans }} {{ description.chroniques_meres[0] }}
+    {% if has_two_parents %}
+        - {{ 'bareme.propagationTimeAbbr'|trans({'%time%': description.temps_propagation[0]|default(0)}) }}
+    {% endif %}
+    {% if description.transformations_limites[0] is defined and description.transformations_limites[0] %}
+        - {{ ('bareme.limitTransfoAbbr.'~description.transformations_limites[0])|trans({'%placeholder%': description.transformations_limites[1]|default(0)}) }}
+    {% endif %}
+    {% include 'IrsteaBdohLoggerBundle::baremesHistoriqueCalculChronique.html.twig' with {'baseId': random~'_firstBareme', 'baremesData': description.baremes[0]} %}
+</div>
+{% if has_two_parents %}
+    <div style="margin-top:2px;margin-bottom:2px;">
+        {{ 'bareme.secondParentChronicle'|trans }}{{ 'deux_points'|trans }} {{ description.chroniques_meres[0] }}
+        - {{ 'bareme.propagationTimeAbbr'|trans({'%time%': description.temps_propagation[1]|default(0)}) }}
+        {% if description.transformations_limites[2] is defined and description.transformations_limites[2] %}
+            - {{ ('bareme.limitTransfoAbbr.'~description.transformations_limites[2])|trans({'%placeholder%': description.transformations_limites[3]|default(0)}) }}
+        {% endif %}
+        {% include 'IrsteaBdohLoggerBundle::baremesHistoriqueCalculChronique.html.twig' with {'baseId': random~'_secondBareme', 'baremesData': description.baremes[1]} %}
+    </div>
+    <div>{{ 'bareme.multFactor'|trans }}{{ 'deux_points'|trans }} {{ description.facteur_multiplicatif }}</div>
+{% endif %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/admin.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/admin.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/admin.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBareme.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBareme.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f792b65f77f5cd6f2b6e556a9aec10f5a07f8bbb
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBareme.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.bareme'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.bareme %}
+            {{ historique.bareme }}
+        {% else %}
+            {{ 'historique.deleted.Bareme'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBassin.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBassin.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7c9ac57db241bb1551e0f1c918e4cb3965bb773d
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminBassin.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.bassin'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.bassin %}
+            {{ historique.bassin }}
+        {% else %}
+            {{ 'historique.deleted.Bassin'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminChronique.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminChronique.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bb47a8c63afe8879394c1e1ce3ee9b6de7f4c1a9
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminChronique.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCommune.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCommune.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bd6b9aff0b1795bbdda11b571190bb79d9557f96
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCommune.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.commune'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.commune %}
+            {{ historique.commune }}
+        {% else %}
+            {{ 'historique.deleted.Commune'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCoursEau.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCoursEau.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..60f3521539019cedd396c747f848f8387b90292a
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCoursEau.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.coursEau'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.coursEau %}
+            {{ historique.coursEau }}
+        {% else %}
+            {{ 'historique.deleted.CoursEau'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaClimate.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaClimate.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..36607179b4ccd4d4176bda88a154ddac7e7d00d4
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaClimate.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.criteriaclimate'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.criteriaclimat %}
+            {{ historique.criteriaclimat }}
+        {% else %}
+            {{ 'historique.deleted.CriteriaClimate'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaGeology.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaGeology.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..16f241142b3425417cc0aa41688c3e618aec103f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminCriteriaGeology.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.criteriageology'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.criteriageology %}
+            {{ historique.criteriageology }}
+        {% else %}
+            {{ 'historique.deleted.CriteriaGeology'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataConstraint.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataConstraint.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5797aa0c6222e14892208eb6348b0285a5d2b956
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataConstraint.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.dataconstraint'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.dataconstraint %}
+            {{ historique.dataconstraint }}
+        {% else %}
+            {{ 'historique.deleted.DataConstraint'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataset.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataset.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d2e2db01eb78abb10af8a916605abade701a9795
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDataset.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.dataset'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.dataset %}
+            {{ historique.dataset }}
+        {% else %}
+            {{ 'historique.deleted.Dataset'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDoi.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDoi.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3bfe288203447acf0d74e9f2ea08aefc4c8f633e
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminDoi.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.doi'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.doi %}
+            {{ historique.doi.identifiant }}
+        {% else %}
+            {{ 'historique.deleted.Doi'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminFamilleParametres.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminFamilleParametres.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1d403093943d51345b72c1674b03e42b5d2cc267
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminFamilleParametres.html.twig
@@ -0,0 +1,25 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% from '::macros.html.twig' import i18nEntityLabel %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.familleParametres'|trans }}</th>
+    <th>{{ 'historique.familleParente'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.familleParametres %}
+            {{ i18nEntityLabel(historique.familleParametres, 'nom', 'historique.deleted.FamilleParametresStrict') }}
+        {% else %}
+            {{ 'historique.deleted.FamilleParametresStrict'|trans }}
+        {% endif %}
+    </td>
+    <td>
+        {% if historique.familleParente %}
+            {{ i18nEntityLabel(historique.familleParente, 'nom', 'historique.deleted.FamilleParente') }}
+        {% else %}
+            {{ 'historique.deleted.FamilleParente'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminInspireTheme.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminInspireTheme.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6e77ebfc29d7c4a853ab6fd97d5c2b8aa69fb6b2
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminInspireTheme.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.inspireTheme'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.inspiretheme %}
+            {{ historique.inspiretheme }}
+        {% else %}
+            {{ 'historique.deleted.inspireTheme'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminMilieu.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminMilieu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..957d7981c92fcd9a8be0cee31f1d4b62e755008f
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminMilieu.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.milieu'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.milieu %}
+            {{ historique.milieu }}
+        {% else %}
+            {{ 'historique.deleted.Milieu'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminObservatoire.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminObservatoire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ea46962785fff791c2c82d12803ecf8e7db09ddf
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminObservatoire.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.observatoire'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.observatoireCible %}
+            {{ historique.observatoireCible }}
+        {% else %}
+            {{ 'historique.deleted.Observatoire'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPartenaire.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPartenaire.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c134c9065de57464ab170d2a5ff6e61e63045628
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPartenaire.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.partenaire'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.partenaire %}
+            {{ historique.partenaire }}
+        {% else %}
+            {{ 'historique.deleted.Partenaire'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPersonneTheia.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPersonneTheia.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..61daddac5ff5e25dd980ae1e70ac5a918bc1f8ec
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminPersonneTheia.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.personneTheia'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.personneTheia %}
+            {{ historique.personneTheia }}
+        {% else %}
+            {{ 'historique.deleted.personneTheia'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminSiteExperimental.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminSiteExperimental.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..245ed7f2ccadd18cfc5821c19d5d021ce17c12c6
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminSiteExperimental.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.siteExperimental'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.siteExperimental %}
+            {{ historique.siteExperimental }}
+        {% else %}
+            {{ 'historique.deleted.SiteExperimental'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminStation.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminStation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..582a485b35cff0cf9ac57f6b0468b8b3423161db
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminStation.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.station'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.station %}
+            {{ historique.station.nom }} ({{ historique.station.code }})
+        {% else %}
+            {{ 'historique.deleted.Station'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTheiaCategories.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTheiaCategories.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..00c486681921b51876b01d48177a03e7b1641e00
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTheiaCategories.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.theiacategories'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.theiacategories %}
+            {{ historique.theiacategories }}
+        {% else %}
+            {{ 'historique.deleted.TheiaCategories'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTopicCategory.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTopicCategory.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4739e10101fcb3a1161934c8d76ad550e8451e79
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTopicCategory.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.topiccategory'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.topiccategory %}
+            {{ historique.topiccategory }}
+        {% else %}
+            {{ 'historique.deleted.TopicCategory'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeFunding.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeFunding.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..741d513ed0db13ddaf0cb1b7144e20c40c872773
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeFunding.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.typefunding'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.typefunding %}
+            {{ historique.typefunding }}
+        {% else %}
+            {{ 'historique.deleted.TypeFunding'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeParametre.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeParametre.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e8c763a61b0d658cae9cd60834c676b0c6d81478
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminTypeParametre.html.twig
@@ -0,0 +1,25 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% from '::macros.html.twig' import i18nEntityLabel %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.typeParametre'|trans }}</th>
+    <th>{{ 'historique.familleParametres'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.typeParametre %}
+            {{ i18nEntityLabel(historique.typeParametre, 'nom', 'historique.deleted.TypeParametre') }}
+        {% else %}
+            {{ 'historique.deleted.TypeParametre'|trans }}
+        {% endif %}
+    </td>
+    <td>
+        {% if historique.familleParametres %}
+            {{ i18nEntityLabel(historique.familleParametres, 'nom', 'historique.deleted.FamilleParametres') }}
+        {% else %}
+            {{ 'historique.deleted.FamilleParametres'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUnite.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUnite.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8f641aedb19b8b51e6f6eb53be90f1029e39cf46
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUnite.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.unite'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.unite %}
+            {{ historique.unite }}
+        {% else %}
+            {{ 'historique.deleted.Unite'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUtilisateur.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUtilisateur.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ad7c1735b466fa0e2c58ad3f35ea12ab7e6c8641
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/adminUtilisateur.html.twig
@@ -0,0 +1,15 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.utilisateur'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.utilisateur %}
+            {{ historique.utilisateur }}
+        {% else %}
+            {{ 'historique.deleted.Utilisateur'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/all.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/all.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/all.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesExport.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesExport.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesExport.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesImport.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesImport.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/baremesImport.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/base.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/base.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b64f6d67a2105cfdcb2dd79ebd8796ce6fe8afb3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/base.html.twig
@@ -0,0 +1,55 @@
+{%- import _self as macros %}
+
+{% block HistoriqueTitle %}<h1>{{ historiqueTitle|trans({'%recent%':recent ? ' '~('historique.recent'|trans) : '',
+    '%from%':recent ? '' : ' '~('historique.from'|trans)~' '~year}) }}</h1>{% endblock %}
+
+<div id="consult-advancedSearch">
+    <table class="table" data-group-by="0">
+        <thead>
+            <tr>
+                <th>{{ 'observatoire'|trans }}</th>
+                <th data-filter-with="#user-filter">{{ 'historique.author'|trans }}</th>
+                <th data-filter-with="#date-filter">{{ 'date'|trans }} [{{ 'UTC'|trans }}]</th>
+                <th data-orderable="false">{{ 'historique.description'|trans }}</th>
+                {% block HistoriqueTH %}{% endblock %}
+            </tr>
+        </thead>
+        <tbody>
+            {% for historique in historiques %}
+                <tr>
+                    <td class="criteria" data-order="{{ historique.observatoire.nom|default('') }}">
+                        <strong>
+                            {{ 'observatoire'| trans }}{{ 'deux_points'|trans }}
+                            {{ 'open_quote'|trans }}{{ historique.observatoire.nom|default('historique.deleted.Observatoire')|trans }}{{ 'close_quote'|trans }}
+                        </strong>
+                    </td>
+                    {%- if historique.auteur %}
+                        <td data-order="{{ historique.auteur.nom }} {{ historique.auteur.prenom }}">
+                            {{- historique.auteur -}}
+                        </td>
+                    {%- else %}
+                        <td data-search="">
+                            {{- 'historique.deleted.Utilisateur'|trans -}}
+                        </td>
+                    {%- endif %}
+                    {{ macros.dateField(historique.date) }}
+                    <td>
+                        {{ historique.description|replace({'\n': '<br/>'})|replace({'_CollapseId': '_CollapseId_'~key})|raw }}
+                    </td>
+                    {% block HistoriqueTD %}{% endblock %}
+                </tr>
+            {% endfor %}
+        </tbody>
+    </table>
+</div>
+
+{% macro dateField(date) %}
+    {%- if date %}
+        <td data-type="num"
+            data-order="{{ date|date('U', false) }}"
+            data-search="{{- date|date('Y-m-d', false) -}}"
+        >{{- date|date('historique.dateTime'|trans, false)|raw -}}</td>
+    {%- else %}
+        <td data-search="">-</td>
+    {%- endif %}
+{%- endmacro %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/calculsChroniques.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/calculsChroniques.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/calculsChroniques.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/conversionsChroniques.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/conversionsChroniques.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..97b7eb4dd870e0b9a95d4989e32bcd8d7de08834
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/conversionsChroniques.html.twig
@@ -0,0 +1,23 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th>{{ 'historique.chroniqueMere'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chroniqueConvertie %}
+            {{ historique.chroniqueConvertie }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>
+        {% if historique.chroniqueMere %}
+            {{ historique.chroniqueMere }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/derniereConnection.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/derniereConnection.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..46e7d4011e1abc08361d10fd9040d87458facdc6
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/derniereConnection.html.twig
@@ -0,0 +1,37 @@
+{%- import _self as macros %}
+
+<h1>{{ historiqueTitle|trans }}</h1>
+
+<div id="consult-advancedSearch">
+    <table class="table last-logins">
+        <thead>
+            <tr>
+                <th data-filter-with="#user-filter">{{ 'historique.utilisateur'|trans }}</th>
+                <th data-filter-with="#date-filter">{{ 'date'|trans }} [{{ 'UTC'|trans }}]</th>
+            </tr>
+        </thead>
+        <tbody>
+            {% for historique in historiques %}
+                <tr>
+                    <td data-order="{{ historique.nom }} {{ historique.prenom }}"
+                        data-search="{{ historique.prenom }} {{ historique.nom }}">
+                        {{ historique.prenom }} {{ historique.nom }}
+                        <br/>({{ 'historique.derniereConnection'|trans }})
+                    </td>
+                    {{ macros.dateField(historique.date) }}
+                </tr>
+            {% endfor %}
+        </tbody>
+    </table>
+</div>
+
+{% macro dateField(date) %}
+    {%- if date %}
+        <td data-type="num"
+            data-order="{{ date|date('U', false) }}"
+            data-search="{{- date|date('Y-m-d', false) -}}"
+        >{{- date|date('historique.dateTime'|trans, false)|raw -}}</td>
+    {%- else %}
+        <td data-search="">-</td>
+    {%- endif %}
+{%- endmacro %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donnees.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donnees.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..463ebe057028b4a97e6e1b657e9193fd3440a8f5
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donnees.html.twig
@@ -0,0 +1,21 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.nbMesures'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>{{ historique.debut|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.fin|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesExport.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesExport.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..38200954594551473f28c8b53a82817137cf9766
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesExport.html.twig
@@ -0,0 +1,25 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th>{{ 'historique.format'|trans }}</th>
+    <th>{{ 'historique.fuseau'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.nbMesures'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>{{ ('export.'~historique.formatExport|capitalize)|trans }}</td>
+    <td>{{ historique.fuseau }}</td>
+    <td>{{ historique.debut|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.fin|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImport.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImport.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e277e7bac802cc660a540ce06f00b10ca2323a78
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImport.html.twig
@@ -0,0 +1,25 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th>{{ 'historique.format'|trans }}</th>
+    <th>{{ 'historique.fuseau'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.nbMesures'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>{{ ('import.'~historique.formatImport)|trans }}</td>
+    <td>{{ historique.fuseau }}</td>
+    <td>{{ historique.debut|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.fin|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImportManuel.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImportManuel.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesImportManuel.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesPointControle.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesPointControle.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..21f2de017c983e6d9174b40d4a7df7d8e11bf531
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesPointControle.html.twig
@@ -0,0 +1,23 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th>{{ 'historique.fuseau'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.nbMesures'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>{{ historique.fuseau }}</td>
+    <td>{{ historique.debut|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.fin|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesSuppression.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesSuppression.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..463ebe057028b4a97e6e1b657e9193fd3440a8f5
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/donneesSuppression.html.twig
@@ -0,0 +1,21 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th>{{ 'historique.chronique'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.debut'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.fin'|trans }} [{{ 'UTC'|trans }}]</th>
+    <th data-searchable="false">{{ 'historique.nbMesures'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>
+        {% if historique.chronique %}
+            {{ historique.chronique }}
+        {% else %}
+            {{ 'historique.deleted.Chronique'|trans }}
+        {% endif %}
+    </td>
+    <td>{{ historique.debut|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.fin|date('historique.dateTime'|trans, false)|raw }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/sig.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/sig.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d359ba805c141bbb9274cef06dccf37fb9bd8128
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/sig.html.twig
@@ -0,0 +1,11 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
+
+{% block HistoriqueTH %}
+    <th data-searchable="false">{{ 'historique.nbNewSig'|trans }}</th>
+    <th data-searchable="false">{{ 'historique.nbMajSig'|trans }}</th>
+{% endblock %}
+
+{% block HistoriqueTD %}
+    <td>{{ historique.nombreInserts }}</td>
+    <td>{{ historique.nombreMesures }}</td>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/historique/transformations.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/historique/transformations.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c460b5aa9412bb344d64c444f93d9ea6a894e5f3
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/historique/transformations.html.twig
@@ -0,0 +1 @@
+{% extends 'IrsteaBdohLoggerBundle:historique:base.html.twig' %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/index.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/index.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..80e2c9125031810e4d019b868cfae93e9444f8fd
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/index.html.twig
@@ -0,0 +1,141 @@
+{% extends 'IrsteaBdohLoggerBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle(('historique.advancedSearch'~(recent ? 'Recent' : ''))|trans) }}
+{% endblock %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/logger.js') }}"></script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/logger.css') }}"/>
+    <style type="text/css">
+        div#main .nav .open > a, div#main .nav .open > a:hover, div#main .nav .open > a:focus {
+            border-color:#e5e5e5;
+        }
+        div#main .nav .active > a:hover {
+            /*background-color:#e5e5e5;*/
+            /*cursor:pointer;*/
+        }
+    </style>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li class="active">{{ ('historique.advancedSearch'~(recent ? 'Recent' : ''))|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block main %}
+    <div class="alert alert-info">{{ 'historique.go-to-menus-for-detail'|trans }}</div>
+    <div class="pull-right form-inline">
+        {% if years %}
+            <div class="form-group form-group-sm">
+                <select style="width:75px" id="historiqueYear" class="form-control input-sm"
+                        data-url="{{ path('irstea_bdoh_logger_advancedSearch') }}">
+                    {% for historiqueYear in years %}
+                        <option value="{{ historiqueYear }}" {% if historiqueYear == year -%}
+                                selected="selected"
+                            {%- endif %}>{{ historiqueYear }}</option>
+                    {% endfor %}
+                </select>
+            </div>
+        {% endif %}
+        <div class="form-group form-group-sm">
+            <select style="width:210px" id="user-filter" class="form-control input-sm"
+                    data-placeholder="{% trans %}historique.author{% endtrans %}"></select>
+        </div>
+        <div class="form-group form-group-sm">
+            <select style="width:105px" id="date-filter" class="form-control input-sm"
+                    data-placeholder="{% trans %}date{% endtrans %}"></select>
+        </div>
+    </div>
+    <ul class="nav nav-tabs">
+        <li class="active">
+            <a href="#all" data-toggle="tab">
+                {{ 'historique.menu.title.all(%recent%)'|trans({'%recent%':recent ? ' '~('historique.recent'|trans) : ''}) }}
+            </a>
+        </li>
+        <li class="dropdown">
+            <a class="dropdown-toggle" href="#" data-toggle="dropdown">
+                {{ 'historique.menu.title.admin'|trans }}
+                <b class="caret"></b>
+            </a>
+            <ul class="dropdown-menu">
+                <li><a href="#admin" data-toggle="tab">{{ 'historique.menu.admin'|trans }}</a></li>
+                <li><a href="#adminObservatoire" data-toggle="tab">{{ 'historique.menu.adminObservatoire'|trans }}</a></li>
+                <li><a href="#adminSiteExperimental" data-toggle="tab">{{ 'historique.menu.adminSiteExperimental'|trans }}</a></li>
+                <li><a href="#adminStation" data-toggle="tab">{{ 'historique.menu.adminStation'|trans }}</a></li>
+                <li><a href="#adminChronique" data-toggle="tab">{{ 'historique.menu.adminChronique'|trans }}</a></li>
+                <li><a href="#adminDataset" data-toggle="tab">{{ 'historique.menu.adminDataset'|trans }}</a></li>
+                <li><a href="#adminBassin" data-toggle="tab">{{ 'historique.menu.adminBassin'|trans }}</a></li>
+                <li><a href="#adminCoursEau" data-toggle="tab">{{ 'historique.menu.adminCoursEau'|trans }}</a></li>
+                <li><a href="#adminCommune" data-toggle="tab">{{ 'historique.menu.adminCommune'|trans }}</a></li>
+                <li><a href="#adminMilieu" data-toggle="tab">{{ 'historique.menu.adminMilieu'|trans }}</a></li>
+                <li><a href="#adminDoi" data-toggle="tab">{{ 'historique.menu.adminDoi'|trans }}</a></li>
+                <li><a href="#adminPartenaire" data-toggle="tab">{{ 'historique.menu.adminPartenaire'|trans }}</a></li>
+                <li><a href="#adminFamilleParametres" data-toggle="tab">{{ 'historique.menu.adminFamilleParametres'|trans }}</a></li>
+                <li><a href="#adminTypeParametre" data-toggle="tab">{{ 'historique.menu.adminTypeParametre'|trans }}</a></li>
+                <li><a href="#adminUnite" data-toggle="tab">{{ 'historique.menu.adminUnite'|trans }}</a></li>
+                <li><a href="#adminUtilisateur" data-toggle="tab">{{ 'historique.menu.adminUtilisateur'|trans }}</a></li>
+                <li><a href="#adminPersonneTheia" data-toggle="tab">{{ 'historique.menu.adminPersonneTheia'|trans }}</a></li>
+                <li><a href="#adminTypeFunding" data-toggle="tab">{{ 'historique.menu.adminTypeFunding'|trans }}</a></li>
+                <li><a href="#adminTopicCategory" data-toggle="tab">{{ 'historique.menu.adminTopicCategory'|trans }}</a></li>
+                <li><a href="#adminTheiaCategories" data-toggle="tab">{{ 'historique.menu.adminTheiaCategories'|trans }}</a></li>
+                <li><a href="#adminInspireTheme" data-toggle="tab">{{ 'historique.menu.adminInspireTheme'|trans }}</a></li>
+                <li><a href="#adminDataConstraint" data-toggle="tab">{{ 'historique.menu.adminDataConstraint'|trans }}</a></li>
+                <li><a href="#adminCriteriaGeology" data-toggle="tab">{{ 'historique.menu.adminCriteriaGeology'|trans }}</a></li>
+                <li><a href="#adminCriteriaClimate" data-toggle="tab">{{ 'historique.menu.adminCriteriaClimate'|trans }}</a></li>
+                <li><a href="#derniereConnection" data-toggle="tab">{{ 'historique.menu.derniereConnection'|trans }}</a></li>
+            </ul>
+        </li>
+        <li class="dropdown">
+            <a class="dropdown-toggle" href="#" data-toggle="dropdown">
+                {{ 'historique.menu.title.donnees'|trans }}
+                <b class="caret"></b>
+            </a>
+            <ul class="dropdown-menu">
+                <li><a href="#donnees" data-toggle="tab">{{ 'historique.menu.donnees'|trans }}</a></li>
+                <li><a href="#donneesImport" data-toggle="tab">{{ 'historique.menu.donneesImport'|trans }}</a></li>
+                <li><a href="#donneesExport" data-toggle="tab">{{ 'historique.menu.donneesExport'|trans }}</a></li>
+                <li><a href="#donneesSuppression" data-toggle="tab">{{ 'historique.menu.donneesSuppression'|trans }}</a></li>
+                <li><a href="#donneesPointControle" data-toggle="tab">{{ 'historique.menu.donneesPointControle'|trans }}</a></li>
+            </ul>
+        </li>
+        <li class="dropdown">
+            <a class="dropdown-toggle" href="#" data-toggle="dropdown">
+                {{ 'historique.menu.title.transformations'|trans }}
+                <b class="caret"></b>
+            </a>
+            <ul class="dropdown-menu">
+                <li><a href="#transformations" data-toggle="tab">{{ 'historique.menu.transformations'|trans }}</a></li>
+                <li><a href="#baremesImport" data-toggle="tab">{{ 'historique.menu.baremesImport'|trans }}</a></li>
+                <li><a href="#baremesExport" data-toggle="tab">{{ 'historique.menu.baremesExport'|trans }}</a></li>
+                <li><a href="#calculsChroniques" data-toggle="tab">{{ 'historique.menu.calculsChroniques'|trans }}</a></li>
+                <li><a href="#donneesImportManuel" data-toggle="tab">{{ 'historique.menu.donneesImportManuel'|trans }}</a></li>
+                <li><a href="#conversionsChroniques" data-toggle="tab">{{ 'historique.menu.conversionsChroniques'|trans }}</a></li>
+            </ul>
+        </li>
+        <li>
+            <a href="#sig" data-toggle="tab">
+                {{ 'historique.menu.title.sig'|trans }}
+            </a>
+        </li>
+    </ul>
+
+    <div class="tab-content">
+        {% for key, historique in historiques %}
+            <div id="{{ key }}" class="tab-pane log-tab{% if loop.first %} active{% endif %}">
+                {% include 'IrsteaBdohLoggerBundle:historique:' ~ key ~ '.html.twig' with {
+                    'historiques':historique,
+                    'historiqueTitle':'historique.title.'~key~'(%recent%, %from%)'
+                } %}
+            </div>
+        {% endfor %}
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohLoggerBundle/Resources/views/layout.html.twig b/src/Irstea/BdohLoggerBundle/Resources/views/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ef4c475787e1d48b5603a170e498ac6e6e092133
--- /dev/null
+++ b/src/Irstea/BdohLoggerBundle/Resources/views/layout.html.twig
@@ -0,0 +1 @@
+{% extends '::layout.html.twig' %}
diff --git a/src/Irstea/BdohSecurityBundle/Command/UtilisateurNewCreateCommand.php b/src/Irstea/BdohSecurityBundle/Command/UtilisateurNewCreateCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..b01049a1a4ca0fba070065d0a8950c8dee16e5f0
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Command/UtilisateurNewCreateCommand.php
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Command;
+
+use Doctrine\Common\Persistence\ObjectManager;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\Question;
+use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
+
+class UtilisateurNewCreateCommand extends Command
+{
+    const COMMAND_NAME = 'security:users:create';
+    const ROLE_ADMIN_FCT = 'FCT';
+    const ROLE_ADMIN_TECH = 'TECH';
+
+    /** ®@var ObjectManager $manager**/
+    private $manager;
+
+    /**
+     * @var EncoderFactoryInterface
+     */
+    protected $encoderFactory;
+
+    /**
+     * UserPasswordValidator constructor.
+     *
+     * @param EncoderFactoryInterface $encoderFactory
+     *
+     * @DI\InjectParams({
+     *     "encoderFactory" = @DI\Inject("security.encoder_factory"),
+     * })
+     */
+    public function __construct(ObjectManager $manager, EncoderFactoryInterface $encoderFactory)
+    {
+        $this->manager = $manager;
+        $this->encoderFactory = $encoderFactory;
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setName(self::COMMAND_NAME)
+            ->setDescription('Création Utilisateur Perso : GestionnaireDesObservatoires et AdminTech')
+            ->addArgument('firstname', InputArgument::REQUIRED, 'User firstname')
+            ->addArgument('lastname', InputArgument::REQUIRED, 'User firstname')
+            ->addArgument('email', InputArgument::REQUIRED, 'User email')
+            ->addArgument('password', InputArgument::REQUIRED, 'User password')
+            ->addArgument('roleAdmin', InputArgument::REQUIRED, 'User roleAdmin');
+    }
+
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        $output->writeln([
+            '==============================',
+            'Welcome you can create a User',
+            '===============================',
+        ]);
+        $questions = [];
+        $argumentUser = ['firstname', 'lastname', 'email', 'password', 'roleAdmin'];
+
+        foreach ($argumentUser as $argumentUtilisateur) {
+            if (!$input->getArgument($argumentUtilisateur)) {
+                $question = new Question('Please enter the ' . $argumentUtilisateur . ':');
+                if ($argumentUtilisateur === 'roleAdmin') {
+                    $question->setValidator(function ($firstname) {
+                        if (empty($firstname)) {
+                            throw new \Exception('Argument can not be empty');
+                        }
+                        $roleAdmin = 'FCT';
+                        $roleTech = 'TECH';
+                        if ($firstname !== $roleAdmin && $firstname !== $roleTech) {
+                            throw new \Exception('This Role does not exist');
+                        }
+
+                        return $firstname;
+                    });
+                } else {
+                    $question->setValidator(function ($firstname) {
+                        if (empty($firstname)) {
+                            throw new \Exception('Argument can not be empty');
+                        }
+
+                        return $firstname;
+                    });
+                }
+
+                $questions[$argumentUtilisateur] = $question;
+            }
+        }
+        foreach ($questions as $name => $question) {
+            $answer = $this->getHelper('question')->ask($input, $output, $question);
+            $input->setArgument($name, $answer);
+        }
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $output->writeln([
+            '====================',
+            'Command Create User',
+            '====================',
+        ]);
+        $user = new Utilisateur();
+        $user->setPrenom($input->getArgument('firstname'));
+        $output->writeln('With firstname : ' . $user->getPrenom());
+        $user->setNom($input->getArgument('lastname'));
+        $output->writeln('With lastname : ' . $user->getNom());
+        $user->setEmail($input->getArgument('email'));
+        $output->writeln('With email : ' . $user->getEmail());
+        $user->setPassword($input->getArgument('password'));
+        //encodage du mot de passe
+        $encoderGestionnaire = $this->encoderFactory->getEncoder($user);
+        $password = $encoderGestionnaire->encodePassword($user->getPassword(), $user->getSalt());
+        $user->setPassword($password);
+        $user->setRoleAdmin($input->getArgument('roleAdmin'));
+
+        $this->manager->persist($user);
+        $this->manager->flush();
+        $output->writeln([
+            '===============================================================================================',
+            'Successful you have created the user : ' . $user->getPrenom() . ' ' . $user->getNom() . ' !!!',
+            '===============================================================================================',
+        ]);
+
+        return 0;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Controller/BesoinController.php b/src/Irstea/BdohSecurityBundle/Controller/BesoinController.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdcc25444da0a69f20cb6a1a8d909b467a2cc091
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Controller/BesoinController.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohSecurityBundle\Entity\Besoin;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohSecurityBundle\Form\BesoinType;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Annotation\Route;
+
+/**
+ * @Route("/besoin")
+ */
+class BesoinController extends Controller
+{
+    /**
+     * Creates a new 'Besoin' entity.
+     *
+     * @Route("/new", name="bdoh_security_besoin_new")
+     * @Security("is_granted('ROLE_USER')")
+     * @Method({"GET", "POST"})
+     */
+    public function newAction(Request $request)
+    {
+        /*
+         * @var Utilisateur $user
+         */
+        $user = $this->get('security.token_storage')->getToken()->getUser();
+
+        // si l'utilisateur a déjà accès à tout on le redirige sur la page de recherche avancée
+        if ($user->isATrustedUserOfCurrentObservatory() || $this->isGranted('ROLE_ADMIN')) {
+            return $this->redirectToRoute('bdoh_consult_advancedSearch');
+        }
+
+        $besoin = new Besoin();
+        $besoin->setObservatoire($this->get('irstea_bdoh.manager.observatoire')->getCurrent());
+        $besoin->setUtilisateur($user);
+
+        $form = $this->createForm(new BesoinType($this->getEm(), $this->get('session')->get('_locale')), $besoin);
+
+        // Some POST parameters ? Checks the form.
+        if (count($request->request) !== 0) {
+            $form->handleRequest($request);
+
+            if ($form->isValid()) {
+                // Persists the new 'Besoin'
+                $em = $this->getEm();
+                $em->persist($besoin);
+                $em->flush();
+
+                // Send a mail to the managers of the observatory
+                $userRepo = $this->getSecurityRepo('Utilisateur');
+                $validatorMails = $userRepo->getValidatorMails($this->container->get('irstea_bdoh.manager.observatoire')->getCurrent());
+                $message = \Swift_Message::newInstance()
+                    ->setSubject($this->get('translator')->trans('security.utilisateur.newNeedMail.title'))
+                    ->setFrom('no.reply.BDOH@irstea.fr')
+                    ->setTo($validatorMails)
+                    ->setBody(
+                        $this->renderView(
+                            'IrsteaBdohSecurityBundle:Utilisateur:mail.txt.twig',
+                            ['user' => $user, 'type' => 'besoin']
+                        )
+                    );
+
+                $this->get('mailer')->send($message);
+
+                // Redirects to home, with a success message
+                $this->getSession()->getFlashBag()->add('success', $this->get('translator')->trans('security.besoin.create.isCompleted'));
+
+                return $this->redirect($this->generateUrl('bdoh_home'));
+            }
+        }
+
+        return $this->render('IrsteaBdohSecurityBundle:Besoin:new.html.twig', ['form' => $form->createView()]);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Controller/ResettingController.php b/src/Irstea/BdohSecurityBundle/Controller/ResettingController.php
new file mode 100644
index 0000000000000000000000000000000000000000..4af46be51f21810000fc0fe3d8a660149395ba2e
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Controller/ResettingController.php
@@ -0,0 +1,208 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohSecurityBundle\Form\ResettingUtilisateurType;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Routing\Annotation\Route;
+
+/**
+ * @Route("/resetting")
+ */
+class ResettingController extends Controller
+{
+    const SESSION_EMAIL = 'resetting_email/email';
+
+    /**
+     * @Route("/request", name="resetting_request")
+     * @Method("GET")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function requestAction()
+    {
+        return $this->render('IrsteaBdohSecurityBundle:Resetting:request.html.twig');
+    }
+
+    /**
+     * @Route("/send-email", name="resetting_send_email")
+     * @Method("POST")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @param Request $request
+     *
+     * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function sendEmailAction(Request $request)
+    {
+        $email = $request->request->get('email');
+
+        /** @var $user UserInterface */
+        $user = $this->getSecurityRepo('Utilisateur')->findOneByEmail($email);
+        if (null === $user) {
+            $this->getSession()->getFlashBag()->add(
+                'error',
+                $this->container->get('translator')->trans('resetting.request.invalid_email', ['%email%' => $email])
+            );
+
+            return $this->render('IrsteaBdohSecurityBundle:Resetting:request.html.twig');
+        }
+
+        if (null === $user->getConfirmationToken()) {
+            $user->setConfirmationToken($this->generateToken());
+        }
+        $this->container->get('session')->set(static::SESSION_EMAIL, $this->getObfuscatedEmail($user));
+        $this->sendResettingEmailMessage($user);
+        $this->getSecurityRepo('Utilisateur')->updateUser($user);
+
+        return new RedirectResponse($this->container->get('router')->generate('resetting_check_email'));
+    }
+
+    /**
+     * @Route("/reset/{token}", name="resetting_reset")
+     * @Method({"GET", "POST"})
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @param Request $request
+     * @param $token
+     *
+     * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function resetAction(Request $request, $token)
+    {
+        $user = $this->getSecurityRepo('Utilisateur')->findOneByConfirmationToken($token);
+
+        if (null === $user) {
+            throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
+        }
+
+        $form = $this->createForm(new ResettingUtilisateurType(), $user);
+        if ('POST' === $request->getMethod()) {
+            $form->handleRequest($request);
+
+            if ($form->isValid()) {
+                $user->setConfirmationToken(null);
+                $encoder = $this->get('security.encoder_factory')->getEncoder($user);
+                $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
+                $user->setPassword($password);
+
+                $this->getSecurityRepo('Utilisateur')->updateUser($user);
+                $url = $this->container->get('router')->generate('bdoh_security_login');
+                $this->getSession()->getFlashBag()->add('success', $this->get('translator')->trans('resetting.isCompleted'));
+
+                return new RedirectResponse($url);
+            }
+        }
+
+        return $this->render(
+            'IrsteaBdohSecurityBundle:Resetting:reset.html.twig',
+            [
+                'token' => $token,
+                'form'  => $form->createView(),
+            ]
+        );
+    }
+
+    /**
+     * @Route("/check-email", name="resetting_check_email")
+     * @Method("GET")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function checkEmailAction()
+    {
+        $session = $this->container->get('session');
+        $email = $session->get(static::SESSION_EMAIL);
+        $session->remove(static::SESSION_EMAIL);
+
+        if (empty($email)) {
+            // the user does not come from the sendEmail action
+            return new RedirectResponse($this->container->get('router')->generate('resetting_request'));
+        }
+
+        return $this->render(
+            'IrsteaBdohSecurityBundle:Resetting:checkEmail.html.twig',
+            ['email' => $email]
+        );
+    }
+
+    protected function getObfuscatedEmail(Utilisateur $user)
+    {
+        $email = $user->getEmail();
+        if (false !== $pos = \strpos($email, '@')) {
+            $email = '...' . substr($email, $pos);
+        }
+
+        return $email;
+    }
+
+    public function generateToken()
+    {
+        return base_convert(bin2hex($this->getRandomNumber()), 16, 36);
+    }
+
+    private function getRandomNumber()
+    {
+        return hash('sha256', uniqid(mt_rand(), true), true);
+    }
+
+    public function sendResettingEmailMessage(Utilisateur $user)
+    {
+        $url = $this->get('router')->generate('resetting_reset', ['token' => $user->getConfirmationToken()], true);
+        $rendered = $this->render(
+            'IrsteaBdohSecurityBundle:Resetting:email.txt.twig',
+            [
+                'user'            => $user,
+                'confirmationUrl' => $url,
+            ]
+        );
+        $this->sendEmailMessage($rendered, $user->getEmail());
+    }
+
+    /**
+     * @param string $renderedTemplate
+     * @param string $toEmail
+     */
+    protected function sendEmailMessage($renderedTemplate, $toEmail)
+    {
+        // Render the email, use the four line as the subject, and the rest as the body
+        $renderedLines = explode("\n", trim($renderedTemplate));
+        $subject = $renderedLines[4];
+        $body = implode("\n", array_slice($renderedLines, 5));
+
+        $message = \Swift_Message::newInstance()
+            ->setSubject($subject)
+            ->setFrom('no.reply.BDOH@irstea.fr')
+            ->setTo($toEmail)
+            ->setBody($body);
+
+        $this->get('mailer')->send($message);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Controller/SecurityController.php b/src/Irstea/BdohSecurityBundle/Controller/SecurityController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1597d04c45f7d9ea012ea972934d57b03e9858b3
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Controller/SecurityController.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Security\Core\Security as CoreSecurity;
+
+/**
+ * Class SecurityController.
+ */
+class SecurityController extends Controller
+{
+    /**
+     * @Route("/login", name="bdoh_security_login")
+     * @Method("GET")
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function loginAction(Request $request)
+    {
+        // si l'utilisateur est déjà identifié on le redirige sur l'accueil de l'observatoire
+        if ($this->isGranted('ROLE_USER')) {
+            return $this->redirectToRoute('bdoh_home');
+        }
+
+        $session = $request->getSession();
+
+        // get the login error if there is one
+        if ($request->attributes->has(CoreSecurity::AUTHENTICATION_ERROR)) {
+            $error = $request->attributes->get(CoreSecurity::AUTHENTICATION_ERROR);
+        } else {
+            $error = $session->get(CoreSecurity::AUTHENTICATION_ERROR);
+            $session->remove(CoreSecurity::AUTHENTICATION_ERROR);
+        }
+
+        return $this->render(
+            'IrsteaBdohSecurityBundle:Security:login.html.twig',
+            [
+                // last username entered by the user
+                'last_username' => $session->get(CoreSecurity::LAST_USERNAME),
+                'error'         => $error,
+            ]
+        );
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Controller/UtilisateurController.php b/src/Irstea/BdohSecurityBundle/Controller/UtilisateurController.php
new file mode 100644
index 0000000000000000000000000000000000000000..2b0fb33ffcbca6d583416204cb3d185820a06f47
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Controller/UtilisateurController.php
@@ -0,0 +1,627 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Controller;
+
+use Irstea\BdohBundle\Controller\Controller;
+use Irstea\BdohSecurityBundle\Entity\Besoin;
+use Irstea\BdohSecurityBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\RoleChronique;
+use Irstea\BdohSecurityBundle\Entity\RoleObservatoire;
+use Irstea\BdohSecurityBundle\Entity\RoleSite;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohSecurityBundle\Form\EditUtilisateurType;
+use Irstea\BdohSecurityBundle\Form\NewUtilisateurType;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\Extension\Core\Type\DateType;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * This controller allows :
+ *      => anonymous to create a new account ;
+ *      => existing User to edit its account .
+ *
+ * @Route("/user")
+ */
+class UtilisateurController extends Controller
+{
+    /**
+     * Creates a new 'Utilisateur' entity.
+     * This action needs no role !
+     *
+     * @Route("/new", name="bdoh_security_utilisateur_new")
+     * @Method({"GET", "POST"})
+     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function newAction(Request $request)
+    {
+        // si l'utilisateur est déjà identifié on le redirige sur la page d'édition de son compte
+        if ($this->isGranted('ROLE_USER')) {
+            return $this->redirectToRoute('bdoh_security_utilisateur_edit');
+        }
+
+        $user = new Utilisateur();
+        $form = $this->createForm(new NewUtilisateurType($this->getEm(), $this->get('session')->get('_locale')), $user);
+
+        // Some POST parameters ? Checks the form.
+        if (count($request->request) !== 0) {
+            $form->handleRequest($request);
+
+            if ($form->isValid()) {
+                // Encodes the password
+                $encoder = $this->get('security.encoder_factory')->getEncoder($user);
+                $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
+
+                $user->setPassword($password);
+
+                // Persists the new user
+                $em = $this->getEm();
+                $em->persist($user);
+                $em->flush();
+
+                // Send a mail to the managers of the observatory
+                $userRepo = $this->getSecurityRepo('Utilisateur');
+                $managerMails = $userRepo->getValidatorMails($this->container->get('irstea_bdoh.manager.observatoire')->getCurrent());
+                $message = \Swift_Message::newInstance()
+                    ->setSubject($this->get('translator')->trans('security.utilisateur.newAccountMail.title'))
+                    ->setFrom('no.reply.BDOH@irstea.fr')
+                    ->setTo($managerMails)
+                    ->setBody(
+                        $this->renderView(
+                            'IrsteaBdohSecurityBundle:Utilisateur:mail.txt.twig',
+                            ['user' => $user, 'type' => 'compte']
+                        )
+                    );
+
+                $this->get('mailer')->send($message);
+
+                // Send a mail to the new user
+                $messageUtilisateur = \Swift_Message::newInstance()
+                    ->setSubject($this->get('translator')->trans('security.utilisateur.newMailUtilisateur.title'))
+                    ->setFrom('no.reply.BDOH@irstea.fr')
+                    ->setTo($user->getEmail())
+                    ->setBody(
+                        $this->renderView(
+                            'IrsteaBdohSecurityBundle:Utilisateur:mailNewUtilisateur.txt.twig',
+                            ['user' => $user]
+                        ),
+                        'text/html'
+                    );
+
+                $this->get('mailer')->send($messageUtilisateur);
+
+                $this->container->get('irstea_bdoh_logger.logger')
+                    ->createHistoriqueAdministrationUtilisateur(
+                        $user,
+                        new \DateTime(),
+                        $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                        'historique.actions.UtilisateurCreate',
+                        $user
+                    );
+
+                // Redirects to login form, with a success message
+                $this->getSession()->getFlashBag()->add('success', $this->get('translator')->trans('security.utilisateur.create.isCompleted'));
+
+                return $this->redirect($this->generateUrl('bdoh_security_login'));
+            }
+        }
+
+        return $this->render('IrsteaBdohSecurityBundle:Utilisateur:new.html.twig', ['form' => $form->createView()]);
+    }
+
+    /**
+     * Edits an existing Utilisateur entity.
+     *
+     * @Route("/edit", name="bdoh_security_utilisateur_edit")
+     * @Method({"GET", "POST"})
+     * @Security("is_granted('ROLE_USER')")
+     *
+     * @param Request $request
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function editAction(Request $request)
+    {
+        $user = $this->get('security.token_storage')->getToken()->getUser();
+        $form = $this->createForm(new EditUtilisateurType($this->getEm(), $this->get('session')->get('_locale')), $user);
+
+        // Some POST parameters ? Checks the form.
+        if (count($request->request) !== 0) {
+            $form->handleRequest($request);
+
+            if ($form->isValid()) {
+                // If the password has changed, encodes it
+                if ($user->getPassword()) {
+                    $encoder = $this->get('security.encoder_factory')->getEncoder($user);
+                    $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
+
+                    $user->setPassword($password);
+                } // Else, retrieves original 'password' and 'salt' to prevent the update to fail !!
+                else {
+                    list($password, $salt) = $this->getSecurityRepo('Utilisateur')->getPasswordSalt($user);
+                    $user->setPassword($password);
+                    $user->setSalt($salt);
+                }
+
+                // Persists the new user
+                $em = $this->getEm();
+                $em->flush();
+
+                $this->container->get('irstea_bdoh_logger.logger')
+                    ->createHistoriqueAdministrationUtilisateur(
+                        $user,
+                        new \DateTime(),
+                        $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent(),
+                        'historique.actions.UtilisateurUpdate',
+                        $user
+                    );
+
+                // Redirects to home, with a success message
+                $this->getSession()->getFlashBag()->add('success', $this->get('translator')->trans('security.utilisateur.edit.isCompleted'));
+
+                return $this->redirect($this->generateUrl('bdoh_home'));
+            }
+        }
+
+        return $this->render('IrsteaBdohSecurityBundle:Utilisateur:edit.html.twig', ['form' => $form->createView()]);
+    }
+
+    /**
+     * Edits an existing Utilisateur rights.
+     *
+     * @Route("/right/{email}", name="bdoh_security_utilisateur_right")
+     * @Method({"GET", "POST"})
+     * @Security("is_granted('ROLE_ADMIN') and (user.isGestionnaireDesObservatoires() or user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory())")
+     *
+     * @param Request $request
+     * @param mixed   $email
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+     */
+    public function rightAction(Request $request, $email)
+    {
+        $em = $this->getEm();
+        $userRepo = $this->getSecurityRepo('Utilisateur');
+        /** @var Utilisateur $user */
+        $user = $userRepo->findOneByEmail($email);
+
+        if ($user === null) {
+            return $this->allAction();
+        }
+
+        $obs = $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        $security = $this->get('security.authorization_checker');
+        $actingAdmin = $this->get('security.token_storage')->getToken()->getUser();
+
+        $sitesOnWhichUserIsGestionnaire = [];
+        $sitesOnWhichUserIsContributeur = [];
+        $chroniquesOnWhichUserIsUtilisateur = [];
+        $sitesChoice = [];
+        $chroniquesChoice = [];
+
+        $besoinsATraiter = [];
+        $besoinsTraite = [];
+        $besoins = [];
+
+        /* @var Besoin $besoin */
+        if ($security->isGranted('RIGHT', [Role::UTILISATEUR, $obs])) {
+            $besoins = $user->getBesoins();
+            foreach ($besoins as $besoin) {
+                if ($besoin !== null) {
+                    if ($besoin->getObservatoire() === $obs) {
+                        if ($besoin->getTraite()) {
+                            $besoinsTraite[] = $besoin;
+                        } else {
+                            $besoinsATraiter[] = $besoin;
+                        }
+                    }
+                }
+            }
+        }
+
+        $sites = $this->getBdohRepo('SiteExperimental')->securedFindAll($actingAdmin);
+        if ($sites) {
+            foreach ($sites as $site) {
+                $sitesChoice[$site->getId()] = $site->getNom();
+                //retrieving of existing roles
+                if ($user->hasRoleSite(Role::GESTIONNAIRE, $site)) {
+                    $sitesOnWhichUserIsGestionnaire[] = $site->getId();
+                }
+                if ($user->hasRoleSite(Role::CONTRIBUTEUR, $site)) {
+                    $sitesOnWhichUserIsContributeur[] = $site->getId();
+                }
+            }
+            $site = $sites[0];
+        } else {
+            $site = null;
+        }
+
+        $chroniques = $this->getBdohRepo('Chronique')->findAll();
+        if ($chroniques) {
+            foreach ($chroniques as $chron) {
+                $chroniqueTxt = $chron->__toString();
+                if (!$chron->getEstVisible()) {
+                    $chroniqueTxt .= ' (invisible)';
+                }
+                $chroniquesChoice[$chron->getId()] = $chroniqueTxt;
+
+                if ($user->hasRoleChronique(Role::UTILISATEUR, $chron)) {
+                    $chroniquesOnWhichUserIsUtilisateur[] = $chron->getId();
+                }
+            }
+            $chronique = $chroniques[0];
+        } else {
+            $chronique = null;
+        }
+
+        //Retrieving of existing roles
+        $isGestionnaireDesObservatoires = $user->getRoleAdmin() !== null;
+        $isGestionnaireObservatoire = ($user->hasRoleObservatoire(Role::GESTIONNAIRE, $obs)) ? true : false;
+        $isUtilisateur = ($user->hasRoleObservatoire(Role::UTILISATEUR, $obs)) ? true : false;
+        $existingDateFin = $user->getFinAcces();
+
+        $defaultData = ['dateFin' => $existingDateFin];
+        if ($security->isGranted('RIGHT', [Role::UTILISATEUR, $obs])) {
+            if ($besoins !== null) {
+                foreach ($besoins as $besoin) {
+                    if ($besoin->getObservatoire() === $obs) {
+                        if ($besoin->getTraite()) {
+                            $defaultData['besoinTraite' . $besoin->getId()] = true;
+                        } else {
+                            $defaultData['besoinATraiter' . $besoin->getId()] = false;
+                        }
+                    }
+                }
+            }
+        }
+        if ($security->isGranted('RIGHT', [Role::GESTIONNAIRE, $obs])) {
+            $defaultData['gestionnaireDesObservatoires'] = $isGestionnaireDesObservatoires;
+            $defaultData['gestionnaireObservatoire'] = $isGestionnaireObservatoire;
+        }
+        if (($site !== null) && $security->isGranted('RIGHT', [Role::GESTIONNAIRE, $site])) {
+            $defaultData['gestionnaireSite'] = $sitesOnWhichUserIsGestionnaire;
+        }
+        if (($site !== null) && $security->isGranted('RIGHT', [Role::CONTRIBUTEUR, $site])) {
+            $defaultData['contributeurSite'] = $sitesOnWhichUserIsContributeur;
+        }
+        if ($security->isGranted('RIGHT', [Role::UTILISATEUR, $obs])) {
+            $defaultData['utilisateurObservatoire'] = $isUtilisateur;
+        }
+        if (($chronique !== null) && $security->isGranted('RIGHT', [Role::UTILISATEUR, $chronique])) {
+            $defaultData['utilisateurChronique'] = $chroniquesOnWhichUserIsUtilisateur;
+        }
+
+        $formBuilder = $this->createFormBuilder($defaultData);
+        if ($security->isGranted('RIGHT', [Role::UTILISATEUR, $obs])) { // gestionnaire de l'observatoire
+            if ($besoins !== null) {
+                foreach ($besoinsATraiter as $besoinATraiter) {
+                    $formBuilder->add(
+                        'besoinATraiter' . $besoinATraiter->getId(),
+                        CheckboxType::class,
+                        [
+                            'required' => false,
+                            'label'    => 'besoin.traite',
+                        ]
+                    );
+                }
+            }
+        }
+        if ($security->isGranted('RIGHT', [Role::GESTIONNAIRE, $obs]) ||  // gestionnaire des tous les observatoires
+            $security->isGranted('RIGHT', [Role::GESTIONNAIRE, $site]) || // gestionnaire de l'observatoire
+            $security->isGranted('RIGHT', [Role::CONTRIBUTEUR, $site])) { // gestionnaire de site
+            $formBuilder->add(
+                'dateFin',
+                DateType::class,
+                [
+                    'required' => false,
+                    'label'    => 'finAcces',
+                ]
+            );
+        }
+        if ($security->isGranted('RIGHT', [Role::GESTIONNAIRE, $obs])) {
+            $formBuilder->add(
+                'gestionnaireDesObservatoires',
+                CheckboxType::class,
+                [
+                    'required' => false,
+                    'label'    => 'security.utilisateur.gestionnaireDesObservatoires',
+                    'disabled' => $user->getRoleAdmin() === Utilisateur::ROLE_ADMIN_TECH,
+                ]
+            );
+            $formBuilder->add(
+                'gestionnaireObservatoire',
+                CheckboxType::class,
+                [
+                    'required' => false,
+                    'label'    => 'security.utilisateur.gestionnaireObservatoire',
+                ]
+            );
+        }
+        if (($site !== null) && $security->isGranted('RIGHT', [Role::GESTIONNAIRE, $site])) {
+            $formBuilder->add(
+                'gestionnaireSite',
+                ChoiceType::class,
+                [
+                    'required' => false,
+                    'label'    => 'security.utilisateur.gestionnaireSite',
+                    'multiple' => true,
+                    'choices'  => $sitesChoice,
+                ]
+            );
+        }
+        if (($site !== null) && $security->isGranted('RIGHT', [Role::CONTRIBUTEUR, $site])) {
+            $formBuilder->add(
+                'contributeurSite',
+                ChoiceType::class,
+                [
+                    'required' => false,
+                    'label'    => 'security.utilisateur.contributeurSite',
+                    'multiple' => true,
+                    'choices'  => $sitesChoice,
+                ]
+            );
+        }
+        if ($security->isGranted('RIGHT', [Role::UTILISATEUR, $obs])) {
+            $formBuilder->add(
+                'utilisateurObservatoire',
+                CheckboxType::class,
+                [
+                    'required' => false,
+                    'label'    => 'security.utilisateur.utilisateurObservatoire',
+                ]
+            );
+        }
+        if (($chronique !== null) && $security->isGranted('RIGHT', [Role::UTILISATEUR, $chronique])) {
+            $formBuilder->add(
+                'utilisateurChronique',
+                ChoiceType::class,
+                [
+                    'required'   => false,
+                    'label'      => 'security.utilisateur.utilisateurChronique',
+                    'multiple'   => true,
+                    'choices'    => $chroniquesChoice,
+                    'block_name' => 'choice_attr',
+                    'group_by'   => function ($choiceValue, $key, $value) {
+                        return $this->getBdohRepo('Chronique')->findOneById($choiceValue)->getStation()->getCode();
+                    },
+                ]
+            );
+        }
+
+        $form = $formBuilder->getForm();
+
+        if ($request->isMethod('POST')) { //count($request->request) !== 0) //Processing
+            //A little boring :
+            //rights should be granted according to what is on the form
+            //AND removed if not in the form
+            //BUT ONLY for rights on this observatoire...
+
+            //so basically we're going to go through all sites and chroniques
+
+            $form->bind($request);
+            $data = $form->getData();
+            $besoinsATraiter = preg_grep('#besoinATraiter#', array_keys($data));
+            if ($besoinsATraiter) {
+                foreach ($besoinsATraiter as $besoinATraiter) {
+                    $besoin = $this->getSecurityRepo('Besoin')->findOneById((int) \substr($besoinATraiter, \strlen('besoinATraiter')));
+                    $besoin->setTraite($data[$besoinATraiter]);
+                    $em->persist($besoin);
+                }
+            }
+            $user->setFinAcces($data['dateFin']);
+
+            if (array_key_exists('gestionnaireDesObservatoires', $data)) {
+                $user->setGestionnaireDesObservatoires($data['gestionnaireDesObservatoires']);
+            } else {
+                $data['gestionnaireDesObservatoires'] = false; // utilisé dans le mail des droits
+            }
+
+            if (array_key_exists('gestionnaireObservatoire', $data)) {
+                if ($data['gestionnaireObservatoire']) {
+                    if (!$user->hasRoleObservatoire(Role::GESTIONNAIRE, $obs)) {
+                        $role = new RoleObservatoire();
+                        $role->setUtilisateur($user);
+                        $role->setValeur(Role::GESTIONNAIRE);
+                        $role->setObservatoire($obs);
+                        $user->addRoleObservatoire($role);
+                        $em->persist($role);
+                    }
+                } elseif ($user->hasRoleObservatoire(Role::GESTIONNAIRE, $obs)) {
+                    $role = $this->getSecurityRepo('RoleObservatoire')->findOneBy(
+                        ['utilisateur' => $user, 'observatoire' => $obs, 'valeur' => Role::GESTIONNAIRE]
+                    );
+                    $em->remove($role);
+                    $user->removeRoleObservatoire($role);
+                }
+            }
+
+            if (array_key_exists('utilisateurObservatoire', $data)) {
+                if ($data['utilisateurObservatoire']) {
+                    if (!$user->hasRoleObservatoire(Role::UTILISATEUR, $obs)) {
+                        $role = new RoleObservatoire();
+                        $role->setUtilisateur($user);
+                        $role->setValeur(Role::UTILISATEUR);
+                        $role->setObservatoire($obs);
+                        $user->addRoleObservatoire($role);
+                        $em->persist($role);
+                    }
+                } elseif ($user->hasRoleObservatoire(Role::UTILISATEUR, $obs)) {
+                    $role = $this->getSecurityRepo('RoleObservatoire')->findOneBy(
+                        ['utilisateur' => $user, 'observatoire' => $obs, 'valeur' => Role::UTILISATEUR]
+                    );
+                    $em->remove($role);
+                    $user->removeRoleObservatoire($role);
+                }
+            }
+
+            foreach ($sites as $site) {
+                //GESTIONNAIRE
+                if (array_key_exists('gestionnaireSite', $data)) {
+                    if ($user->hasRoleSite(Role::GESTIONNAIRE, $site) && !in_array($site->getId(), $data['gestionnaireSite'])) {
+                        //right should be removed
+                        $role = $this->getSecurityRepo('RoleSite')->findOneBy(
+                            ['utilisateur' => $user, 'site' => $site, 'valeur' => Role::GESTIONNAIRE]
+                        );
+                        $em->remove($role);
+                        $user->removeRoleSite($role);
+                    }
+                    if (!$user->hasRoleSite(Role::GESTIONNAIRE, $site) && in_array($site->getId(), $data['gestionnaireSite'])) {
+                        //right should be added
+                        $role = new RoleSite();
+                        $role->setUtilisateur($user);
+                        $role->setValeur(Role::GESTIONNAIRE);
+                        $role->setSite($site);
+                        $user->addRoleSite($role);
+                        $em->persist($role);
+                    }
+                }
+
+                //CONTRIBUTEUR
+                if (array_key_exists('contributeurSite', $data)) {
+                    if ($user->hasRoleSite(Role::CONTRIBUTEUR, $site) && !in_array($site->getId(), $data['contributeurSite'])) {
+                        //right should be removed
+                        $role = $this->getSecurityRepo('RoleSite')->findOneBy(
+                            ['utilisateur' => $user, 'site' => $site, 'valeur' => Role::CONTRIBUTEUR]
+                        );
+                        $em->remove($role);
+                        $user->removeRoleSite($role);
+                    }
+                    if (!$user->hasRoleSite(Role::CONTRIBUTEUR, $site) && in_array($site->getId(), $data['contributeurSite'])) {
+                        //right should be added
+                        $role = new RoleSite();
+                        $role->setUtilisateur($user);
+                        $role->setValeur(Role::CONTRIBUTEUR);
+                        $role->setSite($site);
+                        $user->addRoleSite($role);
+                        $em->persist($role);
+                    }
+                }
+            }
+
+            foreach ($chroniques as $chron) {
+                if (array_key_exists('utilisateurChronique', $data)) {
+                    if ($user->hasRoleChronique(Role::UTILISATEUR, $chron) && !in_array($chron->getId(), $data['utilisateurChronique'])) {
+                        //right should be removed
+                        $role = $this->getSecurityRepo('RoleChronique')->findOneBy(
+                            ['utilisateur' => $user, 'chronique' => $chron, 'valeur' => Role::UTILISATEUR]
+                        );
+                        $em->remove($role);
+                        $user->removeRoleChronique($role);
+                    }
+                    if (!$user->hasRoleChronique(Role::UTILISATEUR, $chron) && in_array($chron->getId(), $data['utilisateurChronique'])) {
+                        //right should be added
+                        $role = new RoleChronique();
+                        $role->setUtilisateur($user);
+                        $role->setValeur(Role::UTILISATEUR);
+                        $role->setChronique($chron);
+                        $user->addRoleChronique($role);
+                        $em->persist($role);
+                    }
+                }
+            }
+
+            //flush if necessary
+            $em->flush();
+
+            // Send a mail to the user to inform her of right granting
+            // and send a copy to the managers of the observatory
+            $managerMails = $userRepo->getValidatorMails($obs);
+            $message = \Swift_Message::newInstance()
+                ->setSubject($this->get('translator')->trans('security.utilisateur.newRightMail.title'))
+                ->setFrom('no.reply.BDOH@irstea.fr')
+                ->setTo($email)
+                ->setCc($managerMails)
+                ->setBody(
+                    $this->renderView(
+                        'IrsteaBdohSecurityBundle:Utilisateur:rightMail.txt.twig',
+                        [
+                            'user'                         => $user,
+                            'obs'                          => $obs,
+                            'gestionnaireDesObservatoires' => $data['gestionnaireDesObservatoires'],
+                            'roleGestionnaire'             => Role::GESTIONNAIRE,
+                            'roleContributeur'             => Role::CONTRIBUTEUR,
+                            'roleUtilisateur'              => Role::UTILISATEUR,
+                            'chroniques'                   => $chroniques,
+                        ]
+                    )
+                );
+
+            $this->get('mailer')->send($message);
+
+            //log the rights granting
+            $this->get('irstea_bdoh_logger.logger')
+                ->createHistoriqueAdministrationUtilisateur(
+                    $this->getUser(),
+                    new \DateTime(),
+                    $obs,
+                    'historique.actions.UtilisateurRights',
+                    $user
+                );
+
+            // Redirects to home, with a success message
+            $this->getSession()->getFlashBag()->add('success', $this->get('translator')->trans('security.utilisateur.right.isCompleted'));
+
+            return $this->redirect($this->generateUrl('bdoh_security_utilisateur_all'));
+        }   //Displaying
+
+        return $this->render(
+            'IrsteaBdohSecurityBundle:Utilisateur:right.html.twig',
+            [
+                'form'            => $form->createView(),
+                'utilisateur'     => $user,
+                'besoinsTraite'   => $besoinsTraite,
+                'besoinsATraiter' => $besoinsATraiter,
+            ]
+        );
+    }
+
+    /**
+     * Edits an existing Utilisateur entity.
+     *
+     * @Route("/all", name="bdoh_security_utilisateur_all")
+     * @Method("GET")
+     * @Security("is_granted('ROLE_ADMIN') and (user.isGestionnaireDesObservatoires() or user.isAManagerOfCurrentObservatory() or user.isASiteManagerOfCurrentObservatory())")
+     */
+    public function allAction()
+    {
+        $obs = $this->container->get('irstea_bdoh.manager.observatoire')->getCurrent();
+        list($users, $autres) = $this->getSecurityRepo('Utilisateur')->findUsersRelatedToTheObservatory($obs);
+
+        return $this->render(
+            'IrsteaBdohSecurityBundle:Utilisateur:all.html.twig',
+            [
+                'obs'     => $obs,
+                'users'   => $users,
+                'autres'  => $autres,
+                'filters' => json_encode($this->getRequest()->query->all()),
+            ]
+        );
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/Users.php b/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/Users.php
new file mode 100644
index 0000000000000000000000000000000000000000..ffe0a70d48d34a375734ca204cb1bde772fd1c95
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/Users.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\DataFixtures\ORM\Test;
+
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Irstea\BdohDataBundle\DataFixtures\ORM\AbstractYamlFixture;
+use Irstea\BdohDataBundle\DataFixtures\ORM\Test\ChroniquesContinues;
+use Irstea\BdohDataBundle\DataFixtures\ORM\Test\Observatoires;
+use Irstea\BdohDataBundle\DataFixtures\ORM\Test\SitesExperimentaux;
+use Irstea\BdohDataBundle\Entity\ChroniqueContinue;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\RoleChronique;
+use Irstea\BdohSecurityBundle\Entity\RoleObservatoire;
+use Irstea\BdohSecurityBundle\Entity\RoleSite;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
+use Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder;
+
+/**
+ * Creation of some 'Utilisateur' for credential testing.
+ */
+class Users extends AbstractYamlFixture implements ContainerAwareInterface, DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [Observatoires::class, SitesExperimentaux::class, ChroniquesContinues::class];
+    }
+
+    /**
+     * @var PasswordEncoderInterface
+     */
+    private $encoder;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->encoder =
+            $container ? $container->get('security.encoder_factory')->getEncoder(Utilisateur::class) : new PlaintextPasswordEncoder();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadEntity(array $data, $username)
+    {
+        $user = new Utilisateur();
+        $user->setEmail($username . '@irstea.fr');
+        $user->setNom($data['nom']);
+        $user->setPrenom($data['prenom']);
+        $user->setPassword($this->encoder->encodePassword('password', $user->getSalt()));
+
+        if (isset($data['roleAdmin'])) {
+            $user->setRoleAdmin($data['roleAdmin']);
+        }
+
+        if (isset($data['rights'])) {
+            foreach ($data['rights'] as $right) {
+                $type = constant(Role::class . '::' . $right['type']);
+
+                if (isset($right['observatoire'])) {
+                    $target = $this->getReference(Observatoire::class . $right['observatoire']);
+                    $role = new RoleObservatoire();
+                    $user->addRoleObservatoire($role);
+                } elseif (isset($right['site'])) {
+                    $target = $this->getReference(SiteExperimental::class . $right['site']);
+                    $role = new RoleSite();
+                    $user->addRoleSite($role);
+                } elseif (isset($right['chronique'])) {
+                    $target = $this->getReference(ChroniqueContinue::class . $right['chronique']);
+                    $role = new RoleChronique();
+                    $user->addRoleChronique($role);
+                } else {
+                    throw new \RuntimeException('Invalid right');
+                }
+
+                $role->setValeur($type);
+                $role->setTarget($target);
+                $role->setUtilisateur($user);
+            }
+        }
+
+        return $user;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/files/UsersData.yml b/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/files/UsersData.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2a1c6a9613a9a850c21af68759b6b79255a6805e
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/DataFixtures/ORM/Test/files/UsersData.yml
@@ -0,0 +1,39 @@
+gestionnaireDesObservatoires:
+  nom: DesObservatoires
+  prenom: Gestionnaire
+  roleAdmin: FCT
+
+adminTech:
+  nom: Technique
+  prenom: Administrateur
+  roleAdmin: TECH
+
+gestionnaireObservatoire:
+  nom: Observatoire
+  prenom: Gestionnaire
+  rights:
+      - { observatoire: Bac à sable, type: GESTIONNAIRE }
+
+gestionnaireSite:
+  nom: Site
+  prenom: Gestionnaire
+  rights:
+      - { site: Bac à sable, type: GESTIONNAIRE }
+
+contributeurSite:
+  nom: Site
+  prenom: Contributeur
+  rights:
+      - { site: Bac à sable, type: CONTRIBUTEUR }
+
+utilisateurObservatoire:
+  nom: Observatoire
+  prenom: Utilisateur
+  rights:
+      - { observatoire: Bac à sable, type: UTILISATEUR }
+
+utilisateurChronique:
+  nom: Chronique
+  prenom: Utilisateur
+  rights:
+    - { chronique: PLUVIO, type: UTILISATEUR }
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Besoin.php b/src/Irstea/BdohSecurityBundle/Entity/Besoin.php
new file mode 100644
index 0000000000000000000000000000000000000000..d3c915db1559f42754bd7b2cc7e523bfa5b7cc28
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Besoin.php
@@ -0,0 +1,284 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\ObservatoireRelatedInterface;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+
+/**
+ * Class Besoin.
+ */
+class Besoin implements ObservatoireRelatedInterface
+{
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $duree;
+
+    /**
+     * @var string
+     */
+    protected $details;
+
+    /**
+     * @var Utilisateur
+     */
+    protected $utilisateur;
+
+    /**
+     * @var ObjectifRecherche
+     */
+    protected $objectif;
+
+    /**
+     * @var TypeTravaux
+     */
+    protected $type;
+
+    /**
+     * @var Observatoire
+     */
+    protected $observatoire;
+
+    /**
+     * @var TypeParametre
+     */
+    protected $parametres;
+
+    /**
+     * @var Station
+     */
+    protected $stations;
+
+    /**
+     * @var bool
+     */
+    protected $traite = false;
+
+    /**
+     * Besoin constructor.
+     */
+    public function __construct()
+    {
+        $this->parametres = new ArrayCollection();
+        $this->stations = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set duree.
+     *
+     * @param string $duree
+     */
+    public function setDuree($duree)
+    {
+        $this->duree = $duree;
+    }
+
+    /**
+     * Get duree.
+     *
+     * @return string
+     */
+    public function getDuree()
+    {
+        return $this->duree;
+    }
+
+    /**
+     * Set details.
+     *
+     * @param string $details
+     */
+    public function setDetails($details)
+    {
+        $this->details = $details;
+    }
+
+    /**
+     * Get details.
+     *
+     * @return string
+     */
+    public function getDetails()
+    {
+        return $this->details;
+    }
+
+    /**
+     * Set utilisateur.
+     *
+     * @param Utilisateur $utilisateur
+     */
+    public function setUtilisateur(Utilisateur $utilisateur)
+    {
+        $this->utilisateur = $utilisateur;
+    }
+
+    /**
+     * Get utilisateur.
+     *
+     * @return Utilisateur
+     */
+    public function getUtilisateur()
+    {
+        return $this->utilisateur;
+    }
+
+    /**
+     * Set objectif.
+     *
+     * @param ObjectifRecherche $objectif
+     */
+    public function setObjectif(ObjectifRecherche $objectif)
+    {
+        $this->objectif = $objectif;
+    }
+
+    /**
+     * Get objectif.
+     *
+     * @return ObjectifRecherche
+     */
+    public function getObjectif()
+    {
+        return $this->objectif;
+    }
+
+    /**
+     * Set type.
+     *
+     * @param TypeTravaux $type
+     */
+    public function setType(TypeTravaux $type)
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * Get type.
+     *
+     * @return TypeTravaux
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Set observatoire.
+     *
+     * @param Observatoire $observatoire
+     */
+    public function setObservatoire(Observatoire $observatoire)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * Add parametres.
+     *
+     * @param TypeParametre $parametres
+     */
+    public function addTypeParametre(TypeParametre $parametres)
+    {
+        $this->parametres[] = $parametres;
+    }
+
+    /**
+     * Get parametres.
+     *
+     * @return Collection|TypeParametre[]
+     */
+    public function getParametres()
+    {
+        return $this->parametres;
+    }
+
+    /**
+     * Add stations.
+     *
+     * @param Station $stations
+     */
+    public function addStation(Station $stations)
+    {
+        $this->stations[] = $stations;
+    }
+
+    /**
+     * Get stations.
+     *
+     * @return Collection|Station[]
+     */
+    public function getStations()
+    {
+        return $this->stations;
+    }
+
+    /**
+     * Set traite.
+     *
+     * @param bool $traite
+     */
+    public function setTraite($traite)
+    {
+        $this->traite = $traite;
+    }
+
+    /**
+     * Get traite.
+     *
+     * @return bool
+     */
+    public function getTraite()
+    {
+        return $this->traite;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Categorie.php b/src/Irstea/BdohSecurityBundle/Entity/Categorie.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ce75ee191771b590eed6ab38213bd51b75181ec
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Categorie.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Irstea\BdohSecurityBundle\Entity\Categorie.
+ *
+ * @UniqueEntity(fields="libelle")
+ * @UniqueEntity(fields="libelleEn")
+ */
+class Categorie implements LabelledEntityInterface
+{
+    use LabelledEntityTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getLibelle();
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/ObjectifRecherche.php b/src/Irstea/BdohSecurityBundle/Entity/ObjectifRecherche.php
new file mode 100644
index 0000000000000000000000000000000000000000..c61a114592496d4b9e3c25363c5ff09c7b3743ee
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/ObjectifRecherche.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Irstea\BdohSecurityBundle\Entity\ObjectifRecherche.
+ *
+ * @UniqueEntity(fields="libelle")
+ * @UniqueEntity(fields="libelleEn")
+ */
+class ObjectifRecherche implements LabelledEntityInterface
+{
+    use LabelledEntityTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getLibelle();
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Repository/BesoinRepository.php b/src/Irstea/BdohSecurityBundle/Entity/Repository/BesoinRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea1700330680dcb6d1f127ea7e5ddda03700afb3
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Repository/BesoinRepository.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+
+/**
+ * Class BesoinRepository.
+ */
+class BesoinRepository extends EntityRepository
+{
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Repository/CategorieRepository.php b/src/Irstea/BdohSecurityBundle/Entity/Repository/CategorieRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..7365711576c8b0bde5bab2c6068e3e894ce58db6
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Repository/CategorieRepository.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+
+/**
+ * Class CategorieRepository.
+ */
+class CategorieRepository extends EntityRepository
+{
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Repository/ObjectifRechercheRepository.php b/src/Irstea/BdohSecurityBundle/Entity/Repository/ObjectifRechercheRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..02352fb6bf784d733adf167e9c83a72b838aa949
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Repository/ObjectifRechercheRepository.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+
+/**
+ * Class ObjectifRechercheRepository.
+ */
+class ObjectifRechercheRepository extends EntityRepository
+{
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Repository/TypeTravauxRepository.php b/src/Irstea/BdohSecurityBundle/Entity/Repository/TypeTravauxRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc5864397b31aaac985f00d59f1d3c0cd3caa796
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Repository/TypeTravauxRepository.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+
+/**
+ * Class TypeTravauxRepository.
+ */
+class TypeTravauxRepository extends EntityRepository
+{
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Repository/UtilisateurRepository.php b/src/Irstea/BdohSecurityBundle/Entity/Repository/UtilisateurRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a2225ab0bd9a45ad29a424351bebd93a4af29a4
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Repository/UtilisateurRepository.php
@@ -0,0 +1,269 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity\Repository;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\EntityRepository;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\RoleObservatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
+use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Security\Core\User\UserProviderInterface;
+
+/**
+ * Class UtilisateurRepository.
+ */
+class UtilisateurRepository extends EntityRepository implements UserProviderInterface
+{
+    /**
+     * Forces to retrieve the 'password' and 'salt' fields of a given 'Utilisateur'.
+     */
+    public function getPasswordSalt(Utilisateur $user)
+    {
+        $sql = 'SELECT password, salt FROM utilisateur WHERE id = ' . $user->getId();
+
+        return $this->_em->getConnection()->fetchArray($sql);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadUserByUsername($username)
+    {
+        try {
+            return $this->createQueryBuilder('u')
+                ->where("u.email = '$username'")
+                ->getQuery()
+                ->getSingleResult();
+        } catch (\Exception $e) {
+            throw new UsernameNotFoundException('');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function refreshUser(UserInterface $user)
+    {
+        $class = get_class($user);
+
+        if (!$this->supportsClass($class)) {
+            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', $class));
+        }
+
+        return $this->loadUserByUsername($user->getUsername());
+    }
+
+    /**
+     * @param Utilisateur $user
+     *
+     * @throws \Doctrine\ORM\OptimisticLockException
+     */
+    public function updateUser(Utilisateur $user)
+    {
+        $this->_em->persist($user);
+        $this->_em->flush();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsClass($class)
+    {
+        return $this->getEntityName() === $class || is_subclass_of($class, $this->getEntityName());
+    }
+
+    /**
+     * @param Observatoire $obs
+     *
+     * @throws \Exception
+     *
+     * @return array
+     */
+    public function findUsersRelatedToTheObservatory(Observatoire $obs)
+    {
+        // les utilisateurs liés à l'observatoire
+        $sqlUsers = <<<'SQL'
+SELECT u.id, u.nom, u.prenom, u.email,
+CASE WHEN u.roleadmin IS NOT NULL THEN TRUE ELSE FALSE END as isgestionnairedetouslesobservatoires,
+CASE WHEN r1.id IS NOT NULL THEN TRUE ELSE FALSE END as isgestionnairedelobservatoire,
+array_to_string(array_agg(DISTINCT s1.nom ORDER BY s1.nom) FILTER (WHERE s1.nom IS NOT NULL),'#####') as sitesgestionnaire,
+array_to_string(array_agg(DISTINCT s2.nom ORDER BY s2.nom) FILTER (WHERE s2.nom IS NOT NULL),'#####') as sitescontributeur,
+CASE WHEN r4.id IS NOT NULL THEN TRUE ELSE FALSE END as isutilisateurdeconfiance,
+CASE WHEN c.id IS NOT NULL AND s3.id IS NOT NULL THEN TRUE ELSE FALSE END as isutilisateurdechroniques,
+CASE WHEN b.id IS NOT NULL THEN TRUE ELSE FALSE END as hasbesoins
+FROM utilisateur u
+LEFT JOIN role r1 ON r1.utilisateur_id = u.id AND r1.observatoire_id = :observatoire AND r1.valeur = 'gestionnaire'
+LEFT JOIN role r2 ON r2.utilisateur_id = u.id AND r2.valeur = 'gestionnaire'
+LEFT JOIN siteexperimental s1 ON r2.site_id = s1.id AND s1.observatoire_id = :observatoire
+LEFT JOIN role r3 ON r3.utilisateur_id = u.id AND r3.valeur = 'contributeur'
+LEFT JOIN siteexperimental s2 ON r3.site_id = s2.id AND s2.observatoire_id = :observatoire
+LEFT JOIN role r4 ON r4.utilisateur_id = u.id AND r4.observatoire_id = :observatoire AND r4.valeur = 'utilisateur'
+LEFT JOIN role r5 ON r5.utilisateur_id = u.id AND r5.valeur = 'utilisateur' AND r5.chronique_id IS NOT NULL
+LEFT JOIN chronique c ON r5.chronique_id = c.id
+LEFT JOIN stations_sites ss ON ss.station_id = c.station_id
+LEFT JOIN siteexperimental s3 ON ss.site_id = s3.id AND s3.observatoire_id = :observatoire
+LEFT JOIN besoin b ON b.utilisateur_id = u.id AND b.observatoire_id = :observatoire AND (b.traite IS NULL OR b.traite = FALSE)
+WHERE u.roleadmin IS NOT NULL
+OR r1.id IS NOT NULL
+OR (r2.id IS NOT NULL AND s1.id IS NOT NULL)
+OR (r3.id IS NOT NULL AND s2.id IS NOT NULL)
+OR r4.id IS NOT NULL
+OR (r5.id IS NOT NULL AND c.id IS NOT NULL AND s3.id IS NOT NULL)
+OR b.id IS NOT NULL
+GROUP BY u.id, u.nom, u.prenom, u.email,
+isgestionnairedetouslesobservatoires, isgestionnairedelobservatoire, isutilisateurdeconfiance, isutilisateurdechroniques, hasbesoins
+ORDER BY u.nom ASC, u.prenom ASC;
+SQL;
+        $users = $this->_em->getConnection()->executeQuery($sqlUsers, [$obs->getId()])->fetchAll();
+
+        $userIds = [];
+        foreach ($users as &$user) {
+            // les ids des utilisateurs liés à l'observatoire
+            $userIds[] = $user['id'];
+            // reconstruction des tableaux sitesgestionnaire et sitescontributeur
+            if ($user['sitesgestionnaire']) {
+                $user['sitesgestionnaire'] = explode('#####', $user['sitesgestionnaire']);
+            }
+            if ($user['sitescontributeur']) {
+                $user['sitescontributeur'] = explode('#####', $user['sitescontributeur']);
+            }
+        }
+
+        // les utilisateurs non liés à l'observatoire
+        $sqlAutres = <<<'SQL'
+SELECT u.nom, u.prenom, u.email
+FROM utilisateur u
+WHERE u.id NOT IN (:userids)
+ORDER BY u.nom ASC, u.prenom ASC;
+SQL;
+        $sqlAutres = str_replace(':userids', implode(',', $userIds), $sqlAutres);
+        $autres = $this->_em->getConnection()->executeQuery($sqlAutres)->fetchAll();
+
+        return [$users, $autres];
+    }
+
+    /**
+     * @param Observatoire $obs
+     *
+     * @return string[]
+     */
+    public function getValidatorMails(Observatoire $obs)
+    {
+        $qb = $this->createQueryBuilder('u')
+            ->from(RoleObservatoire::class, 'ro')
+            ->select('u.email')
+            ->andWhere('ro.observatoire = :observatoire')
+            ->andWhere('ro.utilisateur = u')
+            ->andWhere('ro.valeur = :gestionnaire')
+            ->setParameter('observatoire', $obs)
+            ->setParameter('gestionnaire', Role::GESTIONNAIRE)
+            ->getQuery();
+
+        $results = $qb->getResult();
+        $toReturn = [];
+        foreach ($results as $result) {
+            $toReturn[] = $result['email'];
+        }
+
+        return $toReturn;
+    }
+
+    /**
+     * @param Observatoire $observatoire
+     *
+     * @return array
+     */
+    public function findGestionnairesByObservatoire(Observatoire $observatoire)
+    {
+        $query = $this->createQueryBuilder('u')
+            ->join('u.rolesObservatoire', 'ro')
+            ->andWhere('ro.observatoire = :obs')
+            ->andWhere('ro.valeur = :role')
+            ->addOrderBy('u.nom', 'ASC')
+            ->setParameters(['obs' => $observatoire, 'role' => 'gestionnaire']);
+
+        return $query->getQuery()->getResult();
+    }
+
+    /**
+     * @param Observatoire $obs
+     *
+     * @return array
+     */
+    public function findDerniereConnection(\Irstea\BdohDataBundle\Entity\Observatoire $obs)
+    {
+        $query = $this->createQueryBuilder('u')
+            ->join('u.rolesObservatoire', 'ro')
+            ->andWhere('ro.observatoire = :obs')
+            ->addOrderBy('u.nom', 'ASC')
+            ->setParameters(['obs' => $obs]);
+        $results = $query->getQuery()->getResult();
+
+        $users = [];
+        foreach ($results as $result) {
+            $users[$result->getEmail()] = [
+                'nom'    => $result->getNom(),
+                'prenom' => $result->getPrenom(),
+                'date'   => $result->getDerniereConnection(),
+            ];
+        }
+
+        $query = $this->createQueryBuilder('u')
+            ->join('u.rolesSite', 'rs')
+            ->join('rs.site', 's')
+            ->andWhere('s.observatoire = :obs')
+            ->addOrderBy('u.nom', 'ASC')
+            ->setParameters(['obs' => $obs]);
+        $results = $query->getQuery()->getResult();
+
+        foreach ($results as $result) {
+            $users[$result->getEmail()] = [
+                'nom'    => $result->getNom(),
+                'prenom' => $result->getPrenom(),
+                'date'   => $result->getDerniereConnection(),
+            ];
+        }
+
+        $query = $this->createQueryBuilder('u')
+            ->join('u.rolesChronique', 'rc')
+            ->join('rc.chronique', 'c')
+            ->join('c.station', 'st')
+            ->join('st.sites', 's')
+            ->andWhere('s.observatoire = :obs')
+            ->addOrderBy('u.nom', 'ASC')
+            ->setParameters(['obs' => $obs]);
+        $results = $query->getQuery()->getResult();
+
+        foreach ($results as $result) {
+            $users[$result->getEmail()] = [
+                'nom'    => $result->getNom(),
+                'prenom' => $result->getPrenom(),
+                'date'   => $result->getDerniereConnection(),
+            ];
+        }
+
+        return $users;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Role.php b/src/Irstea/BdohSecurityBundle/Entity/Role.php
new file mode 100644
index 0000000000000000000000000000000000000000..120fc4daeaa3d4d2f8a154ca727a0c5477ecb589
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Role.php
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+/**
+ * Class Role.
+ */
+abstract class Role
+{
+    const GESTIONNAIRE = 'gestionnaire';
+    const CONTRIBUTEUR = 'contributeur';
+    const UTILISATEUR = 'utilisateur';
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $valeur;
+
+    /**
+     * @var Utilisateur
+     */
+    protected $utilisateur;
+
+    /**
+     * Role constructor.
+     *
+     * @param Utilisateur|null $utilisateur
+     * @param string|null      $valeur
+     * @param mixed|null       $target
+     */
+    public function __construct(Utilisateur $utilisateur = null, $valeur = null, $target = null)
+    {
+        if ($utilisateur !== null) {
+            $this->setUtilisateur($utilisateur);
+        }
+        if ($valeur !== null) {
+            $this->setValeur($valeur);
+        }
+        if ($target !== null) {
+            $this->setTarget($target);
+        }
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set utilisateur.
+     *
+     * @param Utilisateur $utilisateur
+     */
+    public function setUtilisateur(Utilisateur $utilisateur)
+    {
+        $this->utilisateur = $utilisateur;
+    }
+
+    /**
+     * Get utilisateur.
+     *
+     * @return Utilisateur
+     */
+    public function getUtilisateur()
+    {
+        return $this->utilisateur;
+    }
+
+    /**
+     * Set valeur.
+     *
+     * @param string $valeur
+     */
+    public function setValeur($valeur)
+    {
+        $this->valeur = $valeur;
+    }
+
+    /**
+     * Get valeur.
+     *
+     * @return string
+     */
+    public function getValeur()
+    {
+        return $this->valeur;
+    }
+
+    /**
+     * @param mixed  $user
+     * @param string $type
+     * @param mixed  $target
+     *
+     * @return bool
+     */
+    public function matches($user, $type, $target)
+    {
+        return ($user instanceof Utilisateur && $user->getId() === $this->utilisateur->getId()) &&
+            $type === $this->valeur &&
+            $this->isTarget($target);
+    }
+
+    /**
+     * @return bool
+     */
+    protected function isValid()
+    {
+        return $this->getTarget() !== null &&
+            $this->utilisateur instanceof Utilisateur &&
+            in_array($this->valeur, [self::CONTRIBUTEUR, self::GESTIONNAIRE, self::UTILISATEUR], true);
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->valeur . '@' . (string) $this->getTarget();
+    }
+
+    /**
+     * @param mixed $target
+     *
+     * @return bool
+     */
+    abstract protected function isTarget($target);
+
+    /**
+     * @return mixed
+     */
+    abstract public function getTarget();
+
+    /**
+     * @param mixed $target
+     */
+    abstract public function setTarget($target);
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/RoleChronique.php b/src/Irstea/BdohSecurityBundle/Entity/RoleChronique.php
new file mode 100644
index 0000000000000000000000000000000000000000..81dfa53bb1fe98ad29888569eaaa81246cf0c495
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/RoleChronique.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\ChroniqueRelatedInterface;
+use Irstea\BdohDataBundle\Entity\ChroniqueRelatedTrait;
+
+/**
+ * Class RoleChronique.
+ */
+class RoleChronique extends Role implements ChroniqueRelatedInterface
+{
+    use ChroniqueRelatedTrait;
+
+    /**
+     * @var Chronique
+     */
+    protected $chronique;
+
+    /**
+     * Set chronique.
+     *
+     * @param Chronique $chronique
+     */
+    public function setChronique(Chronique $chronique)
+    {
+        $this->chronique = $chronique;
+    }
+
+    /**
+     * Get chronique.
+     *
+     * @return Chronique
+     */
+    public function getChronique()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isTarget($target)
+    {
+        return $target instanceof Chronique && $target->getId() === $this->chronique->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTarget()
+    {
+        return $this->chronique;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setTarget($target)
+    {
+        $this->setChronique($target);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/RoleObservatoire.php b/src/Irstea/BdohSecurityBundle/Entity/RoleObservatoire.php
new file mode 100644
index 0000000000000000000000000000000000000000..2029099127fe1d55e0663dbf68393378ac317ef4
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/RoleObservatoire.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\ObservatoireRelatedInterface;
+
+/**
+ * Class RoleObservatoire.
+ */
+class RoleObservatoire extends Role implements ObservatoireRelatedInterface
+{
+    /**
+     * @var Observatoire
+     */
+    private $observatoire;
+
+    /**
+     * Set observatoire.
+     *
+     * @param Observatoire $observatoire
+     */
+    public function setObservatoire(Observatoire $observatoire)
+    {
+        $this->observatoire = $observatoire;
+    }
+
+    /**
+     * Get observatoire.
+     *
+     * @return Observatoire
+     */
+    public function getObservatoire()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isTarget($target)
+    {
+        return $target instanceof Observatoire && $target->getId() === $this->observatoire->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTarget()
+    {
+        return $this->observatoire;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setTarget($target)
+    {
+        $this->setObservatoire($target);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/RoleSite.php b/src/Irstea/BdohSecurityBundle/Entity/RoleSite.php
new file mode 100644
index 0000000000000000000000000000000000000000..50d7c0bd1ead1128ee9e128d684e4ea73e432b26
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/RoleSite.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Irstea\BdohDataBundle\Entity\SiteRelatedInterface;
+use Irstea\BdohDataBundle\Entity\SiteRelatedTrait;
+
+/**
+ * Class RoleSite.
+ */
+class RoleSite extends Role implements SiteRelatedInterface
+{
+    use SiteRelatedTrait;
+
+    /**
+     * @var SiteExperimental
+     */
+    protected $site;
+
+    /**
+     * Set site.
+     *
+     * @param SiteExperimental $site
+     */
+    public function setSite(SiteExperimental $site)
+    {
+        $this->site = $site;
+    }
+
+    /**
+     * Get site.
+     *
+     * @return SiteExperimental
+     */
+    public function getSite()
+    {
+        return $this->site;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isTarget($target)
+    {
+        return $target instanceof SiteExperimental && $target->getId() === $this->site->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTarget()
+    {
+        return $this->site;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setTarget($target)
+    {
+        $this->setSite($target);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSites()
+    {
+        return [$this->site];
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/TypeTravaux.php b/src/Irstea/BdohSecurityBundle/Entity/TypeTravaux.php
new file mode 100644
index 0000000000000000000000000000000000000000..2bd98562963b1fd986c7dbd84952fc63cc141ba1
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/TypeTravaux.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Irstea\BdohBundle\Model\LabelledEntityInterface;
+use Irstea\BdohBundle\Model\LabelledEntityTrait;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
+/**
+ * Irstea\BdohSecurityBundle\Entity\TypeTravaux.
+ *
+ * @UniqueEntity(fields="libelle")
+ * @UniqueEntity(fields="libelleEn")
+ */
+class TypeTravaux implements LabelledEntityInterface
+{
+    use LabelledEntityTrait;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getLibelle();
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Entity/Utilisateur.php b/src/Irstea/BdohSecurityBundle/Entity/Utilisateur.php
new file mode 100644
index 0000000000000000000000000000000000000000..7be71a77115e4f9ac148fe79bc24f5a78082a786
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Entity/Utilisateur.php
@@ -0,0 +1,1011 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Serializable;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\Security\Core\User\AdvancedUserInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * @UniqueEntity(fields="email", message="Utilisateur.email.alreadyUsed")
+ */
+class Utilisateur implements AdvancedUserInterface, Serializable
+{
+    const ROLE_ADMIN_FCT = 'FCT';
+    const ROLE_ADMIN_TECH = 'TECH';
+
+    /***************************************************************************
+     * Data stored in database
+     **************************************************************************/
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * @var string
+     * @Assert\Email(
+     *      message = "Utilisateur.email.invalid",
+     *      checkMX = true
+     * )
+     */
+    protected $email;
+
+    /**
+     * @var string
+     *             Today : not used !
+     */
+    protected $login;
+
+    /**
+     * @var string
+     * @Assert\NotBlank()
+     */
+    protected $prenom;
+
+    /**
+     * @var string
+     * @Assert\NotBlank()
+     */
+    protected $nom;
+
+    /**
+     * @var string
+     * @Assert\Length(
+     *      min        = 4,
+     *      minMessage = "Utilisateur.password.minLength({{ limit }})"
+     * )
+     */
+    protected $password;
+
+    /**
+     * @var string salt
+     */
+    protected $salt;
+
+    /**
+     * @var string
+     *             Assert\NotNull()
+     */
+    protected $organisme;
+
+    /**
+     * @var string
+     * @Assert\Length(
+     *      min        = 10,
+     *      minMessage = "Utilisateur.telephone.minLength({{ limit }})"
+     * )
+     */
+    protected $telephone;
+
+    /**
+     * @var string
+     *             Assert\NotNull()
+     */
+    protected $adresse;
+
+    /**
+     * @var \dateTime
+     */
+    protected $finAcces;
+
+    /**
+     * @var \DateTime
+     */
+    protected $derniereConnection;
+
+    /**
+     * @var Categorie
+     */
+    protected $categorie;
+
+    /**
+     * @var Besoin[]
+     */
+    protected $besoins;
+
+    /**
+     * @var RoleObservatoire[]
+     */
+    protected $rolesObservatoire;
+
+    /**
+     * @var RoleSite[]
+     */
+    protected $rolesSite;
+
+    /**
+     * @var RoleChronique[]
+     */
+    protected $rolesChronique;
+
+    /**
+     * @var string
+     */
+    protected $confirmationToken;
+
+    /**
+     * @var string|null
+     */
+    protected $roleAdmin;
+
+    /**
+     * Utilisateur constructor.
+     *
+     * @param int $id
+     */
+    public function __construct($id = null)
+    {
+        $this->id = $id;
+        $this->besoins = new ArrayCollection();
+        $this->rolesObservatoire = new ArrayCollection();
+        $this->rolesSite = new ArrayCollection();
+        $this->rolesChronique = new ArrayCollection();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set email.
+     *
+     * @param string $email
+     */
+    public function setEmail($email)
+    {
+        $this->email = $email;
+    }
+
+    /**
+     * Get email.
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * Set login.
+     *
+     * @param string $login
+     */
+    public function setLogin($login)
+    {
+        $this->login = $login;
+    }
+
+    /**
+     * Get login.
+     *
+     * @return string
+     */
+    public function getLogin()
+    {
+        return $this->login;
+    }
+
+    /**
+     * Set password.
+     *
+     * @param string $password
+     */
+    public function setPassword($password)
+    {
+        $this->password = $password;
+    }
+
+    /**
+     * Get password.
+     *
+     * @return string
+     */
+    public function getPassword()
+    {
+        return $this->password;
+    }
+
+    /**
+     * Set salt.
+     *
+     * @param string $salt
+     */
+    public function setSalt($salt)
+    {
+        $this->salt = $salt;
+    }
+
+    /**
+     * Gets salt.
+     * This is generated if it doesn't exist.
+     *
+     * @return string
+     */
+    public function getSalt()
+    {
+        if (null === $this->salt) {
+            // Unix dependent
+            $this->salt = bin2hex(file_get_contents('/dev/urandom', null, null, 0, 16));
+        }
+
+        return $this->salt;
+    }
+
+    /**
+     * Set prenom.
+     *
+     * @param string $prenom
+     */
+    public function setPrenom($prenom)
+    {
+        $this->prenom = $prenom;
+    }
+
+    /**
+     * Get prenom.
+     *
+     * @return string
+     */
+    public function getPrenom()
+    {
+        return $this->prenom;
+    }
+
+    /**
+     * Set nom.
+     *
+     * @param string $nom
+     */
+    public function setNom($nom)
+    {
+        $this->nom = $nom;
+    }
+
+    /**
+     * Get nom.
+     *
+     * @return string
+     */
+    public function getNom()
+    {
+        return $this->nom;
+    }
+
+    /**
+     * Set organisme.
+     *
+     * @param string $organisme
+     */
+    public function setOrganisme($organisme)
+    {
+        $this->organisme = $organisme;
+    }
+
+    /**
+     * Get organisme.
+     *
+     * @return string
+     */
+    public function getOrganisme()
+    {
+        return $this->organisme;
+    }
+
+    /**
+     * Set telephone.
+     *
+     * @param string $telephone
+     */
+    public function setTelephone($telephone)
+    {
+        $this->telephone = $telephone;
+    }
+
+    /**
+     * Get telephone.
+     *
+     * @return string
+     */
+    public function getTelephone()
+    {
+        return $this->telephone;
+    }
+
+    /**
+     * Set adresse.
+     *
+     * @param string $adresse
+     */
+    public function setAdresse($adresse)
+    {
+        $this->adresse = $adresse;
+    }
+
+    /**
+     * Get adresse.
+     *
+     * @return string
+     */
+    public function getAdresse()
+    {
+        return $this->adresse;
+    }
+
+    /**
+     * Set finAcces.
+     *
+     * @param \dateTime $finAcces
+     */
+    public function setFinAcces($finAcces)
+    {
+        $this->finAcces = $finAcces;
+    }
+
+    /**
+     * Get finAcces.
+     *
+     * @return \DateTime
+     */
+    public function getFinAcces()
+    {
+        return $this->finAcces;
+    }
+
+    /**
+     * Set derniereConnection.
+     *
+     * @param \DateTime $derniereConnection
+     */
+    public function setDerniereConnection(\DateTime $derniereConnection)
+    {
+        $this->derniereConnection = $derniereConnection;
+    }
+
+    /**
+     * Get derniereConnection.
+     *
+     * @return string
+     */
+    public function getDerniereConnection()
+    {
+        return $this->derniereConnection;
+    }
+
+    /**
+     * Set categorie.
+     *
+     * @param Categorie $categorie
+     */
+    public function setCategorie(Categorie $categorie)
+    {
+        $this->categorie = $categorie;
+    }
+
+    /**
+     * Get categorie.
+     *
+     * @return Categorie
+     */
+    public function getCategorie()
+    {
+        return $this->categorie;
+    }
+
+    /**
+     * Add besoins.
+     *
+     * @param Besoin $besoins
+     */
+    public function addBesoin(Besoin $besoins)
+    {
+        $this->besoins[] = $besoins;
+    }
+
+    /**
+     * Get besoins.
+     *
+     * @return Besoin[]|Collection
+     */
+    public function getBesoins()
+    {
+        return $this->besoins;
+    }
+
+    /**
+     * Add rolesObservatoire.
+     *
+     * @param RoleObservatoire $rolesObservatoire
+     */
+    public function addRoleObservatoire(RoleObservatoire $rolesObservatoire)
+    {
+        $this->rolesObservatoire[] = $rolesObservatoire;
+    }
+
+    /**
+     * Remove rolesObservatoire.
+     *
+     * @param RoleObservatoire $rolesObservatoire
+     */
+    public function removeRoleObservatoire(RoleObservatoire $rolesObservatoire)
+    {
+        $this->rolesObservatoire->removeElement($rolesObservatoire);
+    }
+
+    /**
+     * Get rolesObservatoire.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return RoleObservatoire[]|Collection
+     */
+    public function getRolesObservatoire()
+    {
+        if ($this->isAccountExpired()) {
+            return [];
+        }
+
+        return $this->rolesObservatoire;
+    }
+
+    /**
+     * Add rolesSite.
+     *
+     * @param RoleSite $rolesSite
+     */
+    public function addRoleSite(RoleSite $rolesSite)
+    {
+        $this->rolesSite[] = $rolesSite;
+    }
+
+    /**
+     * Remove rolesSite.
+     *
+     * @param RoleSite $rolesSite
+     */
+    public function removeRoleSite(RoleSite $rolesSite)
+    {
+        $this->rolesSite->removeElement($rolesSite);
+    }
+
+    /**
+     * Get rolesSite.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return RoleSite[]|Collection
+     */
+    public function getRolesSite()
+    {
+        if ($this->isAccountExpired()) {
+            return [];
+        }
+
+        return $this->rolesSite;
+    }
+
+    /**
+     * Add rolesChronique.
+     *
+     * @param RoleChronique $rolesChronique
+     */
+    public function addRoleChronique(RoleChronique $rolesChronique)
+    {
+        $this->rolesChronique[] = $rolesChronique;
+    }
+
+    /**
+     * Remove rolesChronique.
+     *
+     * @param RoleChronique $rolesChronique
+     */
+    public function removeRoleChronique(RoleChronique $rolesChronique)
+    {
+        $this->rolesChronique->removeElement($rolesChronique);
+    }
+
+    /**
+     * Get rolesChronique.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return RoleChronique[]|Collection
+     */
+    public function getRolesChronique()
+    {
+        if ($this->isAccountExpired()) {
+            return [];
+        }
+
+        return $this->rolesChronique;
+    }
+
+    /**
+     * Set confirmationToken.
+     *
+     * @param string $confirmationToken
+     */
+    public function setConfirmationToken($confirmationToken)
+    {
+        $this->confirmationToken = $confirmationToken;
+    }
+
+    /**
+     * Get confirmationToken.
+     *
+     * @return string
+     */
+    public function getConfirmationToken()
+    {
+        return $this->confirmationToken;
+    }
+
+    /***************************************************************************
+     * Methods used for User authorization
+     **************************************************************************/
+
+    /**
+     * Factorization function for very similar behaviour in the three "hasRoleYYY" functions.
+     *
+     * @param string[]|string $expectedRoles
+     * @param mixed[]|mixed   $targets
+     * @param Role[]          $actualRoles
+     *
+     * @return bool
+     */
+    private function hasRole($expectedRoles, $targets, $actualRoles)
+    {
+        if (!\is_array($expectedRoles) && !($expectedRoles instanceof \Traversable)) {
+            $expectedRoles = [$expectedRoles];
+        }
+
+        if (!\is_array($targets) && !($targets instanceof \Traversable)) {
+            $targets = [$targets];
+        }
+
+        foreach ($expectedRoles as $role) {
+            foreach ($targets as $target) {
+                foreach ($actualRoles as $actualRole) {
+                    if ($actualRole->matches($this, $role, $target)) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Chroniques.
+     *
+     * @param string[]|string       $roles
+     * @param Chronique[]|Chronique $chroniques
+     *
+     * @return bool
+     */
+    public function hasRoleChronique($roles, $chroniques)
+    {
+        return $this->hasRole($roles, $chroniques, $this->rolesChronique);
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Chroniques.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @param string[]|string       $roles
+     * @param Chronique[]|Chronique $chroniques
+     *
+     * @return bool
+     */
+    public function securedHasRoleChronique($roles, $chroniques)
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        return $this->hasRole($roles, $chroniques, $this->rolesChronique);
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Sites.
+     *
+     * @param string[]|string                     $roles
+     * @param SiteExperimental[]|SiteExperimental $sites
+     *
+     * @return bool
+     */
+    public function hasRoleSite($roles, $sites)
+    {
+        return $this->hasRole($roles, $sites, $this->rolesSite);
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Sites.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @param string[]|string                     $roles
+     * @param SiteExperimental[]|SiteExperimental $sites
+     *
+     * @return bool
+     */
+    public function securedHasRoleSite($roles, $sites)
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        return $this->hasRole($roles, $sites, $this->rolesSite);
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Observatoires.
+     *
+     * @param string[]|string             $roles
+     * @param Observatoire[]|Observatoire $observatoires
+     *
+     * @return bool
+     */
+    public function hasRoleObservatoire($roles, $observatoires)
+    {
+        return $this->hasRole($roles, $observatoires, $this->rolesObservatoire);
+    }
+
+    /**
+     * Determines if $this has some Roles regarding any of Observatoires.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @param string[]|string             $roles
+     * @param Observatoire[]|Observatoire $observatoires
+     *
+     * @return bool
+     */
+    public function securedHasRoleObservatoire($roles, $observatoires)
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        return $this->hasRole($roles, $observatoires, $this->rolesObservatoire);
+    }
+
+    /**
+     * Part of UserInterface.
+     * Returns the roles granted to the user.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return array
+     */
+    public function getRoles()
+    {
+        // This is supposed to be the minimum for functionnal Users
+        $roles = ['ROLE_USER'];
+
+        if ($this->isAccountExpired()) {
+            return $roles;
+        }
+
+        $obs = Observatoire::getCurrent();
+        if ($obs) {
+            $sites = $obs->getSites();
+
+            if ($this->hasRoleObservatoire(Role::GESTIONNAIRE, $obs)) {
+                $roles[] = 'ROLE_ADMIN';
+            } elseif ($this->hasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $sites)) {
+                $roles[] = 'ROLE_ADMIN';
+            }
+        }
+
+        if ($this->roleAdmin !== null) {
+            $roles[] = 'ROLE_ADMIN_' . $this->roleAdmin;
+        }
+
+        return $roles;
+    }
+
+    /**
+     * Get roleAdmin.
+     *
+     * @return string|null
+     */
+    public function getRoleAdmin()
+    {
+        return $this->roleAdmin;
+    }
+
+    /**
+     * Set roleAdmin.
+     *
+     * @param string $roleAdmin
+     *
+     * @return self
+     */
+    public function setRoleAdmin($roleAdmin)
+    {
+        if (!in_array($roleAdmin, [null, self::ROLE_ADMIN_TECH, self::ROLE_ADMIN_FCT], true)) {
+            throw new \InvalidArgumentException("Invalid roleAdmin: $roleAdmin");
+        }
+        $this->roleAdmin = $roleAdmin;
+
+        return $this;
+    }
+
+    /**
+     * isGestionnaireDesObservatoires.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return bool
+     */
+    public function isGestionnaireDesObservatoires()
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        return $this->getRoleAdmin() !== null;
+    }
+
+    /**
+     * @param bool $enable
+     */
+    public function setGestionnaireDesObservatoires($enable)
+    {
+        if ($enable && $this->roleAdmin === null) {
+            $this->roleAdmin = self::ROLE_ADMIN_FCT;
+        } elseif (!$enable && $this->roleAdmin === self::ROLE_ADMIN_FCT) {
+            $this->roleAdmin = null;
+        }
+    }
+
+    /**
+     * isATrustedUserOfCurrentObservatory.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return bool
+     */
+    public function isATrustedUserOfCurrentObservatory()
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        $obs = Observatoire::getCurrent();
+        if ($obs) {
+            return $this->hasRoleObservatoire([Role::UTILISATEUR], $obs);
+        }
+
+        return false;
+    }
+
+    /**
+     * isAContributorOfCurrentObservatory.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return bool
+     */
+    public function isAContributorOfCurrentObservatory()
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        $obs = Observatoire::getCurrent();
+        if ($obs) {
+            $sites = $obs->getSites();
+
+            return $this->hasRoleSite([Role::CONTRIBUTEUR], $sites);
+        }
+
+        return false;
+    }
+
+    /**
+     * isASiteManagerOfCurrentObservatory.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return bool
+     */
+    public function isASiteManagerOfCurrentObservatory()
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        $obs = Observatoire::getCurrent();
+        if ($obs) {
+            $sites = $obs->getSites();
+
+            return $this->hasRoleSite([Role::GESTIONNAIRE], $sites);
+        }
+
+        return false;
+    }
+
+    /**
+     * isAManagerOfCurrentObservatory.
+     *
+     * Secured with isAccountExpired.
+     *
+     * @return bool
+     */
+    public function isAManagerOfCurrentObservatory()
+    {
+        if ($this->isAccountExpired()) {
+            return false;
+        }
+
+        $obs = Observatoire::getCurrent();
+        if ($obs) {
+            return $this->hasRoleObservatoire([Role::GESTIONNAIRE], $obs);
+        }
+
+        return false;
+    }
+
+    /***************************************************************************
+     * Methods used for User authentication
+     **************************************************************************/
+
+    /**
+     * Part of UserInterface.
+     * Returns the username used to authenticate the user.
+     */
+    public function getUsername()
+    {
+        return $this->getEmail();
+    }
+
+    /**
+     * Part of UserInterface.
+     * Determines if two users are equals.
+     *
+     * @param UserInterface $user
+     *
+     * @return bool
+     */
+    public function equals(UserInterface $user)
+    {
+        if (null !== $user) {
+            return ($this->getId() === $user->getId()) &&
+                ($this->getUsername() === $user->getUsername());
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isAccountNonExpired()
+    {
+        return true; //(!$this->finAcces) || ($this->finAcces > new \DateTime('now'));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isAccountNonLocked()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCredentialsNonExpired()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isEnabled()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isAccountExpired()
+    {
+        return $this->finAcces !== null && $this->finAcces < new \DateTime('now');
+    }
+
+    /***************************************************************************
+     * Other methods.
+     **************************************************************************/
+
+    /**
+     * Part of UserInterface.
+     * Removes sensitive data from the user.
+     */
+    public function eraseCredentials()
+    {
+        /*
+         * TODO: track the following BUG.
+         * If we erase 'password' and 'salt' fields,
+         * SonataAdminBundle detects that 'Utilisateur' has changed.
+         * Then, he tries to update it (why ?? I don't know) and PostegrSQL crashes the error
+         * "[...] Not null violation: 7 ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne "password" [...]".
+         * Prehaps, the next updates of SonataAdminBundle will resolve this bug.
+         */
+
+        //$this->password = null;
+        //$this->salt = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function serialize()
+    {
+        return serialize(
+            [
+                'id'    => $this->getId(),
+                'email' => $this->getEmail(),
+            ]
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serializedData)
+    {
+        $data = unserialize($serializedData);
+        $this->id = $data['id'];
+        $this->email = $data['email'];
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->prenom . ' ' . $this->nom;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Exception/ForbiddenException.php b/src/Irstea/BdohSecurityBundle/Exception/ForbiddenException.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b2db4b1a86324ecd267ef20cf44a81745a413e9
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Exception/ForbiddenException.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Exception;
+
+use Irstea\BdohBundle\Exception\Exception;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+
+/**
+ * Thrown when trying to view a chronique with unficcient rights.
+ */
+class ForbiddenException extends AccessDeniedHttpException implements Exception
+{
+    public function __construct()
+    {
+        parent::__construct('You have no sufficient rights to see this Chronique');
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/BesoinType.php b/src/Irstea/BdohSecurityBundle/Form/BesoinType.php
new file mode 100644
index 0000000000000000000000000000000000000000..da6dfdd62c29b7692bf02089a0e08d8903ed7a49
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/BesoinType.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+
+class BesoinType extends AbstractType
+{
+    protected $em;
+
+    protected $locale;
+
+    public function __construct(\Doctrine\ORM\EntityManagerInterface $em, $locale = 'fr')
+    {
+        $this->em = $em;
+        $this->locale = $locale;
+    }
+
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $propertyObjectif = 'libelle';
+        $propertyType = 'libelle';
+        $propertyParametre = 'nom';
+        $isLocaleEn = \strpos($this->locale, 'en') === 0;
+        if ($isLocaleEn) {
+            $propertyObjectif .= 'En';
+            $propertyType .= 'En';
+            $propertyParametre .= 'En';
+        }
+
+        $builder
+            ->add(
+                'stations',
+                null,
+                [
+                    'label'         => 'besoin.stations',
+                    'required'      => true,
+                    'query_builder' => $this->em->getRepository('IrsteaBdohDataBundle:Station')->createQueryBuilder('st')->orderBy('st.nom', 'ASC'),
+                ]
+            )
+            ->add('duree', 'text', ['label' => 'besoin.duree', 'required' => true])
+            ->add(
+                'objectif',
+                null,
+                [
+                    'label'         => 'besoin.objectif',
+                    'required'      => true,
+                    'query_builder' => $this->em->getRepository('IrsteaBdohSecurityBundle:ObjectifRecherche')->createQueryBuilder('ore')->orderBy('ore.' . $propertyObjectif, 'ASC'),
+                    'property'      => $propertyObjectif,
+                ]
+            )
+            ->add(
+                'type',
+                null,
+                [
+                    'label'         => 'besoin.type',
+                    'required'      => true,
+                    'query_builder' => $this->em->getRepository('IrsteaBdohSecurityBundle:TypeTravaux')->createQueryBuilder('tt')->orderBy('tt.' . $propertyType, 'ASC'),
+                    'property'      => $propertyType,
+                ]
+            )
+            ->add(
+                'parametres',
+                null,
+                [
+                    'label'         => 'besoin.parametres',
+                    'required'      => true,
+                    'query_builder' => $this->em->getRepository('IrsteaBdohDataBundle:Observatoire')->createParametresQueryBuilder($isLocaleEn),
+                    'property'      => $propertyParametre,
+                ]
+            )
+            ->add(
+                'details',
+                'textarea',
+                [
+                    'label'    => 'besoin.details',
+                    'required' => true,
+                    'attr'     => ['class' => 'col-md-17', 'style' => 'height: 150px;'],
+                ]
+            );
+    }
+
+    public function setDefaultOptions(OptionsResolverInterface $resolver)
+    {
+        $resolver->setDefaults(
+            [
+                'data_class' => 'Irstea\BdohSecurityBundle\Entity\Besoin',
+            ]
+        );
+    }
+
+    public function getName()
+    {
+        return 'irstea_bdohsecuritybundle_besointype';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordTransformer.php b/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordTransformer.php
new file mode 100644
index 0000000000000000000000000000000000000000..fffce0a4cb52a5c96c942f25c8cbf791b7611e78
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordTransformer.php
@@ -0,0 +1,50 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Symfony\Component\Form\DataTransformerInterface;
+
+/**
+ * Class CheckedPasswordTransformer.
+ */
+final class CheckedPasswordTransformer implements DataTransformerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function transform($value)
+    {
+        return ['main' => $value, 'repeat' => null];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reverseTransform($value)
+    {
+        if (is_array($value) && \array_key_exists('main', $value)) {
+            return $value['main'];
+        }
+
+        return null;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordType.php b/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordType.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b28adcbaf2737f8d1ab9c57e9a870f507a2ca0b
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/CheckedPasswordType.php
@@ -0,0 +1,87 @@
+<?php declare(strict_types=1);
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\FormType;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormError;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+/**
+ * Class CheckedPasswordType.
+ */
+final class CheckedPasswordType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('main', PasswordType::class, [
+                'label'       => $options['label'],
+                'required'    => $options['required'] ?? false,
+                'constraints' => $options['constraints'],
+            ])
+            ->add('repeat', PasswordType::class, [
+                'label'    => 'passwordRepeat',
+                'required' => $options['required'] ?? false,
+            ])
+            ->addModelTransformer(new CheckedPasswordTransformer())
+            ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
+                $form = $event->getForm();
+                $main = $form->get('main');
+                $repeat = $form->get('repeat');
+                if (!$main->isValid() || !$repeat->isValid() || $main->getData() === $repeat->getData()) {
+                    return;
+                }
+                $repeat->addError(new FormError('Utilisateur.password.badRepetition'));
+            });
+
+        return $builder;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        parent::configureOptions($resolver);
+
+        $resolver->setDefaults([
+            'cascade_validation' => true,
+            'empty_data'         => ['main' => null, 'repeat' => null],
+        ]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParent()
+    {
+        return FormType::class;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/EditUtilisateurType.php b/src/Irstea/BdohSecurityBundle/Form/EditUtilisateurType.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f7111cb21c5b586cab62ce943fc56aef2fbbe4b
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/EditUtilisateurType.php
@@ -0,0 +1,86 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Irstea\BdohSecurityBundle\Validator\Constraint\UserPassword;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormError;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+
+/**
+ * {@inheritdoc}
+ */
+class EditUtilisateurType extends UtilisateurType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        parent::buildForm($builder, $options);
+
+        $builder
+            // Old password : virtual field
+            ->add(
+                'oldPassword',
+                PasswordType::class,
+                [
+                    'required'    => false,
+                    'mapped'      => false,
+                    'constraints' => new UserPassword(),
+                    'label'       => 'oldPassword',
+                ]
+            )
+            // New password
+            ->add('password', CheckedPasswordType::class, ['required' => false, 'label' => 'newPassword']);
+
+        // Checks that 'oldPassword' and 'newPassword' are both empty, or both full.
+        $builder->addEventListener(
+            FormEvents::POST_SUBMIT,
+            function (FormEvent $event) {
+                $form = $event->getForm();
+                $oldPassword = $form->get('oldPassword');
+                $newPassword = $form->get('password');
+
+                // oldPassword full && newPassword empty => error
+                if ($oldPassword->getData()) {
+                    if (!$newPassword->getData()) {
+                        $newPassword->addError(new FormError('Utilisateur.newPassword.mandatory'));
+                    }
+                } // oldPassword empty && newPassword full => error
+                elseif ($newPassword->getData()) {
+                    $oldPassword->addError(new FormError('Utilisateur.oldPassword.mandatory'));
+                }
+            }
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'irstea_bdohsecuritybundle_editutilisateurtype';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/NewUtilisateurType.php b/src/Irstea/BdohSecurityBundle/Form/NewUtilisateurType.php
new file mode 100644
index 0000000000000000000000000000000000000000..f646d626f3459d3a205c84f6e10da64737dc6bc2
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/NewUtilisateurType.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Gregwar\CaptchaBundle\Type\CaptchaType;
+use Symfony\Component\Form\FormBuilderInterface;
+
+/**
+ * {@inheritdoc}
+ */
+class NewUtilisateurType extends UtilisateurType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        parent::buildForm($builder, $options);
+        $builder->add('captcha', CaptchaType::class, ['required' => true, 'label' => 'captcha.info']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'irstea_bdohsecuritybundle_newutilisateurtype';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/ResettingUtilisateurType.php b/src/Irstea/BdohSecurityBundle/Form/ResettingUtilisateurType.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ddec1b21cf0572673cdd786eb9f25266e0ebe79
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/ResettingUtilisateurType.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Gregwar\CaptchaBundle\Type\CaptchaType;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+
+/**
+ * {@inheritdoc}
+ */
+class ResettingUtilisateurType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            // New password
+            ->add('password', CheckedPasswordType::class, ['required' => true, 'label' => 'newPassword'])
+            ->add('captcha', CaptchaType::class, ['required' => true, 'label' => 'captcha.info']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'irstea_bdohsecuritybundle_editutilisateurtype';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Form/UtilisateurType.php b/src/Irstea/BdohSecurityBundle/Form/UtilisateurType.php
new file mode 100644
index 0000000000000000000000000000000000000000..9419c5e638fce9d4b7c7453f675b5f89594c792e
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Form/UtilisateurType.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Form;
+
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\EmailType;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\Extension\Core\Type\TextareaType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+
+/**
+ * {@inheritdoc}
+ */
+abstract class UtilisateurType extends AbstractType
+{
+    /**
+     * @var \Doctrine\ORM\EntityManagerInterface
+     */
+    protected $em;
+
+    /**
+     * @var string
+     */
+    protected $locale;
+
+    /**
+     * UtilisateurType constructor.
+     *
+     * @param \Doctrine\ORM\EntityManagerInterface $em
+     * @param string                               $locale
+     */
+    public function __construct(\Doctrine\ORM\EntityManagerInterface $em, $locale = 'fr')
+    {
+        $this->em = $em;
+        $this->locale = $locale;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $propertyCategorie = 'libelle';
+        if (\strpos($this->locale, 'en') === 0) {
+            $propertyCategorie .= 'En';
+        }
+        $builder
+            ->add('prenom', TextType::class, ['required' => true, 'label' => 'prenom'])
+            ->add('nom', TextType::class, ['required' => true, 'label' => 'nom'])
+            ->add('organisme', TextType::class, ['required' => true, 'attr' => ['class' => 'col-md-8'], 'label' => 'organisme'])
+            ->add('email', EmailType::class, ['required' => true, 'attr' => ['class' => 'col-md-8'], 'label' => 'email'])
+            //->add('password', PasswordType::class, ['required' => true, 'label' => 'password'])
+            ->add('password', CheckedPasswordType::class, ['required' => true, 'label' => 'password'])
+            ->add('telephone', TextType::class, ['required' => true, 'label' => 'telephone'])
+            ->add('adresse', TextareaType::class, ['required' => true, 'attr' => ['class' => 'col-md-10', 'style' => 'height: 80px;'], 'label' => 'adresse'])
+            ->add(
+                'categorie',
+                null,
+                [
+                    'label'         => 'categorie',
+                    'required'      => true,
+                    'query_builder' => $this->em->getRepository('IrsteaBdohSecurityBundle:Categorie')->createQueryBuilder('cat')->orderBy('cat.' . $propertyCategorie, 'ASC'),
+                    'property'      => $propertyCategorie,
+                ]
+            );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDefaultOptions(OptionsResolverInterface $resolver)
+    {
+        $resolver->setDefaults(
+            [
+                'data_class' => Utilisateur::class,
+            ]
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'irstea_bdohsecuritybundle_utilisateurtype';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/IrsteaBdohSecurityBundle.php b/src/Irstea/BdohSecurityBundle/IrsteaBdohSecurityBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..edf6ad92429b7898055db68a1bc6537128c44b2d
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/IrsteaBdohSecurityBundle.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class IrsteaBdohSecurityBundle extends Bundle
+{
+}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/assets/entries/utilisateur/all.js b/src/Irstea/BdohSecurityBundle/Resources/assets/entries/utilisateur/all.js
new file mode 100644
index 0000000000000000000000000000000000000000..1ac606d91f3a17eb961558e8c5b49ebf7fc93315
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/assets/entries/utilisateur/all.js
@@ -0,0 +1,6 @@
+const $ = require('jquery');
+
+require('@IrsteaBdohBundle/lib/date-time/range-picker');
+require('@IrsteaBdohBundle/lib/datatables');
+
+$(() => $('.table').DataTable());
diff --git a/src/Irstea/BdohSecurityBundle/Resources/config/doctrine/mapping.orm.yml b/src/Irstea/BdohSecurityBundle/Resources/config/doctrine/mapping.orm.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b0de407320622815243387fe04113a7db31aedc3
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/config/doctrine/mapping.orm.yml
@@ -0,0 +1,301 @@
+Empty:
+################################################################################
+# Empty class because of "the first line bug".
+################################################################################
+#
+# WARNING : entities used in a discriminatorMap MUST EXIST !!!
+# This can require an entities generation in two steps (the first, without the discriminatorMap)
+# then manually set the "extends Mother" on all son classes.
+#
+################################################################################
+#
+# OVERVIEW :
+#   Role
+#   RoleObservatoire
+#   RoleSite
+#   RoleChronique
+#   Utilisateur
+#   Besoin
+#   Categorie
+#   TypeTravaux
+#   ObjectifRecherche
+#
+################################################################################
+
+
+################################################################################
+Irstea\BdohSecurityBundle\Entity\Role:
+    type: entity
+    inheritanceType: SINGLE_TABLE
+    discriminatorMap:
+        simple:       Role
+        observatoire: RoleObservatoire
+        site:         RoleSite
+        chronique:    RoleChronique
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        valeur: #should always be a const defined in SecurityManager or null
+            type: string
+            nullable: false
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\RoleObservatoire:
+    type: entity
+    extends: Role
+    manyToOne:
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            inversedBy: rolesObservatoire
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: CASCADE
+                nullable: false
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\RoleSite:
+    type: entity
+    extends: Role
+    manyToOne:
+        site:
+            targetEntity: Irstea\BdohDataBundle\Entity\SiteExperimental
+            joinColumn:
+                name: site_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            inversedBy: rolesSite
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: CASCADE
+                nullable: false
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\RoleChronique:
+    type: entity
+    extends: Role
+    manyToOne:
+        chronique:
+            targetEntity: Irstea\BdohDataBundle\Entity\Chronique
+            joinColumn:
+                name: chronique_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            inversedBy: rolesChronique
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: CASCADE
+                nullable: false
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\Utilisateur:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        # Today : used as username (ie as login)
+        email:
+            type: string
+        # Today : not used
+        login:
+            type: string
+            nullable: true
+        # Encrypted password
+        password:
+            type: string
+        # Salt is randomly generated and used for password encryption
+        salt:
+            type: string
+        prenom:
+            type: string
+            nullable: true
+        nom:
+            type: string
+            nullable: true
+        organisme:
+            type: string
+            nullable: true
+        telephone:
+            type: string
+            nullable: true
+        adresse:
+            type: string
+            nullable: true
+        finAcces:
+            type: date
+            nullable: true
+        derniereConnection:
+            type: datetime
+            nullable: true
+        confirmationToken:
+            type: string
+            nullable: true
+        roleAdmin:
+            type: string
+            nullable: true
+
+    manyToOne:
+        categorie:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Categorie
+
+    oneToMany:
+        besoins:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Besoin
+            mappedBy: utilisateur
+            cascade: [persist]
+
+        rolesObservatoire:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\RoleObservatoire
+            mappedBy: utilisateur
+            cascade: [persist]
+
+        rolesSite:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\RoleSite
+            mappedBy: utilisateur
+            cascade: [persist]
+
+        rolesChronique:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\RoleChronique
+            mappedBy: utilisateur
+            cascade: [persist]
+
+    repositoryClass: Irstea\BdohSecurityBundle\Entity\Repository\UtilisateurRepository
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\Besoin:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        duree:
+            type: string
+            nullable: true
+        details:
+            type: string
+            nullable: true
+            length: 1023
+        traite:
+            type: boolean
+            nullable: true
+    manyToOne:
+        utilisateur:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\Utilisateur
+            inversedBy: besoins
+            joinColumn:
+                name: utilisateur_id
+                referenceColumnName: id
+                onDelete: CASCADE
+        objectif:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\ObjectifRecherche
+        type:
+            targetEntity: Irstea\BdohSecurityBundle\Entity\TypeTravaux
+        observatoire:
+            targetEntity: Irstea\BdohDataBundle\Entity\Observatoire
+            joinColumn:
+                name: observatoire_id
+                referenceColumnName: id
+                onDelete: CASCADE
+    manyToMany:
+        parametres:
+            targetEntity: Irstea\BdohDataBundle\Entity\TypeParametre
+            joinTable:
+                name: besoins_parametres
+                joinColumns:
+                    besoin_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+                inverseJoinColumns:
+                    parametre_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+        stations:
+            targetEntity: Irstea\BdohDataBundle\Entity\Station
+            joinTable:
+                name: besoins_stations
+                joinColumns:
+                    besoin_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+                inverseJoinColumns:
+                    station_id:
+                        referencedColumnName: id
+                        onDelete: CASCADE
+
+    repositoryClass: Irstea\BdohSecurityBundle\Entity\Repository\BesoinRepository
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\Categorie:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        libelle:
+            type: string
+            unique: TRUE
+        libelleEn:
+            type: string
+            unique: TRUE
+
+    repositoryClass: Irstea\BdohSecurityBundle\Entity\Repository\CategorieRepository
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\TypeTravaux:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        libelle:
+            type: string
+            unique: TRUE
+        libelleEn:
+            type: string
+            unique: TRUE
+
+    repositoryClass: Irstea\BdohSecurityBundle\Entity\Repository\TypeTravauxRepository
+
+#################################################################################
+Irstea\BdohSecurityBundle\Entity\ObjectifRecherche:
+    type: entity
+    id:
+        id:
+            type: integer
+            generator:
+                strategy: AUTO
+    fields:
+        libelle:
+            type: string
+            unique: TRUE
+        libelleEn:
+            type: string
+            unique: TRUE
+
+    repositoryClass: Irstea\BdohSecurityBundle\Entity\Repository\ObjectifRechercheRepository
+
+#################################################################################
diff --git a/src/Irstea/BdohSecurityBundle/Resources/config/services.yml b/src/Irstea/BdohSecurityBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1ff197a6ec3732cbb111f6048b4380b02883c2f9
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/config/services.yml
@@ -0,0 +1,9 @@
+services:
+    irstea_bdoh_security_bundle_user_create:
+        class: Irstea\BdohSecurityBundle\Command\UtilisateurNewCreateCommand
+        arguments:
+            - "@doctrine.orm.default_entity_manager"
+            - "@security.encoder_factory"
+        tags:
+            - { name: console.command }
+
diff --git a/src/Irstea/BdohSecurityBundle/Resources/doc/attributionDroits.ep b/src/Irstea/BdohSecurityBundle/Resources/doc/attributionDroits.ep
new file mode 100644
index 0000000000000000000000000000000000000000..b358686be4e4101899935d0a0028c8fb400fc3f1
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/doc/attributionDroits.ep
@@ -0,0 +1,608 @@
+<?xml version="1.0"?>
+<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Demande d'accès - création / connexion</Property><Property name="id">1343747555439_2581</Property><Property name="width">908</Property><Property name="height">800</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,19,703)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="21990af9a7a847aebba75e3e3546f324" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="cd5981d746954d6992902ec41cebe011" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="a925b77d232a40b0be32ea643845cbea">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#cd5981d746954d6992902ec41cebe011" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#a925b77d232a40b0be32ea643845cbea)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="cf1931ebd68a4c4c8abcd3034c0f98f6"/>
+            <use xlink:href="#cd5981d746954d6992902ec41cebe011" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="1730323769e14985ba5bff84bdf54852" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="b6b2e49ae2004c7389485cee5d5f20a8" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="352e5c6d79e1487583d69940c50f3e92" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="4250b6e763c74e3b8797474f74b1c873"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="60da1882e1e34e42a9ce54241cb7e58f" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="545ab1c515e94ea6ab4aeb54afe89a63" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="4a773f9c4dcd451a960f3c4192293c77" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="fffe7eb76a8545acb02d5702d51fab71" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="bde71abffbd64cb392fa08ef541e4b28" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="d6c23c6d25364188bdaffa6ba58b49a4" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6aadc83ea43d41f8b8e47659b428f9a8">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#d6c23c6d25364188bdaffa6ba58b49a4" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6aadc83ea43d41f8b8e47659b428f9a8)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="514e1b48706847f2a162c02460a4b184"/>
+            <use xlink:href="#d6c23c6d25364188bdaffa6ba58b49a4" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="181bc4d9b02347848886aa8c457ab259" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="043b9ff799954e16afab5c4efe9d886b" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="6b29cad34ada43419f5b1ce71ad5b6e6" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="598a24ff649d4c508df816433d14be05">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#6b29cad34ada43419f5b1ce71ad5b6e6" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#598a24ff649d4c508df816433d14be05)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8596f1a00c2f4d56b6929938e7ef30b6"/>
+            <use xlink:href="#6b29cad34ada43419f5b1ce71ad5b6e6" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="c1166b164cb444ce989ac25e475fd913" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="3e5239f414ff4417a40a8841e95b6315" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="bc7bf4758d264c80b8b797db1743749b">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="1784c69dfe684ef493ee32d20f7f4131">
+                    <ellipse p:name="ellipse" id="af18c7f3d87042b79e49c5cf410a119e" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#1784c69dfe684ef493ee32d20f7f4131" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#bc7bf4758d264c80b8b797db1743749b)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="573866ff2775475f9bce2b51f23786a6"/>
+            <use xlink:href="#1784c69dfe684ef493ee32d20f7f4131" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="e61c6ae1d87145e58af93e81f0f919ce" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="666eb10e95ee488bba8ffda61d8671a2" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ba961f2af64c43b9ad1edee9a87fc8c8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9bfbb14fe14743778706b419e40cb1b8"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e468a6a5e9734310bf044e04b29f3a02" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="937954ab570a4ce89e905a038c49d8d8" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="9bf0bc5e46fa453e8ee9446b2af8ed5b"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="545a108c84174816b645444772f56dbe" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c175f70e69a64f5a9f851a7dc85a833e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6d95483eec014022ba4eebd4714ff0d4"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="1c9ac65069a44a688b381339acfe6cf4" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="0bf15a105dbb4e8fab4f8f3ff4ffc8b9" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="80ff4aaa23104e0d9dc052b5c6546a7f" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="d433da7fe04b4a41b4d9a99359665d09" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="97a48617f2ae4676a43ad69ee599c7e7" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="35d3c60e62604a04be76c05f6d739bb0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7ec4046b8ccd43bb88fa426fcd5cccb0"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="770879b4cba74430b5c1c72538fa80f6" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="b7b10b41b4d444cabf82f5a5907e4824" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="a71e3a8bed0449bb8f018182e1da8ba1" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="f0d716e85fa043d6b9ec50956661bf44" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="d1c0899d836544c2a1587d49cca8f28f" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="809b7108fb224906b939751041ea203e" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="82efce2fd1f547f5affa72af04eb7785" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="8fcc7e1e96254b2da5d937dc90a6180e" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="79b38b7aefbd46fe90513fed650e8565" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="02c2669545984e3693575b245b158f02" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6352ace62a86498281eca54c9cfb3ac4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ccc7992b2ac94946b42061f7c63cda4b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="1104add72f0c4d59b59dba935c08049a" transform="matrix(1,0,0,1,425,189)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[2,488]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="e46fa7a6a6ba49da82d3f2d4bdf2826b" d="M 0 0 L 2 488 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="38c618e1367e4de48ae0df1689bd2349" transform="translate(0,0)" d="M 0 0 L 2 488 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="abbf70f0a035469a935e21d18ca2b178" transform="matrix(1,0,0,1,37,203)"><p:metadata><p:property name="textContent"><![CDATA[Création de compte<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="185" height="24" p:name="htmlObject" id="1e270845e624444c957b96ba757f0aa7" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="5b40cd7e5d2c400a8e0027c247d2a9a7" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Création de compte<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="123a9d557ce24baf879fddd4f6cc9f40" transform="matrix(1,0,0,1,458,203)"><p:metadata><p:property name="textContent"><![CDATA[Connexion]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="101" height="24" p:name="htmlObject" id="72646ac4716b4573b40ba4d893cc6839" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="39c4c856d8744d1db53012470c67adda" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Connexion</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="12793f5d8de14edba3e56964a32bbaaf" transform="matrix(1,0,0,1,37,189)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Je ne possède aucun compte BDOH]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ede2029b737f4e12af7fb06ccd5f8a9b" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="127c6cc9b1684fb9b815c1d18efe6b2e"><tspan x="0" y="0">Je ne possède aucun compte BDOH</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="cb172ceb2b0b42578ceb549e86e980f3" transform="matrix(1,0,0,1,458,189)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Je possède déjà un compte sur un observatoire BDOH]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="0cb62abcaccc4b89a0c61ac50cf36ed1" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d10f066dd35d4943bbe0bb83dc01acd6"><tspan x="0" y="0">Je possède déjà un compte sur un observatoire BDOH</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="31372280d4014664be93db5cb0342332" transform="matrix(1,0,0,1,571,250)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="32d2ae1970ca4a0fbd365bc862dcb71b" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="fe40fb1199de41099e2319f07d8f06d6" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="46c2f4bf82fc48e99978f47b5bbd5477" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="2fe950d463cd4f2ab83857e7c2a8c0db" transform="matrix(1,0,0,1,472,256)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Email]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="173f73a70ae84383b2301f60de02d08f" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="4b2a9d01df094460b44586662cc5623c"><tspan x="0" y="0">Email</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="087bd4f7ce7742b8bf71e7013b42d85f" transform="matrix(1,0,0,1,571,282)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="450b3c1b3573406e912b66887ccefdd1" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="8db2f7463ec94bcfa34f0851b0e22e4c" transform="translate(0.5,0.5)" d="M 0 0 L 18.281233383148372 -0.1988462409379006 L 41.2997873048191 -0.09067776386387061 L 58.43720736976192 0.37702383447201826 L 81.01610968015035 0.3732863225367834 L 102.89835808662649 0.10560169084696647 L 126.28482269422305 -0.3245153227158585 L 147.25825278629736 -0.030626848014703945 L 167.36731706435197 -0.19300825079307538 L 186.9922166159655 0.15679691719024325 L 200 0 L 200.35752104858585 11.973340391187273 L 200 25 L 176.94169469453843 24.80348104405999 L 160.33485870948493 24.815852591608486 L 142.37268622857346 24.60324415205311 L 118.51607030502043 24.820176719518507 L 101.73308939883471 25.486446321021276 L 78.99051481922781 25.422422217365803 L 56.807150299087375 24.54822438429698 L 39.61791605277932 25.246855671729627 L 18.95012048701159 25.202069868037892 L 0 25 L 0.15593710889229095 12.554800757171458 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="6f797926f1d74793ad0f5253e8cb6dee" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="97212def26ba4875bfc8e094df89a1c0" transform="matrix(1,0,0,1,473,288)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Mot de passe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="8f992986ad3f4d068c09cd8bbf5e0de4" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="c1ed639837fb492fbbf9572206829e5b"><tspan x="0" y="0">Mot de passe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c84ca834382542eeb160a5421e8e1b2e" transform="matrix(1,0,0,1,474,325)"><p:metadata><p:property name="box"><![CDATA[90,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Connexion]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="21034e35a9be41a193a40e554c24321d" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="935eab75e51b49aa90442702e223365a" d="M 0 0 L 21.42930378155543 0.18089789960548197 L 38.7277866599961 0.13781738815714384 L 62.08829914676748 -0.09023208151725559 L 90 0 L 90.26437355908031 12.620271323189959 L 90 25 L 67.29384142601421 24.802258366597155 L 49.79736414474796 24.513788386800034 L 28.245583840368713 25.197889577785805 L 0 25 L -0.1498323151235541 10.623337515605526 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="08ac3290af9d43cab1233ad917ef02b2" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="9" y="17">Connexion</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7800e3721b7a46de8b601a46cdcf8516" transform="matrix(1,0,0,1,18,256)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Prénom]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9d5aff129c184f418c18ace7a6e52700" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3f445bfc154949c1912b158038a137c7"><tspan x="0" y="0">Prénom</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c100438be1d147b98718686f3cd74dee" transform="matrix(1,0,0,1,19,288)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nom]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="6d1e93873aef49e9992885f211fe8f35" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="86c44545eea949c8b1efced4cad0f0ab"><tspan x="0" y="0">Nom</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1f0ee77799a146ee9f317f563709092b" transform="matrix(1,0,0,1,19,424)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Email]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5b143b499d034ab396137f457e3d76cb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="90e48ec5d13c4268b506de30a8e8b80f"><tspan x="0" y="0">Email</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="1e05fe2bb3364ddab61a45654fb50912" transform="matrix(1,0,0,1,18,463)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Mot de passe]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="a48a8c07fd44414eb3c8351cd0597d86" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="574c61909bed41f3a5794b267f728e05"><tspan x="0" y="0">Mot de passe</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="56dbd9ea4f354183b9c50712707ab4d2" transform="matrix(1,0,0,1,19,324)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Organisme]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="c43259ae52b7498ba4778323b3862756" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fc4ad1223bc14db1b2d5bb211041812f"><tspan x="0" y="0">Organisme</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c8d99296dc764d8aaf1964d38d7eeefa" transform="matrix(1,0,0,1,19,356)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Catégorie]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d5fb95a065cf47c0b9098871dcad9668" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e30f60182139450daf6681c2ab6f3ddd"><tspan x="0" y="0">Catégorie</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="00630a72ae8543aa98fcf7d21ae98137" transform="matrix(1,0,0,1,18,388)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Téléphone]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="3bad43ec89d14c3489dff5d2b41cb0b3" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6388a5e4e2764677aa70ff2cdaf9052a"><tspan x="0" y="0">Téléphone</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBoxV2" id="0a0d85a25ffd46ac9089b79aa9907d28" transform="matrix(1,0,0,1,19,489)"><p:metadata><p:property name="width"><![CDATA[104,0]]></p:property><p:property name="fixedWidth"><![CDATA[true]]></p:property><p:property name="textContent"><![CDATA[Répétez votre mot de passe]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="104" height="30" p:name="htmlObject" id="fcc229c650ca4f268d7757f4d1867236" style="color: rgb(0, 0, 0); opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="729cc2a66e1c400cb4666a167ba4dfe8" style="display: inline-block; width: 104px; text-decoration: none;"><div xmlns="http://www.w3.org/1999/xhtml">Répétez votre mot de passe</div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="52b088fc1d1445ecacd5c33431109313" transform="matrix(1,0,0,1,144,250)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9348facfef0447cbacdccf78f985b176" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="e525feb95ec948b2b3ed1a6fc4bf3166" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="a946a9a0ba654bc98617f0701965e7a3" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2dee43398dc4ef68749164e0d089b76" transform="matrix(1,0,0,1,144,282)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="dfc2bd41a98e409f9d674c5056e69d71" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="fc5f1c9e3aa843e3bdaabcd36313515e" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="32df0a929a0e4cf18c5d920b0ede12ea" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="c2c487635ecd49dc859880edf940c9a9" transform="matrix(1,0,0,1,144,316)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="c77589d338dc4ccf9c855269b4f7a793" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="540d37eceea1423c88b593936b915f55" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="ac1fe959224e463499f809fd139b728a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="3ec7e5dd113b47b9b6d1f53e300bf8fc" transform="matrix(1,0,0,1,145,351)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b14cb169d1b74587b24c750a5b74a5ea" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="eda7ddaa847e471c9d9b4a344a11902a" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="1e723d85059b41f1a954fa0ea3ed6ea5" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="8fdd76e87c254af9bf24596645b90f64" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="9ed6a07a2fa24b1081ae76f096ac2c23"/>
+            <text p:name="text" id="00a83339795e4dd586c0989a4cd38330" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="6294b540cd9f4249ac784467dd361709" transform="matrix(1,0,0,1,144,382)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f7de11aa2bb0411eb0c698bb92fb5f68" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="18abfdf0d2394d8685e13fd56c33e12a" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="54a67986beaa40b9b07f5466790325fe" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="79a2bd5942064cc1b85fa6c620fea8fe" transform="matrix(1,0,0,1,144,423)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="f385c0e3fba34c9cb0f37bc7a11aec33" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="da7bd216944d473396ebdf019ae62e7f" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="442d621c0cf84b76853a63dd0a91c809" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="fb363e08e0254c249021ed8c4f311398" transform="matrix(1,0,0,1,144,457)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="fa1d75a2748e4021b7292363dbce498d" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6117be53f0484de2970c7f48e09c565b" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c388f90bdc5d454eb8a715f9b6d9a3ef" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2ce458ba65142ceba99f99543a457bb" transform="matrix(1,0,0,1,144,489)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cd95deda1fab4dcab80d06acb88b2164" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="d446008d4eed4ca9b403ac0b0e512cb3" transform="translate(0.5,0.5)" d="M 0 0 L 19.946989400177607 -0.2076530057559196 L 37.14738023774311 -0.25966378773416154 L 59.12372843103181 -0.05563026433844509 L 82.45264909271589 -0.13902882951493845 L 99.96037616878408 0.1445956552353922 L 120.72822468268083 0.04117383507774164 L 138.8405484696228 0.4647493983308342 L 156.98296047565907 0.49282855933242553 L 174.80636150437337 0.46274481048974203 L 200 0 L 199.54447057652686 14.594936822361658 L 200 25 L 179.09386228469472 24.583635192203737 L 156.44439198938042 25.267467147057086 L 136.81185596421165 24.6814937296507 L 114.87680455751034 24.52997461987994 L 94.38258343631517 25.34144406731134 L 74.71850390350347 24.616914797313267 L 55.598287514245335 24.51311118992569 L 36.70854497557142 25.267537748785102 L 20.081959145553583 24.75285397053255 L 0 25 L -0.022489867937878882 12.75092376334671 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b131530c49c64caeb12d3329dae9ac89" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="9dee82bf08174f43869866058da5713a" transform="matrix(1,0,0,1,151,588)"><p:metadata><p:property name="box"><![CDATA[112,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="2d0246bbc4a843ebab9d049a39270dcb" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="4456c5f896204e8f9e462b0fec358f45" transform="translate(0.5,0.5)" d="M 0 0 L 21.39915468445833 0.2981248983895023 L 44.046342245343816 -0.039617179254846535 L 66.9081976162151 0.062299921891463717 L 86.44245063934657 0.09180600380200588 L 112 0 L 112.14974310897651 12.7955560071952 L 112 25 L 89.7872880642052 25.37926059263044 L 66.55715507552543 24.82275560000845 L 44.29089247674409 25.281608889456997 L 22.359413861443915 25.374735137934064 L 0 25 L -0.40596671976743515 12.789477224854997 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="c6b3ab3525144412a2ff78ecd41ad1cb" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="43"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="133563c7b8dd4c24b00bf37bab43beb1" transform="matrix(1,0,0,1,19,552)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Veuillez recopier le texte suivant]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="61542d64171b4d9f920ddac864c722ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="710617c0541a455f886ee4b79e4d7d39"><tspan x="0" y="0">Veuillez recopier le texte suivant</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(18.9921875,576.609375)" id="0bddfc725b9741319789e29affb9e825"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="59b37ff87f944766bae3639ff698199f" transform="matrix(1,0,0,1,-0.9921875,-0.609375)"><p:metadata><p:property name="box"><![CDATA[126,48]]></p:property><p:property name="textPadding"><![CDATA[6.300000000000001,3.1999999999999997]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="eee1e4ae705e4ee49d3dc300348a7fd0" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="6ac37b83333549969295dfa569ae1f6a" transform="translate(0.5,0.5)" d="M 0 0 L 17.296133417450616 0.23222168172036606 L 38.26978322977777 -0.39217877984642535 L 55.39738861435678 0.16032681775485846 L 75.00542772023077 0.27545314756841044 L 95.48224418575332 -0.09332521460556953 L 126 0 L 126.43509915376892 19.408156041155657 L 126 48 L 106.83595320420373 48.14327020398683 L 86.25359840008443 47.54520480883729 L 65.43009656258664 48.447014702356455 L 41.798946604035535 48.2694171852207 L 18.99588320466084 47.52167444721791 L 0 48 L -0.006845567329393454 31.218991312152394 L 0 0 z"/>
+    		</g>
+            <foreignObject x="6.3" y="24" width="113.4" height="0" p:name="text" id="cda9cf6073db4fcbba00adfcdab53c30" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.BasicWebElements:heading" id="9b7bdbae42cd41a1b10dd14409b2fa3f" transform="matrix(1,0,0,1,18.0078125,11.390625)"><p:metadata><p:property name="textContent"><![CDATA[T  X U Z<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="75" height="24" p:name="htmlObject" id="01bab046ae324399aeac37f5e4954d8f" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="933ce64b2f7a4b7eb82fb51ad03d30b2" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">T  X U Z<br /></div></div>
+            </foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="5387b9fff3b94b1caa96d319e9989986" transform="matrix(1,0,0,1,17.0078125,25.390625)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[34,12]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="497d080043684553becc57f74915402e" d="M 0 0 L 34 12 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="f7946efcbbf048c9bd9da08504c200d2" transform="translate(0,0)" d="M 0 0 L 34 12 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="4af41fdcbb724cd4a67533e2f6a9b0b8" transform="matrix(1,0,0,1,59.0078125,23.390625)"><p:metadata><p:property name="a"><![CDATA[0,0]]></p:property><p:property name="b"><![CDATA[34,-12]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="42e9e005ed904d4ba383eb617145081c" d="M 0 0 L 34 -12 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="715981358fff446f87524c8407d3a958" transform="translate(0,0)" d="M 0 0 L 34 -12 z"/>
+            </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="e728291d872241babbc8073869a6d310" transform="matrix(1,0,0,1,18,437)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[vous servira d'identifiant]]></p:property><p:property name="textColor"><![CDATA[#FF0000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|10px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="07cec5d826db45a2a42b1b8dd3321eeb" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 10px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="cf882659b2a14be3a022ffc56c4238e7"><tspan x="0" y="0">vous servira d'identifiant</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="422443bd66ba47c991ed72924c80251b" transform="matrix(1,0,0,1,19,646)"><p:metadata><p:property name="box"><![CDATA[148,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Créer mon compte]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="49fe89f52c6240329dc946e5be950e28" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="c3199981f8754a6abbcd667d46615adc" d="M 0 0 L 18.552421213234677 -0.053848351837630926 L 40.856576982237186 0.02313380980625479 L 59.2840753089119 0.21792195158233707 L 77.16251608352663 -0.03017523568619962 L 96.28237883035364 0.3891147037800011 L 116.23392716246076 -0.11892281038950281 L 148 0 L 148.08171516924878 10.912882695404157 L 148 25 L 128.3754643449158 25.17589188407483 L 104.9610073069981 25.148156160615027 L 81.74584090859106 25.13595930119655 L 60.433006625588526 24.793163901649173 L 40.16959852619836 24.9206543427871 L 18.21296193841417 24.83531606483582 L 0 25 L -0.361098727875344 10.717529789981262 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="7c1171e9b3e24f4d93583699ce2e3854" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="10" y="17">Créer mon compte</text>
+        </g></Content></Page><Page><Properties><Property name="name">Demande d'accès - besoins</Property><Property name="id">1343827036958_3750</Property><Property name="width">908</Property><Property name="height">900</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,13,779)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="72eda8205781444397fca844b4528e04" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="24edfb6dda434053a1b297406ba78699" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ad8427bd24b1461689fbd43e57091f01">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ad8427bd24b1461689fbd43e57091f01)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="19f683b7fb3e42e5b99f6dea1a6d2f67"/>
+            <use xlink:href="#24edfb6dda434053a1b297406ba78699" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="53c80e2ba30b42cbb2395c11242dbc46" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="4502ecc4a9d549b8a207719a417eee6d" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="ae0f5b0bdc794f918a5e0bf160111dfc" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="1d45fbf8a13948aab60e32cf180ee001"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="9abf7c5b890d4888a327ffb1d3699aac" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="973cd76d9d564af18926311f9fc73732" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="01ac64217e2a4d5d92cbaca20f5c4d76" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="1eb7fecc18fb4d4688e68ec813cdddb5" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="84b617c6bc0647828e26d6b234d5c9ca" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="385d70f0f489496fa182c89f5d6f50ef" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="3acdb787527845bd9e570a82553c16ba">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#3acdb787527845bd9e570a82553c16ba)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="f03a1bb845db4312a20a7a43721eb926"/>
+            <use xlink:href="#385d70f0f489496fa182c89f5d6f50ef" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="2be0e67db1284407b3da7fd5865a5385" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="4ce30b8309724909bc0643717248bc3d" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="62d760d019b94776ba3f7af8e581b9d3" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="6c258d2f87394f0d9dece203c3430962">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#6c258d2f87394f0d9dece203c3430962)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="7ba7c2a7435f4752b9b9750a85d986c4"/>
+            <use xlink:href="#62d760d019b94776ba3f7af8e581b9d3" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="031a45df67c04df0a4e7b94ddd3f3d76" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="610e2c6c204b4ac28076a58a678e9134" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="37d0f3b368ef4c979629cb0b7669617c">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="a59711fc86f647e89709d17492d98aab">
+                    <ellipse p:name="ellipse" id="3968cc6b329c4b26a4bda3a2f2113dab" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#37d0f3b368ef4c979629cb0b7669617c)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d1959982575744ae9272b739b811a58c"/>
+            <use xlink:href="#a59711fc86f647e89709d17492d98aab" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="25312fe8b33e4fedb0aa1a329be33d54" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="4eef4dde0ed74d8baa753ac678a21a01" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="7456a8f1b1b44da793d9506e7e852639" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="e98f3c848f51437290aa87f3a7f53164"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="29deac56c78f4d35a50491319b4601ee" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="83c1b59032764d13bd7d25722d9164ae" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="0bb423d153df47fc8a5c115f81191a74"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="726b685e70c24ee99605b6fe4c13df67" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d01cdd3e6e4f46508cb0a06d7bd761f7" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d1fb761440834b208549a3e0d51472bb"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="666ae23733ca483eb94a5fa8e3efa56b" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b523bff85a134877b2f5f7ad1125b9f8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="6f52d269248d446abc5261a9744323b6" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="b22675b9402047878a0adc3262c1ad02" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="76713801a93742d3ac222377c0da89a8" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="f77e54ddf4bc420e921cfdb7421c9df2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="3a563687c0dc45a792fe4e482fd46eb8"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="995480f6c1a64828b06175d1eb076b9c" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="a52d7d17917d4c4f939ed4f7af59c4b1" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="b02403a035914528aa73b690d2b4ace8" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="b06f7e1c2b094cdfa92a1082cc06e321" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="533a921c393d455c87c3274d528c818b" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="4818e27cd60d4024b7a42a09a982a710" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="c11cb640d4ff45b5b48f62705fd4cc64" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="0071d041f0d84114ae69751c738e81e7" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="8f50f551f10c4f978530327aba1c7363" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d6408b52adae43b6a2aec0c79ad6fa08" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="16bdca3913b94d51b95e7a75bae31cfa" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa98326e39994fbbb623684c8afca91b"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="7800e3721b7a46de8b601a46cdcf8516" transform="matrix(1,0,0,1,20,210)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Types de données]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="d5fb028de36b448daf7b056c351126ac" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="772a01a9e0664780a55632007c11f496"><tspan x="0" y="0">Types de données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c100438be1d147b98718686f3cd74dee" transform="matrix(1,0,0,1,20,478)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Durée d'accès souhaitée]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="e6fa1ac477d84f668e45b2df3c0b78e2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ae00f3db78ee4b5a9db9ea0c0f09bf27"><tspan x="0" y="0">Durée d'accès souhaitée</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c8d99296dc764d8aaf1964d38d7eeefa" transform="matrix(1,0,0,1,18,527)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Objectif / thème de recherche]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="64d6eaeb3fbd45afab2c4fa84957d3ba" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="7d59c8608c224268bcf1ae3f1ce94db6"><tspan x="0" y="0">Objectif / thème de recherche</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="e2dee43398dc4ef68749164e0d089b76" transform="matrix(1,0,0,1,235,472)"><p:metadata><p:property name="box"><![CDATA[160,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[en mois]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="7b49000da18c4934a837736acda7fe8a" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="1774fffb481047f78378f128b35ac849" transform="translate(0.5,0.5)" d="M 0 0 L 18.70802458446006 -0.40405411073974995 L 41.235529064533125 0.28519471260737905 L 63.10554718629752 0.19370018825843438 L 84.19175816332407 0.31331670046659366 L 104.98743132991771 0.25149609170045695 L 127.03446265019724 0.33425876699606016 L 147.46969528961372 -0.36833385003006835 L 160 0 L 159.6748078328943 13.465660567295352 L 160 25 L 139.91000491335095 25.43190930198774 L 118.83500510940824 25.301514523639263 L 98.2540951497037 25.43499044352274 L 79.27890752014551 24.794862228967116 L 58.43824709699772 25.28994123992837 L 38.63987159889793 25.449331294127187 L 21.745817947166007 25.088414054759657 L 0 25 L 0.1883205687574171 11.90784110395294 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="71180bbd5498478781782598a49270b5" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">en mois</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="3ec7e5dd113b47b9b6d1f53e300bf8fc" transform="matrix(1,0,0,1,237,517)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="db0ed13d98484f439ad78f66a2f5548b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="12878f6a95d44ff4b7f2cfe643f4a277" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="e8ad42e744b0405db706f4f272a2cf2d" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="855008c8b45b4e9c804916cb14adcbcf" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="591a3e32fe6a4f38927a9749c04a1429"/>
+            <text p:name="text" id="fd6c780e231b4e058b526747d4ab89a7" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="d280e7a309c74e499a9d24596b7422fa" transform="matrix(1,0,0,1,412,210)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Aire géographique]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="485b273b4959488ca874ac0ae49241be" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="ee2e009a8108447abcfc09548f28a055"><tspan x="0" y="0">Aire géographique</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="15442b78465c49e39718f63e0c1475c9" transform="matrix(1,0,0,1,19,173)"><p:metadata><p:property name="textContent"><![CDATA[Description de vos besoins<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="257" height="24" p:name="htmlObject" id="22651d086ad84314a887606760bafb8b" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="7103dd34bcc14d69adceaa7df7c08961" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Description de vos besoins<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(149.34765625,210)" id="7fc8bbc0b3d5490a8d85fb3767e0ea0a"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:scrollbar" id="17b9d290b0814da1aef20b08ee5c8e50" transform="matrix(1,0,0,1,199.93359375,0)"><p:metadata><p:property name="box"><![CDATA[18.71875,237.94608940864228]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <rect rx="0" ry="0" style="fill: white; stroke: none;" p:name="bg" id="996c7d94195a4bac9a6319a5cf3a4334" width="18.7188" height="237.946"/>
+            <g style="fill: none; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="scrollbar" id="d31a80508d9047648d92993eca0e575b">
+                <path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line2" id="9ba3f420672d46bbafc5db7d6d03171c" d="M 0 0 L 0.021589864267022696 21.979289971699036 L 0.3811171922400908 39.68121120177902 L -0.4959374334518909 59.03596358762193 L -0.06872577020541781 79.97481706224956 L 0.3753211571254911 102.23528198211629 L 0.3106073429255545 123.76118418008001 L 0.12153583416546132 147.46679032082733 L 0.348817220458022 166.4245139717224 L 0.07767252725862939 188.1209348161678 L -0.49202540176336174 205.1425861294175 L 0 237.94608940864228 L 9.181647379168133 237.452514756846 L 18.71875 237.94608940864228 L 18.711636973177654 219.79067128617226 L 18.45609005355394 197.41649688982852 L 18.54765244993219 180.17815043989233 L 18.48065251259508 157.20541555603785 L 19.136420248722917 133.8442976194927 L 18.29245527972477 112.21871483746243 L 19.08534869510589 93.64078347764709 L 19.038528225829513 74.60946250808901 L 18.53546038818652 56.6170365796735 L 18.771703430362464 34.434405516594566 L 18.71875 0 z M 2 128.97304470432113 L 6.715705276586788 128.8088208492139 L 14.71875 128.97304470432113 M 2 118.97304470432114 L 8.203204533985824 119.4584703231632 L 14.71875 118.97304470432114 M 2 108.97304470432114 L 9.319593357426381 109.37451704510052 L 14.71875 108.97304470432114 M 2 10 L 5.404498339293904 8.164324188895941 L 9.359375 5 L 12.184579439610388 7.8266521455493425 L 14.71875 10 M 2 227.94608940864228 L 5.985253199243492 230.7434229493821 L 9.359375 232.94608940864228 L 12.388540259678862 230.38603778697885 L 14.71875 227.94608940864228"/>
+            </g>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="6e8f72d62d044850922bb5c64c2ac3c1" transform="matrix(1,0,0,1,-0.52734375,-0.016754150390625)"><p:metadata><p:property name="box"><![CDATA[200,235.67006718089078]]></p:property><p:property name="textPadding"><![CDATA[10,15.711337812059385]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="74442fd2eb574a5b868e3673393369c8" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="cacce4aa23054ee08d4ba23bbc112bce" transform="translate(0.5,0.5)" d="M 0 0 L 19.332171149415647 0.16289366172134456 L 37.95795014561311 -0.02365217585850743 L 54.56140577684483 0.34065222876201373 L 76.56147446190913 -0.09213764308862915 L 100.06282219473036 -0.41586695342380264 L 117.9433826209737 0.33466360118181615 L 138.27528100353948 -0.0359380039627577 L 161.45831771110423 0.3450024089532707 L 180.26536277102855 -0.443311168966135 L 200 0 L 199.64013263228597 17.449541823923614 L 200.2359935962052 36.753087073699575 L 200.00760617062383 55.05833886955823 L 199.69486554096468 78.390564155983 L 199.62882241404714 95.51509568769761 L 200.4841172761107 116.11138840642657 L 199.76588978083 138.455262758605 L 200.29600766964114 159.36156571443607 L 200.0916169203942 181.14720399699345 L 200.18004111644422 201.5768171503299 L 200 235.67006718089078 L 179.31249328868535 235.5250838377163 L 161.5931950089613 235.87510689916806 L 144.59179077400586 235.9120627064166 L 124.44894173143418 236.1546384925607 L 106.09612518395645 235.68384017972053 L 88.30940525777716 235.81516410909705 L 69.80109196711057 235.38292981272363 L 52.74938068861773 235.76204109425154 L 33.508686995726976 235.8091336994171 L 0 235.67006718089078 L 0.14658050242092135 219.12350420746395 L -0.16741307400943128 198.5048012300401 L -0.150762886334723 180.92133449859486 L -0.21218474395772013 160.14638108297547 L 0.20434558173853734 137.81620704671488 L 0.029053669518705028 114.29459776890883 L 0.14600531834200592 93.48551980613554 L -0.22355447990221966 70.52979134960951 L -0.47347654963339536 49.929866987371916 L -0.03187669766201073 27.525741725662975 L 0 0 z"/>
+    		</g>
+            <foreignObject x="10" y="118" width="180" height="0" p:name="text" id="c1162b9b745045caac1b8b713c8a3143" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="4a2e7867aa7142c89284d97f7dee5e24" transform="matrix(1,0,0,1,10.65234375,5.7709197998046875)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Tous]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="393ee29010f1497bbba41e6e9ed19924" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="5e6dbdfa69d3457dbc569cb15130ce9f"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="4203038b163347d1b3e5367e042096d1"/>
+    		</g>
+    		<text p:name="text" id="df5fce467239432f97f054d9d183ee58" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Tous</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="d28940436cf6418fa814814392be9f39" transform="matrix(1,0,0,1,10.65234375,32.5673828125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 1]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="116d8d18142045ec93e09f3f95f99369" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="c7f88d05d04b45778f626bc274c78728"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="45261b5ed1b042d495b89ef394ce17d6"/>
+    		</g>
+    		<text p:name="text" id="828f5263fb344a64af513941410212d6" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 1</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="7af6ba98a2544299b90f44a934694556" transform="matrix(1,0,0,1,10.65234375,60.639892578125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="007ec3907b6a428ab120c56614ebbe1c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="ca346e59ab304cc79ea337166cacea52"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="778bfa82dc4c40e2b02909d2fae11dd4"/>
+    		</g>
+    		<text p:name="text" id="a59fdf43bb5c4425a6a3653f246a2e2d" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 2</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="07203440ea35411394f77d116a67f587" transform="matrix(1,0,0,1,10.65234375,87.43634033203125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Paramètre 3]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="0bd3a490a99b4856822a074d1adf528a" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="e2b89380c0ae4e4f8bd7899f34016034"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="a2456b41d094407295767d96d8b41f53"/>
+    		</g>
+    		<text p:name="text" id="5fd23c169a4d4ab78d2e47eac9d68543" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Paramètre 3</text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="translate(563.390625,210)" id="ef60a26b57ac4304a34938f2ee7b8b8f"><g p:type="Shape" p:def="Evolus.Sketchy.GUI:scrollbar" id="b3c98e4b3b7f49a99d95fc4fdcfeea14" transform="matrix(1,0,0,1,199.890625,0)"><p:metadata><p:property name="box"><![CDATA[20.71875,237.94608940864228]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property></p:metadata>
+            <rect rx="0" ry="0" style="fill: white; stroke: none;" p:name="bg" id="b694cb432a5144e5b2f24f9d8c7cd9fa" width="20.7188" height="237.946"/>
+            <g style="fill: none; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="scrollbar" id="0c6cc66ca8d147079d7a6e4003a92221">
+                <path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line2" id="747549507bd94f2b9365b6924328d8de" d="M 0 0 L 0.09370420642245059 21.51189672390306 L 0.26930953706210237 40.45047512249332 L -0.27487591650745824 61.180849651282614 L -0.37611468026522565 82.8407345165763 L 0.4936691914986564 103.42416940710602 L -0.22706272011542117 124.3562463850252 L -0.39915917583100047 142.6119456997219 L -0.07947308213492332 164.4405018298335 L -0.0661873358485533 183.30354179610336 L 0.042761441475626216 199.68166458087563 L 0 237.94608940864228 L 8.555448698620946 237.4685026562194 L 20.71875 237.94608940864228 L 20.96866770124247 216.1803262315837 L 20.291656573717866 195.0007328519734 L 20.956140773196214 177.2482424912257 L 20.493263483796486 156.73393957812962 L 20.40966781917222 135.55529572650929 L 20.542678550289637 115.25786077391743 L 20.911556037545925 95.3352790592577 L 20.414469708210106 74.42913319653027 L 20.980401932045712 53.91985483941797 L 20.693989229883364 37.384946413312065 L 20.71875 0 z M 2 128.97304470432113 L 9.813315784669339 129.3429941088062 L 16.71875 128.97304470432113 M 2 118.97304470432114 L 10.472802723196907 118.79663350262894 L 16.71875 118.97304470432114 M 2 108.97304470432114 L 9.64262658196039 108.90024701702367 L 16.71875 108.97304470432114 M 2 10 L 6.0002661947441025 7.820788293558486 L 10.359375 5 L 13.256067967894971 7.441610148456751 L 16.71875 10 M 2 227.94608940864228 L 6.696636927952565 230.42847044638822 L 10.359375 232.94608940864228 L 13.681608138219852 230.55192308172377 L 16.71875 227.94608940864228"/>
+            </g>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:box" id="01534938e672422aabf992bc0b09b042" transform="matrix(1,0,0,1,-0.5703125,-0.016754150390625)"><p:metadata><p:property name="box"><![CDATA[200,235.67006718089078]]></p:property><p:property name="textPadding"><![CDATA[10,15.711337812059385]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="56bbe1c979974ef59a72cb99ec93c9d2" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="2f6997865e5f4f88b06b4c5c21affb14" transform="translate(0.5,0.5)" d="M 0 0 L 18.303465508318812 0.2529488613173343 L 40.444109174106174 -0.28952583322785974 L 61.90085172198669 0.09177554438723712 L 81.09330630842149 0.30557580397249196 L 103.78646806703388 -0.3259559800709988 L 121.83508378920085 0.21088440258724872 L 140.37272107715836 0.38612503233356477 L 162.29944882237731 0.15050835472419477 L 183.678571297313 0.3648606857289588 L 200 0 L 199.61547633603615 18.625401550733283 L 199.95751322724132 36.19899125658823 L 200.07606251668767 58.53870546602642 L 199.86609752961195 78.64429550132222 L 200.48302523704723 95.66311507207645 L 200.4335352772436 115.19093207421838 L 200.2525806053532 132.73075956120087 L 199.94551231509666 156.47023079907748 L 199.77591882176358 176.08006828260199 L 200.2728118369389 196.0431340415898 L 200 235.67006718089078 L 182.36512978409172 236.149817807442 L 163.0219491513793 235.99076500726892 L 141.32129284796312 235.9079279222149 L 121.50940202994789 236.0050442287024 L 99.79870853565676 235.91889554533904 L 80.04617608807771 235.69212604976784 L 57.625964719605605 235.39264049314352 L 38.43276409230875 235.84323496864542 L 20.609111068572993 235.62108310861478 L 0 235.67006718089078 L 0.20779549856894008 219.10928342296532 L -0.02763820260894556 196.97652329463156 L -0.14703687861350545 176.45292785819152 L -0.015472700690770447 156.09587160068975 L 0.35266448958688446 132.38343219504466 L -0.168765348948979 112.81133219011535 L -0.25591207712557185 91.69613490793337 L -0.11024272006329328 68.25299448854541 L 0.31146817648139713 50.39213042723511 L -0.42987131829935055 31.817394558716593 L 0 0 z"/>
+    		</g>
+            <foreignObject x="10" y="118" width="180" height="0" p:name="text" id="8e65946568754d21b26cdb0208e4a824" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="58926b8d1e2d4f9891b89aa5bde3b0db" transform="matrix(1,0,0,1,10.609375,5.7709197998046875)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Tous]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="f57c0996042c49dd8fc1fb27efbfc0e8" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="b8476b037ca14a3fb9f959a22a6d162b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="b0e847cb80044d5aa15387581b51dc7b"/>
+    		</g>
+    		<text p:name="text" id="81a2436741e542098588d094edc04411" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Tous</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="7baa06acd72c436a8c45163b33c77c27" transform="matrix(1,0,0,1,10.609375,32.5673828125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Site expérimental 1]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="caa44e20f8d0441d81fdf7f38bcc200c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="8ef3aae6683745c4be25f56c87910aee"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="52afd350f2d9479e95aa1051a5604bb9"/>
+    		</g>
+    		<text p:name="text" id="0dedfd25eda44e3ab32f5ff395748228" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Site expérimental 1</text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:checkbox" id="42a1a5402c7b4ba38faa186e879167d6" transform="matrix(1,0,0,1,10.609375,146.639892578125)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Site expérimental 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="a7eb6fd20bdf43a085eff36ca5d7ff2b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="8baf37fbf38247ba8ebf1d6eb0776041"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="004370ad104b42948b4bc898aa5b6139"/>
+    		</g>
+    		<text p:name="text" id="cfca71044f584746843fff3dfeb742dc" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Site expérimental 2</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="b16f6a11f37149e7a0626afb057fa65a" transform="matrix(1,0,0,1,31.609375,53.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Babaou]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="99bc50b487ae4fb7a15b0c2ef917851b" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="263017c345764ed9adfdea21c2805788"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="37e334a5ff4e421a9687e12ab67174c5"/>
+    		</g>
+    		<text p:name="text" id="8d9d7633930745c0b617dad38a3e5952" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Babaou</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="d051cce6de8741c2afbfeb3ecd720084" transform="matrix(1,0,0,1,31.609375,74.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Machin]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="72d66847e3a740bb8662fa2cf9880e72" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="2c7f7027abff49ff8ee845b643d97f8a"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="153a0a3a046b4126b03e40b1ce96e924"/>
+    		</g>
+    		<text p:name="text" id="e1cef54789d847d6b4e95874ac9a0be3" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Machin</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="23d82bf91f26421aa0f865a60b6cd55d" transform="matrix(1,0,0,1,31.609375,96.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Chose]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="46cdde820f764672a4a8ffbd84b6c040" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="cb7233cc8fab462297a2cba6b40404ce"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="3989d386a2d94861803a634b809fb1b4"/>
+    		</g>
+    		<text p:name="text" id="4c0d65bb87d8474e8faf0fb3d3d1244a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Chose</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="bc5a03c7a175480e84e9e9b15e4148c2" transform="matrix(1,0,0,1,32.609375,117.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[STX48789665]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="e4156ab8d21445fcaa1953d61e781d7c" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="da338ecd2add4dc8a41b860389eddd9b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="2673336545304d6786d30602dda40c2c"/>
+    		</g>
+    		<text p:name="text" id="f266464cb42443739a0bfcd9791b4062" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">STX48789665</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="c92228976b55475a8e5f96c6e4db6ee3" transform="matrix(1,0,0,1,31.609375,166.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Babaou 2]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="4a8fd5fbe20f450ab16213561d16e4e7" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="69bfb48e4a5c4ed9b201989a74582452"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="c2a4bd6432c049938c8258501e4105bd"/>
+    		</g>
+    		<text p:name="text" id="3c4434ff9fde469fb961260a5771a59a" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Babaou 2</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="eeed8fe1c79943639d3bd7fb4d308e48" transform="matrix(1,0,0,1,31.609375,187.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Truc]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="48e80c1e1e064e92ad287119ab1974af" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="39577b1033ce41189ce9a9493b66ce8c"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="9f7bf43c73234a4eb3cf5d48217cc36c"/>
+    		</g>
+    		<text p:name="text" id="2160d08c07b149a8982bb7da82d711ff" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Truc</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="638c64c5ff6744ed852968a99e3efb3b" transform="matrix(1,0,0,1,31.609375,209.77093505859375)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[...]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="bc354771e34a4b83b10336a3e5bbfc2e" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="f5f53ab25436436899ca9b91dee09da3"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="1a52555619d54d429ba4cf45e9326263"/>
+    		</g>
+    		<text p:name="text" id="753e8b10c3034a84a6b824d7a0ba9d06" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">...</text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="eef17d9f5f304b0788a39054376951f5" transform="matrix(1,0,0,1,478,182)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(widget potentiellement difficile à utiliser et prenant beaucoup de place)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2eb2e916eb4a41a6850b026a33faffa0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="98937cff8c984b11bddb0d5e828efe17"><tspan x="0" y="0">(widget potentiellement difficile à utiliser et prenant beaucoup de place)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="a6a1409adbad4333b4d6f2a246aad130" transform="matrix(1,0,0,1,31,492)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[(peut-être automatisé)]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|italic|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b8f8e42309bd4c808a724cb859f7f617" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: italic; text-decoration: none;" xml:space="preserve" p:name="text" id="d49648bdca2649df9a450beaff64ebeb"><tspan x="0" y="0">(peut-être automatisé)</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="0fed078b88c94a458e243552c58966db" transform="matrix(1,0,0,1,493,527)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Type de travaux]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="5f5641af511e4e1dac30ef1b8d381e49" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="47499190034347579e4b15c6cfaa86f9"><tspan x="0" y="0">Type de travaux</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:combobox" id="f73750573e7c4a9ca29d1a061bb29062" transform="matrix(1,0,0,1,625,522)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cb45f878e6f342c19a956632fbe2024f" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line1" id="8b2895de4c744e96bb351dc7d6891265" d="M 0 0 L 21.3376178151831 0.42062808607568314 L 38.10809646209412 -0.29043040007842236 L 58.18757530386513 -0.41159579532816526 L 78.27035499219123 -0.39373237483771784 L 96.1671296128981 -0.48593296231729133 L 116.13102044902479 -0.29077824145563 L 134.46291459727348 0.1363638352247244 L 175 0 L 175.03213531007574 11.785016008012185 L 175 25 L 154.27798162923378 25.039308901613012 L 130.75772404391765 24.9849552490316 L 108.57244161383065 24.60083296605903 L 91.09098913083807 25.40752234209533 L 71.93610798515783 25.14315898226726 L 48.54079177282565 25.272559927042582 L 28.935603197915626 25.246937266143362 L 0 25 L -0.05679204980134178 12.140817878981107 L 0 0 z"/>
+            </g>
+            <g p:name="fillrect" id="6685fc2e1d57479d80e72ce196695201" style="fill: rgb(204, 204, 204); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path style="stroke-linejoin: round;" p:name="line2" id="5b2662f700c34214be6b7d4a7b71f980" d="M 175 0 L 188.22154201783798 0.29972945494597625 L 200 0 L 200.4108069245487 11.681099817015886 L 200 25 L 189.42108640337113 25.089032474876646 L 175 25 L 175.02641603236444 12.141385530735068 L 175 0 z"/>
+            </g>
+            <path d="M 178.85 5 L 187.56290884527698 4.5888371772648275 L 196.16 5 L 191.4646171597709 13.325220620856012 L 187.51 20 z" style="fill:black;stroke-linejoin: round;" p:name="triangle" id="d3a41ef830c144788e94898670dc3693"/>
+            <text p:name="text" id="e8cf7df67cd44a5e86b890697d3baf59" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="30"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9cf43da02c7a401398b52ff307f8768f" transform="matrix(1,0,0,1,18,573)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Détails]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="ff4397351b16436283ad7bd294a0a1d2" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="8af21241711e44bab69f9cf842afda37"><tspan x="0" y="0">Détails</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:textbox" id="ca48237488654ea7bc43ffdb44577958" transform="matrix(1,0,0,1,235,567)"><p:metadata><p:property name="box"><![CDATA[589,118]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="19eef555cd824052b9d0d14d8eb0a723" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="56800681b5c14e928a83a933c10a0e98" transform="translate(0.5,0.5)" d="M 0 0 L 21.118865810917676 0.05328663220893548 L 38.41581018293946 -0.1393842321362525 L 55.34929282504191 -0.44981104879210265 L 76.68814654636955 0.4130540608355082 L 98.15185374216468 -0.4016563801314085 L 119.71843737720233 0.1112252281477325 L 142.20006173021943 -0.3657501485687562 L 165.21991200499295 0.12097057551352197 L 184.227801125343 0.04475827082111139 L 201.89004268730466 -0.06073353065580367 L 220.28824712644732 -0.38848764702224625 L 239.83013104957746 -0.3749342283751347 L 259.9230674089338 0.20075193069959973 L 279.5034731398228 -0.06370595198489304 L 300.25020135634173 0.3067172525280024 L 317.00557593527327 0.17734017748117004 L 336.7351087838339 0.38419767698218754 L 354.03779072981814 0.24680874314079548 L 371.68668901469135 0.27183081628010386 L 394.83062232571075 -0.33557031612100474 L 418.01138527236304 0.0229292161073259 L 435.4808409661606 -0.023614815815651724 L 455.5854700265468 0.03211777970525487 L 476.9202209205273 -0.46066864997252543 L 493.55619410329115 -0.0719906391715418 L 514.4929800129784 0.08634974869240719 L 530.6692909048307 -0.45449768206510954 L 550.9004010470769 -0.07387324584747335 L 589 0 L 589.2270440778624 18.693906451411177 L 588.8881545447648 41.034866126438196 L 588.8134190271118 60.99371746060804 L 589.3648647556003 81.5057044400006 L 589 118 L 572.458162488314 117.90706749237701 L 552.8066945050365 117.83151201620079 L 533.34970563096 118.1731560687103 L 514.5262687531159 117.74458486349388 L 496.61845286488096 118.16566440134153 L 476.16609110761186 117.92340731691169 L 457.5907658449439 118.49650184245898 L 440.1645806681627 117.82680267911984 L 423.4246980272216 118.328330106609 L 402.7816977236016 118.42568103281809 L 380.2682140818089 117.95313170302869 L 359.9524350453302 118.290402565997 L 342.28802988307405 117.91848927878101 L 322.94870509202093 117.64753953180303 L 305.78299639273666 118.3069462638548 L 282.80870403423717 117.85545689851112 L 265.4726634669588 118.21342835143315 L 245.26990571003236 117.64742714310594 L 224.2137115093445 118.33469783849992 L 202.59653601019355 118.25961435959923 L 180.29062006511768 118.24353783905185 L 160.1006776247846 117.67674484359505 L 141.9204148562552 118.02605036449626 L 121.2409049807261 118.0900410266054 L 104.24463984511068 117.71719965792481 L 85.16328034955926 117.84132044246198 L 67.31675080816366 118.37851959713929 L 45.19325286491767 117.61721619228001 L 0 118 L 0.06371185034875704 99.77058069415017 L -0.34302906019029045 78.12330022432519 L -0.03763984369881246 55.72610546544693 L 0.1170950595730631 34.49639734618753 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="4b2c0d2e59ea49dc978e4a9d561060a5" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="251"> </text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="32fde558276349149681e415dfa22826" transform="matrix(1,0,0,1,19,730)"><p:metadata><p:property name="box"><![CDATA[200,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Envoyer votre demande]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cf6ca7ccdd2b47a7b756e57f2e38d4c0" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="6bb42d1ad0c74c0eb7b9369856d2703d" d="M 0 0 L 20.592098553440287 0.000023303442897915083 L 40.225105361877226 -0.31098818217185686 L 59.371755074329975 0.2638788438847499 L 80.89074764495682 0.07795535433389733 L 102.91529460119787 0.10713910527796211 L 124.46641450571684 -0.15251126727582953 L 144.52950319379002 0.24399210729263454 L 165.82918697375993 -0.2836813414708059 L 185.69122735600266 -0.03570094564767101 L 200 0 L 199.5255077785371 13.449724991109052 L 200 25 L 181.958688957317 24.78995448433606 L 164.16603778336795 25.138144977625632 L 142.4882809712783 24.83102438197899 L 121.94802272831164 24.634838715651295 L 98.6601632851882 24.688134283810275 L 81.46894570353935 25.113559276925077 L 63.85715025312898 24.97103397074358 L 43.18359887414324 24.68203787352045 L 25.28693584347532 24.905611658634967 L 0 25 L -0.2106102836403434 14.584724673844208 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="cd91ca4a2d0d4ddbba15452110090305" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="19" y="17">Envoyer votre demande</text>
+        </g></Content></Page><Page><Properties><Property name="name">Demande d'accès - conditions d'utilisation</Property><Property name="id">1343830361479_9489</Property><Property name="width">908</Property><Property name="height">800</Property><Property name="dimBackground"/><Property name="transparentBackground">true</Property><Property name="backgroundColor">#FFFFFFFF</Property><Property name="background">transparent</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,692)" id="64739e38f7d84e0e89d121197b55988b"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="45703e0b5a1e402ca0eb97bce02bd50e" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[874.9999999999999,68]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,8.5]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="875" height="68" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="10ae976f11d248f59d7e5cd54cb8796c" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="ed3e79c035a1439e9e859680c65324a5">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#10ae976f11d248f59d7e5cd54cb8796c" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#ed3e79c035a1439e9e859680c65324a5)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="8933c26960af43859981d2a8ea77e93f"/>
+            <use xlink:href="#10ae976f11d248f59d7e5cd54cb8796c" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="8.5" y="34" width="858" height="0" p:name="text" id="379cd925cece457cade8abb9ca3aa29e" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:pane" id="d500558312784de3b1af95e0c010cfc4" transform="matrix(1,0,0,1,10.379517555236816,12)"><p:metadata><p:property name="box"><![CDATA[62.19879518072288,44]]></p:property><p:property name="cornerStyle"><![CDATA[none]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property><p:property name="radius"><![CDATA[3.109939759036144,0]]></p:property><p:property name="textPadding"><![CDATA[0,1.4666666666666668]]></p:property><p:property name="fillColor"><![CDATA[#EEEEEEFF]]></p:property><p:property name="shadowStyle"><![CDATA[0|0|3]]></p:property><p:property name="shadowColor"><![CDATA[#00000000]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property><p:property name="textContent"><![CDATA[<div style="text-align: center;">LOGO</div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <foreignObject x="-3" y="-3" width="68.19879518072288" height="50" p:name="htmlObject" id="2fd3f1bd7da84bd498b36a71ad045320" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1;">
+                <div xmlns="http://www.w3.org/1999/xhtml" style="-moz-box-sizing: border-box; overflow: hidden; width: 62.1988px; height: 44px; padding: 1.46667px; background-color: rgb(238, 238, 238); border: medium none; margin-left: 3px; margin-top: 3px;" p:name="div" id="6d9a3d1f917e460d88bd10b9f21412d4"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">LOGO</div></div></div>
+            </foreignObject>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="d0cb9f0fd691401a90f4d1c46fffc035" transform="matrix(1,0,0,1,19,119)"><p:metadata><p:property name="textContent"><![CDATA[<span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|24px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="354" height="28" p:name="htmlObject" id="5b57016245d7495d8de8a4b0dda9ee47" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 24px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="021ab2278b834f7e85a35748ea2e4548" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><span style="color: rgb(51, 51, 255);">Demande d'accès aux données</span><br style="color: rgb(51, 51, 255);" /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Line" id="aa8fdd93472242e09424cdda092e3840" transform="matrix(1,0,0,1,19,150)"><p:metadata><p:property name="box"><![CDATA[875,10]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+            <rect style="fill: #000000; fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="6ee027414584431dba2515d21d1a26dd" width="875" height="10"/>
+            <path style="fill: none; stroke: rgb(27, 50, 128); stroke-width: 2; stroke-opacity: 1;" d="M 0 5 L 875 5" p:name="line1" id="db992ee9fa0b4c0c86bd1a728e766bb9" transform="translate(0,0)"/>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" transform="matrix(1,0,0,1,18,19)" id="e1f809b923a3495db45a32a27efe8ca9"><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="adc4bedd05b34f26abea044d6ac4be18" transform="matrix(1,0,0,1,108.58433532714844,0)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,38]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,4.75]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="38" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="cdf99ebe15c54b74831be806b56ac651" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="dcfda962e11c4853bde138c37f74293d">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#cdf99ebe15c54b74831be806b56ac651" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#dcfda962e11c4853bde138c37f74293d)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c12b0329099b4bab884746a5e6b0dbc9"/>
+            <use xlink:href="#cdf99ebe15c54b74831be806b56ac651" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="4.75" y="19" width="756.916" height="0" p:name="text" id="cfee9a2474df41a4a83196b58cfae632" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="69cf96eaabb94bdf9911167b53bef849" transform="matrix(1,0,0,1,108.58433532714844,48)"><p:metadata><p:property name="box"><![CDATA[766.4156626506025,26]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,3.25]]></p:property><p:property name="fillColor"><![CDATA[#33CCFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA[sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="766.416" height="26" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(51, 204, 255); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="1238aa29f25d4616ae9d153c2d45f9cb" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="902e2aeef6ee4da79541c3ab7127ba27">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#1238aa29f25d4616ae9d153c2d45f9cb" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#902e2aeef6ee4da79541c3ab7127ba27)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="9a6e8a7fe52a4de8882ad676e1708ace"/>
+            <use xlink:href="#1238aa29f25d4616ae9d153c2d45f9cb" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="3.25" y="13" width="759.916" height="0" p:name="text" id="06a53bf3790b4e9d9997adcd37a12e29" style="font-family: sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bullet" id="216195c9fe384292aca831fb324e79e5" transform="matrix(1,0,0,1,0,0)"><p:metadata><p:property name="box"><![CDATA[84.33734939759037,80]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#4388CCFF]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[IRSTEA]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+
+            <defs>
+                <filter height="1.2558399" y="-0.12792" width="1.2558399" x="-0.12792" p:name="imageShading" id="5c5391f2b1f84df79708b8c1f90dee25">
+                    <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/>
+                </filter>
+                <g p:name="container" id="e8f648d41c3841b5877bf60b29fcc726">
+                    <ellipse p:name="ellipse" id="a84b18a2368643c0a68ad693d35cada2" cx="42.168674698795186" cy="40" rx="42.168674698795186" ry="40" style="fill: rgb(67, 136, 204); fill-opacity: 1; stroke: rgb(27, 50, 128); stroke-opacity: 1; stroke-width: 2;"/>
+                </g>
+            </defs>
+            <use xlink:href="#e8f648d41c3841b5877bf60b29fcc726" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#5c5391f2b1f84df79708b8c1f90dee25)" style="opacity: 0.6; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="c6b8455852984fa8aaf593515e4620df"/>
+            <use xlink:href="#e8f648d41c3841b5877bf60b29fcc726" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="0" y="33" width="84.3373" height="15" p:name="text" id="27d1dd1e81dc490096b0dffdd00d7d33" style="fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml">IRSTEA</div></foreignObject>
+        </g><g p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="c222a096d09f4f8f828dbe39ca579288" transform="matrix(1,0,0,1,116.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Real Collobrier]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="9e4a21b288a046708c6773511a97949a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="bc12ec8ddfaf49428b4e90b947867315"><tspan x="0" y="0">Real Collobrier</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="9feaa4f02bcb4edc8a98c494955f7d3a" transform="matrix(1,0,0,1,259.56024169921875,10)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Nos données]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="b36d85774f3c4161ad777e44641c4d31" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="fa94c5aa6fbc4ef3ba390597877ba9be"><tspan x="0" y="0">Nos données</tspan></text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="3a8752c2f39d475c9532d993a1104576" transform="matrix(1,0,0,1,393.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Carte]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="2f685bcc57fd4e338a0f65737d8d117a" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="6d2bcb24fc324019a900ca3605f790ae"><tspan x="0" y="0">Carte</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Sketchy.GUI:textbox" id="7c620f3afe7c4c62b59c300ff3fa42c6" transform="matrix(1,0,0,1,708,7)"><p:metadata><p:property name="box"><![CDATA[125,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Recherche rapide]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property></p:metadata>
+            <g p:name="rect" id="9e395fcdd7c045c0b2c12e34d7c56e47" transform="translate(0.5,0.5)" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;" p:name="line1" id="99c1557ff6184e818fdb1cd7ccf18923" transform="translate(0.5,0.5)" d="M 0 0 L 21.74149857443315 -0.43607726695743376 L 44.154196139992 0.1628563603656028 L 60.80714033281478 -0.047788119797667394 L 84.23289812923 0.4703531551999779 L 104.15986669426185 -0.0371537946343673 L 125 0 L 125.18065793020357 13.679088218688829 L 125 25 L 106.08603494477826 24.573939039242077 L 84.45251122721662 25.060285821841486 L 63.70822122703946 25.071586559322636 L 43.58231871068523 25.21184197959473 L 27.188156761083757 25.03264065657275 L 0 25 L 0.37132730598365926 15.46690782828825 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="98817b52f24d4c52ac85890ba7b265cf" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="5" y="17">Recherche rapide</text>
+        </g><g p:type="Shape" p:def="Evolus.Common:PlainTextV2" id="cc091dff917d4c3cba187e32cc47c841" transform="matrix(1,0,0,1,843,5)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[+]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|24px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="07d93dc72a574fbd8a293acfa38739b0" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: 'Comic Sans MS'; font-size: 24px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="701252ef72e74b4ea4af28c53116a726"><tspan x="0" y="0">+</tspan></text>
+        </g><g p:type="Shape" p:def="Evolus.Common:2pointline" id="b02179f6686b49bf897868718c883f8b" transform="matrix(1,0,0,1,246,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="de06679bc103492486ed63f3638dcccb" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="62f1edbcd5ab4997bdf8a9ec7a290864" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="41785d39e167486baff68c026aa1b00e" transform="matrix(1,0,0,1,375,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="59cfb7a6c2f4477e9cf5a274081d88b0" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="ff88541ba9964960abda1d9277ff1aec" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:2pointline" id="1225d966216745caac8ae2abffca142d" transform="matrix(1,0,0,1,450,-44)"><p:metadata><p:property name="a"><![CDATA[0,48]]></p:property><p:property name="b"><![CDATA[2,76]]></p:property><p:property name="strokeColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property></p:metadata>
+                <path fill="none" style="stroke: rgba(0, 0, 0, 0); stroke-width: 10px;" p:name="bgpath" id="bb979e5506b84e8f8eedd714b362f30a" d="M 0 48 L 2 76 z"/>
+                <path fill="none" style="stroke-linejoin: round; stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2;" p:name="path" id="ec5a59516bbf4f4bb8bc31cae24c6eb6" transform="translate(0,0)" d="M 0 48 L 2 76 z"/>
+            </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:PlainTextV2" id="887391ca3e04450fab48d98f7da7b218" transform="matrix(1,0,0,1,461.56024169921875,9)"><p:metadata><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="width"><![CDATA[100,0]]></p:property><p:property name="fixedWidth"><![CDATA[false]]></p:property><p:property name="label"><![CDATA[Contact]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|16px|none]]></p:property><p:property name="textAlign"><![CDATA[0,0]]></p:property></p:metadata>
+            <rect x="0" y="0" style="fill: none; stroke: none; visibility: hidden;" p:name="bgRect" id="985336f83afb49179d59007f7319cd8e" width="0" height="0"/>
+            <text y="9.0077095" x="17.999992" text-anchor="start" style="dominant-baseline: hanging; fill: rgb(255, 255, 255); fill-opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 16px; font-weight: bold; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="d9ea5245f2f24fa09910a81663d59e9f"><tspan x="0" y="0">Contact</tspan></text>
+        </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="c84ca834382542eeb160a5421e8e1b2e" transform="matrix(1,0,0,1,19,640)"><p:metadata><p:property name="box"><![CDATA[195,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#33CC00FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[J'accepte ces conditions]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="cdf7761a1ce246949e29ea098e243f01" style="fill: rgb(51, 204, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="7b1d4f8b68df458d848c2463e3fd82b5" d="M 0 0 L 16.698352953573643 -0.30939306784534093 L 37.686750846790154 -0.32331459721129907 L 56.36713632755396 -0.36184269165168303 L 75.17070707931698 0.30919668267259803 L 92.68991508247562 0.16505787201507605 L 113.14508336365053 0.07650899537275346 L 129.5236389634624 -0.3524251497953873 L 153.25283067493007 0.15903848139661714 L 195 0 L 195.30582567498536 14.386064533236791 L 195 25 L 176.07728372158576 24.63754814386435 L 159.40790710600245 24.868124981582007 L 137.7183424053661 24.846854549918085 L 119.01644678792206 25.40273918716941 L 99.39050307337061 24.80291184338434 L 79.40526287212406 24.61104647135766 L 57.54007566547613 24.60411094571313 L 39.34708378075691 25.365827527241944 L 0 25 L -0.3686684512238195 11.376550071822194 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="36215d70e35b45a98255b120bb84b514" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="15" y="17">J'accepte ces conditions</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="1fa74118828a482e9210371616fcc5ca" transform="matrix(1,0,0,1,19,173)"><p:metadata><p:property name="textContent"><![CDATA[Conditions d'utilisation<br />]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="217" height="24" p:name="htmlObject" id="61bd5bd706c049169c43756b07b26bb6" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="ddad9e8113034494a3eafd0bb157af93" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml">Conditions d'utilisation<br /></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RoundedRect" id="a2b7d52f82334db188116b309346a147" transform="matrix(1,0,0,1,19,212)"><p:metadata><p:property name="box"><![CDATA[863,367]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="radius"><![CDATA[0,0]]></p:property><p:property name="textPadding"><![CDATA[0,45.875]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#1B3280FF]]></p:property><p:property name="strokeStyle"><![CDATA[2|]]></p:property><p:property name="textContent"><![CDATA[]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|normal|normal|13px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+
+            <defs>
+                <rect width="863" height="367" rx="0" ry="0" x="0" y="0" style="stroke-width: 2; fill: rgb(255, 255, 255); fill-opacity: 0; stroke: rgb(27, 50, 128); stroke-opacity: 1;" p:name="rrRect" id="9d8a1218b4db43a9ac2f016e419e4e77" transform="translate(0,0)"/>
+                <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="c5ee1f29dd4f41e39e6be795cf14c780">
+                    <feGaussianBlur stdDeviation="1" in="SourceAlpha"/>
+                </filter>
+            </defs>
+            <use xlink:href="#9d8a1218b4db43a9ac2f016e419e4e77" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#c5ee1f29dd4f41e39e6be795cf14c780)" style="opacity: 0.5; visibility: hidden;" p:heavy="true" p:name="bgCopy" id="d45187929e844f389db440c8f429e63a"/>
+            <use xlink:href="#9d8a1218b4db43a9ac2f016e419e4e77" xmlns:xlink="http://www.w3.org/1999/xlink"/>
+            <foreignObject x="45.875" y="184" width="771.25" height="0" p:name="text" id="451049e364004450b0f6fee627c81e90" style="font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 13px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; color: rgb(0, 0, 0); opacity: 1; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.BasicWebElements:heading" id="64973878ecf74a0da5ec1b8d5064fdc0" transform="matrix(1,0,0,1,327,294)"><p:metadata><p:property name="textContent"><![CDATA[<div style="text-align: center;">Tout le blabla<br />spécifique par observatoire<br /></div>]]></p:property><p:property name="textFont"><![CDATA["Liberation Sans",Arial,sans-serif|bold|normal|20px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="customStyle"><![CDATA[]]></p:property></p:metadata>
+
+            <foreignObject x="0" y="0" width="259" height="48" p:name="htmlObject" id="622aedf22e7144d89f9626530b99b349" style="color: rgb(0, 0, 0); opacity: 1; font-family: &quot;Liberation Sans&quot;,Arial,sans-serif; font-size: 20px; font-weight: bold; font-style: normal; text-decoration: none;">
+                <div xmlns="http://www.w3.org/1999/xhtml" p:name="textDiv" id="3a46aa64ae664930a2d75db6c84eda1c" style="white-space: nowrap; display: inline-block !important"><div xmlns="http://www.w3.org/1999/xhtml"><div style="text-align: center;">Tout le blabla<br />spécifique par observatoire<br /></div></div></div>
+            </foreignObject>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:checkbox" id="8a99a0625857491eb1050872459fcb3d" transform="matrix(1,0,0,1,17,613)"><p:metadata><p:property name="checked"><![CDATA[false]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Je reconnais avoir lu les conditions d'utilisation ci-dessus]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata>
+           <g p:name="rect" id="e37c37b846b5431eb643accd3905260f" style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+                <path d="m 1.2896594,14.987973 c 4.21875,-0.0313 9.1874996,-0.562496 13.4062466,-0.593746 0.44792,-4.21875 -0.604173,-8.4375002 -0.156253,-12.6562502 -4.5937436,-0.22917 -8.9374936,0.0417 -13.5312436,-0.1875 -0.0729,4.47917 0.35417,8.9583302 0.28125,13.4374962 z" p:name="cbBox" id="2abacbf32b6644b3822c418af23e053b"/>
+                <path style="fill: none; visibility: hidden;" d="m 5.0048894,5.0121168 1.88908,4.8033 3.3587596,-3.18198 c 2.28541,-4.02289 3.74045,-4.86056 5.126527,-8.83883" p:name="cbTick" id="58f269c78dde4cc3a23a7e8ac13bb258"/>
+    		</g>
+    		<text p:name="text" id="7ddf9a736fbb4bba82d4d39f2f69d095" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="20" y="12">Je reconnais avoir lu les conditions d'utilisation ci-dessus</text>
+        </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Sketchy.GUI:button" id="0572fa29c1634fc497f75e4762202694" transform="matrix(1,0,0,1,233,640)"><p:metadata><p:property name="box"><![CDATA[127,25]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="default"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FF0000FF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[1|]]></p:property><p:property name="textContent"><![CDATA[Je n'accepte pas]]></p:property><p:property name="textFont"><![CDATA['Comic Sans MS'|bold|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata>
+            <g p:name="rect" id="b95eb6c3077d48ff963a0c3f7c28c78d" style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 1;">
+    			<path style="stroke-linejoin: round;" p:name="line1" id="05e8d5556bce4ff3ae711bf0f378e9e5" d="M 0 0 L 22.13771510203776 -0.2607838674622719 L 44.26104603751432 -0.16304448106512281 L 65.95252615442554 0.19828310845328645 L 88.12838551519984 -0.3775721393882294 L 108.30379142788175 0.49132834920757806 L 127 0 L 126.73646639185225 12.924804035860866 L 127 25 L 108.40444293026421 24.731606849277757 L 90.47442370489048 25.071266809906874 L 72.22526116532379 25.27702632907016 L 53.18607647543955 24.82217734901724 L 31.5867305480717 24.792630208056867 L 0 25 L -0.40909795410983074 14.394920778457582 L 0 0 z"/>
+    		</g>
+    		<text p:name="text" id="2c57afb7b00b4f629b4f6b0c14f2fb53" style="font-family: 'Comic Sans MS'; font-size: 12px; font-weight: bold; font-style: normal; text-decoration: none; fill: rgb(0, 0, 0); fill-opacity: 1; dominant-baseline: auto;" x="8" y="17">Je n'accepte pas</text>
+        </g></Content></Page></Pages></Document>
\ No newline at end of file
diff --git a/src/Irstea/BdohSecurityBundle/Resources/doc/index.rst b/src/Irstea/BdohSecurityBundle/Resources/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..0699dee6f4d136860bbad21367edd91aeb093c10
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.en.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'Needs',
+    'Categorie'         => 'Categories',
+    'ObjectifRecherche' => 'Themes',
+    'Role'              => 'Roles',
+    'RoleChronique'     => 'Roles on a time series',
+    'RoleObservatoire'  => 'Roles on an observatory',
+    'RoleSite'          => 'Roles on an experimental site',
+    'TypeTravaux'       => 'Work types',
+    'Utilisateur'       => 'Users',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8640fab01f9015e66a1b2b6065e55bd8b8fb980
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesPlurals.fr.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'Besoins',
+    'Categorie'         => 'Catégories',
+    'ObjectifRecherche' => 'Thématiques',
+    'Role'              => 'Rôles',
+    'RoleChronique'     => 'Rôles sur une chronique',
+    'RoleObservatoire'  => 'Rôles sur un observatoire',
+    'RoleSite'          => 'Rôles sur un site expérimental',
+    'TypeTravaux'       => 'Types de travaux',
+    'Utilisateur'       => 'Utilisateurs',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..e53889b313e18e1204fe615fd940d63c327821cb
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.en.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'Need',
+    'Categorie'         => 'Category',
+    'ObjectifRecherche' => 'Theme',
+    'Role'              => 'Role',
+    'RoleChronique'     => 'Role on a time series',
+    'RoleObservatoire'  => 'Role on an observatory',
+    'RoleSite'          => 'Role on an experimental site',
+    'TypeTravaux'       => 'Work type',
+    'Utilisateur'       => 'User',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..9da77db49a6f4518eb0ba6c8eb695c507fe6d788
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingulars.fr.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'Besoin',
+    'Categorie'         => 'Catégorie',
+    'ObjectifRecherche' => 'Thématique',
+    'Role'              => 'Rôle',
+    'RoleChronique'     => 'Rôle sur une chronique',
+    'RoleObservatoire'  => 'Rôle sur un observatoire',
+    'RoleSite'          => 'Rôle sur un site expérimental',
+    'TypeTravaux'       => 'Type de travaux',
+    'Utilisateur'       => 'Utilisateur',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..602ff9a3c2b25160fb3e708d222ee8978e9a87bd
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.en.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'a',
+    'Categorie'         => 'a',
+    'ObjectifRecherche' => 'a',
+    'Role'              => 'a',
+    'RoleChronique'     => 'a',
+    'RoleObservatoire'  => 'a',
+    'RoleSite'          => 'a',
+    'TypeTravaux'       => 'a',
+    'Utilisateur'       => 'a',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..191fec902ee73121ac64ea300c51025edb67e00d
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsArticles.fr.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'un',
+    'Categorie'         => 'une',
+    'ObjectifRecherche' => 'une',
+    'Role'              => 'un',
+    'RoleChronique'     => 'un',
+    'RoleObservatoire'  => 'un',
+    'RoleSite'          => 'un',
+    'TypeTravaux'       => 'un',
+    'Utilisateur'       => 'un',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..e16819897378c363946a8ba87766492aa1bed367
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.en.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'of the ',
+    'Categorie'         => 'of the ',
+    'ObjectifRecherche' => 'of the ',
+    'Role'              => 'of the ',
+    'RoleChronique'     => 'of the ',
+    'RoleObservatoire'  => 'of the ',
+    'RoleSite'          => 'of the ',
+    'TypeTravaux'       => 'of the ',
+    'Utilisateur'       => 'of the ',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..f90d89ec1d96871b3fae5dbdf7d8bc6c532d5a2a
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/entitiesSingularsDefinedArticles.fr.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Besoin'            => 'du ',
+    'Categorie'         => 'de la ',
+    'ObjectifRecherche' => 'de la ',
+    'Role'              => 'du ',
+    'RoleChronique'     => 'du ',
+    'RoleObservatoire'  => 'du ',
+    'RoleSite'          => 'du ',
+    'TypeTravaux'       => 'du ',
+    'Utilisateur'       => "de l'",
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/fields.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/fields.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..e93156e9d30279b36388387b972ada84850a8348
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/fields.en.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    /* Common fields */
+
+    /* Besoin */
+    'besoin'              => [
+        'details'         => 'Additional information',
+        'duree'           => 'Desired access duration (in mounths)',
+        'objectif'        => 'Theme',
+        'parametres'      => 'Parameters',
+        'stations'        => 'Stations',
+        'type'            => 'Work type',
+        'traite'          => 'Processed need',
+        'aTraiter'        => 'Need to process ',
+        'besoinsTraites'  => 'Processed needs',
+        'besoinsATraiter' => 'Needs to process',
+        'none'            => 'None',
+    ],
+
+    /* Categorie */
+
+    /* ObjectifRecherche */
+
+    /* Role */
+
+    /* RoleChronique */
+
+    /* RoleObservatoire */
+
+    /* RoleSite */
+
+    /* TypeTravaux */
+
+    /* Utilisateur */
+    'adresse'           => 'Address',
+    'besoins'           => 'Needs',
+    'email'             => 'E-mail address',
+    'categorie'         => 'Category',
+    'finAcces'          => 'End of access',
+    'login'             => 'Login',
+    'newPassword'       => 'New password',
+    'newPasswordRepeat' => 'Repeat the password',
+    'oldPassword'       => 'Current password',
+    'organisme'         => 'Organism',
+    'password'          => 'Password',
+    'passwordRepeat'    => 'Repeat the password',
+    'prenom'            => 'First name',
+    'telephone'         => 'Phone number',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/fields.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/fields.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dff570b01a7d468c6210179bf3654b1f4cf6ef6
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/fields.fr.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    /* Common fields */
+
+    /* Besoin */
+    'besoin'              => [
+        'details'         => 'Informations complémentaires',
+        'duree'           => "Durée d'accès souhaitée (en mois)",
+        'objectif'        => 'Thématique ',
+        'parametres'      => 'Paramètres',
+        'stations'        => 'Stations',
+        'type'            => 'Type de travaux',
+        'traite'          => 'Besoin traité',
+        'aTraiter'        => 'Besoin à traiter ',
+        'besoinsTraites'  => 'Besoins traités',
+        'besoinsATraiter' => 'Besoins à traiter',
+        'none'            => 'Aucun besoin',
+    ],
+
+    /* Categorie */
+
+    /* ObjectifRecherche */
+
+    /* Role */
+
+    /* RoleChronique */
+
+    /* RoleObservatoire */
+
+    /* RoleSite */
+
+    /* TypeTravaux */
+
+    /* Utilisateur */
+    'adresse'           => 'Adresse',
+    'besoins'           => 'Besoins',
+    'email'             => 'Adresse e-mail',
+    'categorie'         => 'Catégorie',
+    'finAcces'          => "Fin d'accès",
+    'login'             => 'Identifiant',
+    'newPassword'       => 'Nouveau mot de passe',
+    'newPasswordRepeat' => 'Répétez le mot de passe',
+    'oldPassword'       => 'Mot de passe actuel',
+    'organisme'         => 'Organisme',
+    'password'          => 'Mot de passe',
+    'passwordRepeat'    => 'Répétez le mot de passe',
+    'prenom'            => 'Prénom',
+    'telephone'         => 'N° de téléphone',
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/messages.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/messages.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1d6da08c64d5f2ed35e31d63bb0eb04cc6f4059
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/messages.en.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$entities = require 'entitiesSingulars.en.php';
+$fields = require 'fields.en.php';
+
+/*************************************************
+ * CREATION AND EDITION OF A USER
+ ************************************************/
+
+$user = [
+    'security.utilisateur' => [
+        'create'                       => [
+            'title'       => 'Register on BDOH',
+            'submit'      => 'Register',
+            'isCompleted' => 'Your BDOH account has been created. You may now sign in.',
+            'info'        => [
+                'isTheFirstStep' => 'The account you are creating will be valid for the whole BDOH application. To download data, once signed in, you will have to make <b>specific access requests</b> on observatories you are interested in by using the data access request form or by contacting a manager.',
+                'yourIdentifier' => 'The <b>e-mail address</b> will be your <u>login</u>.',
+            ],
+        ],
+        'edit'                         => [
+            'title'       => 'Modifiy my BDOH account',
+            'submit'      => 'Save the changes',
+            'isCompleted' => 'Your BDOH account has been updated.',
+            'info'        => [
+                'changePassword' => 'If you want to <u>change your password</u> fill the <u>following 3 fields</u>',
+            ],
+        ],
+        'right'                        => [
+            'title'       => 'Rights management: roles assignment',
+            'role'        => 'Roles assignment',
+            'submit'      => "Change user's roles",
+            'isCompleted' => "The user's roles have been updated.",
+        ],
+        'all'                          => [
+            'title'                        => 'Rights management: user selection',
+            'action'                       => 'Change his roles',
+            'besoin'                       => 'Need',
+            'gestionnaireObservatoires'    => 'Manager of ALL the observatories',
+            'gestionnaireObservatoire'     => 'Manager of the observatory',
+            'gestionnaireSite'             => 'Site manager',
+            'contributeurSite'             => 'Contributor',
+            'utilisateurDeConfiance'       => 'Trusted user',
+            'utilisateurChronique'         => 'User of time series',
+            'OfObservatory(%observatory%)' => 'In observatory %observatory%',
+            'OtherUsers'                   => 'Other users',
+        ],
+        'loginInfo'                    => 'Login information',
+        'personalInfo'                 => 'Personnal information',
+        'newRightMail'                 => [
+            'body'  => [
+                'hello'    => 'Hello',
+                'part1'    => ',
+
+
+You receive this e-mail because new rights have been assigned to you on BDOH.',
+                'part2'    => 'You can access the application with the following link:',
+                'youAre1'  => 'Your are now: ',
+                'youAre2'  => ', you are now: ',
+            ],
+            'title' => ' BDOH: New rights',
+        ],
+        'newAccountMail'               => [
+            'body'  => 'created an account on BDOH.
+
+You can assign him/her a role in your observatory from the following page:',
+            'title' => 'BDOH: new user',
+        ],
+        'newMailUtilisateur'           => [
+            'body'  => [
+                'hello' => 'Hello',
+                'step1' => 'You have created an account on BDOH. It is valid for the whole application.',
+                'step2' => 'To download data, once signed in, you will have to make specific access requests on observatories you are interested in by using the data access request form or by contacting a manager:',
+                'step3' => "Accordance with Articles 39 and 40 of the law “\u{a0}Informatique et Libertés\u{a0}” amended by Law No. 2004-801 of 6 August 2004 on the protection of individuals with regard to the processing of personal data, you have a right to access and rectify data concerning you.",
+                'step4' => 'To request a correction please contact: <a href="mailto:bdoh.support@lists.irstea.fr">bdoh.support@lists.irstea.fr</a>.',
+            ],
+            'title' => 'Welcome to BDOH',
+        ],
+        'newNeedMail'                  => [
+            'body'  => 'created a new data access request on your observatory on BDOH.
+
+You can assign him/her a role in your observatory from the following page:',
+            'title' => 'BDOH: new need',
+        ],
+        'mailFooter'                   => 'You receive this e-mail because you have the right to validate users for your observatory.
+        
+This e-mail is automatically generated, thank you for not replying.',
+        'gestionnaireDesObservatoires' => 'Manager of ALL the observatories',
+        'gestionnaireObservatoire'     => 'Manager of the observatory',
+        'utilisateurObservatoire'      => 'Trusted user for the observatory',
+        'gestionnaireSite'             => 'Manager of one or more experimental sites',
+        'contributeurSite'             => 'Contributor of one or more experimental sites',
+        'utilisateurChronique'         => 'User limited to one or more time series',
+        'gestion'                      => 'Rights management',
+        'creation'                     => 'New user',
+        'aboutTheObservatory'          => 'For the observatory',
+        'validityDate'                 => 'These rights are valid until the (D-M-Y):',
+        'noValidityDate'               => 'no date of end of validity',
+    ],
+];
+
+/*************************************************
+ * CREATION OF A 'BESOIN'
+ ************************************************/
+
+$besoin = [
+    'security.besoin' => [
+        'create'                => [
+            'title'       => 'Request for data access',
+            'submit'      => 'Send the request',
+            'isCompleted' => 'Your request for data access has been registered, an administrator will respond.',
+            'info'        => [
+            ],
+        ],
+        'scope(%observatoire%)' => "This request <u>only applies to</u> the observatory <b>“\u{a0}%observatoire%\u{a0}”</b>.",
+    ],
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'User account has expired.' => 'This BDOH account is expired.',
+    'Bad credentials.'          => 'The <u>e-mail address</u> or <u>password</u> are wrong or this BDOH account is expired.',
+    'contactGestionnaire'       => 'To contact a manager of this observatory please contact:',
+    'userManual(%link%)'        => 'For more information about using BDOH you may read <a href="%link%">the BDOH documentaion</a>.',
+    'technicalContact'          => 'For technical questions about using BDOH please contact <a href="mailto:bdoh.support@lists.irstea.fr">bdoh.support@lists.irstea.fr</a>.',
+
+    'security' => [
+        'login_form' => [
+            'connection'   => 'Sign in',
+            'title'        => 'Sign in to BDOH',
+            'username'     => 'E-mail address',
+            'password'     => 'Password',
+            'connectTo'    => 'Sign in',
+            'lostPassword' => 'Forgot Password?',
+        ],
+    ],
+    'Utilisateur.password.badRepetition' => 'Bad password repetition.',
+    'Utilisateur.password.badCurrent'    => 'This value should be your current password.',
+    'Utilisateur.newPassword.mandatory'  => 'You have not completed this field.',
+    'Utilisateur.oldPassword.mandatory'  => 'You have not completed this field.',
+];
+
+// Password resetting
+$resetting = [
+    'resetting' => [
+        'password_already_requested' => 'A new password has been requested for this user in the past 24 hours.',
+        'isCompleted'                => 'Your password has been changed successfully.',
+        'check_email'                => "An e-mail has been sent to “\u{a0}%email%\u{a0}”, it contains a link to reset your password.",
+        'request'                    => [
+            'invalid_email' => "The e-mail address “\u{a0}%email%\u{a0}” does not exist.",
+            'email'         => 'E-mail address',
+            'submit'        => 'Reset your password',
+        ],
+        'reset'                      => [
+            'submit' => 'Change your password',
+        ],
+        'flash'                      => [
+            'success' => 'The password has been successfully reset',
+        ],
+        'email'                      => [
+            'subject' => 'Reset your password',
+            'message' => 'Hello %username%,
+
+To reset your password please visit the following link:
+%confirmationUrl%
+
+Regards,
+
+The BDOH team.',
+        ],
+    ],
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entities, $fields, $user, $besoin, $various, $resetting);
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/messages.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/messages.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..11420380fdc57a23b1727bfe0dcd365bd80caf13
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/messages.fr.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+$entities = require 'entitiesSingulars.fr.php';
+$fields = require 'fields.fr.php';
+
+/*************************************************
+ * CREATION AND EDITION OF A USER
+ ************************************************/
+
+$user = [
+    'security.utilisateur' => [
+        'create'                       => [
+            'title'       => 'Créer un compte sur BDOH',
+            'submit'      => 'Créer le compte',
+            'isCompleted' => 'Votre compte BDOH a bien été créé. Vous pouvez désormais vous connecter.',
+            'info'        => [
+                'isTheFirstStep' => "Le compte que vous allez créer sera valable sur toute l'application BDOH. Pour pouvoir télécharger des données il faudra, une fois connecté, faire <b>des demandes d'accès spécifiques</b> sur les observatoires qui vous intéressent via le formulaire de demande d'accès aux données ou contacter un gestionnaire.",
+                'yourIdentifier' => "L'<b>adresse e-mail</b> sera votre <u>identifiant de connexion</u>.",
+            ],
+        ],
+        'edit'                         => [
+            'title'       => 'Modifier mon compte BDOH',
+            'submit'      => 'Enregistrer les modifications',
+            'isCompleted' => 'Votre compte BDOH a été mis à jour.',
+            'info'        => [
+                'changePassword' => 'Si vous desirez <u>changer votre mot de passe</u> remplissez les <u>3 champs suivants</u>',
+            ],
+        ],
+        'right'                        => [
+            'title'       => 'Gestion des droits : attribution des rôles',
+            'role'        => 'Attribution des rôles',
+            'submit'      => "Modifier les rôles de l'utilisateur",
+            'isCompleted' => "Les rôles de l'utilisateur ont été mis à jour.",
+        ],
+        'all'                          => [
+            'title'                        => "Gestion des droits : choix d'un utilisateur",
+            'action'                       => 'Modifier ses rôles',
+            'besoin'                       => 'Besoin',
+            'gestionnaireObservatoires'    => 'Gestionnaire de TOUS les observatoires',
+            'gestionnaireObservatoire'     => "Gestionnaire de l'observatoire",
+            'gestionnaireSite'             => 'Gestionnaire de site',
+            'contributeurSite'             => 'Contributeur',
+            'utilisateurDeConfiance'       => 'Utilisateur de confiance',
+            'utilisateurChronique'         => 'Utilisateur de chronique',
+            'OfObservatory(%observatory%)' => "De l'observatoire %observatory%",
+            'OtherUsers'                   => 'Les autres',
+        ],
+        'loginInfo'                    => 'Informations de connexion',
+        'personalInfo'                 => 'Informations personnelles',
+        'newRightMail'                 => [
+            'body'  => [
+                'hello'    => 'Bonjour',
+                'part1'    => ',
+
+
+Vous recevez cet e-mail car de nouveaux droits vous ont été attribués sur BDOH.',
+                'part2'    => "Vous pouvez accédez à l'application depuis l'adresse suivante :",
+                'youAre1'  => 'Vous êtes désormais : ',
+                'youAre2'  => ', vous êtes désormais : ',
+            ],
+            'title' => ' BDOH : Nouveaux droits',
+        ],
+        'newAccountMail'               => [
+            'body'  => 'a créé un compte sur BDOH.
+
+Vous pouvez lui attribuer un rôle sur votre observatoire deppuis la page suivante :',
+            'title' => 'BDOH : nouvel utilisateur',
+        ],
+        'newMailUtilisateur'           => [
+            'body'  => [
+                'hello' => 'Bonjour',
+                'step1' => "Vous avez créé un compte sur BDOH. Il est valable pour toute l'application.",
+                'step2' => "Pour pouvoir télécharger des données il faudra, une fois connecté, faire des demandes d'accès spécifiques sur les observatoires qui vous intéressent via le formulaire de demande d'accès aux données ou contacter un gestionnaire :",
+                'step3' => "Conformément aux articles 39 et 40 de la loi Informatique et Libertés modifiée par la loi n° 2004-801 du 6 août 2004 relative à la protection des personnes physiques à l'égard des traitements de données à caractère personnel, vous disposez d'un droit d'accès et de rectification des données vous concernant.",
+                'step4' => 'Pour toute demande de rectification veuillez vous adresser à : bdoh.support@lists.irstea.fr.',
+            ],
+            'title' => 'Bienvenue sur BDOH',
+        ],
+        'newNeedMail'                  => [
+            'body'  => "a exprimé une nouvelle demande d'accès aux données de votre observatoire sur BDOH.
+
+Vous pouvez lui attribuer un rôle sur votre observatoire deppuis la page suivante :",
+            'title' => 'BDOH : nouveau besoin',
+        ],
+        'mailFooter'                   => 'Vous recevez cet e-mail parce que vous possédez le droit de valider les utilisateurs pour votre observatoire.
+        
+Cet e-mail est généré automatiquement, merci de ne pas y répondre.',
+        'gestionnaireDesObservatoires' => 'Gestionnaire de TOUS les observatoires',
+        'gestionnaireObservatoire'     => "Gestionnaire de l'observatoire",
+        'utilisateurObservatoire'      => "Utilisateur de confiance sur l'observatoire",
+        'gestionnaireSite'             => "Gestionnaire d'un ou plusieurs sites expérimentaux",
+        'contributeurSite'             => 'Contributeur sur un ou plusieurs sites expérimentaux',
+        'utilisateurChronique'         => 'Utilisateur limité à une ou plusieurs chroniques',
+        'gestion'                      => 'Gestion des droits',
+        'creation'                     => 'Nouvel utilisateur',
+        'aboutTheObservatory'          => "Pour l'observatoire",
+        'validityDate'                 => "Ces droits sont valables jusqu'au :",
+        'noValidityDate'               => 'pas de date de fin de validité',
+    ],
+];
+
+/*************************************************
+ * CREATION OF A 'BESOIN'
+ ************************************************/
+
+$besoin = [
+    'security.besoin' => [
+        'create'                => [
+            'title'       => "Demande d'accès aux données",
+            'submit'      => 'Envoyer la demande',
+            'isCompleted' => "Votre demande d'accès a bien été enregistrée, un administrateur va y répondre.",
+            'info'        => [
+            ],
+        ],
+        'scope(%observatoire%)' => "Cette demande <u>ne concernera que</u> l'observatoire <b>«\u{a0}%observatoire%\u{a0}»</b>.",
+    ],
+];
+
+/*************************************************
+ * VARIOUS MESSAGES
+ ************************************************/
+
+$various = [
+    'User account has expired.' => 'Ce compte BDOH a expiré.',
+    'Bad credentials.'          => "L'<u>adresse e-mail</u> ou le <u>mot de passe</u> sont erronés ou ce compte BDOH a expiré.",
+    'contactGestionnaire'       => 'Pour contacter un gestionnaire de cet observatoire adressez-vous à :',
+    'userManual(%link%)'        => "Pour plus d'informations sur l'utilisation de BDOH vous pouvez consulter <a href=\"%link%\">la documentaion de BDOH</a>.",
+    'technicalContact'          => "Pour les demandes techniques concernant l'utilisation de BDOH veuillez contacter <a href=\"mailto:bdoh.support@lists.irstea.fr\">bdoh.support@lists.irstea.fr</a>.",
+
+    'security' => [
+        'login_form' => [
+            'connection'   => 'Connexion',
+            'title'        => 'Connexion à BDOH',
+            'username'     => 'Adresse e-mail',
+            'password'     => 'Mot de passe',
+            'connectTo'    => 'Se connecter',
+            'lostPassword' => 'Mot de passe oublié',
+        ],
+    ],
+    'Utilisateur.password.badRepetition' => 'Mauvaise répétition du mot de passe.',
+    'Utilisateur.password.badCurrent'    => 'Vous devez renseigner ce champ avec votre mot de passe actuel.',
+    'Utilisateur.newPassword.mandatory'  => "Vous n'avez pas rempli ce champ.",
+    'Utilisateur.oldPassword.mandatory'  => "Vous n'avez pas rempli ce champ.",
+];
+
+// Password resetting
+$resetting = [
+    'resetting' => [
+        'password_already_requested' => 'Un nouveau mot de passe a déjà été demandé pour cet utilisateur dans les dernières 24 heures.',
+        'isCompleted'                => 'Votre mot de passe à bien été modifié.',
+        'check_email'                => "Un e-mail a été envoyé à l'adresse «\u{a0}%email%\u{a0}», il contient un lien pour réinitialiser votre mot de passe.",
+        'request'                    => [
+            'invalid_email' => "L'adresse e-mail «\u{a0}%email%\u{a0}» n'existe pas.",
+            'email'         => 'Adresse e-mail',
+            'submit'        => 'Réinitialiser votre mot de passe',
+        ],
+        'reset'                      => [
+            'submit' => 'Modifier votre mot de passe',
+        ],
+        'flash'                      => [
+            'success' => 'Le mot de passe a été réinitialisé avec succès',
+        ],
+        'email'                      => [
+            'subject' => 'Réinitialiser votre mot de passe',
+            'message' => "Bonjour %username%,
+
+Pour réinitialiser votre mot de passe merci de vous rendre sur :
+%confirmationUrl%
+
+Cordialement,
+
+L'équipe BDOH.",
+        ],
+    ],
+];
+
+/*************************************************
+ * RETURNED MESSAGES
+ ************************************************/
+
+return array_merge($entities, $fields, $user, $besoin, $various, $resetting);
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/validators.en.php b/src/Irstea/BdohSecurityBundle/Resources/translations/validators.en.php
new file mode 100644
index 0000000000000000000000000000000000000000..954bbd4c522a248f86a7733f7f7dae05c577c599
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/validators.en.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Utilisateur' => [
+        'email.alreadyUsed'                => 'This e-mail address is already used.',
+        'email.invalid'                    => 'This e-mail address does not seem valid.',
+        'password.badRepetition'           => 'Bad password repetition.',
+        'password.minLength({{ limit }})'  => '|The password must contain at least {{ limit }} characters.',
+        'telephone.minLength({{ limit }})' => '|Phone number too short: {{ limit }} minimum characters.',
+        'oldPassword.mandatory'            => 'You have not completed this field.',
+        'newPassword.mandatory'            => 'You have not completed this field.',
+    ],
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/translations/validators.fr.php b/src/Irstea/BdohSecurityBundle/Resources/translations/validators.fr.php
new file mode 100644
index 0000000000000000000000000000000000000000..56bfbbe71c37d9a780d24a7bca27d6150a42e5f7
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/translations/validators.fr.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+return [
+    'Utilisateur' => [
+        'email.alreadyUsed'                => 'Cette adresse e-mail est déjà utilisée.',
+        'email.invalid'                    => 'Cette adresse e-mail ne semble pas valide.',
+        'password.badRepetition'           => 'Mauvaise répétition du mot de passe.',
+        'password.minLength({{ limit }})'  => '|Le mot de passe doit contenir au moins {{ limit }} caractères.',
+        'telephone.minLength({{ limit }})' => '|N° de téléphone trop court : {{ limit }} caractères minimum.',
+        'oldPassword.mandatory'            => "Vous n'avez pas rempli ce champ.",
+        'newPassword.mandatory'            => "Vous n'avez pas rempli ce champ.",
+    ],
+];
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/besoin-inList.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/besoin-inList.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dfe3a8f1de9e1ae680dc240874cc2cf57e61723d
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/besoin-inList.html.twig
@@ -0,0 +1,63 @@
+{% from '::macros.html.twig' import i18nEntityLabel %}
+{% if besoins %}
+    {% for besoin in besoins %}
+        {% set nomBesoin=[nomBesoinMain,besoin.id]|join %}
+        <div class="row box">
+            <div class="col-md-14">
+                <div class="col-md-10">
+                    <b>{{ 'besoin.duree' | trans }}{{ 'deux_points'|trans }}</b>
+                </div>
+                <div class="col-md-14">
+                    {{ besoin.duree }}
+                </div>
+                <div class="col-md-10">
+                    <b>{{ 'besoin.objectif' | trans }}{{ 'deux_points'|trans }}</b>
+                </div>
+                <div class="col-md-14">
+                    {{ besoin.objectif }}
+                </div>
+                <div class="col-md-10">
+                    <b>{{ 'besoin.type' | trans }}{{ 'deux_points'|trans }}</b>
+                </div>
+                <div class="col-md-14">
+                    {{ besoin.type }}
+                </div>
+                <div class="col-md-24">
+                    <br/>
+                </div>
+                <div class="col-md-4">
+                    <b>{{ 'besoin.parametres' | trans }}{{ 'deux_points'|trans }}</b>
+                </div>
+                <div class="col-md-8">
+                    {%- for param in besoin.parametres -%}
+                        {{- i18nEntityLabel(param, 'nom', '') -}}
+                        {%- if not loop.last -%}<br/>{% endif -%}
+                    {%- endfor -%}
+                </div>
+                <div class="col-md-3">
+                    <b>{{ 'besoin.stations' | trans }}{{ 'deux_points'|trans }}</b>
+                </div>
+                <div class="col-md-9">
+                    {%- for station in besoin.stations -%}
+                        {{- station.nom -}}
+                        {%- if not loop.last -%}<br/>{% endif -%}
+                    {%- endfor -%}
+                </div>
+            </div>
+            <div class="col-md-10">
+                <div class="col-md-24"><b>{{ 'besoin.details' | trans }}{{ 'deux_points'|trans }}</b></div>
+                <div class="col-md-24"> {{ besoin.details }} </div>
+                {% if nomBesoinMain ==  'besoinATraiter' %}
+                    <div class="col-md-24">
+                        <br/>
+                    </div>
+                    <div class="col-md-24">{{ form_widget(attribute(form, nomBesoin)) }}</div>
+                {% endif %}
+            </div>
+        </div>
+    {% endfor %}
+{% else %}
+    <div class="row box">
+        <h2>{{ 'besoin.none'|trans }}</h2>
+    </div>
+{% endif %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/new.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/new.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a189b117b736aa424d205de3afc6635e3d8e7a6c
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Besoin/new.html.twig
@@ -0,0 +1,93 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit, cancelForm, pageTitle %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <style type="text/css">
+        div#security-besoin-new div.row div.col-md-12 .form-group label.control-label{
+            width:25%;
+        }
+        div#security-besoin-new div.row div.col-md-12 .form-group label.control-label + div{
+            width:75%;
+        }
+        div#security-besoin-new div.row .form-group label.control-label{
+            width:20%;
+        }
+        div#security-besoin-new div.row .form-group label.control-label + div{
+            width:80%;
+        }
+    </style>
+{% endblock %}
+
+{% block title %}
+    {{ pageTitle('security.besoin.create.title'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Ask an access #}
+        <li class="active">{{ 'askDataAccess'|trans }}</li>
+    </ul>
+{% endblock %}
+
+
+{% block main %}
+    <div id="security-besoin-new">
+
+        <h1>{{ 'security.besoin.create.title' | trans }}</h1>
+
+
+        <div class="alert alert-info">
+            <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+            <ul>
+                <li>{{ 'security.besoin.scope(%observatoire%)' | trans({ '%observatoire%': currentObservatoire().nom }) | raw }}</li>
+            </ul>
+        </div>
+
+
+        <form action="{{ path('bdoh_security_besoin_new') }}" method="post"
+              class="form-horizontal" {{ form_enctype(form) }}>
+
+            <div class="alert alert-warning">
+                <div class="row">
+                    <div class="col-md-12">{{ form_row(form.parametres) }}</div>
+                    <div class="col-md-12">{{ form_row(form.stations) }}</div>
+                </div>
+
+                <div class="row">
+                    <div class="col-md-12">{{ form_row(form.objectif) }}</div>
+                    <div class="col-md-12">{{ form_row(form.type) }}</div>
+                </div>
+
+                <div class="row besoin-duree">
+                    <div class="span">{{ form_row(form.duree) }}</div>
+                </div>
+
+                <div class="row besoin-infos">
+                    <div class="span">{{ form_row(form.details) }}</div>
+                </div>
+
+                {{ form_rest(form) }}
+
+                <!-- Link which triggers the modal for Terms of Uses -->
+                <div class="row">
+                    <div class="pull-right">
+                        <input id="checkboxbesoinid" type="checkbox" name="termsOfUses" required="required" style="vertical-align:-3px;">
+                        <label for="checkboxbesoinid">
+                            {{ 'IAgreeWith'|trans }}
+                            <a href="{{ path('bdoh_data_observatoire_conditions_export') }}">{{ 'TermsOfUses(the)'|trans }}</a>
+                        </label>
+                    </div>
+                </div>
+            </div>
+            <div style="display:flex;margin-bottom:10px;">
+                <div>{{ submit('security.besoin.create.submit'|trans, 'btn btn-success') }}</div>
+                <div style="margin-left:15px;">{{ cancelForm('bdoh_home') }}</div>
+            </div>
+        </form>
+
+
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/checkEmail.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/checkEmail.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bbfb3e3068eb6021a741f232129b10613fd47259
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/checkEmail.html.twig
@@ -0,0 +1,13 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('resetting.request.submit'|trans) }}
+{% endblock %}
+
+{% block main %}
+    <h1>{{ 'resetting.email.subject'|trans }}</h1>
+    <div class="well" style="margin-bottom:14px;">
+        <strong>{{ 'resetting.check_email'|trans({'%email%': email}) }}</strong>
+    </div>
+{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/email.txt.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/email.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7701039dfe7d6293d369fdc0a8201cc9ee25d6e7
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/email.txt.twig
@@ -0,0 +1,11 @@
+{% block subject %}
+{% autoescape false %}
+BDOH{{ 'deux_points'|trans }} {{ 'resetting.email.subject'|trans }}
+{% endautoescape %}
+{% endblock %}
+{% block body_text %}
+{% autoescape false %}
+{{ 'resetting.email.message'|trans({'%username%': user, '%confirmationUrl%': confirmationUrl})|raw }}
+{% endautoescape %}
+{% endblock %}
+{% block body_html %}{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ffba8352d1cf55306b94d45fb7d51b82a85fc249
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request.html.twig
@@ -0,0 +1,11 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% block title %}
+    {{ pageTitle('resetting.request.submit'|trans) }}
+{% endblock %}
+
+{% block main %}
+    <h1>{{ 'resetting.request.submit'|trans }}</h1>
+    {% include "IrsteaBdohSecurityBundle:Resetting:request_content.html.twig" %}
+{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request_content.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request_content.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2ca8375af7f66aaf1d9dd988af3cb3425727a27a
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/request_content.html.twig
@@ -0,0 +1,11 @@
+<div class="well" style="margin-bottom:14px;">
+    <form action="{{ path('resetting_send_email') }}" method="POST" class="resetting_request">
+        <div class="form-group">
+            <label for="email">{{ 'resetting.request.email'|trans }}</label>
+            <input style="width:25%;" class="form-control" type="text" id="email" name="email" required="required"/>
+        </div>
+        <div>
+            <input class="btn btn-success" type="submit" value="{{ 'resetting.request.submit'|trans }}"/>
+        </div>
+    </form>
+</div>
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6aa2d1e49aa6e8f7a389a54c6c914285b8aa7070
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset.html.twig
@@ -0,0 +1,13 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% form_theme form 'IrsteaBdohSecurityBundle::custom_form.html.twig' %}
+
+{% block title %}
+    {{ pageTitle('resetting.reset.submit'|trans) }}
+{% endblock %}
+
+{% block main %}
+    <h1>{{ 'resetting.reset.submit'|trans }}</h1>
+    {% include 'IrsteaBdohSecurityBundle:Resetting:reset_content.html.twig' %}
+{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset_content.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset_content.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c3ee348fa49ca56cf29784b5318820bf61d4d4fa
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Resetting/reset_content.html.twig
@@ -0,0 +1,15 @@
+<form class="form-horizontal" action="{{ path('resetting_reset', {'token': token}) }}" {{ form_enctype(form) }} method="POST">
+    <div class="alert alert-warning">
+        {{ form_widget(form.password) }}
+    </div>
+    <!-- Captcha -->
+    <div class="alert alert-danger">
+        {{ form_row(form.captcha) }}
+    </div>
+
+    {{ form_rest(form) }}
+
+    <div style="display:flex;margin-bottom:10px;">
+        <div><input class="btn btn-success" type="submit" value="{{ 'resetting.reset.submit'|trans }}"/></div>
+    </div>
+</form>
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Security/login.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Security/login.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d52baa55da0e725d3b23c6259c1f064345c654d4
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Security/login.html.twig
@@ -0,0 +1,42 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit, cancelForm, pageTitle %}
+
+{% block title %}
+    {{ pageTitle('security.login_form.connection'|trans) }}
+{% endblock %}
+
+{% block main %}
+    <div id="security-utilisateur-login">
+
+        <h1>{{ 'security.login_form.title' | trans }}</h1>
+
+        {% if error %}
+            <div class="alert alert-danger">
+                {{ error.message|trans|raw }}
+            </div>
+        {% endif %}
+
+        <div class="well" style="margin-bottom:14px;">
+            <form action="{{ path('bdoh_security_login_check') }}" method="post" autocomplete="off">
+
+                <!-- Username -->
+                <div class="form-group">
+                    <label for="_username">{{ 'security.login_form.username' | trans }}</label>
+                    <input style="width:25%;" class="form-control" type="text" id="_username" name="_username" value="{{ last_username }}" required="required" autocomplete="off"/>
+                </div>
+
+                <!-- Password -->
+                <div class="form-group">
+                    <label for="_password">{{ 'security.login_form.password' | trans }}</label>
+                    <input style="width:25%;" class="form-control" type="password" id="_password" name="_password" required="required" autocomplete="off"/>
+                </div>
+                <div style="display:flex;">
+                    <div>{{ submit('security.login_form.connectTo'|trans, 'btn btn-success') }}</div>
+                    <div style="margin-left:15px;"><a class="btn btn-info" href="{{ path('resetting_request') }}">{{ 'security.login_form.lostPassword'|trans }}</a></div>
+                    <div style="margin-left:15px;">{{ cancelForm('bdoh_home') }}</div>
+                </div>
+            </form>
+        </div>
+
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/anonymous-menu.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/anonymous-menu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c3dbd083d75fe401d16499d602582428a7f39c71
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/anonymous-menu.html.twig
@@ -0,0 +1,7 @@
+{% from '::macros.html.twig' import richLink %}
+
+<!-- Navigation Menu for an anonymous user.
+================================================== -->
+<li>{{ richLink(path('bdoh_security_login'), 'account.login'|trans, 'user', 'both') }}</li>
+<li class="navbar-text">{{ 'or'|trans }}</li>
+<li><a href="{{ path('bdoh_security_utilisateur_new') }}">{{ 'account.create'|trans }}</a></li>
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/connected-menu.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/connected-menu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2add9d5d1dca6cc8e2515a1a45cf2488ba0d5c9f
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/UserBar/connected-menu.html.twig
@@ -0,0 +1,157 @@
+{% from '::macros.html.twig' import richLink %}
+
+<!-- Navigation Menu for a connected user.
+================================================== -->
+
+<!-- Edit user account + display user name -->
+<li class="info-high" data-toggle="tooltip" rel="tooltip" data-original-title="{{ 'account.edit'|trans }}" data-placement="bottom">
+    {{ richLink(path('bdoh_security_utilisateur_edit'), app.user , 'user-edit', 'both') }}
+</li>
+
+<li class="divider"></li>
+
+<!-- Logout -->
+<li>{{ richLink(path('bdoh_security_logout'), 'account.logout', 'disconnect', 'both') }}</li>
+
+{% set userIsAllManager = app.user.isGestionnaireDesObservatoires() %}
+{% set userIsManager = app.user.isAManagerOfCurrentObservatory() %}
+{% set userIsSiteManager = app.user.isASiteManagerOfCurrentObservatory() %}
+{% set userIsContributor = app.user.isAContributorOfCurrentObservatory() %}
+{% set userIsTrusted = app.user.isATrustedUserOfCurrentObservatory() %}
+{% set userCanJobList = is_granted('JOB_LIST', currentObservatoire()) %}
+
+{# The following is depending on User rights #}
+
+{% set entity_admin_links = block('entity_admin_links')|trim %}
+{% set data_admin_links = block('data_admin_links')|trim %}
+
+{% if entity_admin_links is not empty %}
+    <li class="divider"></li>
+    <li><a href="{{ path('sonata_admin_dashboard') }}">{{ 'dashboard'|trans({}, 'SonataAdminBundle') }}</a></li>
+    <li class="divider"></li>
+    <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'administration'|trans }} <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            {% block entity_admin_links %}
+
+                {# les observatoires #}
+                {% if userIsAllManager %}
+                    <li><a href="{{ path('bdoh_admin_observatoire_list') }}">{{ 'Observatoire'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_colors') }}">{{ 'colors.title'|trans }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {% if userIsManager or userIsSiteManager %}
+                    {# l'observatoire et les sites #}
+                    {% if userIsManager %}
+                        <li><a href="{{ path('bdoh_admin_observatoire_edit', {'id' : currentObservatoire().id}) }}">{{ 'observatoire'|trans }}</a></li>
+                        <li><a href="{{ path('bdoh_admin_siteexperimental_list') }}">{{ 'SiteExperimental'|trans({}, 'entitiesPlurals') }}</a></li>
+                        <li><a href="{{ path('bdoh_admin_dataset_list') }}">{{ 'DataSet'|trans({}, 'entitiesPlurals') }}</a></li>
+                    {% endif %}
+                    {# les stations #}
+                    {% if userIsManager or userIsSiteManager %}
+                        <li><a href="{{ path('bdoh_admin_station_list') }}">{{ 'Station'|trans({}, 'entitiesPlurals') }}</a></li>
+                    {% endif %}
+                    <li class="divider"></li>
+                    {% if userIsManager and currentObservatoire().theiaCode == true %}
+                        <li><a href="{{ path('bdoh_admin_observatoire_edit', {'id' : currentObservatoire().id}) }}">{{ 'validateurJSON'|trans }}</a></li>
+                        <li class="divider"></li>
+                    {% endif %}
+                {% endif %}
+
+                {# les chroniques #}
+                {% if userIsManager or userIsSiteManager or userIsContributor %}
+                    <li><a href="{{ path('bdoh_admin_chroniquecontinue_list') }}">{{ 'ChroniqueContinue'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_chroniquediscontinue_list') }}">{{ 'ChroniqueDiscontinue'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_chroniquecalculee_list') }}">{{ 'ChroniqueCalculee'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_chroniqueconvertie_list') }}">{{ 'ChroniqueConvertie'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# les bassins, cours d'eau et communes #}
+                {% if userIsAllManager or userIsManager %}
+                    {% if userIsManager %}
+                        <li><a href="{{ path('bdoh_admin_bassin_list') }}">{{ 'Bassin'|trans({}, 'entitiesPlurals') }}</a></li>
+                        <li><a href="{{ path('bdoh_admin_courseau_list') }}">{{ 'CoursEau'|trans({}, 'entitiesPlurals') }}</a></li>
+                    {% endif %}
+                    {% if userIsAllManager %}
+                        <li><a href="{{ path('bdoh_admin_commune_list') }}">{{ 'Commune'|trans({}, 'entitiesPlurals') }}</a></li>
+                    {% endif %}
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# les DOI et les partenaires #}
+                {% if userIsAllManager or userIsManager %}
+                    {% if userIsManager %}
+                        <li><a href="{{ path('bdoh_admin_doi_list') }}">{{ 'Doi'|trans({}, 'entitiesPlurals') }}</a></li>
+                    {% endif %}
+                    <li><a href="{{ path('bdoh_admin_partenaire_list') }}">{{ 'Partenaire'|trans({}, 'entitiesPlurals') }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# les utilisateurs : création et droits #}
+                {% if userIsAllManager or userIsManager or userIsSiteManager %}
+                    {% if userIsAllManager or userIsManager %}
+                        <li><a href="{{ path('bdoh_admin_utilisateur_create') }}">{{ 'security.utilisateur.creation'|trans({}, 'messages') }}</a></li>
+                    {% endif %}
+                    <li><a href="{{ path('bdoh_security_utilisateur_all') }}">{{ 'security.utilisateur.gestion'|trans({}, 'messages') }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# les historiques #}
+                {% if userIsAllManager or userIsManager or userIsSiteManager or userIsContributor %}
+                    <li><a href="{{ path('irstea_bdoh_logger_advancedSearch') }}">{{ 'historique.advancedSearch'|trans }}</a></li>
+                    <li><a href="{{ path('irstea_bdoh_logger_advancedSearch_recent') }}">{{ 'historique.advancedSearchRecent'|trans }}</a></li>
+                {% endif %}
+
+            {% endblock entity_admin_links %}
+        </ul>
+    </li>
+{% endif %}
+
+{% if data_admin_links is not empty %}
+    <li class="divider"></li>
+    <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'data.management'|trans }}<b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            {% block data_admin_links %}
+
+                {# import de mesures et de points de contrôle #}
+                {% if userIsManager or userIsSiteManager or userIsContributor %}
+                    <li><a href="{{ path('bdoh_admin_measure_import') }}">{{ 'admin.measuresImport'|trans }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_controle_import') }}">{{ 'admin.controleImport'|trans }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# import de données géographiques #}
+                {% if userIsManager %}
+                    <li><a href="{{ path('bdoh_admin_shape_import') }}">{{ 'admin.shapeImport'|trans }}</a></li>
+                    <li class="divider"></li>
+                {% endif %}
+
+                {# calcul de chroniques #}
+                {% if userIsManager or userIsSiteManager or userIsContributor %}
+                    <li><a href="{{ path('bdoh_admin_transformation') }}">{{ 'CalculChroniques'|trans }}</a></li>
+                    <li><a href="{{ path('bdoh_admin_conversion') }}">{{ 'ConversionChroniques'|trans }}</a></li>
+                    {% if userCanJobList %}
+                        <li class="divider"></li>
+                    {% endif %}
+                {% endif %}
+
+                {# liste des jobs #}
+                {% if userCanJobList %}
+                    <li><a href="{{ path('bdoh_job_list') }}">{{ 'job.title.list'|trans }}</a></li>
+                {% endif %}
+
+            {% endblock data_admin_links %}
+        </ul>
+    </li>
+{% endif %}
+
+{# Simple user only #}
+{% if entity_admin_links is empty and data_admin_links is empty and not userIsTrusted %}
+    {% if currentObservatoire().hasChronique() %}
+        <li class="divider"></li>
+        <li><a href="{{ path('bdoh_security_besoin_new') }}">{{ 'askDataAccess'|trans }}</a></li>
+    {% endif %}
+{% endif %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/all.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/all.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2be2097c547af244d3b392d59384420702c042d2
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/all.html.twig
@@ -0,0 +1,145 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit, cancelForm, pageTitle, richLink %}
+
+{% block javascripts %}
+    {{ parent() }}
+    <script src="{{ asset('assets/security/utilisateur/all.js') }}">
+    </script>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <link rel="stylesheet" href="{{ asset('assets/security/utilisateur/all.css') }}">
+    <style type="text/css">
+        div#main ul.nav.nav-tabs{
+            margin-bottom:15px;
+        }
+    </style>
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Edition of the logged user account #}
+        <li class="active">{{ 'security.utilisateur.gestion'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block title %}
+    {{ pageTitle('security.utilisateur.all.title'|trans) }}
+{% endblock %}
+
+{% macro doHaveRole(content) %}
+    <span class="label label-success">{{ content }}</span>
+{% endmacro %}
+
+{% macro dontHaveRole() %}
+    {%- trans %}no{% endtrans %}
+{% endmacro %}
+
+{% macro boolRole(enabled) %}
+    {%- import _self as macros %}
+    {%- if enabled %}
+        {{- macros.doHaveRole('yes'|trans) }}
+    {%- else %}
+        {{- macros.dontHaveRole() }}
+    {%- endif %}
+{% endmacro %}
+
+{% macro listRole(targets) %}
+    {%- import _self as macros %}
+    {%- if targets is not empty %}
+        {%- for target in targets %}
+            {{- macros.doHaveRole(target) }}
+        {%- endfor %}
+    {%- else %}
+        {{- macros.dontHaveRole() }}
+    {%- endif %}
+{% endmacro %}
+
+{% block main %}
+    {%- import _self as macros %}
+
+    <div id="security-utilisateur-all">
+
+        <h1>{{ 'security.utilisateur.all.title' | trans }}</h1>
+
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#courant" data-toggle="tab">
+                    {{ 'security.utilisateur.all.OfObservatory(%observatory%)'|trans({'%observatory%': obs}) }}
+                </a></li>
+            <li><a href="#autres" data-toggle="tab">
+                    {{ 'security.utilisateur.all.OtherUsers'|trans }}
+                </a></li>
+        </ul>
+        <div class="tab-content">
+            <div id="courant" class="tab-pane active">
+                <div id="consult-advancedSearch">
+                    <table class="table">
+                        <!-- Columns header -->
+                        <thead>
+                            <tr>
+                                <th>{{ 'Utilisateur'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.gestionnaireObservatoires'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.gestionnaireObservatoire'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.gestionnaireSite'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.contributeurSite'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.utilisateurDeConfiance'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.utilisateurChronique'|trans }}</th>
+                                <th class="text-center">{{ 'security.utilisateur.all.besoin'|trans }}</th>
+
+                            </tr>
+                        </thead>
+                        <tbody>
+                            {% for user in users %}
+                                <tr>
+                                    <td data-order="{{ user.nom }} {{ user.prenom }}">
+                                        <a href={{ path('bdoh_security_utilisateur_right', {'email' : user.email}) }}>
+                                            {{ user.prenom }} {{ user.nom }}
+                                        </a>
+                                        <br/>
+                                        ({{ user.email }})
+                                    </td>
+                                    <td class="text-center">{{ macros.boolRole(user.isgestionnairedetouslesobservatoires) }}</td>
+                                    <td class="text-center">{{ macros.boolRole(user.isgestionnairedelobservatoire) }}</td>
+                                    <td class="text-center">{{ macros.listRole(user.sitesgestionnaire) }}</td>
+                                    <td class="text-center">{{ macros.listRole(user.sitescontributeur) }}</td>
+                                    <td class="text-center">{{ macros.boolRole(user.isutilisateurdeconfiance) }}</td>
+                                    <td class="text-center">{{ macros.boolRole(user.isutilisateurdechroniques) }}</td>
+                                    <td class="text-center">{{ macros.boolRole(user.hasbesoins) }}</td>
+                                </tr>
+                            {% endfor %}
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+
+            <div id="autres" class="tab-pane">
+                <div id="consult-advancedSearch">
+                    <table class="table">
+                        <!-- Columns header -->
+                        <thead>
+                            <tr>
+                                <th>{{ 'Utilisateur'|trans }}</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            {% for user in autres %}
+                                <tr>
+                                    <td data-order="{{ user.nom }} {{ user.prenom }}">
+                                        <a href={{ path('bdoh_security_utilisateur_right', {'email' : user.email}) }}>
+                                            {{ user.prenom }} {{ user.nom }}
+                                        </a>
+                                        <br/>
+                                        ({{ user.email }})
+                                    </td>
+                                </tr>
+                            {% endfor %}
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/chroniques-utilisateur-widget.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/chroniques-utilisateur-widget.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f679564b1909b908481b5ca881361cfcff95f802
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/chroniques-utilisateur-widget.html.twig
@@ -0,0 +1,26 @@
+{% block choice_widget_options %}
+    {% set invisible_text = " (invisible)" %}
+    {% set invisible_text_length = invisible_text|length %}
+    {% spaceless %}
+        {% for group_label, choice in options %}
+            {% if choice is iterable %}
+                <optgroup label="{{ group_label|trans({}, translation_domain) }}">
+                    {% set options = choice %}
+                    {{ block('choice_widget_options') }}
+                </optgroup>
+            {% else %}
+                {% set choice_label = choice.label %}
+                {% set label_trunked_length = choice_label|length - invisible_text_length %}
+                {% if choice_label|slice(label_trunked_length, invisible_text_length) == invisible_text %}
+                    {% set choice_label = choice_label|slice(0, label_trunked_length) %}
+                    {% set html_attr = 'class=option-with-lock' %}
+                {% else %}
+                    {% set html_attr = '' %}
+                {% endif %}
+                <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %} {{ html_attr }}>
+                    {{ choice_label|trans({}, translation_domain) }}
+                </option>
+            {% endif %}
+        {% endfor %}
+    {% endspaceless %}
+{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/edit.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/edit.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fe5d25641b7803a28af70b3f95b06f00078ed699
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/edit.html.twig
@@ -0,0 +1,59 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit, cancelForm, pageTitle %}
+
+{% form_theme form 'IrsteaBdohSecurityBundle::custom_form.html.twig' %}
+
+{% block title %}
+    {{ pageTitle('security.utilisateur.edit.title'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Edition of the logged user account #}
+        <li class="active">{{ 'account.edit'|trans }}</li>
+    </ul>
+{% endblock %}
+
+
+{% block main %}
+    <div id="security-utilisateur-edit">
+
+        <h1>{{ 'security.utilisateur.edit.title' | trans }}</h1>
+
+        <form action="{{ path('bdoh_security_utilisateur_edit') }}" method="post"
+              class="form-horizontal" {{ form_enctype(form) }}>
+
+            <!-- Login fields (with possibility to change password) -->
+            <div class="alert alert-warning">
+                <h4 class="alert-heading" style="margin-bottom:25px;">{{ 'security.utilisateur.loginInfo'|trans }}</h4>
+                {{ form_row(form.email) }}
+                <div style="margin-bottom:15px;">
+                    <strong>{{ 'security.utilisateur.edit.info.changePassword'|trans|raw }}</strong>
+                </div>
+                {{ form_row(form.oldPassword) }}
+                {{ form_widget(form.password) }}
+            </div>
+
+            <!-- Identification fields -->
+            <div class="alert alert-warning">
+                <h4 class="alert-heading" style="margin-bottom:25px;">{{ 'security.utilisateur.personalInfo'|trans }}</h4>
+                {{ form_row(form.prenom) }}
+                {{ form_row(form.nom) }}
+                {{ form_row(form.organisme) }}
+                {{ form_row(form.categorie) }}
+                {{ form_row(form.telephone) }}
+                {{ form_row(form.adresse) }}
+            </div>
+
+            {{ form_rest(form) }}
+
+            <div style="display:flex;margin-bottom:10px;">
+                <div>{{ submit('security.utilisateur.edit.submit'|trans, 'btn btn-success') }}</div>
+                <div style="margin-left:15px;">{{ cancelForm('bdoh_home') }}</div>
+            </div>
+        </form>
+
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mail.txt.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mail.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7d55a570d2a5cb7870aa289dc9d296b2defcce8a
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mail.txt.twig
@@ -0,0 +1,10 @@
+{{ user.prenom|default('') }} {{ user.nom|default('') }}
+{%- if type == 'besoin' %}
+ {{ 'security.utilisateur.newNeedMail.body'|trans|raw }}
+{% endif %}
+{%- if type == 'compte' %}
+ {{ 'security.utilisateur.newAccountMail.body'|trans|raw }}
+{% endif %}
+{{ url('bdoh_security_utilisateur_right', {'email': user.email}) }}
+
+{{ 'security.utilisateur.mailFooter'|trans|raw }}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mailNewUtilisateur.txt.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mailNewUtilisateur.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0e13a2cd2119241aa6e3c497a6cdf063b1577fbd
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/mailNewUtilisateur.txt.twig
@@ -0,0 +1,7 @@
+{{'security.utilisateur.newMailUtilisateur.body.hello'|trans}} {{ user.prenom|default('') }} {{ user.nom|default('') }},<br/><br/>
+{{ 'security.utilisateur.newMailUtilisateur.body.step1'|trans|raw }}<br/><br/>
+{{ 'security.utilisateur.newMailUtilisateur.body.step2'|trans|raw }}<br/><br/>
+{{ 'askDataAccess'|trans }}{{ 'deux_points'|trans }} <a href="{{ url('bdoh_security_besoin_new') }}">{{ url('bdoh_security_besoin_new') }}</a><br/>
+{{ 'askManager'|trans }}{{ 'deux_points'|trans }} <a href="{{ url('bdoh_consult_contact') }}">{{ url('bdoh_consult_contact') }}</a><br/>
+<h5>{{ 'security.utilisateur.newMailUtilisateur.body.step3'|trans|raw }}
+{{ 'security.utilisateur.newMailUtilisateur.body.step4'|trans|raw }}</h5>
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/new.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/new.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7e89dacb05e8257e3569c14b2749425acbefb53d
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/new.html.twig
@@ -0,0 +1,72 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import submit, cancelForm, pageTitle %}
+
+{% form_theme form 'IrsteaBdohSecurityBundle::custom_form.html.twig' %}
+
+{% block title %}
+    {{ pageTitle('security.utilisateur.create.title'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        {# Creation of a user account #}
+        <li class="active">{{ 'account.create'|trans }}</li>
+    </ul>
+{% endblock %}
+
+
+{% block main %}
+    <div id="security-utilisateur-new">
+
+        <h1>{{ 'security.utilisateur.create.title' | trans }}</h1>
+
+
+        <div class="alert alert-info">
+            <h4 class="alert-heading">{{ 'information'|trans }}{{ 'deux_points'|trans }}</h4>
+            <ul>
+                <li>{{ 'security.utilisateur.create.info.isTheFirstStep'|trans|raw }}</li>
+                <li>{{ 'security.utilisateur.create.info.yourIdentifier'|trans|raw }}</li>
+            </ul>
+        </div>
+
+
+        <form action="{{ path('bdoh_security_utilisateur_new') }}" method="post"
+              class="form-horizontal" {{ form_enctype(form) }}>
+
+            <!-- Login fields -->
+            <div class="alert alert-warning">
+                <h4 class="alert-heading" style="margin-bottom:25px;">{{ 'security.utilisateur.loginInfo'|trans }}</h4>
+                {{ form_row(form.email) }}
+                {{ form_widget(form.password) }}
+            </div>
+
+            <!-- Identification fields -->
+            <div class="alert alert-warning">
+                <h4 class="alert-heading" style="margin-bottom:25px;">{{ 'security.utilisateur.personalInfo'|trans }}</h4>
+                {{ form_row(form.prenom) }}
+                {{ form_row(form.nom) }}
+                {{ form_row(form.organisme) }}
+                {{ form_row(form.categorie) }}
+                {{ form_row(form.telephone) }}
+                {{ form_row(form.adresse) }}
+            </div>
+
+            <!-- Captcha -->
+            <div class="alert alert-danger">
+                <h4 class="alert-heading" style="margin-bottom:25px;">{{ 'captcha.security'|trans }}</h4>
+                {{ form_row(form.captcha) }}
+            </div>
+
+            {{ form_rest(form) }}
+
+            <div style="display:flex;margin-bottom:10px;">
+                <div>{{ submit('security.utilisateur.create.submit'|trans, 'btn btn-success') }}</div>
+                <div style="margin-left:15px;">{{ cancelForm('bdoh_home') }}</div>
+            </div>
+        </form>
+
+
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right-edit.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right-edit.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c2d5e4174d0bcb9d864943d6ec1a2fae63b2763f
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right-edit.html.twig
@@ -0,0 +1,14 @@
+{% from '::macros.html.twig' import submit, cancelForm %}
+
+<div class="row">
+    <fieldset id="identification" class="box">
+        <legend><i class="fam-application-edit"></i> {{ 'security.utilisateur.right.role' | trans }}</legend>
+        {{ form_errors(form) }}
+
+        {{ form_rest(form) }}
+    </fieldset>
+</div>
+<div style="display:flex;">
+    <div>{{ submit('security.utilisateur.right.submit'|trans, 'btn btn-success') }}</div>
+    <div style="margin-left:15px;">{{ cancelForm('bdoh_security_utilisateur_all') }}</div>
+</div>
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0546b012f180741dbe410ff9c7d4334eafe50ffb
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/right.html.twig
@@ -0,0 +1,79 @@
+{% extends 'IrsteaBdohSecurityBundle::layout.html.twig' %}
+{% from '::macros.html.twig' import pageTitle %}
+
+{% form_theme form 'IrsteaBdohSecurityBundle:Utilisateur:chroniques-utilisateur-widget.html.twig' %}
+
+{% block title %}
+    {{ pageTitle('security.utilisateur.right.title'|trans) }}
+{% endblock %}
+
+{% block breadcrumb %}
+    <ul class="breadcrumb">
+        {# Home #}
+        <li><a href="{{ path('bdoh_home') }}">{{ 'home'|trans }}</a></li>
+        <li><a href="{{ path('bdoh_security_utilisateur_all') }}">{{ 'security.utilisateur.gestion'|trans }}</a></li>
+        {# Edition of the logged user account #}
+        <li class="active">{{ 'security.utilisateur.right.role'|trans }}</li>
+    </ul>
+{% endblock %}
+
+{% block stylesheets %}
+    {{ parent() }}
+    <style type="text/css">
+        .option-with-lock {
+            background-image: url('/images/main/icon_padlock.gif');
+            background-repeat: no-repeat;
+            background-position: center right;
+        }
+        div#main div.row{
+            margin-left:0;
+            margin-right:0;
+        }
+        div#main ul.nav.nav-tabs{
+            margin-bottom:15px;
+        }
+        div#main select#form_utilisateurChronique{
+            height:20em;
+        }
+    </style>
+{% endblock %}
+
+{% block main %}
+    <div id="security-utilisateur-right" class="row">
+
+        <h1>{{ 'security.utilisateur.right.title' | trans }}</h1>
+        <fieldset>
+            <legend>
+                <h2>
+                    {{ utilisateur.prenom | capitalize }} {{ utilisateur.nom | capitalize }}
+                    {%- if utilisateur.categorie is not empty %}, {{ utilisateur.categorie | lower }}{% endif %}
+                    {%- if utilisateur.organisme is not empty %} ({{ utilisateur.organisme | capitalize }}){% endif %}
+                </h2>
+            </legend>
+            <form action="{{ path('bdoh_security_utilisateur_right', {'email': utilisateur.email}) }}" method="post"
+                  class="form-horizontal" {{ form_enctype(form) }}>
+                <div id="needs" style="margin-bottom:1em" class="row">
+                    {% if besoinsATraiter or besoinsTraite %}
+                        <ul class="nav nav-tabs" id="switch-traites-a-traiter">
+                            <li class="active"><a href="#besoinATraiter"
+                                                  data-toggle="tab">{{ 'besoin.besoinsATraiter'|trans }}</a></li>
+                            <li><a href="#besoinTraite" data-toggle="tab">{{ 'besoin.besoinsTraites'|trans }}</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                            <div id="besoinATraiter" class="tab-pane active">
+                                {% include 'IrsteaBdohSecurityBundle:Besoin:besoin-inList.html.twig'
+                                with {nomBesoinMain:'besoinATraiter' , besoins: besoinsATraiter } %}
+                            </div>
+                            <div id="besoinTraite" class="tab-pane">
+                                {% include 'IrsteaBdohSecurityBundle:Besoin:besoin-inList.html.twig'
+                                with {nomBesoinMain: 'besoinTraite', besoins: besoinsTraite } %}
+                            </div>
+                        </div>
+                    {% endif %}
+                    {% include 'IrsteaBdohSecurityBundle:Utilisateur:right-edit.html.twig' %}
+                </div>
+            </form>
+        </fieldset>
+    </div>
+{% endblock main %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/rightMail.txt.twig b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/rightMail.txt.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9f12a446834e2321bb1c8f6b54b91582e6f8ff34
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/Utilisateur/rightMail.txt.twig
@@ -0,0 +1,120 @@
+{%- autoescape false -%}{{- 'security.utilisateur.newRightMail.body.hello'|trans }} {{ user.prenom|default('') }} {{ user.nom|default('') -}}{{- 'security.utilisateur.newRightMail.body.part1'|trans -}}
+
+
+{# date de fin de validité #}
+{%- set endOfValidityDate = user.getFinAcces() -%}
+{%- if endOfValidityDate -%}
+{%- set endOfValidityDate = endOfValidityDate|date('formatDate'|trans, false) -%}
+{%- else -%}
+{%- set endOfValidityDate = 'security.utilisateur.noValidityDate'|trans -%}
+{%- endif -%}
+
+
+{#- bloc gestionnaire de TOUS les observatoires -#}
+{%- if gestionnaireDesObservatoires %}
+
+
+
+{{ 'security.utilisateur.newRightMail.body.youAre1'|trans -}}{{- 'security.utilisateur.gestionnaireDesObservatoires'|trans -}}
+{%- endif -%}
+{#- fin du bloc gestionnaire de TOUS les observatoires -#}
+
+{#- bloc observatoire -#}
+{%- set obs_block = block('obs_block')|trim -%}
+{%- if obs_block is not empty %}
+
+
+
+{{ 'security.utilisateur.aboutTheObservatory'|trans }} {{ 'open_quote'|trans }}{{ obs.nom }}{{ 'close_quote'|trans }}{{ 'security.utilisateur.newRightMail.body.youAre2'|trans -}}
+{%- endif -%}
+{%- block obs_block -%}
+
+{#- roles sur l'observatoire -#}
+{%- if user.rolesObservatoire|length > 0 -%}
+{%- for role in user.rolesObservatoire -%}
+
+{#- gestionnaire sur l'observatoire -#}
+{%- if role.valeur == roleGestionnaire and role.observatoire == obs %}
+
+
+{{ 'security.utilisateur.gestionnaireObservatoire'|trans -}}
+{%- endif -%}
+
+{#- utilisateur de confiance sur l'observatoire -#}
+{%- if role.valeur == roleUtilisateur and role.observatoire == obs %}
+
+
+{{ 'security.utilisateur.utilisateurObservatoire'|trans -}}
+{%- endif -%}
+
+{%- endfor -%}
+{%- endif -%}
+{#- fin des roles sur l'observatoire -#}
+
+{#- roles sur les sites de l'observatoire -#}
+{%- if user.rolesSite|length > 0 -%}
+
+{#- roles gestionnaire sur les sites de l'observatoire -#}
+{%- set firstRoleGestionnaireSite=0 -%}
+{%- for role in user.rolesSite -%}
+{%- if role.site.observatoire == obs and role.valeur == roleGestionnaire -%}
+{%- if firstRoleGestionnaireSite == 0 %}
+
+
+{{ 'security.utilisateur.gestionnaireSite'|trans }}{{ 'deux_points'|trans -}}
+{%- set firstRoleGestionnaireSite=1 -%}
+{%- endif %}
+
+    - {{ role.site.nom -}}
+{%- endif -%}
+{%- endfor -%}
+{#- fin des roles gestionnaire sur les sites de l'observatoire -#}
+
+{#- roles contributeur sur les sites de l'observatoire -#}
+{%- set firstRoleContributeurSite=0 -%}
+{%- for role in user.rolesSite -%}
+{%- if role.site.observatoire == obs and role.valeur == roleContributeur -%}
+{%- if firstRoleContributeurSite == 0 %}
+
+
+{{ 'security.utilisateur.contributeurSite'|trans }}{{ 'deux_points'|trans -}}
+{%- set firstRoleContributeurSite=1 -%}
+{%- endif %}
+
+    - {{ role.site.nom -}}
+{%- endif -%}
+{%- endfor -%}
+{#- fin des roles contributeur sur les sites de l'observatoire -#}
+
+{%- endif -%}
+{#- fin des roles sur les sites de l'observatoire -#}
+
+{#- roles utilisateur sur les chroniques  de l'observatoire -#}
+{%- if user.rolesChronique|length > 0 -%}
+{%- set firstRoleUtilisateurChronique=0 -%}
+{%- for role in user.rolesChronique -%}
+{%- if role.chronique in chroniques and role.valeur == roleUtilisateur -%}
+{%- if firstRoleUtilisateurChronique == 0 %}
+
+
+{{ 'security.utilisateur.utilisateurChronique'|trans }}{{ 'deux_points'|trans -}}
+{%- set firstRoleUtilisateurChronique=1 -%}
+{%- endif %}
+
+    - {{ role.chronique.station.code -}}/{{- role.chronique.code-}}
+{%- endif -%}
+{%- endfor -%}
+{%- endif -%}
+{#- fin des roles utilisateur sur les chroniques  de l'observatoire -#}
+
+{%- endblock obs_block -%}
+{#- fin du bloc observatoire #}
+
+
+
+{{ 'security.utilisateur.validityDate'|trans }} {{ endOfValidityDate }}
+
+
+{{ 'security.utilisateur.newRightMail.body.part2'|trans -}}{%- endautoescape %}
+
+{{ url('bdoh_home') -}}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/custom_form.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/custom_form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..16690c9961c9dc72a259e1c5e0a321e3d3b5918e
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/custom_form.html.twig
@@ -0,0 +1,31 @@
+{% block captcha_widget %}
+    {% spaceless %}
+        {{ form_widget(form) }}
+    {% endspaceless %}
+{% endblock %}
+{% block captcha_row %}
+    {% spaceless %}
+        <div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
+            {{ form_label(form, null, {'label_attr': {'class': 'custom-captcha-label-class'}}) }}
+            <div class="col-sm-4" style="text-align:center;">
+                <img src="{{ captcha_code }}" title="captcha" width="{{ captcha_width }}" height="{{ captcha_height }}" />
+            </div>
+            <div class="col-sm-14">
+                {{ form_widget(form) }}
+                {{ form_errors(form) }}
+            </div>
+        </div>
+    {% endspaceless %}
+{% endblock %}
+{# problème de traduction des erreurs d'où le redefinition de form_errors #}
+{% block form_errors -%}
+    {% if errors|length > 0 -%}
+        {% if form is not rootform %}<span class="help-block">{% else %}<div class="alert alert-danger">{% endif %}
+        <ul class="list-unstyled">
+        {%- for error in errors -%}
+            <li><span class="glyphicon glyphicon-exclamation-sign"></span> {{ error.message|trans }}</li>
+        {%- endfor -%}
+    </ul>
+        {% if form is not rootform %}</span>{% else %}</div>{% endif %}
+    {%- endif %}
+{%- endblock form_errors %}
diff --git a/src/Irstea/BdohSecurityBundle/Resources/views/layout.html.twig b/src/Irstea/BdohSecurityBundle/Resources/views/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..860a4b052f75b909f2117098ed78577ccd3d26b4
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Resources/views/layout.html.twig
@@ -0,0 +1,11 @@
+{% extends '::layout.html.twig' %}
+
+
+{% block javascripts %}
+    {{ parent() }}
+{% endblock %}
+
+
+{% block stylesheets %}
+    {{ parent() }}
+{% endblock %}
diff --git a/src/Irstea/BdohSecurityBundle/Security/BdohAuthenticationHandler.php b/src/Irstea/BdohSecurityBundle/Security/BdohAuthenticationHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..199f374133eeea2e03956a61d4bf3c3a51055677
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Security/BdohAuthenticationHandler.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Security;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohSecurityBundle\Entity\Repository\UtilisateurRepository;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
+
+/**
+ * Custom authentication success handler.
+ *
+ * @DI\Service("irstea_bdoh_security.security.success_handler", public=false)
+ */
+class BdohAuthenticationHandler implements AuthenticationSuccessHandlerInterface
+{
+    /**
+     * @var RouterInterface
+     */
+    private $router;
+
+    /**
+     * @var UtilisateurRepository
+     */
+    private $em;
+
+    /**
+     * Constructor.
+     *
+     * @param RouterInterface $router
+     * @param EntityManager   $em
+     * @DI\InjectParams({
+     *     "router" = @DI\Inject("router"),
+     *     "em" = @DI\Inject("doctrine.orm.entity_manager"),
+     * })
+     */
+    public function __construct(RouterInterface $router, EntityManager $em)
+    {
+        $this->router = $router;
+        $this->em = $em;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
+    {
+        $user = $token->getUser();
+        if ($user instanceof Utilisateur) {
+            $user->setDerniereConnection(new \DateTime('now', new \DateTimeZone('UTC')));
+            $this->em->persist($user);
+            $this->em->flush();
+        }
+
+        $session = $request->getSession();
+        $uri = $session ? $session->get('_security.secured_area.target_path', null) : null;
+        if ($uri !== null) {
+            $session->remove('_security.secured_area.target_path');
+        } else {
+            $uri = $this->router->generate('bdoh_home');
+        }
+
+        return new RedirectResponse($uri);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Security/BdohRightVoter.php b/src/Irstea/BdohSecurityBundle/Security/BdohRightVoter.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8758217ee14cb549fe4b73c45d355332953ee41
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Security/BdohRightVoter.php
@@ -0,0 +1,735 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Security;
+
+use Doctrine\ORM\EntityManager;
+use Irstea\BdohBundle\Manager\ObservatoireManagerInterface;
+use Irstea\BdohDataBundle\Entity\Bassin;
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\Commune;
+use Irstea\BdohDataBundle\Entity\CoursEau;
+use Irstea\BdohDataBundle\Entity\CriteriaClimat;
+use Irstea\BdohDataBundle\Entity\CriteriaGeology;
+use Irstea\BdohDataBundle\Entity\DataConstraint;
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\Doi;
+use Irstea\BdohDataBundle\Entity\FamilleParametres;
+use Irstea\BdohDataBundle\Entity\InspireTheme;
+use Irstea\BdohDataBundle\Entity\JeuBareme;
+use Irstea\BdohDataBundle\Entity\Milieu;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\ObservatoireRelatedInterface;
+use Irstea\BdohDataBundle\Entity\Partenaire;
+use Irstea\BdohDataBundle\Entity\PersonneTheia;
+use Irstea\BdohDataBundle\Entity\SiteExperimental;
+use Irstea\BdohDataBundle\Entity\Station;
+use Irstea\BdohDataBundle\Entity\TheiaCategories;
+use Irstea\BdohDataBundle\Entity\TopicCategory;
+use Irstea\BdohDataBundle\Entity\TypeFunding;
+use Irstea\BdohDataBundle\Entity\TypeParametre;
+use Irstea\BdohDataBundle\Entity\Unite;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
+
+/**
+ * {@inheritdoc}
+ *
+ * @DI\Service
+ * @DI\Tag("security.voter")
+ */
+class BdohRightVoter implements VoterInterface
+{
+    /**
+     * @var string[]
+     */
+    const SUPPORTED_ATTRIBUTES = [
+        'LIST',
+        'VIEW',
+        'CREATE',
+        'EDIT',
+        'DELETE',
+
+        'CONSULT_TIMESERIES',  // affichage des chroniques (gestion des chroniques cachées)
+        'CONSULT_CHECKPOINTS', // affichage des points de contrôle (en fonction de la chronique)
+        'DOWNLOAD',            // export des mesures (en fonction de la chronique ou de la station)
+                               // et export des jeux de barèmes (depuis la page de la chronique)
+        'UPLOAD_DATA',         // import et export des barèmes, import des mesures, import et export des points de contrôle,
+                               // calcul des chroniques, conversion des chroniques et calcul des taux de remplissage
+        'REMOVE_DATA',         // suppression des mesures (en fonction de la chronique)
+        'UPLOAD_GIS',          // import des données géographiques (bassins, cours d'eau et stations)
+                               // concrètement jamais utilisé directement (verification du droit en amont)
+
+        'RIGHT',               // gestion des droits sur les utilisateurs
+
+        'AJAX',                // listage en ajax depuis sonata pour des entities qui n'ont pas le droit list
+    ];
+
+    /**
+     * @var string[]
+     */
+    const SUPPORTED_CLASSES = [
+        'Observatoire',
+        'SiteExperimental',
+        'Station',
+        'Chronique',
+        'ChroniqueContinue',
+        'ChroniqueCalculee',
+        'ChroniqueConvertie',
+        'ChroniqueDiscontinue',
+        'Bareme',
+        'DataSet',
+
+        'Bassin',
+        'CoursEau',
+        'Commune',
+
+        'Doi',
+        'Partenaire',
+
+        'JeuQualite',
+        'Echantillonnage',
+        'PasEchantillonnage',
+        'FamilleParametres',
+        'TypeParametre',
+        'Unite',
+        'TopicCategory',
+        'CriteriaGeology',
+        'CriteriaClimat',
+        'DataConstraint',
+        'TypeFunding',
+        'TheiaCategories',
+        'Milieu',
+        'InspireTheme',
+
+        'Utilisateur',
+        'PersonneTheia',
+        'Categorie',
+        'ObjectifRecherche',
+        'TypeTravaux',
+
+        'JeuBareme',
+    ];
+
+    /**
+     * @var ObservatoireManagerInterface|null
+     */
+    private $obsManager;
+
+    /**
+     * @var EntityManager
+     */
+    private $em;
+
+    /**
+     * BdohRightVoter constructor.
+     *
+     * @param ObservatoireManagerInterface $manager
+     * @param EntityManager                $em
+     * @DI\InjectParams({
+     *     "manager" = @DI\Inject("irstea_bdoh.manager.observatoire"),
+     *     "em" = @DI\Inject("doctrine.orm.entity_manager"),
+     * })
+     */
+    public function __construct(ObservatoireManagerInterface $manager, EntityManager $em)
+    {
+        $this->obsManager = $manager;
+        $this->em = $em;
+    }
+
+    /**
+     * @return Observatoire|null
+     */
+    private function getCurrentObservatoire()
+    {
+        return $this->obsManager->getCurrent();
+    }
+
+    /**
+     * @param mixed $objectOrClass
+     *
+     * @return array [string, object, Observatoire, SiteExperimental[]]
+     */
+    private function normalizeClassAndObject($objectOrClass): array
+    {
+        if (\is_string($objectOrClass)) {
+            $class = $objectOrClass;
+            $object = null;
+        } elseif (\is_object($objectOrClass)) {
+            $class = \get_class($objectOrClass);
+            $object = $objectOrClass;
+        } else {
+            return ['', null, null, null];
+        }
+
+        $class = explode('\\', $class);
+        $class = array_pop($class);
+
+        $obs = $object instanceof ObservatoireRelatedInterface ?
+            $object->getObservatoire() : null;
+        $obs = $obs ?? $this->getCurrentObservatoire();
+
+        $sites = $object === null ? $obs->getSites() :
+            (method_exists($object, 'getSites') ? $object->getSites() : []);
+
+        return [$class, $object, $obs, $sites];
+    }
+
+    /**
+     * Determines if User can list the objetcs of class Class.
+     *
+     * @param mixed $user
+     * @param mixed $objectOrClass
+     *
+     * @return bool
+     */
+    public function canList($user, $objectOrClass): bool
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        list($class, $object, $observatoire, $sites) = $this->normalizeClassAndObject($objectOrClass);
+
+        switch ($class) {
+            case 'Chronique':
+            case 'ChroniqueContinue':
+            case 'ChroniqueCalculee':
+            case 'ChroniqueConvertie':
+            case 'ChroniqueDiscontinue':
+            case 'JeuQualite':
+            case 'Echantillonnage':
+            case 'PasEchantillonnage':
+            case 'FamilleParametres':
+            case 'TypeParametre':
+            case 'Unite':
+            case 'Doi':
+            case 'DataSet':
+            case 'TopicCategory':
+            case 'CriteriaGeology':
+            case 'Milieu':
+            case 'CriteriaClimat':
+            case 'InspireTheme':
+            case 'DataConstraint':
+            case 'TypeFunding':
+            case 'TheiaCategories':
+            case 'Partenaire':
+            case 'PersonneTheia':
+            case 'Utilisateur':
+            case 'Categorie':
+            case 'ObjectifRecherche':
+            case 'TypeTravaux':
+                return $user->isGestionnaireDesObservatoires()
+                    || $this->canCreate($user, $objectOrClass);
+            case 'Observatoire':
+                return $user->isGestionnaireDesObservatoires()
+                    || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire);
+            case 'SiteExperimental':
+            case 'Station':
+            case 'Bareme':
+            case 'Bassin':
+            case 'CoursEau':
+            case 'Commune':
+                return $user->isGestionnaireDesObservatoires()
+                    || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire)
+                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $sites);
+        }
+
+        return false;
+    }
+
+    /**
+     * Determines if a User can create an object of class Class.
+     *
+     * WARNING : this function only checks basic right ;
+     * actual answer should depend on data (ie the Site where a Station is created, etc.).
+     *
+     * @param mixed $user
+     * @param mixed $objectOrClass
+     *
+     * @return bool
+     */
+    public function canCreate($user, $objectOrClass): bool
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        list($class, $object, $observatoire, $sites) = $this->normalizeClassAndObject($objectOrClass);
+
+        switch ($class) {
+            case 'ChroniqueContinue':
+            case 'ChroniqueCalculee':
+            case 'ChroniqueConvertie':
+            case 'ChroniqueDiscontinue':
+                return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire)
+                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $sites);
+
+            case 'Station':
+                return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire)
+                    || $user->securedHasRoleSite(Role::GESTIONNAIRE, $sites);
+            case 'DataSet':
+            case 'SiteExperimental':
+            case 'Doi':
+                return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire);
+
+            case 'Partenaire':
+            case 'PersonneTheia':
+            case 'Utilisateur':
+                return $user->isGestionnaireDesObservatoires()
+                    || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $observatoire);
+            case 'TheiaCategories':
+            case 'TypeFunding':
+            case 'TopicCategory':
+            case 'CriteriaGeology':
+            case 'CriteriaClimat':
+            case 'InspireTheme':
+            case 'Milieu':
+            case 'DataConstraint':
+            case 'Observatoire':
+            case 'Commune':
+            case 'FamilleParametres':
+            case 'TypeParametre':
+            case 'Unite':
+                return $user->isGestionnaireDesObservatoires();
+        }
+
+        return false;
+    }
+
+    /**
+     * Determines if User can modify Object.
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canEdit($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        if ($object instanceof Chronique) {
+            return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getSites());
+        }
+
+        if ($object instanceof Station) {
+            return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                || $user->securedHasRoleSite(Role::GESTIONNAIRE, $object->getSites());
+        }
+
+        if ($object instanceof SiteExperimental
+            || $object instanceof Bassin
+            || $object instanceof CoursEau
+            || $object instanceof Doi || $object instanceof DataSet) {
+            return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire());
+        }
+
+        $current = $this->getCurrentObservatoire();
+
+        if ($object instanceof Partenaire
+            || $object instanceof Utilisateur) {
+            return $user->isGestionnaireDesObservatoires()
+                || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $current);
+        }
+
+        if ($object instanceof Observatoire) {
+            return $user->isGestionnaireDesObservatoires()
+                || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object);
+        }
+
+        if ($object instanceof Commune
+            || $object instanceof FamilleParametres
+            || $object instanceof TypeParametre
+            || $object instanceof Unite || $object instanceof TopicCategory
+            || $object instanceof CriteriaGeology || $object instanceof CriteriaClimat || $object instanceof DataConstraint
+            || $object instanceof TypeFunding || $object instanceof PersonneTheia || $object instanceof TheiaCategories || $object instanceof Milieu || $object instanceof InspireTheme) {
+            return $user->isGestionnaireDesObservatoires();
+        }
+
+        return false;
+    }
+
+    /**
+     * Determines if User can delete Object.
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canDelete($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        if ($object instanceof Chronique) {
+            return !$object->hasChildren()
+                && ($user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                        || $user->securedHasRoleSite(Role::GESTIONNAIRE, $object->getSites()));
+        }
+
+        if ($object instanceof Station) {
+            return $object->getChroniques()->isEmpty()
+                && ($user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                        || $user->securedHasRoleSite(Role::GESTIONNAIRE, $object->getSites()));
+        }
+
+        if ($object instanceof SiteExperimental) {
+            return $object->getStations()->isEmpty()
+                && $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire());
+        }
+
+        if ($object instanceof Observatoire) {
+            return $object->getSites()->isEmpty()
+                && $user->isGestionnaireDesObservatoires();
+        }
+
+        if ($object instanceof Bassin
+            || $object instanceof CoursEau
+            || $object instanceof Doi || $object instanceof DataSet) {
+            return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire());
+        }
+
+        if ($object instanceof Partenaire) {
+            $timeSeriesWithThisProducteur = $this->em->getRepository('IrsteaBdohDataBundle:Chronique')->findByProducteur($object);
+            $observatoriesWithThisPartenaire = $this->em->getRepository('IrsteaBdohDataBundle:Observatoire')->findByPartenaire($object);
+
+            return $user->isGestionnaireDesObservatoires()
+                || (count($timeSeriesWithThisProducteur) === 0
+                    && count($observatoriesWithThisPartenaire) === 0
+                    && $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $this->getCurrentObservatoire()));
+        }
+
+        if ($object instanceof Commune || $object instanceof TopicCategory
+            || $object instanceof CriteriaGeology || $object instanceof CriteriaClimat || $object instanceof DataConstraint
+            || $object instanceof TypeFunding || $object instanceof PersonneTheia || $object instanceof TheiaCategories || $object instanceof Milieu
+            || $object instanceof InspireTheme) {
+            return $user->isGestionnaireDesObservatoires();
+        }
+
+        if ($object instanceof FamilleParametres) {
+            $childrenFamilies = $this->em->getRepository('IrsteaBdohDataBundle:FamilleParametres')->findByFamilleParente($object);
+            $parameterTypes = $this->em->getRepository('IrsteaBdohDataBundle:TypeParametre')->findByFamilleParametres($object);
+
+            return count($childrenFamilies) === 0
+                && count($parameterTypes) === 0
+                && $user->isGestionnaireDesObservatoires();
+        }
+
+        if ($object instanceof TypeParametre) {
+            $timeSeriesWithThisParametre = $this->em->getRepository('IrsteaBdohDataBundle:Chronique')->findByParametre($object);
+
+            return count($timeSeriesWithThisParametre) === 0
+                && $user->isGestionnaireDesObservatoires();
+        }
+
+        if ($object instanceof Unite) {
+            $timeSeriesWithThisUnite = $this->em->getRepository('IrsteaBdohDataBundle:Chronique')->findByUnite($object);
+            $scalesWithThisUnite = $this->em->getRepository('IrsteaBdohDataBundle:Bareme')->findByUnite($object);
+
+            return count($timeSeriesWithThisUnite) === 0
+                && count($scalesWithThisUnite) === 0
+                && $user->isGestionnaireDesObservatoires();
+        }
+
+        return false;
+    }
+
+    /**
+     * affichage des chroniques (gestion des chroniques cachées).
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canConsultTimeseries($user, $object)
+    {
+        return ($object instanceof Chronique)
+            && ($object->getEstVisible()
+                    || (($user instanceof Utilisateur)
+                            && ($user->isGestionnaireDesObservatoires()
+                                    || $user->securedHasRoleObservatoire([Role::GESTIONNAIRE, Role::UTILISATEUR], $object->getObservatoire())
+                                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getObservatoire()->getSites())
+                                    || $user->securedHasRoleChronique(Role::UTILISATEUR, $object))));
+    }
+
+    /**
+     * affichage des points de contrôle (en fonction de la chronique).
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canConsultCheckpoints($user, $object)
+    {
+        return ($object instanceof Chronique)
+            && ($user instanceof Utilisateur)
+            && ($user->isGestionnaireDesObservatoires()
+                    || $user->securedHasRoleObservatoire([Role::GESTIONNAIRE, Role::UTILISATEUR], $object->getObservatoire())
+                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getObservatoire()->getSites())
+                    || $user->securedHasRoleChronique(Role::UTILISATEUR, $object));
+    }
+
+    /**
+     * export des mesures (en fonction de la chronique ou de la station)
+     * et export des jeux de barèmes (depuis la page de la chronique).
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canDownload($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        if ($object instanceof Chronique) {
+            return $user->isGestionnaireDesObservatoires()
+                || $user->securedHasRoleObservatoire([Role::GESTIONNAIRE, Role::UTILISATEUR], $object->getObservatoire())
+                || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getObservatoire()->getSites())
+                || $user->securedHasRoleChronique(Role::UTILISATEUR, $object);
+        }
+
+        if ($object instanceof Station) {
+            return $user->isGestionnaireDesObservatoires()
+                || $user->securedHasRoleObservatoire([Role::GESTIONNAIRE, Role::UTILISATEUR], $object->getObservatoire())
+                || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getObservatoire()->getSites());
+        }
+
+        if ($object instanceof JeuBareme) {
+            return $user->isGestionnaireDesObservatoires()
+                || $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getObservatoire()->getSites());
+        }
+
+        return false;
+    }
+
+    /**
+     * import et export des barèmes, import des mesures, import et export des points de contrôle,
+     * calcul des chroniques, conversion des chroniques et calcul des taux de remplissage.
+     *
+     * ATTENTION :
+     * - l'import de mesure est interdit sur les chroniques converties -> géré dans le contôleur.
+     * - l'import de points de contrôle est interdit sur les chroniques discontinues et converties -> géré dans le contrôleur.
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canUploadData($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        return ($object instanceof Chronique || $object instanceof Station || $object instanceof SiteExperimental)
+            && ($user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getSites()));
+    }
+
+    /**
+     * suppression des mesures (en fonction de la chronique).
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canRemoveData($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        return ($object instanceof Chronique)
+            && (!$object->isCalculee())
+            && (!$object->isConvertie())
+            && ($user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())
+                    || $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $object->getSites()));
+    }
+
+    /**
+     * import des données géographiques (bassins, cours d'eau et stations)
+     * concrètement jamais utilisé directement (verification du droit en amont).
+     *
+     * @param mixed $user
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    public function canUploadGis($user, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        return $object instanceof ObservatoireRelatedInterface
+            && $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire());
+    }
+
+    /**
+     * Determines if User can grant or remove Right on Object.
+     *
+     * @param mixed  $user
+     * @param string $right
+     * @param string $object
+     *
+     * @return bool
+     */
+    public function canGiveOrRemoveRightOn($user, $right, $object)
+    {
+        if (!($user instanceof Utilisateur)) {
+            return false;
+        }
+
+        if ($right === Role::GESTIONNAIRE && $object instanceof Observatoire) {
+            return $user->isGestionnaireDesObservatoires();
+        }
+
+        if (!($object instanceof ObservatoireRelatedInterface)) {
+            return false;
+        }
+
+        if ($user->securedHasRoleObservatoire(Role::GESTIONNAIRE, $object->getObservatoire())) {
+            return true;
+        }
+
+        if ($right === Role::CONTRIBUTEUR && ($object instanceof SiteExperimental)) {
+            return $user->securedHasRoleSite(Role::GESTIONNAIRE, $object);
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function vote(TokenInterface $token, $object, array $attributes)
+    {
+        if (in_array('RIGHT', $attributes, true) && is_array($object)) {
+            $actualObject = $object[1];
+        } else {
+            $actualObject = $object;
+        }
+
+        $class = \is_object($actualObject) ? get_class($actualObject) : (string) $actualObject;
+        if (!$this->supportsClass($class)) {
+            return self::ACCESS_ABSTAIN;
+        }
+
+        $user = $token->getUser();
+
+        $default = self::ACCESS_ABSTAIN;
+
+        foreach ($attributes as $attribute) {
+            if ($this->supportsAttribute($attribute)) {
+                if ($this->voteOn($user, $attribute, $object)) {
+                    return self::ACCESS_GRANTED;
+                }
+                $default = self::ACCESS_DENIED;
+            }
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param mixed $user
+     * @param mixed $attribute
+     * @param mixed $object
+     *
+     * @return bool
+     */
+    private function voteOn($user, $attribute, $object): bool
+    {
+        switch ($attribute) {
+            case 'LIST':
+                return $this->canList($user, $object);
+            case 'VIEW':
+                return $this->canEdit($user, $object);
+            case 'CREATE':
+                return $this->canCreate($user, $object);
+            case 'EDIT':
+                return $this->canEdit($user, $object);
+            case 'DELETE':
+                return $this->canDelete($user, $object);
+
+            case 'CONSULT_TIMESERIES':
+                return $this->canConsultTimeseries($user, $object);
+            case 'CONSULT_CHECKPOINTS':
+                return $this->canConsultCheckpoints($user, $object);
+            case 'DOWNLOAD':
+                return $this->canDownload($user, $object);
+            case 'UPLOAD_DATA':
+                return $this->canUploadData($user, $object);
+            case 'REMOVE_DATA':
+                return $this->canRemoveData($user, $object);
+            case 'UPLOAD_GIS':
+                return $this->canUploadGis($user, $object);
+
+            case 'RIGHT':
+                /*
+                 * Convention:
+                 * $object[0] is right to grant,
+                 * $object[1] is object on which right is to be granted
+                 */
+                return is_array($object) && $this->canGiveOrRemoveRightOn($user, $object[0], $object[1]);
+
+            case 'AJAX':
+                return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsAttribute($attribute)
+    {
+        return \in_array($attribute, self::SUPPORTED_ATTRIBUTES, true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsClass($class)
+    {
+        $names = explode('\\', $class);
+        $name = array_pop($names);
+
+        return \in_array($name, self::SUPPORTED_CLASSES, true);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Security/BdohSecurityHandler.php b/src/Irstea/BdohSecurityBundle/Security/BdohSecurityHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5be45db124c6b17c9f590ca0fd9a83f77f8267a
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Security/BdohSecurityHandler.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Security;
+
+use Irstea\BdohDataBundle\Entity\Commune;
+use JMS\DiExtraBundle\Annotation as DI;
+use Sonata\AdminBundle\Admin\AdminInterface;
+use Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
+
+/**
+ * Class BdohSecurityHandler.
+ *
+ * @DI\Service("irstea_bdoh_security.admin.security.handler")
+ */
+class BdohSecurityHandler implements SecurityHandlerInterface
+{
+    /**
+     * @var AuthorizationCheckerInterface
+     */
+    protected $authorizationChecker;
+
+    /**
+     * @param AuthorizationCheckerInterface $authorizationChecker
+     * @DI\InjectParams({
+     *     "authorizationChecker" = @DI\Inject("security.authorization_checker")
+     * })
+     */
+    public function __construct(AuthorizationCheckerInterface $authorizationChecker)
+    {
+        $this->authorizationChecker = $authorizationChecker;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isGranted(AdminInterface $admin, $attributes, $object = null)
+    {
+        if ($attributes instanceof \Traversable) {
+            $attributes = iterator_to_array($attributes);
+        } elseif (!\is_array($attributes)) {
+            $attributes = [$attributes];
+        }
+
+        // Transforme les demande de droit LIST en demande de droit AJAX
+        // pour la liste des Communes faite en autocomplete (AJAX)
+        if (\strpos($admin->getRequest()->attributes->get('_controller'), 'retrieveAutocompleteItemsAction')
+            && in_array('LIST', $attributes, true)
+            && $admin->getClass() === Commune::class) {
+            $attributes[] = 'AJAX';
+        }
+
+        $baseRole = $this->getBaseRole($admin);
+        $actualAttributes = array_map(
+            function ($role) use ($baseRole) {
+                return sprintf($baseRole, $role);
+            },
+            $attributes
+        );
+
+        // Si on a un AdminInterface, c'est que Sonata n'a pas d'instance d'objet (i.e. pour CREATE)
+        // alors on utilise le nom de la classe à la place.
+        if ($object instanceof AdminInterface) {
+            $object = $object->getClass();
+        }
+
+        try {
+            return $this->authorizationChecker->isGranted($actualAttributes, $object);
+        } catch (AuthenticationCredentialsNotFoundException $e) {
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBaseRole(AdminInterface $admin)
+    {
+        return '%s';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function buildSecurityInformation(AdminInterface $admin)
+    {
+        return [];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createObjectSecurity(AdminInterface $admin, $object)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteObjectSecurity(AdminInterface $admin, $object)
+    {
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Security/Voter/JobVoter.php b/src/Irstea/BdohSecurityBundle/Security/Voter/JobVoter.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d82416c824283f8e587e9f556a48ea144aa25a4
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Security/Voter/JobVoter.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Security\Voter;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\DiExtraBundle\Annotation as DI;
+use JMS\JobQueueBundle\Entity\Job;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+use Symfony\Component\Security\Core\Authorization\Voter\Voter;
+
+/**
+ * Contrôle d'accès sur les jobs.
+ *
+ * Gère les droits de la forme JOBS_* sur les Job.
+ *
+ * @DI\Service
+ * @DI\Tag("security.voter")
+ */
+class JobVoter extends Voter
+{
+    const SHOW_PERM = 'JOB_SHOW';
+    const LIST_PERM = 'JOB_LIST';
+    const RETRY_PERM = 'JOB_RETRY';
+    const CANCEL_PERM = 'JOB_CANCEL';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function supports($attribute, $subject)
+    {
+        switch ($attribute) {
+            case self::LIST_PERM:
+                return $subject instanceof Observatoire;
+
+            case self::SHOW_PERM:
+            case self::RETRY_PERM:
+            case self::CANCEL_PERM:
+                return $subject instanceof Job;
+
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
+    {
+        $user = $token->getUser();
+        if (!$user instanceof Utilisateur) {
+            return false;
+        }
+
+        if ($user->isGestionnaireDesObservatoires()) {
+            return true;
+        }
+
+        if ($attribute === self::LIST_PERM) {
+            return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, [$subject]) ||
+                $user->securedHasRoleSite([Role::GESTIONNAIRE, Role::CONTRIBUTEUR], $subject->getSites());
+        }
+
+        if ($this->isAdminOfObservatoire($user, $subject)) {
+            return true;
+        }
+
+        if ($attribute === self::RETRY_PERM) {
+            return false;
+        }
+
+        return $this->isOwnerOfJobs($user, $subject);
+    }
+
+    /**
+     * @param Utilisateur $user
+     * @param Job         $job
+     *
+     * @return bool
+     */
+    private function isOwnerOfJobs(Utilisateur $user, Job $job)
+    {
+        $owner = $job->findRelatedEntity(Utilisateur::class);
+
+        return $owner && $owner->getId() === $user->getId() && !$owner->isAccountExpired();
+    }
+
+    /**
+     * @param Utilisateur $user
+     * @param Job         $job
+     *
+     * @return bool
+     */
+    private function isAdminOfObservatoire(Utilisateur $user, Job $job)
+    {
+        $observatoire = $job->findRelatedEntity(Observatoire::class);
+
+        return $user->securedHasRoleObservatoire(Role::GESTIONNAIRE, [$observatoire]);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Security/Voter/SuperAdminVoter.php b/src/Irstea/BdohSecurityBundle/Security/Voter/SuperAdminVoter.php
new file mode 100644
index 0000000000000000000000000000000000000000..480405682feb4e49c2581114d21948963b577b37
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Security/Voter/SuperAdminVoter.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Security\Voter;
+
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+use Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter;
+use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
+
+/**
+ * Class SuperAdminVoter.
+ *
+ * @DI\Service
+ * @DI\Tag("security.voter")
+ */
+class SuperAdminVoter extends RoleHierarchyVoter
+{
+    /**
+     * SuperAdminVoter constructor.
+     *
+     * @param RoleHierarchyInterface $roleHierarchy
+     * @DI\InjectParams({"roleHierarchy" = @DI\Inject("security.role_hierarchy")})
+     */
+    public function __construct(RoleHierarchyInterface $roleHierarchy)
+    {
+        parent::__construct($roleHierarchy, '*');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supportsAttribute($attribute)
+    {
+        return is_string($attribute);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function vote(TokenInterface $token, $object, array $attributes)
+    {
+        $vote = parent::vote($token, $object, ['ROLE_SUPER_ADMIN']);
+
+        return $vote === self::ACCESS_GRANTED ? $vote : self::ACCESS_ABSTAIN;
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Tests/Command/UtilisateurNewCreateCommandTest.php b/src/Irstea/BdohSecurityBundle/Tests/Command/UtilisateurNewCreateCommandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..dade4660ad4c416e46d8a49890575ed565f8b693
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Tests/Command/UtilisateurNewCreateCommandTest.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Tests\Command;
+
+use Symfony\Bundle\FrameworkBundle\Console\Application;
+use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
+use Symfony\Component\Console\Tester\CommandTester;
+
+class UtilisateurNewCreateCommandTest extends KernelTestCase
+{
+    public function testExecute()
+    {
+        $kernel = static::createKernel();
+        $application = new Application($kernel);
+        $command = $application->find('security:users:create');
+        $commandTester = new CommandTester($command);
+        $commandTester->execute([
+            'command'   => $command->getName(),
+            'firstname' => 'Bob',
+            'lastname'  => 'Sponge',
+            'email'     => 'bob.sponge@bikinibottom.com',
+            'roleAdmin' => 'FCT',
+        ]);
+        // the output of the command in the console
+        $output = $commandTester->getDisplay();
+        $this->assertContains('Successful you have created the user : Bob Sponge', $output);
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Tests/Encoder/BCryptPasswordEncoderTest.php b/src/Irstea/BdohSecurityBundle/Tests/Encoder/BCryptPasswordEncoderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3f2b00808f8581efd35a51807054b64179901ed
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Tests/Encoder/BCryptPasswordEncoderTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Tests\Encoder;
+
+use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder;
+
+/**
+ * Description of BlowfishPasswordEncoderTest.
+ *
+ * @group unit
+ */
+class BCryptPasswordEncoderTest extends \PHPUnit_Framework_TestCase
+{
+    public function testIsPasswordValid()
+    {
+        $encoder = new BCryptPasswordEncoder(10);
+        $this->assertTrue(
+            $encoder->isPasswordValid('$2a$10$012345678901234567890uH/zuqMZaW/R/NuSP.Oii64BEsHGA2a2', 'password', '0123456789012345678901')
+        );
+    }
+
+    public function testIsPasswordInvalid()
+    {
+        $encoder = new BCryptPasswordEncoder(10);
+        $this->assertFalse(
+            $encoder->isPasswordValid('$2a$10$012345678901234567890uH/zuqMZaW/R/NuSP.Oii64BEsHGA2a2', 'Password', '0123456789012345678901')
+        );
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Tests/Security/Voter/JobVoterTest.php b/src/Irstea/BdohSecurityBundle/Tests/Security/Voter/JobVoterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a888dc03e0535c08554e19ce36203f42cc6ef60
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Tests/Security/Voter/JobVoterTest.php
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Tests\Security\Voter;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohSecurityBundle\Entity\Role;
+use Irstea\BdohSecurityBundle\Entity\RoleObservatoire;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use Irstea\BdohSecurityBundle\Security\Voter\JobVoter;
+use JMS\JobQueueBundle\Entity\Job;
+use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
+use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
+use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
+
+/**
+ * Class JobVoterTest.
+ *
+ * @group unit
+ */
+class JobVoterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var JobVoter
+     */
+    private $voter;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function setUp()
+    {
+        $this->voter = new JobVoter();
+    }
+
+    /**
+     * @dataProvider getSupportTestCases
+     * @covers \JobVoter::vote
+     *
+     * @param mixed      $expected
+     * @param mixed      $object
+     * @param mixed      $role
+     * @param mixed|null $user
+     */
+    public function testCase($expected, $object, $role, $user = null)
+    {
+        $token = $user ? new UsernamePasswordToken($user, null, 'provider') : new AnonymousToken(null, 'anon.');
+
+        $this->assertEquals($expected, $this->voter->vote($token, $object, [$role]));
+    }
+
+    /**
+     * @return array
+     */
+    public function getSupportTestCases()
+    {
+        $abs = VoterInterface::ACCESS_ABSTAIN;
+        $grt = VoterInterface::ACCESS_GRANTED;
+        $den = VoterInterface::ACCESS_DENIED;
+
+        $any = new \stdClass();
+
+        $other = new Utilisateur(1);
+        $owner = new Utilisateur(2);
+        $admin = new Utilisateur(3);
+
+        $obs = new Observatoire();
+
+        $job = new Job('test');
+        $job->addRelatedEntity($obs);
+        $job->addRelatedEntity($owner);
+
+        $role = new RoleObservatoire();
+        $role->setObservatoire($obs);
+        $role->setValeur(Role::GESTIONNAIRE);
+        $role->setUtilisateur($admin);
+        $admin->addRoleObservatoire($role);
+
+        return [
+            [$abs, null, 'ROLE_USER'],
+            [$abs, $any, 'ROLE_USER'],
+            [$abs, $job, 'ROLE_USER'],
+
+            [$abs, $any, JobVoter::LIST_PERM],
+            [$abs, $job, JobVoter::LIST_PERM],
+            [$abs, null, JobVoter::LIST_PERM],
+            [$den, $obs, JobVoter::LIST_PERM, $other],
+            [$den, $obs, JobVoter::LIST_PERM, $owner],
+            [$grt, $obs, JobVoter::LIST_PERM, $admin],
+
+            [$abs, null, JobVoter::SHOW_PERM],
+            [$abs, $any, JobVoter::SHOW_PERM],
+            [$den, $job, JobVoter::SHOW_PERM],
+            [$den, $job, JobVoter::SHOW_PERM, $other],
+            [$grt, $job, JobVoter::SHOW_PERM, $owner],
+            [$grt, $job, JobVoter::SHOW_PERM, $admin],
+
+            [$abs, null, JobVoter::CANCEL_PERM],
+            [$abs, $any, JobVoter::CANCEL_PERM],
+            [$den, $job, JobVoter::CANCEL_PERM],
+            [$den, $job, JobVoter::CANCEL_PERM, $other],
+            [$grt, $job, JobVoter::CANCEL_PERM, $owner],
+            [$grt, $job, JobVoter::CANCEL_PERM, $admin],
+
+            [$abs, null, JobVoter::RETRY_PERM],
+            [$abs, $any, JobVoter::RETRY_PERM],
+            [$den, $job, JobVoter::RETRY_PERM],
+            [$den, $job, JobVoter::RETRY_PERM, $other],
+            [$den, $job, JobVoter::RETRY_PERM, $owner],
+            [$grt, $job, JobVoter::RETRY_PERM, $admin],
+        ];
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPassword.php b/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPassword.php
new file mode 100644
index 0000000000000000000000000000000000000000..faf221b9704ea2a8ef98256249f3eec0b441f971
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPassword.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Validator\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ */
+class UserPassword extends Constraint
+{
+    public $message = 'Utilisateur.password.badCurrent';
+
+    public function validatedBy()
+    {
+        return 'irstea_bdoh_security.validator.user_password';
+    }
+}
diff --git a/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPasswordValidator.php b/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPasswordValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..7478167bfe124e4f9aa97f40f3ea63aa7a96d923
--- /dev/null
+++ b/src/Irstea/BdohSecurityBundle/Validator/Constraint/UserPasswordValidator.php
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohSecurityBundle\Validator\Constraint;
+
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\EntityManagerInterface;
+use Irstea\BdohSecurityBundle\Entity\Utilisateur;
+use JMS\DiExtraBundle\Annotation as DI;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * Constraint largely based on Symfony\Component\Security\Core\Validator\Constraint\UserPassword.
+ *
+ * The only difference is we force the retrieval of 'password' and 'salt' fields, in database.
+ *
+ * @DI\Service("irstea_bdoh_security.validator.user_password")
+ * @DI\Tag("validator.constraint_validator", attributes={"alias" = "irstea_bdoh_security.validator.user_password"})
+ */
+class UserPasswordValidator extends ConstraintValidator
+{
+    /**
+     * @var EntityManagerInterface
+     */
+    protected $entityManager;
+
+    /**
+     * @var TokenStorageInterface
+     */
+    protected $tokenStorage;
+
+    /**
+     * @var EncoderFactoryInterface
+     */
+    protected $encoderFactory;
+
+    /**
+     * UserPasswordValidator constructor.
+     *
+     * @param EntityManager           $entityManager
+     * @param TokenStorageInterface   $tokenStorage
+     * @param EncoderFactoryInterface $encoderFactory
+     *
+     * @DI\InjectParams({
+     *     "entityManager" = @DI\Inject("doctrine.orm.entity_manager"),
+     *     "tokenStorage" = @DI\Inject("security.token_storage"),
+     *     "encoderFactory" = @DI\Inject("security.encoder_factory"),
+     * })
+     */
+    public function __construct(
+        EntityManager $entityManager,
+        TokenStorageInterface $tokenStorage,
+        EncoderFactoryInterface $encoderFactory
+    ) {
+        $this->entityManager = $entityManager;
+        $this->tokenStorage = $tokenStorage;
+        $this->encoderFactory = $encoderFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validate($newPassword, Constraint $constraint)
+    {
+        if (empty($newPassword)) {
+            return;
+        }
+
+        // Gets the connected User
+        $user = $this->tokenStorage->getToken()->getUser();
+
+        if (!$user instanceof Utilisateur) {
+            throw new ConstraintDefinitionException('The User must be an instance of Utilisateur');
+        }
+
+        list($password, $salt) = $this->entityManager->getRepository('IrsteaBdohSecurityBundle:Utilisateur')->getPasswordSalt($user);
+
+        $encoder = $this->encoderFactory->getEncoder($user);
+
+        if (!$encoder->isPasswordValid($password, $newPassword, $salt)) {
+            $this->context->addViolation($constraint->message);
+        }
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Command/DumpFormatPivotCommand.php b/src/Irstea/BdohTheiaOzcarBundle/Command/DumpFormatPivotCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..db113e80b367abc08a3b6b37f0c68e0833569623
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Command/DumpFormatPivotCommand.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Command;
+
+use Doctrine\ORM\EntityRepository;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohTheiaOzcarBundle\Mapper\MapperInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Serializer\SerializerInterface;
+
+class DumpFormatPivotCommand extends Command
+{
+    /** @var RegistryInterface */
+    private $registry;
+
+    /** @var SerializerInterface */
+    private $serializer;
+
+    /** @var MapperInterface */
+    private $mapper;
+
+    public function __construct(
+        RegistryInterface $registry,
+        SerializerInterface $serializer,
+        MapperInterface $mapper
+    ) {
+        parent::__construct('theia:dump:pivot');
+
+        $this->registry = $registry;
+        $this->serializer = $serializer;
+        $this->mapper = $mapper;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('theia:dump:pivot');
+        // NOOP
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        //format pivot
+        /** @var EntityRepository $observatoireRepository */
+        $observatoireRepository = $this->registry->getRepository(Observatoire::class);
+
+        $observatoires = $observatoireRepository->findAll();
+        $output->writeln('Dumping <info>' . count($observatoires) . '</info> format(s) pivot(s):');
+
+        foreach ($observatoires as $observatoire) {
+            $dto = $this->mapper->mapFormatPivotInterface($observatoire);
+            $json = $this->serializer->serialize($dto, 'json');
+            $output->writeln($json);
+        }
+
+        return 0;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Command/SendJSONToTheiaCommand.php b/src/Irstea/BdohTheiaOzcarBundle/Command/SendJSONToTheiaCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8f533405326e9b2bec94126ab6b6136c334ff3b
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Command/SendJSONToTheiaCommand.php
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Command;
+
+use Irstea\BdohDataBundle\Command\AbstractJobCommand;
+use Irstea\BdohTheiaOzcarBundle\Service\EnvoiJSON;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\Question;
+
+class SendJSONToTheiaCommand extends AbstractJobCommand
+{
+    const COMMAND_NAME = 'theia:send:json:data';
+
+    /** @var EnvoiJSON */
+    private $envoieJSON;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName(self::COMMAND_NAME)
+        ->setDescription('Commande pour envoyer les données à Theia/OZCAR par Observatoire')
+        ->addArgument('codeTheia', InputArgument::REQUIRED, 'Theia/OZCAR Identifier (4 letters)')
+        ->addOption('jms-job-id', null, InputOption::VALUE_REQUIRED, 'Identifiant du job');
+
+        // NOOP
+    }
+
+    /**
+     * SendJSONToTheiaCommand constructor.
+     */
+    public function __construct(
+        EnvoiJSON $envoieJSON
+    ) {
+        parent::__construct('theia:send:json:data');
+        $this->envoieJSON = $envoieJSON;
+    }
+
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        $output->writeln([
+            '==================================================================================',
+            'Welcome you can send your datas to Theia/OZCAR with your Theia/OZCAR Identifier ',
+            '===================================================================================',
+        ]);
+        $questions = [];
+        $argumentUser = ['codeTheia'];
+
+        foreach ($argumentUser as $argumentUtilisateur) {
+            if (!$input->getArgument($argumentUtilisateur)) {
+                $question = new Question('Please enter the ' . $argumentUtilisateur . ':');
+                $question->setValidator(function ($firstname) {
+                    if (empty($firstname)) {
+                        throw new \Exception('Argument can not be empty');
+                    }
+
+                    return $firstname;
+                });
+
+                $questions[$argumentUtilisateur] = $question;
+            }
+        }
+        foreach ($questions as $name => $question) {
+            $answer = $this->getHelper('question')->ask($input, $output, $question);
+            $input->setArgument($name, $answer);
+        }
+    }
+
+    /**
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @throws \Exception
+     *
+     * @return int|void|null
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $theiaCode = $input->getArgument('codeTheia');
+
+        $envoi = $this->envoieJSON->sendJsonTheia($theiaCode);
+        [$unix, $key, $message, $responseBody, $result, $seri] = $envoi;
+
+        // message d'erreur à faire apparaitre dans les résumés des jobs
+        if ($unix === 0) {
+            $output->writeln('Envoi réussi');
+        } elseif ($key !== null) {
+            //si le validateur json ne fonctionne pas
+            $output->writeln([
+                '==================================== ERROR JSON SCHEMA==================================================== ',
+            ]);
+            foreach ($result->getErrors() as $erreurs) {
+                $key = $erreurs->keyword();
+                $dataPoitner = $erreurs->dataPointer();
+                $dataPointerString = implode('.', $dataPoitner);
+                $dataErr = $erreurs->data();
+                $dataString = json_encode($dataErr);
+                $output->writeln([
+                        'Keywords : ' . $key,
+                        'DataPointer : ' . $dataPointerString,
+                        'Data : ' . $dataString,
+                    ]);
+            }
+            $output->writeln([
+                '==================================== JSON ==================================================== ',
+                $seri,
+            ]);
+        } elseif ($message !== null) {
+            //si l'envoie ne fonctionne pas
+            $output->writeln([
+                '==================================== GuzzleException ==================================================== ',
+                'Message : ' . $message,
+                'Body response : ' . $responseBody,
+                '==================================== JSON ==================================================== ',
+                $seri,
+            ]);
+        }
+
+        return $unix;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Exception/Exception.php b/src/Irstea/BdohTheiaOzcarBundle/Exception/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c4d0394b676d0e9ebb10ab24c6c57bf8588e6a3
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Exception/Exception.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Exception;
+
+interface Exception
+{
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Exception/PasswordException.php b/src/Irstea/BdohTheiaOzcarBundle/Exception/PasswordException.php
new file mode 100644
index 0000000000000000000000000000000000000000..76a5ac8691027d6e9abcc06d5fcd1282b6356083
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Exception/PasswordException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Exception;
+
+final class PasswordException extends \RuntimeException implements Exception
+{
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Form/PasswordEventSubscriber.php b/src/Irstea/BdohTheiaOzcarBundle/Form/PasswordEventSubscriber.php
new file mode 100644
index 0000000000000000000000000000000000000000..12d11e517821fcb50b491bc984ab2f512d52388b
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Form/PasswordEventSubscriber.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Form;
+
+use Irstea\BdohTheiaOzcarBundle\Service\PasswordEncryptionServiceInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+
+class PasswordEventSubscriber implements EventSubscriberInterface
+{
+    /** @var PasswordEncryptionServiceInterface */
+    private $passwordEncryptionService;
+
+    public function __construct(PasswordEncryptionServiceInterface $passwordEncryptionService)
+    {
+        $this->passwordEncryptionService = $passwordEncryptionService;
+    }
+
+    public function onPreSubmit(FormEvent $event): void
+    {
+        $clearPassword = trim($event->getData());
+        if ($clearPassword) {
+            // Encrypte le mot de passe
+            $event->setData($this->passwordEncryptionService->encrypt($clearPassword));
+        } else {
+            // Ignore un champ vide (=n'efface pas le mot de passe existant)
+            $form = $event->getForm();
+            if ($form->getParent()) {
+                $form->getParent()->remove($form->getName());
+            }
+        }
+    }
+
+    public static function getSubscribedEvents(): array
+    {
+        return [FormEvents::PRE_SUBMIT => 'onPreSubmit'];
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/IrsteaBdohTheiaOzcarBundle.php b/src/Irstea/BdohTheiaOzcarBundle/IrsteaBdohTheiaOzcarBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..7944990720e58c876b3dc4c4e167810e14da129e
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/IrsteaBdohTheiaOzcarBundle.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+final class IrsteaBdohTheiaOzcarBundle extends Bundle
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getParent()
+    {
+        // NOOP: pas de parent
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Mapper/Mapper.php b/src/Irstea/BdohTheiaOzcarBundle/Mapper/Mapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d5488e14cdd44bd3a7266707a799d3f57e1a336
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Mapper/Mapper.php
@@ -0,0 +1,366 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Mapper;
+
+use Irstea\BdohDataBundle\Entity\Chronique;
+use Irstea\BdohDataBundle\Entity\DataSet as DataSetEntity;
+use Irstea\BdohDataBundle\Entity\Observatoire as ObservatoireEntity;
+use Irstea\BdohDataBundle\Entity\Partenaire as PartenaireEntity;
+use Irstea\BdohDataBundle\Entity\PersonneTheia;
+use Irstea\BdohDataBundle\Entity\Repository\ChroniqueRepository;
+use Irstea\BdohDataBundle\Entity\Repository\DataSetRepository;
+use Irstea\BdohDataBundle\Entity\Repository\TheiaCategoriesRepository;
+use Irstea\BdohTheiaOzcarBundle\Model\Contact;
+use Irstea\BdohTheiaOzcarBundle\Model\DataConstraint;
+use Irstea\BdohTheiaOzcarBundle\Model\Datasets;
+use Irstea\BdohTheiaOzcarBundle\Model\Datasets as DataSetDTO;
+use Irstea\BdohTheiaOzcarBundle\Model\FeatureOfInterest;
+use Irstea\BdohTheiaOzcarBundle\Model\FormatPivot;
+use Irstea\BdohTheiaOzcarBundle\Model\Fundings;
+use Irstea\BdohTheiaOzcarBundle\Model\Observations;
+use Irstea\BdohTheiaOzcarBundle\Model\ObservedProperty;
+use Irstea\BdohTheiaOzcarBundle\Model\OnlineResource;
+use Irstea\BdohTheiaOzcarBundle\Model\Organisation;
+use Irstea\BdohTheiaOzcarBundle\Model\Producer as ProducerDTO;
+use Irstea\BdohTheiaOzcarBundle\Model\SpatialExtent;
+use Irstea\BdohTheiaOzcarBundle\Model\TemporalExtent;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+final class Mapper implements MapperInterface
+{
+    private $registry;
+
+    private $generateurUrl;
+
+    public function __construct(RegistryInterface $registry, UrlGeneratorInterface $generateurUrl)
+    {
+        $this->registry = $registry;
+        $this->generateurUrl = $generateurUrl;
+    }
+
+    //------------------mapFormatPivot-----------------------------------------------
+
+    public function mapFormatPivotInterface(ObservatoireEntity $entity): FormatPivot
+    {
+        $formatpivot = new FormatPivot();
+        $this->mapFormatPivot($entity, $formatpivot);
+
+        return $formatpivot;
+    }
+
+    private function mapFormatPivot(ObservatoireEntity $entity, FormatPivot $formatpivot): FormatPivot
+    {
+        $codeObservatoire = $entity->getTheiaCode();
+        foreach ($entity->getDataSets() as $dataSet) {
+            $formatpivot->setDatasets(
+                $this->mapMetadata($dataSet, $codeObservatoire)
+            );
+        }
+        $formatpivot->setProducer($this->mapProducer($entity, $formatpivot->getProducer()));
+
+        return $formatpivot;
+    }
+
+    //------------------------- mapMetaData ---------------------------------------------------
+
+    private function mapMetadata(DataSetEntity $entity, string $codeObservatoire): DataSetDTO
+    {
+        $dto = new Datasets();
+        $dto->setDatasetId($codeObservatoire . '_DAT_' . $entity->getId());
+
+        //conditionne en fonction du champs en anglais
+        if ($entity->getTitreEn() === null) {
+            $dto->metadata->setTitle($entity->getTitre());
+        } else {
+            $dto->metadata->setTitle($entity->getTitreEn());
+        }
+
+        //conditionne en fonction du champs en anglais
+        if ($entity->getDescriptionEn() === null) {
+            $dto->metadata->setDescription($entity->getDescription());
+        } else {
+            $dto->metadata->setDescription($entity->getDescriptionEn());
+        }
+
+        //conditionne en fonction du champs en anglais
+        if ($entity->getGenealogieEn() === null) {
+            $dto->metadata->setDatasetLineage($entity->getGenealogie());
+        } else {
+            $dto->metadata->setDatasetLineage($entity->getGenealogieEn());
+        }
+
+        $dto->metadata->setInspireTheme($entity->getInspireTheme());
+        $dto->metadata->setSpatialExtent($this->mapSpatialExtends($entity));
+
+        // conditionne le mapping du Online ressource en cas de DOI non présent
+        $dto->metadata->setOnlineResource($this->mapOnlineResourceDataset($entity));
+
+        foreach ($entity->getTopicCategories() as $topicCat) {
+            $dto->metadata->addTopicCategories($topicCat->getNom());
+        }
+        foreach ($entity->getPortailSearchCriteriaClimat() as $criteriaclimat) {
+            $dto->metadata->portalSearchCriteria->addClimate($criteriaclimat->getNom());
+        }
+        foreach ($entity->getPortailSearchCriteriaGeology() as $criteriaGeology) {
+            $dto->metadata->portalSearchCriteria->addGeology($criteriaGeology->getNom());
+        }
+        $dto->metadata->setDataConstraint($this->mapDataConstraint($entity));
+
+        foreach ($entity->getPrincipalInvestigators() as $personneTheia) {
+            $role = 'Principal investigator';
+            $dto->metadata->addContact($this->mapContact($personneTheia, $role));
+        }
+        foreach ($entity->getDataCollectors() as $personneTheia) {
+            $role = 'Data collector';
+            $dto->metadata->addContact($this->mapContact($personneTheia, $role));
+        }
+        foreach ($entity->getDataManagers() as $personneTheia) {
+            $role = 'Data manager';
+            $dto->metadata->addContact($this->mapContact($personneTheia, $role));
+        }
+        foreach ($entity->getProjectMembers() as $personneTheia) {
+            $role = 'Project member';
+            $dto->metadata->addContact($this->mapContact($personneTheia, $role));
+        }
+        foreach ($entity->getChroniques() as $chronique) {
+            $dto->addObservations($this->mapObservation($chronique, $codeObservatoire));
+        }
+
+        return $dto;
+    }
+
+    private function mapDataConstraint(DataSetEntity $dataSet): DataConstraint
+    {
+        $dataConstraint = new DataConstraint();
+        $dataConstraint->setAccessUseConstraint($dataSet->getDataConstraint());
+        $dataConstraint->setUrlDataPolicy($this->generateurUrl->generate('bdoh_cgu_observatoires', [], UrlGeneratorInterface::ABSOLUTE_URL));
+
+        return $dataConstraint;
+    }
+
+    private function mapOnlineResourceDataset(DataSetEntity $dataSet): OnlineResource
+    {
+        $nomDataset = $dataSet->getUuid();
+        $onlineResource = new OnlineResource();
+
+        $onlineResource->setDoi($dataSet->getDoi());
+        $onlineResource->setUrlDownload($this->generateurUrl->generate('bdoh_consult_dataset', ['dataset' => "$nomDataset"], UrlGeneratorInterface::ABSOLUTE_URL));
+        $onlineResource->setUrlInfo($this->generateurUrl->generate('bdoh_consult_observatoire', [], UrlGeneratorInterface::ABSOLUTE_URL));
+
+        return $onlineResource;
+    }
+
+    private function mapOnlineResourceProducer(ObservatoireEntity $observatoire): OnlineResource
+    {
+        $onlineResource = new OnlineResource();
+
+        $onlineResource->setDoi($observatoire->getDoiPrincipal());
+        $onlineResource->setUrlDownload($this->generateurUrl->generate('bdoh_consult_observatoire', [], UrlGeneratorInterface::ABSOLUTE_URL));
+        $onlineResource->setUrlInfo($this->generateurUrl->generate('bdoh_consult_observatoire', [], UrlGeneratorInterface::ABSOLUTE_URL));
+
+        return $onlineResource;
+    }
+
+    //------------------------------mapContactTest-------------------------------------
+
+    private function mapContact(PersonneTheia $personneTheia, string $role): Contact
+    {
+        $partenaire = $personneTheia->getPartenaire();
+        $orgadto = new Organisation();
+        $contact = new Contact($orgadto);
+        $organisation = $this->mapOrganisation($partenaire, $orgadto);
+        $contact->setOrganisation($organisation);
+        $contact->setFirstName($personneTheia->getPrenom());
+        $contact->setLastName($personneTheia->getNom());
+        $contact->setEmail($personneTheia->getEmail());
+        $contact->setRole($role);
+
+        return $contact;
+    }
+
+    //-----------------------------mapProducer----------------------------
+
+    private function mapProducer(ObservatoireEntity $entity, ProducerDTO $dtoPro): ProducerDTO
+    {
+        $dtoPro->setProducerId($entity->getTheiaCode());
+        $dtoPro->setName($entity->getNom());
+        if ($entity->getTitreEn() === null) {
+            $dtoPro->setTitle($entity->getTitre());
+        } else {
+            $dtoPro->setTitle($entity->getTitreEn());
+        }
+
+        //conditionne en fonction du champs en anglais
+        if ($entity->getDescriptionEn() === null) {
+            $dtoPro->setDescription($entity->getDescription());
+        } else {
+            $dtoPro->setDescription($entity->getDescriptionEn());
+        }
+
+        $dtoPro->setEmail($entity->getEmail());
+
+        foreach ($entity->getDataManagers() as $personneTheia) {
+            $role = 'Data manager';
+            $dtoPro->setContact($this->mapContact($personneTheia, $role));
+        }
+
+        $dtoPro->setOnlineResource($this->mapOnlineResourceProducer($entity));
+        $dtoPro->setContact($this->mapContact($entity->getProjectLeader(), 'Project leader'));
+
+        foreach ($entity->getPartenaires() as $fundings) {
+            if ($fundings->getEstFinanceur() == true) {
+                $dtoPro->setFundings($this->mapFundings($fundings));
+            }
+        }
+
+        return $dtoPro;
+    }
+
+    //--------------------------------mapOrganisation--------------------------
+
+    private function mapOrganisation(PartenaireEntity $partenaire, Organisation $organisation): Organisation
+    {
+        $organisation->setName($partenaire->getNom());
+        if ($partenaire->getIso() == 'FR') {
+            $organisation->setIdScanR($partenaire->getScanR());
+        } else {
+            $organisation->setIdScanR(null);
+        }
+        $organisation->setIso3166($partenaire->getIso());
+        $organisation->setRole('Research group');
+
+        return $organisation;
+    }
+
+    //------------------------------MapObservation------------------------
+
+    private function mapObservation(Chronique $entity, string $codeObservatoire): Observations
+    {
+        $dtoobservation = new Observations();
+        $dtoobservation->setFeatureOfInterest($this->mapFeatureOfInterest($entity));
+        $dtoobservation->setObservedProperty($this->mapObservedProperty($entity));
+        $dtoobservation->setTemporalExtent($this->mapTemporalExtends($entity));
+        $dtoobservation->setObservationId($codeObservatoire . '_OBS_' . $entity->getChronique()->getId());
+        $dtoobservation->setDataType('Numeric');
+        $dtoobservation->setProcessingLevel('Quality-controlled data');
+
+        return $dtoobservation;
+    }
+
+    private function mapFeatureOfInterest(Chronique $chronique): FeatureOfInterest
+    {
+        $chroniqueId = $chronique->getId();
+        /** @var ChroniqueRepository $chroniquerepo */
+        $chroniquerepo = $this->registry->getRepository('IrsteaBdohDataBundle:Chronique');
+        $point = $chroniquerepo->getPoint($chroniqueId);
+        $featureOfInterest = new FeatureOfInterest();
+        $featureOfInterest->samplingFeature->setType('Feature');
+        $featureOfInterest->samplingFeature->setProperties(((object) null));
+        $featureOfInterest->samplingFeature->setName($chronique->getStation()->getNom());
+        $featureOfInterest->samplingFeature->geometry->setCoordinates($point);
+        $featureOfInterest->samplingFeature->geometry->setType('Point');
+
+        return $featureOfInterest;
+    }
+
+    private function mapTemporalExtends(Chronique $chronique): TemporalExtent
+    {
+        $temporalExtends = new TemporalExtent();
+        $temporalExtends->setDateBeg(strtotime($chronique->getDateDebutMesures()));
+        $temporalExtends->setDateEnd(strtotime($chronique->getDateFinMesures()));
+
+        return $temporalExtends;
+    }
+
+    private function mapFundings(PartenaireEntity $partenaire): Fundings
+    {
+        $fundings = new Fundings();
+        $fundings->setIso3166($partenaire->getIso());
+        $fundings->setName($partenaire->getNom());
+        if ($partenaire->getEstFinanceur()) {
+            $fundings->setType($partenaire->getTypeFundings());
+        }
+        if ($partenaire->getIso() === 'FR') {
+            $fundings->setIdScanR($partenaire->getScanR());
+        } else {
+            $fundings->setIdScanR(null);
+        }
+
+        return $fundings;
+    }
+
+    private function mapSpatialExtends(DataSetEntity $dataSet): SpatialExtent
+    {
+        $datasetId = $dataSet->getId();
+        /** @var DataSetRepository $datasetrepo */
+        $datasetrepo = $this->registry->getRepository('IrsteaBdohDataBundle:DataSet');
+        $rectangle = $datasetrepo->getReclangleEnglobant($datasetId);
+        $tableauRectangle = [$rectangle];
+        $spatial = new SpatialExtent();
+
+        $spatial->setType('Feature');
+        $spatial->setProperties(((object) null));
+
+        $spatial->geometry->setType('Polygon');
+        $spatial->geometry->setCoordinates($tableauRectangle);
+
+        return $spatial;
+    }
+
+    //------------------Contient la conversion du Theia catégorie--------------------------------
+    private function mapObservedProperty(Chronique $chronique): ObservedProperty
+    {
+        $observedProperty = new ObservedProperty();
+        $observedProperty->setUnit($chronique->getUnite());
+
+        //conditionne le champs en fonction du champ en anglais
+        if ($chronique->getLibelleEn() === null) {
+            $observedProperty->setName($chronique->getLibelle());
+        } else {
+            $observedProperty->setName($chronique->getLibelleEn());
+        }
+
+        $milieu = $chronique->getMilieu();
+        //message si la chronique ne contient pas de milieu
+        if ($milieu === null) {
+            $message = 'N/A (A definir dans votre chronique)';
+        } else {
+            $message = $milieu;
+        }
+        $familleParametre = $chronique->getParametre()->getFamilleParametres();
+        /** @var TheiaCategoriesRepository $theiaCategrepository */
+        $theiaCategrepository = $this->registry->getRepository('IrsteaBdohDataBundle:TheiaCategories');
+        $triTheiaPourChronique = $theiaCategrepository->findOneBy(['milieu' => $milieu, 'familleParametre' => $familleParametre]);
+
+        //conditionnement s'il n'y a pas de correspondance dans le theiaCagorie
+        if ($triTheiaPourChronique === null) {
+            $tableauURI = ['Votre chronique ne contient pas un URI TheiaCategorie correspondant au milieu : ' . $message . ' + famille de parametre : ' . $familleParametre];
+        } else {
+            $tableauURI = $triTheiaPourChronique->getUriOzcarTheia();
+        }
+
+        $observedProperty->setTheiaCategories($tableauURI);
+
+        return $observedProperty;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Mapper/MapperInterface.php b/src/Irstea/BdohTheiaOzcarBundle/Mapper/MapperInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..b02639186529b30ff5e7668e43ec5e24bd5e2cf1
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Mapper/MapperInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Mapper;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohTheiaOzcarBundle\Model\FormatPivot;
+
+interface MapperInterface
+{
+    public function mapFormatPivotInterface(Observatoire $entity): FormatPivot;
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Contact.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Contact.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8a98dcd0e448195f6c78e168f5a9e2f7e4d6231
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Contact.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Contact
+{
+    /**
+     * @var string
+     */
+    private $firstName = '';
+
+    /**
+     * @var string
+     */
+    private $lastName = '';
+
+    /**
+     * @var string
+     */
+    private $email = '';
+
+    /**
+     * @var string
+     */
+    private $role = '';
+
+    /**
+     * @var Organisation
+     */
+    private $organisation;
+
+    //-----------------------ctor----------
+    public function __construct(Organisation $organisation)
+    {
+        $this->organisation = $organisation;
+    }
+
+    //----------------------getter et setter--------
+
+    /**
+     * @return string
+     */
+    public function getFirstName(): string
+    {
+        return $this->firstName;
+    }
+
+    /**
+     * @param string $firstName
+     */
+    public function setFirstName(string $firstName): void
+    {
+        $this->firstName = $firstName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLastName(): string
+    {
+        return $this->lastName;
+    }
+
+    /**
+     * @param string $lastName
+     */
+    public function setLastName(string $lastName): void
+    {
+        $this->lastName = $lastName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getEmail(): string
+    {
+        return $this->email;
+    }
+
+    /**
+     * @param string $email
+     */
+    public function setEmail(string $email): void
+    {
+        $this->email = $email;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRole(): string
+    {
+        return $this->role;
+    }
+
+    /**
+     * @param string $role
+     */
+    public function setRole(string $role): void
+    {
+        $this->role = $role;
+    }
+
+    /**
+     * @return Organisation
+     */
+    public function getOrganisation(): Organisation
+    {
+        return $this->organisation;
+    }
+
+    /**
+     * @param Organisation $organisation
+     */
+    public function setOrganisation(Organisation $organisation)
+    {
+        $this->organisation = $organisation;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/DataConstraint.php b/src/Irstea/BdohTheiaOzcarBundle/Model/DataConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..a061da847390306205945db5abfae4d64f09c488
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/DataConstraint.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class DataConstraint
+{
+    /**
+     * @var string
+     */
+    private $accessUseConstraint = '';
+
+    /**
+     * @var string
+     */
+    private $urlDataPolicy;
+
+    /**
+     * @return string
+     */
+    public function getAccessUseConstraint(): string
+    {
+        return $this->accessUseConstraint;
+    }
+
+    /**
+     * @param string $accessUseConstraint
+     */
+    public function setAccessUseConstraint(string $accessUseConstraint): void
+    {
+        $this->accessUseConstraint = $accessUseConstraint;
+    }
+
+    /**
+     * @return string
+     */
+    public function getUrlDataPolicy(): string
+    {
+        return $this->urlDataPolicy;
+    }
+
+    /**
+     * @param string $urlDataPolicy
+     */
+    public function setUrlDataPolicy(string $urlDataPolicy): void
+    {
+        $this->urlDataPolicy = $urlDataPolicy;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/DataFile.php b/src/Irstea/BdohTheiaOzcarBundle/Model/DataFile.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ae9c8548ba0c80361c50e4acec9d8e5ffe2c906
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/DataFile.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class DataFile
+{
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        return 'fichier.txt';
+    }
+
+    /**
+     * @param string $name
+     */
+    public function setName(string $name)
+    {
+        $this->name = $name;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Datasets.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Datasets.php
new file mode 100644
index 0000000000000000000000000000000000000000..beb666540973f74ee455b2578b3892fa4baed7a7
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Datasets.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Datasets
+{
+    /** @var string */
+    public $datasetId = '';
+
+    /** @var Metadata */
+    public $metadata;
+
+    /** @var Observations[] */
+    public $observations = [];
+
+    public function __construct()
+    {
+        $this->metadata = new Metadata();
+    }
+
+    /**
+     * @return string
+     */
+    public function getDatasetId(): string
+    {
+        return $this->datasetId;
+    }
+
+    /**
+     * @param string $datasetId
+     */
+    public function setDatasetId(string $datasetId): void
+    {
+        $this->datasetId = $datasetId;
+    }
+
+    /**
+     * @return Observations|Observations[]
+     */
+    public function getObservations()
+    {
+        return $this->observations;
+    }
+
+    /**
+     * @param Observations|null $observation
+     */
+    public function addObservations(?Observations $observation): void
+    {
+        $this->observations[] = $observation;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/FeatureOfInterest.php b/src/Irstea/BdohTheiaOzcarBundle/Model/FeatureOfInterest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d041b0571cc40a63ff3cd1dea065a1fcd5a31fcf
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/FeatureOfInterest.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class FeatureOfInterest
+{
+    /***
+     * @var SamplingFeature
+     */
+    public $samplingFeature;
+
+    //------------------------------ctor------------------
+
+    public function __construct()
+    {
+        $this->samplingFeature = new SamplingFeature();
+    }
+
+    //----------------------getter et setter-----------------------------------
+
+    /**
+     * @return SamplingFeature
+     */
+    public function getSamplingFeature(): SamplingFeature
+    {
+        return $this->samplingFeature;
+    }
+
+    /**
+     * @return object
+     */
+    public function getProperties()
+    {
+        $objectVide = new \stdClass();
+
+        return $objectVide;
+    }
+
+    /**
+     * @param SamplingFeature $samplingFeature
+     */
+    public function setSamplingFeature(SamplingFeature $samplingFeature)
+    {
+        $this->samplingFeature = $samplingFeature;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/FormatPivot.php b/src/Irstea/BdohTheiaOzcarBundle/Model/FormatPivot.php
new file mode 100644
index 0000000000000000000000000000000000000000..bbe0e0c67b2b78c7a282b5f46fe81a49f4d05bf1
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/FormatPivot.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class FormatPivot
+{
+    /** @var string */
+    public $version = '1.1';
+
+    /** @var Producer */
+    public $producer;
+
+    /** @var Datasets */
+    public $datasets;
+
+    public function __construct()
+    {
+        $this->producer = new Producer();
+    }
+
+    /**
+     * @return Datasets[]|Datasets
+     */
+    public function getDatasets()
+    {
+        return $this->datasets;
+    }
+
+    /**
+     * @param Datasets $datasets
+     */
+    public function setDatasets(Datasets $datasets): void
+    {
+        $this->datasets[] = $datasets;
+    }
+
+    /**
+     * @return Producer
+     */
+    public function getProducer(): Producer
+    {
+        return $this->producer;
+    }
+
+    /**
+     * @param Producer $producer
+     */
+    public function setProducer(Producer $producer): void
+    {
+        $this->producer = $producer;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Fundings.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Fundings.php
new file mode 100644
index 0000000000000000000000000000000000000000..47b82715afe33ed987f2844d71e7c0580f555bf5
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Fundings.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Fundings
+{
+    /** @var string */
+    private $type = '';
+
+    /** @var string */
+    private $iso3166 = '';
+
+    /**
+     * @var string
+     */
+    private $name = '';
+
+    /**
+     * @var string
+     */
+    private $idScanR;
+
+    //------------------------------getter et setter-----------------------------------
+
+    /**
+     * @return string
+     */
+    public function getType(): ?string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setType(string $type): void
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * @return string
+     */
+    public function getIso3166(): string
+    {
+        return $this->iso3166;
+    }
+
+    /**
+     * @param string $iso3166
+     */
+    public function setIso3166(string $iso3166): void
+    {
+        $this->iso3166 = $iso3166;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string $name
+     */
+    public function setName(string $name): void
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getIdScanR(): ?string
+    {
+        return $this->idScanR;
+    }
+
+    /**
+     * @param string|null $idScanR
+     */
+    public function setIdScanR(?string $idScanR): void
+    {
+        $this->idScanR = $idScanR;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Geometry.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Geometry.php
new file mode 100644
index 0000000000000000000000000000000000000000..845dbe022c67cc6cbd7f4e65c633c9ec414555fe
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Geometry.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+use Doctrine\Common\Collections\ArrayCollection;
+
+final class Geometry
+{
+    /**
+     * @var string
+     */
+    private $type = '';
+
+    /**
+     * @var float[]|float
+     */
+    private $coordinates;
+
+    public function __construct()
+    {
+        $this->coordinates = new ArrayCollection();
+    }
+
+    //-----------------------------------getter et setter-----------------------------------------------
+
+    /**
+     * @return float|float[]
+     */
+    public function getCoordinates()
+    {
+        return $this->coordinates;
+    }
+
+    /**
+     * @param float|float[] $coordinates
+     */
+    public function setCoordinates($coordinates)
+    {
+        $this->coordinates = $coordinates;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setType(string $type): void
+    {
+        $this->type = $type;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Metadata.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Metadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..679afd9435fd43a9ef78d2a850314835237b038d
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Metadata.php
@@ -0,0 +1,229 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Metadata
+{
+    /**
+     * @var string
+     */
+    private $title = '';
+
+    /**
+     * @var string
+     */
+    private $description = '';
+
+    /**
+     * @var string
+     */
+    private $datasetLineage = '';
+
+    /**
+     * @var string[]
+     */
+    private $topicCategories = [];
+
+    /**
+     * @var string
+     */
+    private $inspireTheme = '';
+
+    /**
+     * @var PortalSearchCriteria
+     */
+    public $portalSearchCriteria;
+
+    /**
+     * @var Contact[]
+     */
+    public $contacts = [];
+
+    /**
+     * @var DataConstraint
+     */
+    private $dataConstraint = '';
+
+    /**
+     * @var OnlineResource
+     */
+    private $onlineResource;
+
+    /**
+     * @var SpatialExtent
+     */
+    private $spatialExtent;
+
+    //-------------------ctor----------------
+
+    public function __construct()
+    {
+        $this->portalSearchCriteria = new PortalSearchCriteria();
+        $this->spatialExtent = new SpatialExtent();
+    }
+
+    //----------------getter-----------------------
+
+    /**
+     * @return SpatialExtent
+     */
+    public function getSpatialExtent()
+    {
+        return $this->spatialExtent;
+    }
+
+    /**
+     * @param SpatialExtent $spatialextends
+     */
+    public function setSpatialExtent(SpatialExtent $spatialextends)
+    {
+        $this->spatialExtent = $spatialextends;
+    }
+
+    /**
+     * @return string
+     */
+    public function getTitle(): string
+    {
+        return $this->title;
+    }
+
+    /**
+     * @param string $title
+     */
+    public function setTitle(string $title): void
+    {
+        $this->title = $title;
+    }
+
+    /**
+     * @return DataConstraint
+     */
+    public function getDataConstraint(): DataConstraint
+    {
+        return $this->dataConstraint;
+    }
+
+    /**
+     * @param DataConstraint $dataConstraint
+     */
+    public function setDataConstraint(DataConstraint $dataConstraint): void
+    {
+        $this->dataConstraint = $dataConstraint;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getTopicCategories(): array
+    {
+        return $this->topicCategories;
+    }
+
+    /**
+     * @param string $topicCategories
+     */
+    public function addTopicCategories(string $topicCategories): void
+    {
+        $this->topicCategories[] = $topicCategories;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription(): string
+    {
+        return $this->description;
+    }
+
+    /**
+     * @param string $description
+     */
+    public function setDescription(string $description): void
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDatasetLineage(): string
+    {
+        return $this->datasetLineage;
+    }
+
+    /**
+     * @param string $datasetLineage
+     */
+    public function setDatasetLineage(string $datasetLineage): void
+    {
+        $this->datasetLineage = $datasetLineage;
+    }
+
+    /**
+     * @return string
+     */
+    public function getInspireTheme(): string
+    {
+        return $this->inspireTheme;
+    }
+
+    /**
+     * @param string $inspireTheme
+     */
+    public function setInspireTheme(string $inspireTheme): void
+    {
+        $this->inspireTheme = $inspireTheme;
+    }
+
+    /**
+     * @return Contact[]
+     */
+    public function getContacts(): array
+    {
+        return $this->contacts;
+    }
+
+    /**
+     * @param Contact $contact
+     */
+    public function addContact(Contact $contact): void
+    {
+        $this->contacts[] = $contact;
+    }
+
+    /**
+     * @return OnlineResource|null
+     */
+    public function getOnlineResource(): ?OnlineResource
+    {
+        return $this->onlineResource;
+    }
+
+    /**
+     * @param OnlineResource $onlineRessource
+     */
+    public function setOnlineResource(OnlineResource $onlineRessource): void
+    {
+        $this->onlineResource = $onlineRessource;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Observations.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Observations.php
new file mode 100644
index 0000000000000000000000000000000000000000..c357a7c6fe33c295838b72c2746890cc2609c676
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Observations.php
@@ -0,0 +1,201 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Observations
+{
+    /**
+     * @var string
+     */
+    private $observationId = '';
+
+    /**
+     * @var bool
+     */
+    private $timeSerie = true;
+
+    /**
+     * @var ObservedProperty
+     */
+    private $observedProperty;
+
+    /**
+     * @var FeatureOfInterest
+     */
+    private $featureOfInterest;
+
+    /**
+     * @var TemporalExtent
+     */
+    private $temporalExtent;
+
+    /**
+     * @var Result
+     */
+    private $result;
+
+    /**
+     * @var string
+     */
+    private $processingLevel;
+
+    /**
+     * @var string
+     */
+    private $dataType;
+
+    //-------------------------constructor-------------------
+    public function __construct()
+    {
+        $this->result = new Result();
+    }
+
+    //---------------------getter et setter
+
+    /**
+     * @return string
+     */
+    public function getObservationId(): string
+    {
+        return $this->observationId;
+    }
+
+    /**
+     * @param string $observationId
+     */
+    public function setObservationId(string $observationId): void
+    {
+        $this->observationId = $observationId;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isTimeSerie(): bool
+    {
+        return $this->timeSerie;
+    }
+
+    /**
+     * @param bool $timeSerie
+     */
+    public function setTimeSerie(bool $timeSerie): void
+    {
+        $this->timeSerie = $timeSerie;
+    }
+
+    /**
+     * @return string
+     */
+    public function getProcessingLevel(): string
+    {
+        return $this->processingLevel;
+    }
+
+    /**
+     * @param string $processingLevel
+     */
+    public function setProcessingLevel(string $processingLevel): void
+    {
+        $this->processingLevel = $processingLevel;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDataType(): string
+    {
+        return $this->dataType;
+    }
+
+    /**
+     * @param string $dataType
+     */
+    public function setDataType(string $dataType): void
+    {
+        $this->dataType = $dataType;
+    }
+
+    /**
+     * @return ObservedProperty
+     */
+    public function getObservedProperty(): ObservedProperty
+    {
+        return $this->observedProperty;
+    }
+
+    /**
+     * @param ObservedProperty $observedProperty
+     */
+    public function setObservedProperty(ObservedProperty $observedProperty): void
+    {
+        $this->observedProperty = $observedProperty;
+    }
+
+    /**
+     * @return FeatureOfInterest
+     */
+    public function getFeatureOfInterest(): FeatureOfInterest
+    {
+        return $this->featureOfInterest;
+    }
+
+    /**
+     * @param FeatureOfInterest $featureOfInterest
+     */
+    public function setFeatureOfInterest(FeatureOfInterest $featureOfInterest): void
+    {
+        $this->featureOfInterest = $featureOfInterest;
+    }
+
+    /**
+     * @return TemporalExtent
+     */
+    public function getTemporalExtent(): TemporalExtent
+    {
+        return $this->temporalExtent;
+    }
+
+    /**
+     * @param TemporalExtent $temporalExtends
+     */
+    public function setTemporalExtent(TemporalExtent $temporalExtends): void
+    {
+        $this->temporalExtent = $temporalExtends;
+    }
+
+    /**
+     * @return Result | null
+     */
+    public function getResult(): ?Result
+    {
+        return $this->result;
+    }
+
+    /**
+     * @param Result $result
+     */
+    public function setResult(Result $result): void
+    {
+        $this->result = $result;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/ObservedProperty.php b/src/Irstea/BdohTheiaOzcarBundle/Model/ObservedProperty.php
new file mode 100644
index 0000000000000000000000000000000000000000..26596add7d89f0d08b6d7ac38e4c861c4aa00739
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/ObservedProperty.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class ObservedProperty
+{
+    /**
+     * @var string
+     */
+    private $name = '';
+
+    /**
+     * @var string
+     */
+    private $unit = '';
+
+    /**
+     * @var string[]
+     */
+    public $theiaCategories = [];
+
+    //--------------------------getter et setter----------------------------
+
+    /**
+     * @return string|null
+     */
+    public function getName(): ?string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string|null $name
+     */
+    public function setName(?string $name): void
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getUnit(): string
+    {
+        return $this->unit;
+    }
+
+    /**
+     * @param string $unit
+     */
+    public function setUnit(string $unit): void
+    {
+        $this->unit = $unit;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getTheiaCategories()
+    {
+        return $this->theiaCategories;
+    }
+
+    /**
+     * @param string[] $theiaCategories
+     */
+    public function setTheiaCategories($theiaCategories)
+    {
+        $this->theiaCategories = $theiaCategories;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/OnlineResource.php b/src/Irstea/BdohTheiaOzcarBundle/Model/OnlineResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f5f974c06b410debe8fe489e78929622d2ce5e0
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/OnlineResource.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class OnlineResource
+{
+    /**
+     * @var string
+     */
+    private $urlDownload;
+
+    /**
+     * @var string
+     */
+    private $urlInfo;
+
+    /**
+     * @var string
+     */
+    private $doi;
+
+    /**
+     * @return string|null
+     */
+    public function getUrlDownload(): ?string
+    {
+        return $this->urlDownload;
+    }
+
+    /**
+     * @param string $urlDownload
+     */
+    public function setUrlDownload(string $urlDownload): void
+    {
+        $this->urlDownload = $urlDownload;
+    }
+
+    /**
+     * @return string
+     */
+    public function getUrlInfo(): string
+    {
+        return $this->urlInfo;
+    }
+
+    /**
+     * @param string $urlInfo
+     */
+    public function setUrlInfo(string $urlInfo): void
+    {
+        $this->urlInfo = $urlInfo;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getDoi(): ?string
+    {
+        return $this->doi;
+    }
+
+    /**
+     * @param string|null $doi
+     */
+    public function setDoi(?string $doi)
+    {
+        $this->doi = $doi;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Organisation.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Organisation.php
new file mode 100644
index 0000000000000000000000000000000000000000..b16d91a10b9b8065523253772e27bc1f4bea89e1
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Organisation.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+final class Organisation
+{
+    /** @var string */
+    private $iso3166 = '';
+
+    /**
+     * @var string
+     */
+    private $name = '';
+
+    /**
+     * @var string|null
+     */
+    private $idScanR = '';
+
+    /**
+     * @var string
+     */
+    private $role = 'Research group';
+
+    //-----------------------------------getter et setter-----------------------------
+
+    /**
+     * @return string
+     */
+    public function getIso3166(): string
+    {
+        return $this->iso3166;
+    }
+
+    /**
+     * @param string $iso3166
+     */
+    public function setIso3166(string $iso3166): void
+    {
+        $this->iso3166 = $iso3166;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string $name
+     */
+    public function setName(string $name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getIdScanR(): ?string
+    {
+        return $this->idScanR;
+    }
+
+    /**
+     * @param string|null $idScanR
+     */
+    public function setIdScanR(?string $idScanR): void
+    {
+        $this->idScanR = $idScanR;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRole(): string
+    {
+        return $this->role;
+    }
+
+    /**
+     * @param string $role
+     */
+    public function setRole(string $role): void
+    {
+        $this->role = $role;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/PortalSearchCriteria.php b/src/Irstea/BdohTheiaOzcarBundle/Model/PortalSearchCriteria.php
new file mode 100644
index 0000000000000000000000000000000000000000..25bad09bf9bd34c9d6a65acacfd24dcd4cf7a021
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/PortalSearchCriteria.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class PortalSearchCriteria
+{
+    /**
+     * @var string[]
+     */
+    private $climates = [];
+
+    /**
+     * @var string[]
+     */
+    private $geologies = [];
+
+    //--------------------getter et setter--------
+
+    /**
+     * @return string[]
+     */
+    public function getClimates(): array
+    {
+        return $this->climates;
+    }
+
+    /**
+     * @param string $climate
+     */
+    public function addClimate(string $climate): void
+    {
+        $this->climates[] = $climate;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getGeologies(): array
+    {
+        return $this->geologies;
+    }
+
+    /**
+     * @param string $geology
+     */
+    public function addGeology(string $geology): void
+    {
+        $this->geologies[] = $geology;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Producer.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Producer.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a4972ed65a1a49c50252c7de422c5dc813ee493
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Producer.php
@@ -0,0 +1,195 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class Producer
+{
+    /**
+     * @var string
+     */
+    private $producerId = '';
+
+    /**
+     * @var string
+     */
+    private $name = '';
+
+    /**
+     * @var string
+     */
+    private $title = '';
+
+    /**
+     * @var string
+     */
+    private $description = '';
+
+    /**
+     * @var string
+     */
+    private $email = '';
+
+    /**
+     * @var Fundings[]
+     */
+    private $fundings = [];
+
+    /**
+     * @var Contact[]
+     */
+    public $contacts = [];
+
+    /**
+     * @var OnlineResource
+     */
+    private $onlineResource;
+
+    //------------------------------------getter et setter
+
+    /**
+     * @return string|null
+     */
+    public function getTitle(): string
+    {
+        return $this->title;
+    }
+
+    /**
+     * @param string $title
+     */
+    public function setTitle(string $title): void
+    {
+        $this->title = $title;
+    }
+
+    /**
+     * @return string
+     */
+    public function getProducerId(): string
+    {
+        return $this->producerId;
+    }
+
+    /**
+     * @param string $producerId
+     */
+    public function setProducerId(string $producerId): void
+    {
+        $this->producerId = $producerId;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string $name
+     */
+    public function setName(string $name): void
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription(): string
+    {
+        return $this->description;
+    }
+
+    /**
+     * @param string
+     */
+    public function setDescription(string $description): void
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getEmail(): ?string
+    {
+        return $this->email;
+    }
+
+    /**
+     * @param string|null $email
+     */
+    public function setEmail(?string $email): void
+    {
+        $this->email = $email;
+    }
+
+    /**
+     * @return Fundings[]
+     */
+    public function getFundings(): array
+    {
+        return $this->fundings;
+    }
+
+    /**
+     * @param Fundings $fundings
+     */
+    public function setFundings(Fundings $fundings): void
+    {
+        $this->fundings[] = $fundings;
+    }
+
+    /**
+     * @return Contact[]
+     */
+    public function getContacts(): array
+    {
+        return $this->contacts;
+    }
+
+    /**
+     * @param Contact $contact
+     */
+    public function setContact(Contact $contact): void
+    {
+        $this->contacts[] = $contact;
+    }
+
+    /**
+     * @return OnlineResource|null
+     */
+    public function getOnlineResource(): ?OnlineResource
+    {
+        return $this->onlineResource;
+    }
+
+    /**
+     * @param OnlineResource $onlineRessource
+     */
+    public function setOnlineResource(OnlineResource $onlineRessource): void
+    {
+        $this->onlineResource = $onlineRessource;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/Result.php b/src/Irstea/BdohTheiaOzcarBundle/Model/Result.php
new file mode 100644
index 0000000000000000000000000000000000000000..e72dad2ff6260a6d07ed962ce42c427c2fe61351
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/Result.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class Result
+{
+    /**
+     * @var DataFile
+     */
+    private $dataFile;
+
+    //------------------------------------------------------------
+
+    public function __construct()
+    {
+        $this->dataFile = new DataFile();
+    }
+
+    //---------------------------------------------------------
+
+    /**
+     * @return DataFile
+     */
+    public function getDataFile()
+    {
+        return $this->dataFile;
+    }
+
+    /**
+     * @param DataFile $dataFile
+     */
+    public function setDataFile(DataFile $dataFile)
+    {
+        $this->dataFile = $dataFile;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/SamplingFeature.php b/src/Irstea/BdohTheiaOzcarBundle/Model/SamplingFeature.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3f086bc6f4f1a2df2ce03b973ad18b10b6f4535
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/SamplingFeature.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class SamplingFeature
+{
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     *@var Geometry
+     */
+    public $geometry;
+
+    /**
+     * @var \stdClass
+     */
+    public $properties;
+
+    /**
+     * @var string
+     */
+    public $type;
+
+    //------------------------------ctor------------------
+    public function __construct()
+    {
+        $this->geometry = new Geometry();
+    }
+
+    //--------------------------------------getter/setter ---------------------------------------------------------
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string $name
+     */
+    public function setName(string $name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return \stdClass
+     */
+    public function getProperties(): \stdClass
+    {
+        return $this->properties;
+    }
+
+    /**
+     * @param \stdClass $properties
+     */
+    public function setProperties(\stdClass $properties): void
+    {
+        $this->properties = $properties;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType(): string
+    {
+        return 'Feature';
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setType(string $type): void
+    {
+        $this->type = $type;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/SpatialExtent.php b/src/Irstea/BdohTheiaOzcarBundle/Model/SpatialExtent.php
new file mode 100644
index 0000000000000000000000000000000000000000..649d7910771b2f195e2c868cebe8dfef494e6f99
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/SpatialExtent.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class SpatialExtent
+{
+    /**
+     * @var Geometry
+     */
+    public $geometry;
+
+    /**
+     * @var \stdClass
+     */
+    public $properties;
+
+    /**
+     * @var string
+     */
+    public $type;
+
+    //------------------------------ctor------------------
+    public function __construct()
+    {
+        $this->geometry = new Geometry();
+    }
+
+    //------------------------getter et setter------------
+
+    /**
+     * @return \stdClass
+     */
+    public function getProperties(): \stdClass
+    {
+        return $this->properties;
+    }
+
+    /**
+     * @param \stdClass $properties
+     */
+    public function setProperties(\stdClass $properties): void
+    {
+        $this->properties = $properties;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType(): string
+    {
+        return 'Feature';
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setType(string $type): void
+    {
+        $this->type = $type;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/TemporalExtent.php b/src/Irstea/BdohTheiaOzcarBundle/Model/TemporalExtent.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9ca45c511e46aec38babf54bbcf1a4d30bd1f98
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/TemporalExtent.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class TemporalExtent
+{
+    /**
+     * @var string|null
+     */
+    private $dateBeg = '';
+
+    /**
+     * @var string|null
+     */
+    private $dateEnd = '';
+
+    //@todo actuellement mis en string ou null mais en réalité il est obligatoire
+
+    /**
+     * @return string|null
+     */
+    public function getDateBeg(): ?string
+    {
+        return $this->dateBeg;
+    }
+
+    /**
+     * @param string|null $dateBeg
+     */
+    public function setDateBeg(?string $dateBeg): void
+    {
+        $dateBeg = date('Y-m-d\TH:i:s.00', $dateBeg) . 'Z';
+        $this->dateBeg = $dateBeg;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getDateEnd(): ?string
+    {
+        return $this->dateEnd;
+    }
+
+    /**
+     * @param string|null $dateEnd
+     */
+    public function setDateEnd(?string $dateEnd): void
+    {
+        $dateEnd = date('Y-m-d\TH:i:s.00', $dateEnd) . 'Z';
+        $this->dateEnd = $dateEnd;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Model/TopicCategory.php b/src/Irstea/BdohTheiaOzcarBundle/Model/TopicCategory.php
new file mode 100644
index 0000000000000000000000000000000000000000..2becdf4e2c1cbf5ec98c4843866b5b624e8194e6
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Model/TopicCategory.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Model;
+
+class TopicCategory
+{
+    /** @var string */
+    public $nom = '';
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Resources/config/services.yml b/src/Irstea/BdohTheiaOzcarBundle/Resources/config/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..622ff0c4b75f2cbda05c45234752f26c116873af
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Resources/config/services.yml
@@ -0,0 +1,65 @@
+parameters:
+
+services:
+    irstea_bdoh_theia_ozcar_sendjsontotheia_service:
+       class: Irstea\BdohTheiaOzcarBundle\Service\EnvoiJSON
+       arguments:
+           - "%uri_theia_send_data%"
+           - "@irstea_bdoh_theia_ozcar.encryption_service"
+           - "@router"
+           - "@irstea_bdoh_theia_ozcar.serializerjson"
+           - "@irstea_bdoh_theia_ozcar.schemajson"
+           - "@irstea_bdoh_theia_ozcar_zip"
+           - "@doctrine"
+
+    irstea_bdoh_theia_ozcar_zip:
+        class: Irstea\BdohTheiaOzcarBundle\Service\ZipJSON
+
+    irstea_bdoh_theia_ozcar.sendjsontotheia:
+        class: Irstea\BdohTheiaOzcarBundle\Command\SendJSONToTheiaCommand
+        arguments:
+            - "@irstea_bdoh_theia_ozcar_sendjsontotheia_service"
+
+        tags:
+            - { name: console.command }
+
+    irstea_bdoh_theia_ozcar.mapper:
+        class: Irstea\BdohTheiaOzcarBundle\Mapper\Mapper
+        arguments:
+            - "@doctrine"
+            - "@router"
+            -
+    irstea_bdoh_theia_ozcar.schemajson:
+        class: Irstea\BdohTheiaOzcarBundle\Service\SchemaJSON
+        arguments:
+            - "%uri_theia_ozcar_schema_json%"
+            - "@irstea_bdoh_consult.json_schema.loader"
+
+    irstea_bdoh_theia_ozcar.serializerjson:
+        class: Irstea\BdohTheiaOzcarBundle\Service\SerializerJSON
+        arguments:
+            - "@irstea_bdoh_theia_ozcar.serializer"
+            - "@irstea_bdoh_theia_ozcar.mapper"
+
+    irstea_bdoh_theia_ozcar.serializer:
+        class: JMS\Serializer\SerializerInterface
+        factory: [Irstea\BdohTheiaOzcarBundle\Service\SerializerFactory, create]
+
+    irstea_bdoh_theia_ozcar.encryption_service:
+        class: Irstea\BdohTheiaOzcarBundle\Service\PasswordEncryptionService
+        arguments:
+            - "%theia_password_secret_key%"
+
+    irstea_bdoh_theia_ozcar.password_event_subscriber:
+        class: Irstea\BdohTheiaOzcarBundle\Form\PasswordEventSubscriber
+        arguments:
+            - "@irstea_bdoh_theia_ozcar.encryption_service"
+
+    irstea_bdoh_theia_ozcar.command.dump_formatpivot:
+        class: Irstea\BdohTheiaOzcarBundle\Command\DumpFormatPivotCommand
+        arguments:
+            - "@doctrine"
+            - "@serializer"
+            - "@irstea_bdoh_theia_ozcar.mapper"
+        tags:
+            - { name: console.command }
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/EnvoiJSON.php b/src/Irstea/BdohTheiaOzcarBundle/Service/EnvoiJSON.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae75554afaf6c33f2282ae93a741ff26f1ae2050
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/EnvoiJSON.php
@@ -0,0 +1,169 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use Doctrine\ORM\EntityManagerInterface;
+use GuzzleHttp\Client;
+use GuzzleHttp\Exception\GuzzleException;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Repository\ObservatoireRepository;
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\Routing\RouterInterface;
+
+class EnvoiJSON
+{
+    /** @var string */
+    private $uriTheiaSend;
+
+    /** @var PasswordEncryptionService */
+    private $passwordEncryptionService;
+
+    /** @var RouterInterface */
+    private $router;
+
+    /** @var SerializerJSON */
+    private $serializerJson;
+
+    /** @var SchemaJSON */
+    private $schemaJSON;
+
+    /** @var ZipJSON */
+    private $zipJSON;
+
+    /**
+     * @var RegistryInterface
+     * @DI\Inject
+     */
+    public $doctrine;
+
+    /**
+     * SendJSONToTheiaCommand constructor.
+     *
+     * @param string $uriTheiaSend
+     */
+    public function __construct(
+        string $uriTheiaSend,
+        PasswordEncryptionService $passwordEncryptionService,
+        RouterInterface $router,
+        SerializerJSON $serializerJson,
+        SchemaJSON $schemaJSON,
+        ZipJSON $zipJSON,
+        RegistryInterface $doctrine
+    ) {
+        $this->uriTheiaSend = $uriTheiaSend;
+        $this->passwordEncryptionService = $passwordEncryptionService;
+        $this->router = $router;
+        $this->serializerJson = $serializerJson;
+        $this->schemaJSON = $schemaJSON;
+        $this->zipJSON = $zipJSON;
+        $this->doctrine = $doctrine;
+    }
+
+    public function sendJsonTheia(string $theiaCode)
+    {
+        $envoi = $this->doctrine
+            ->getManagerForClass(Observatoire::class)
+            ->transactional(
+                function (EntityManagerInterface $manager) use ($theiaCode) {
+                    //pour les messages d'erreurs
+                    $key = null;
+                    $message = null;
+                    $responseBody = null;
+                    $nameZip = 'BDOH.zip';
+
+                    /** @var ObservatoireRepository $observatoireRepo */
+                    $observatoireRepo = $manager->getRepository(Observatoire::class);
+
+                    //récupérer l'bservatoire via son codeTheia
+                    $observatoire = $observatoireRepo->findOneByTheiaCode($theiaCode);
+                    $username = $observatoire->getTheiaCode();
+                    $password = $observatoire->getTheiaPassword();
+
+                    //décrypter le mot de passe
+                    $passwordDecrypt = $this->passwordEncryptionService->decrypt($password);
+
+                    //ajout du _observatoire pour les routes
+                    $slug = $observatoire->getSlug();
+                    $url = $this->router->getContext()->setParameter('_observatoire', $slug);
+
+                    //serialization du json avec le mapper theia
+                    $seri = $this->serializerJson->serialize($observatoire);
+                    $data = json_decode($seri);
+
+                    //vérification du schema de valisation du json
+                    $result = $this->schemaJSON->validateSchemaTheia($data);
+
+                    if ($result->isValid()) {
+                        // Compression dans un zip du fichier json
+                        $filename = tempnam('/tmp', 'theia');
+
+                        $this->zipJSON->zipArchive($seri, $filename, $username);
+
+                        $content = file_get_contents($filename);
+                        $uriTheia = $this->uriTheiaSend . $username . '/new/' . $nameZip;
+                        //Envoie du zip à Theia
+                        $client = new Client();
+
+                        try {
+                            $response = $client->request(
+                                'PUT',
+                                $uriTheia,
+                                [
+                                    'headers' => [
+                                        'Content-Type' => 'application/zip',
+                                    ],
+                                    'body'         => $content,
+                                    'auth'         => [$username, $passwordDecrypt],
+                                ]
+                            );
+                            $responseBody = $response->getBody()->getContents();
+                            $unix = 0;
+                        } catch (GuzzleException $e) {
+                            // si l'envoie ne fonctionne pas
+                            $message = $e->getMessage();
+                            $response = $e->getResponse();
+                            $responseBody = $response->getBody()->getContents();
+                            // passage de la mise à jour en false
+                            $observatoire->setMiseajourAutomatique(false);
+
+                            $unix = 1;
+                        }
+                    } else {
+                        // si le json n'est pas valid affichage des erreurs dans la console
+
+                        foreach ($result->getErrors() as $erreurs) {
+                            $key = $erreurs->keyword();
+                        }
+                        // passage de la mise à jour en false
+
+                        $observatoire->setMiseajourAutomatique(false);
+
+                        $unix = 1;
+                    }//end result is valid
+
+                    return [$unix, $key, $message, $responseBody, $result, $seri];
+                }
+            );
+
+        return $envoi;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php b/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed5486d6902e15c3b012f84e2d742fc274ab8099
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionService.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use Irstea\BdohTheiaOzcarBundle\Exception\PasswordException;
+
+final class PasswordEncryptionService implements PasswordEncryptionServiceInterface
+{
+    private const BASE64_VARIANT = SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING;
+
+    /** @var string */
+    private $secretKey;
+
+    public function __construct(string $secretKey)
+    {
+        try {
+            $this->secretKey = sodium_hex2bin($secretKey);
+        } catch (\Exception $ex) {
+            throw new PasswordException('Theia secret key: ' . $ex->getMessage(), 0, $ex);
+        }
+        if (strlen($this->secretKey) !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
+            throw new PasswordException('The secret key must have a length of 32 bytes.');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function encrypt(string $clearPassword): string
+    {
+        try {
+            $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
+            $cipher = sodium_crypto_secretbox($clearPassword, $nonce, $this->secretKey);
+
+            $base64Cipher = sodium_bin2base64($cipher, self::BASE64_VARIANT);
+            $base64Nonce = sodium_bin2base64($nonce, self::BASE64_VARIANT);
+
+            return $base64Cipher . '!' . $base64Nonce;
+        } catch (\Exception $ex) {
+            throw new PasswordException('Theia password: ' . $ex->getMessage(), 0, $ex);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function decrypt(string $encryptedPassword): string
+    {
+        try {
+            [$base64Cipher, $base64Nonce] = explode('!', $encryptedPassword);
+
+            $cipher = sodium_base642bin($base64Cipher, self::BASE64_VARIANT);
+            $nonce = sodium_base642bin($base64Nonce, self::BASE64_VARIANT);
+
+            $result = sodium_crypto_secretbox_open($cipher, $nonce, $this->secretKey);
+        } catch (\Exception $ex) {
+            throw new PasswordException('Theia password: ' . $ex->getMessage(), 0, $ex);
+        }
+
+        if ($result === false) {
+            throw new PasswordException('could not decrypt Theia password');
+        }
+
+        return $result;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionServiceInterface.php b/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6063eaf6be0ce1556f66bcb7ebef126bc8cae8d3
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/PasswordEncryptionServiceInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use Irstea\BdohTheiaOzcarBundle\Exception\PasswordException;
+
+interface PasswordEncryptionServiceInterface
+{
+    /**
+     * @throws PasswordException
+     */
+    public function encrypt(string $clearPassword): string;
+
+    /**
+     * @throws PasswordException
+     */
+    public function decrypt(string $encryptedPassword): string;
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/SchemaJSON.php b/src/Irstea/BdohTheiaOzcarBundle/Service/SchemaJSON.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1e9afb9bfe4fd65111da9c9dfbce00dfa5c4cc1
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/SchemaJSON.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use Irstea\BdohConsultBundle\Service\JsonSchema\SpyingLoader;
+use Opis\JsonSchema\ISchema;
+use Opis\JsonSchema\ISchemaLoader;
+use Opis\JsonSchema\ValidationResult;
+use Opis\JsonSchema\Validator;
+
+final class SchemaJSON
+{
+    /** @var string */
+    private $uriTheiaOzcarValidateur;
+
+    /**
+     * @var ISchemaLoader
+     */
+    private $loader;
+
+    public function __construct(string $uriTheiaOzcarValidateur, ISchemaLoader $loader)
+    {
+        $this->uriTheiaOzcarValidateur = $uriTheiaOzcarValidateur;
+        $this->loader = $loader;
+    }
+
+    /**
+     * @param $jsonDecode
+     */
+    public function validateSchemaTheia($jsonDecode): ValidationResult
+    {
+        $schema = $this->loadSchemaTheia();
+        $validator = new Validator();
+        /** @var ValidationResult $result */
+        $result = $validator->schemaValidation($jsonDecode, $schema, 10, $this->loader);
+
+        return $result;
+    }
+
+    public function loadSchemaTheia(): ISchema
+    {
+        $spyingLoader = new SpyingLoader($this->loader);
+        $schema = $spyingLoader->loadSchema($this->uriTheiaOzcarValidateur);
+
+        return $schema;
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerFactory.php b/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc5330b6bcbf7c1874130d633ccc7c8dd35e468f
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerFactory.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
+use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
+use JMS\Serializer\SerializationContext;
+use JMS\Serializer\SerializerBuilder;
+use JMS\Serializer\SerializerInterface;
+
+final class SerializerFactory
+{
+    public static function create(): SerializerInterface
+    {
+        return SerializerBuilder::create()
+            ->setPropertyNamingStrategy(
+                new SerializedNameAnnotationStrategy(
+                    new IdenticalPropertyNamingStrategy()
+                )
+            )
+            ->setSerializationContextFactory(function () {
+                return SerializationContext::create()
+                    ->setSerializeNull(false);
+            })
+            ->build();
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerJSON.php b/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerJSON.php
new file mode 100644
index 0000000000000000000000000000000000000000..337a370f54be38a8734b8ab114f6d80a57803570
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/SerializerJSON.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohTheiaOzcarBundle\Mapper\MapperInterface;
+use JMS\Serializer\SerializerInterface;
+
+final class SerializerJSON
+{
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * @var MapperInterface
+     */
+    private $mapper;
+
+    public function __construct(SerializerInterface $serializer, MapperInterface $mapper)
+    {
+        $this->serializer = $serializer;
+        $this->mapper = $mapper;
+    }
+
+    public function serialize(Observatoire $observatoire): string
+    {
+        $formatPivot = $this->mapper->mapFormatPivotInterface($observatoire);
+
+        return $this->serializer->serialize($formatPivot, 'json');
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Service/ZipJSON.php b/src/Irstea/BdohTheiaOzcarBundle/Service/ZipJSON.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2db5f50b9b66daa6988031585e55fb47f65d5bb
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Service/ZipJSON.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Service;
+
+class ZipJSON
+{
+    public function zipArchive(string $serializerJSON, string $filename, string $theiaCode)
+    {
+        $zip = new \ZipArchive();
+        if ($zip->open($filename, \ZipArchive::CREATE) !== true) {
+            throw new \RuntimeException("cannot open <$filename>\n");
+        }
+        $zip->addFromString($theiaCode . '_en.json', $serializerJSON);
+
+        // All files are added, so close the zip file.
+        $zip->close();
+    }
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Tests/Mapper/MapperTest.php b/src/Irstea/BdohTheiaOzcarBundle/Tests/Mapper/MapperTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d93350117d4d96b82eeb7a73813a457c2b335909
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Tests/Mapper/MapperTest.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Tests\Mapper;
+
+use Irstea\BdohDataBundle\Entity\ChroniqueDiscontinue;
+use Irstea\BdohDataBundle\Entity\DataConstraint;
+use Irstea\BdohDataBundle\Entity\DataSet;
+use Irstea\BdohDataBundle\Entity\Observatoire;
+use Irstea\BdohDataBundle\Entity\Partenaire;
+use Irstea\BdohDataBundle\Entity\PersonneTheia;
+use Irstea\BdohDataBundle\Entity\Unite;
+use Irstea\BdohTheiaOzcarBundle\Mapper\Mapper;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @group unit
+ */
+class MapperTest extends TestCase
+{
+    public function testMapMetadata(): void
+    {
+        // Arrange
+       /* $mapper = new Mapper();
+        $dataSetEntity = new DataSet();
+        $dataSetEntity->setId('13');
+        $dataSetEntity->setTitre('foo');
+        $dataSetEntity->setDataConstraints(new DataConstraint());
+        $dataSetEntity->setDescription('popo');
+        $dataSetEntity->setGenealogie('truc');
+        $dataSetEntity->setThemeInpire('Environnemental monitoring');
+
+        // Act
+        $dataSetDTO = $mapper->map($dataSetEntity);
+
+        // Assert
+        //@todo quand l'uuid sera reglé
+        self::assertEquals('_DAT_13', $dataSetDTO->getDatasetId());
+        self::assertEquals('foo', $dataSetDTO->metadata->getTitle());
+        self::assertEquals('popo', $dataSetDTO->metadata->getDescription());
+        self::assertEquals('', $dataSetDTO->metadata->getDataConstraint()->getAccessUseConstraint());
+        self::assertEquals('truc', $dataSetDTO->metadata->getDatasetLineage());
+        self::assertEquals('Environnemental monitoring', $dataSetDTO->metadata->getInspireTheme());**/
+    }
+
+    public function testMapProducer(): void
+    {
+        //Arrange
+        /*
+        $mapper = new Mapper($this->registry);
+        $observatorieEntity = new Observatoire();
+
+        $personneTheiaEntity = new PersonneTheia();
+        $personneTheiaEntity->setNom('TESS');
+        $personneTheiaEntity->setPrenom('Adri');
+        $personneTheiaEntity->setPartenaires(new Partenaire());
+        $personneTheiaEntity->setEmail('adrien.tessanne@outlook.fr');
+
+        $partenaireEntity = $personneTheiaEntity->getPartenaires();
+        $partenaireEntity->setNom('Enterprise');
+        $partenaireEntity->setIso('FR');
+        $partenaireEntity->setScanR('200017466P');
+
+        $observatorieEntity->setTheiaCode('_OBS_15');
+        $observatorieEntity->setTitre('Pommerainette');
+        $observatorieEntity->setNom('Babar');
+        $observatorieEntity->setDescriptionEn('description');
+        $observatorieEntity->setEmail('adrien.tessae@outlook.fr');
+        $observatorieEntity->addDataManager($personneTheiaEntity);
+        $observatorieEntity->setProjectLeader($personneTheiaEntity);
+
+        //Act
+        $producerDTO = $mapper->mapProducerInterface($observatorieEntity);
+        $contactDTO = $mapper->mapContactInterface($personneTheiaEntity);
+        $organisationDTO = $mapper->mapOrganisationInterface($partenaireEntity);
+
+        //Assert
+        self::assertEquals('_OBS_15', $producerDTO->getProducerId());
+        self::assertEquals('Pommerainette', $producerDTO->getTitle());
+        self::assertEquals('Babar', $producerDTO->getName());
+        self::assertEquals('description', $producerDTO->getDescription());
+        self::assertEquals('adrien.tessae@outlook.fr', $producerDTO->getEmail());
+
+        self::assertEquals('TESS', $contactDTO->getLastName());
+        self::assertEquals('Adri', $contactDTO->getFirstName());
+        self::assertEquals('adrien.tessanne@outlook.fr', $contactDTO->getEmail());
+
+        self::assertEquals('Enterprise', $organisationDTO->getName());
+        self::assertEquals('FR', $organisationDTO->getIso3166());
+        self::assertEquals('200017466P', $organisationDTO->getIdScanR());
+        self::assertEquals('Research group', $organisationDTO->getRole());*/
+    }
+
+    //@todo faire maperTest de l'observation
+   /* public function testMapObservation(): void{
+
+        //Arrange
+        $mapper = new Mapper();
+        $observationEntity = new ChroniqueDiscontinue();
+
+        $observationEntity->setDateDebutMesures('2021-02-22T14:41:10.00Z');
+        $observationEntity->setDateFinMesures('2021-02-22T14:41:10.00Z');
+        $observationEntity->setLibelle('papa');
+        $observationEntity->setUnite( new Unite());
+
+        //Act
+        $observationDTO = $mapper->mapObs($observationEntity);
+
+        //Assert
+        self::assertEquals('2021-02-22T14:41:10.00Z', $observationDTO->getTemporalExtends()->getDateBeg());
+        self::assertEquals('2021-02-22T14:41:10.00Z', $observationDTO->getTemporalExtends()->getDateEnd());
+        self::assertEquals('papa', $observationDTO->getObservedProperty()->getName());
+        self::assertEquals('', $observationDTO->getObservedProperty()->getUnit());
+
+
+
+    }**/
+}
diff --git a/src/Irstea/BdohTheiaOzcarBundle/Tests/Service/PasswordEncryptionServiceTest.php b/src/Irstea/BdohTheiaOzcarBundle/Tests/Service/PasswordEncryptionServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cc5c994a5a9d63e2af5b5af1818b12e324d44a6
--- /dev/null
+++ b/src/Irstea/BdohTheiaOzcarBundle/Tests/Service/PasswordEncryptionServiceTest.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\BdohTheiaOzcarBundle\Tests\Service;
+
+use Irstea\BdohTheiaOzcarBundle\Exception\PasswordException;
+use Irstea\BdohTheiaOzcarBundle\Service\PasswordEncryptionService;
+use PHPUnit\Framework\TestCase;
+
+class PasswordEncryptionServiceTest extends TestCase
+{
+    public function testInvalidSecretKey(): void
+    {
+        $this->expectException(PasswordException::class);
+        $dummy = new PasswordEncryptionService('foo');
+
+        $this->assertNull($dummy);
+    }
+
+    public function testShortSecretKey(): void
+    {
+        $this->expectException(PasswordException::class);
+        $dummy = new PasswordEncryptionService('deadbeef');
+
+        $this->assertNull($dummy);
+    }
+
+    public function testCreate(): void
+    {
+        $secretKey = bin2hex(random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES));
+
+        $service = new PasswordEncryptionService($secretKey);
+
+        $this->assertInstanceOf(PasswordEncryptionService::class, $service);
+    }
+
+    public function testEncrypt(): void
+    {
+        $secretKey = bin2hex(random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES));
+
+        $service = new PasswordEncryptionService($secretKey);
+
+        $clear = 'my password !';
+        $crypted1 = $service->encrypt($clear);
+        $crypted2 = $service->encrypt($clear);
+
+        $this->assertNotEquals($clear, $crypted1);
+        $this->assertNotEquals($crypted2, $crypted1);
+    }
+
+    public function testSymmetry(): void
+    {
+        $secretKey = bin2hex(random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES));
+
+        $service = new PasswordEncryptionService($secretKey);
+
+        $clear = 'my password !';
+        $crypted = $service->encrypt($clear);
+        $decrypted = $service->decrypt($crypted);
+
+        $this->assertEquals($clear, $decrypted);
+    }
+}
diff --git a/web/app.php b/web/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fcbd84cb94c461f5a092f73868eb745beaba7cb
--- /dev/null
+++ b/web/app.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * Base de Données des Observatoires en Hydrologie
+ * Copyright (C) 2012-2019 IRSTEA
+ * Copyright (C) 2020-2021 INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use Symfony\Component\HttpFoundation\Request;
+
+umask(0002);
+
+$env = getenv('SYMFONY_ENV') ?: 'prod';
+$debug = 'dev' === $env;
+
+/**
+ * @var Composer\Autoload\ClassLoader
+ */
+$loader = require __DIR__ . '/../app/autoload.php';
+include_once __DIR__ . '/../app/bootstrap.php.cache';
+
+$kernel = new AppKernel($env, $debug);
+$kernel->loadClassCache();
+//$kernel = new AppCache($kernel);
+
+// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
+//Request::enableHttpMethodParameterOverride();
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/web/css/.htaccess b/web/css/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..38dcd05d018f73dd59e4d0a0ae55a18a7f12ee34
--- /dev/null
+++ b/web/css/.htaccess
@@ -0,0 +1 @@
+RewriteEngine Off
diff --git a/web/documents/.htaccess b/web/documents/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..38dcd05d018f73dd59e4d0a0ae55a18a7f12ee34
--- /dev/null
+++ b/web/documents/.htaccess
@@ -0,0 +1 @@
+RewriteEngine Off
diff --git a/web/documents/ConditionsGeneralesUtilisation.pdf b/web/documents/ConditionsGeneralesUtilisation.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..8e8ec07a06a80891eefb94da4ee777857581a7d5
Binary files /dev/null and b/web/documents/ConditionsGeneralesUtilisation.pdf differ
diff --git a/web/documents/DocumentationBDOH.pdf b/web/documents/DocumentationBDOH.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..8326a1eb3b78e099663fbacd0e1db15188e6091d
Binary files /dev/null and b/web/documents/DocumentationBDOH.pdf differ
diff --git a/web/documents/FormatsExport.pdf b/web/documents/FormatsExport.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2c6b4d3357cfeb8a0a9ea1a9b25b90794a26063e
Binary files /dev/null and b/web/documents/FormatsExport.pdf differ
diff --git a/web/favicon.ico b/web/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..4cc605de72861678240e4917624dbb2c482ea5da
Binary files /dev/null and b/web/favicon.ico differ
diff --git a/web/images/.htaccess b/web/images/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..38dcd05d018f73dd59e4d0a0ae55a18a7f12ee34
--- /dev/null
+++ b/web/images/.htaccess
@@ -0,0 +1 @@
+RewriteEngine Off
diff --git a/web/images/Logo_INRAE.png b/web/images/Logo_INRAE.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cd93142e9ad2127cf167eac4acf97afed6be74b
Binary files /dev/null and b/web/images/Logo_INRAE.png differ
diff --git a/web/images/Logo_INRAE_REPUBLIQUE.png b/web/images/Logo_INRAE_REPUBLIQUE.png
new file mode 100644
index 0000000000000000000000000000000000000000..51d99e279b1ecb3f3251b9268a3f76fd0d721e88
Binary files /dev/null and b/web/images/Logo_INRAE_REPUBLIQUE.png differ
diff --git a/web/images/MiniLogo_INRAE_REPUBLIQUE.png b/web/images/MiniLogo_INRAE_REPUBLIQUE.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a7c60cbb32f685d531a96fd35c836bc39e79f61
Binary files /dev/null and b/web/images/MiniLogo_INRAE_REPUBLIQUE.png differ
diff --git a/web/images/admin/overlap_after.png b/web/images/admin/overlap_after.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fb58d7add9010b564bd915a6b5bf0bab3dd88a3
Binary files /dev/null and b/web/images/admin/overlap_after.png differ
diff --git a/web/images/admin/overlap_before.png b/web/images/admin/overlap_before.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bc8bf3dbbfe0a0814475100016690f3127b7d70
Binary files /dev/null and b/web/images/admin/overlap_before.png differ
diff --git a/web/images/admin/overlap_boundsEqual.png b/web/images/admin/overlap_boundsEqual.png
new file mode 100644
index 0000000000000000000000000000000000000000..18d0c0b86bb88677574f1ac3d5669a00cf046aab
Binary files /dev/null and b/web/images/admin/overlap_boundsEqual.png differ
diff --git a/web/images/admin/overlap_firstIn.png b/web/images/admin/overlap_firstIn.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d24f6564c225912385e594090702a850edb3602
Binary files /dev/null and b/web/images/admin/overlap_firstIn.png differ
diff --git a/web/images/admin/overlap_lastIn.png b/web/images/admin/overlap_lastIn.png
new file mode 100644
index 0000000000000000000000000000000000000000..604ee35a59ae4280549b0862357b84a7999d623f
Binary files /dev/null and b/web/images/admin/overlap_lastIn.png differ
diff --git a/web/images/admin/overlap_new.png b/web/images/admin/overlap_new.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2db363f4b1afac0ddd0abe8267836d87d8060f3
Binary files /dev/null and b/web/images/admin/overlap_new.png differ
diff --git a/web/images/admin/overlap_newInOld.png b/web/images/admin/overlap_newInOld.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4f255c449cead715b8a527da09272c41879a1c5
Binary files /dev/null and b/web/images/admin/overlap_newInOld.png differ
diff --git a/web/images/admin/overlap_oldInNew.png b/web/images/admin/overlap_oldInNew.png
new file mode 100644
index 0000000000000000000000000000000000000000..493d9f8d46cc968f235bde5a29d61c50fca3f122
Binary files /dev/null and b/web/images/admin/overlap_oldInNew.png differ
diff --git a/web/images/consult/cv-icon.gif b/web/images/consult/cv-icon.gif
new file mode 100644
index 0000000000000000000000000000000000000000..89ae2087a16774a530ec52a3690495c274fc4a66
Binary files /dev/null and b/web/images/consult/cv-icon.gif differ
diff --git a/web/images/consult/rate0.png b/web/images/consult/rate0.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6924a2989749cd61f79ca03a2afeb28fde9898a
Binary files /dev/null and b/web/images/consult/rate0.png differ
diff --git a/web/images/consult/rate10.png b/web/images/consult/rate10.png
new file mode 100644
index 0000000000000000000000000000000000000000..fff3048164021f2f2beddc87bd1f457712acc0be
Binary files /dev/null and b/web/images/consult/rate10.png differ
diff --git a/web/images/consult/rate100.png b/web/images/consult/rate100.png
new file mode 100644
index 0000000000000000000000000000000000000000..37abbdd40ffd77bb9c82484e6d6d6b59753070db
Binary files /dev/null and b/web/images/consult/rate100.png differ
diff --git a/web/images/consult/rate20.png b/web/images/consult/rate20.png
new file mode 100644
index 0000000000000000000000000000000000000000..0627c8a8598b1fe0d08455d38e79f6f517338e17
Binary files /dev/null and b/web/images/consult/rate20.png differ
diff --git a/web/images/consult/rate30.png b/web/images/consult/rate30.png
new file mode 100644
index 0000000000000000000000000000000000000000..638b4ee28e9d2b3230e19ddb910b580f309c93e8
Binary files /dev/null and b/web/images/consult/rate30.png differ
diff --git a/web/images/consult/rate40.png b/web/images/consult/rate40.png
new file mode 100644
index 0000000000000000000000000000000000000000..47247e27fb0f6623f1e25f3669fe75ce62429b3a
Binary files /dev/null and b/web/images/consult/rate40.png differ
diff --git a/web/images/consult/rate50.png b/web/images/consult/rate50.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8b148f98959cb489a8ac77dd36828b1592c868a
Binary files /dev/null and b/web/images/consult/rate50.png differ
diff --git a/web/images/consult/rate60.png b/web/images/consult/rate60.png
new file mode 100644
index 0000000000000000000000000000000000000000..24df49f13ffa40be85d4d8440d8486ccb0acb8d0
Binary files /dev/null and b/web/images/consult/rate60.png differ
diff --git a/web/images/consult/rate70.png b/web/images/consult/rate70.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4550030ab3a34def3801580d984f5bd34138525
Binary files /dev/null and b/web/images/consult/rate70.png differ
diff --git a/web/images/consult/rate80.png b/web/images/consult/rate80.png
new file mode 100644
index 0000000000000000000000000000000000000000..965a924026a2c1470a850cfda11c7d717e96613f
Binary files /dev/null and b/web/images/consult/rate80.png differ
diff --git a/web/images/consult/rate90.png b/web/images/consult/rate90.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7be10e095ea824b732a79141b96855846c6acc2
Binary files /dev/null and b/web/images/consult/rate90.png differ
diff --git a/web/images/disc.png b/web/images/disc.png
new file mode 100644
index 0000000000000000000000000000000000000000..8740a89ee9bbae36b57fa5c24722346bed2d87ac
Binary files /dev/null and b/web/images/disc.png differ
diff --git a/web/images/etat_logo.svg b/web/images/etat_logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..52f3a4dc1e394e6465db3559c31b8917072edd94
--- /dev/null
+++ b/web/images/etat_logo.svg
@@ -0,0 +1,5169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.0" id="Calque_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 138 146"
+	 style="enable-background:new 0 0 138 146;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#293173;}
+	.st1{fill:#E10814;}
+	.st2{fill:#9D9D9C;}
+</style>
+<switch>
+	<foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+		<i:aipgfRef  xlink:href="#adobe_illustrator_pgf">
+		</i:aipgfRef>
+	</foreignObject>
+	<g i:extraneous="self">
+		<g>
+			<path d="M2.64,55.26v2.82h1.29c0.97,0,1.53-0.52,1.53-1.44c0-0.85-0.56-1.39-1.53-1.39H2.64L2.64,55.26z M0.35,53.31H3.8
+				c2.48,0,4.02,1.27,4.02,3.37c0,1.35-0.66,2.37-1.81,2.92l3.55,5H6.81l-3-4.56H2.64v4.56H0.35V53.31L0.35,53.31z"/>
+			<path d="M13.2,52.34l1.82-2.18h2.35l-2.1,2.18H13.2L13.2,52.34z M10.98,53.31h6.58v1.95h-4.29v2.61h3.64v1.95h-3.64v2.82h4.29
+				v1.95h-6.58V53.31L10.98,53.31z"/>
+			<path d="M22.51,55.26v2.82h1.53c0.97,0,1.55-0.52,1.55-1.44c0-0.85-0.58-1.39-1.55-1.39H22.51L22.51,55.26z M20.22,53.31h3.72
+				c2.48,0,4,1.27,4,3.37c0,2.08-1.52,3.35-4,3.35h-1.44v4.56h-2.29V53.31L20.22,53.31z"/>
+			<path d="M36.49,53.31h2.29v6.87c0,2.97-1.74,4.74-4.58,4.74c-2.82,0-4.56-1.77-4.56-4.74v-6.87h2.29v7.06
+				c0,1.52,0.85,2.4,2.29,2.4c1.4,0,2.27-0.89,2.27-2.4V53.31L36.49,53.31z"/>
+			<path d="M43.9,59.69v2.95h1.29c1.06,0,1.71-0.56,1.71-1.5c0-0.94-0.65-1.45-1.71-1.45H43.9L43.9,59.69z M43.9,55.26v2.47h0.97
+				c0.87,0,1.37-0.44,1.37-1.24c0-0.76-0.5-1.23-1.37-1.23H43.9L43.9,55.26z M41.61,53.31h3.21c2.35,0,3.77,1.16,3.77,3.06
+				c0,0.9-0.42,1.69-1.19,2.23c1.19,0.53,1.85,1.5,1.85,2.68c0,2.06-1.6,3.32-4.19,3.32h-3.45V53.31L41.61,53.31z"/>
+			<polygon points="51.6,53.31 53.89,53.31 53.89,62.51 58.17,62.51 58.17,64.59 51.6,64.59 51.6,53.31 			"/>
+			<polygon points="60.19,53.31 62.48,53.31 62.48,64.59 60.19,64.59 60.19,53.31 			"/>
+			<path d="M74.3,58.95c0-2.16-1.52-3.82-3.63-3.82c-2.13,0-3.64,1.66-3.64,3.82c0,2.16,1.52,3.82,3.64,3.82
+				C72.78,62.77,74.3,61.11,74.3,58.95L74.3,58.95z M77.48,65.38c0.24,0,0.56-0.03,0.81-0.13v1.94c-0.37,0.15-0.69,0.21-1.19,0.21
+				c-1.26,0-2.42-0.52-3.53-1.48l-1.34-1.19c-0.48,0.13-1,0.19-1.55,0.19c-3.56,0-6-2.74-6-5.97c0-3.23,2.43-5.97,6-5.97
+				c3.55,0,5.98,2.74,5.98,5.97c0,1.89-0.84,3.61-2.23,4.71l0.68,0.65C75.98,65.09,76.75,65.38,77.48,65.38L77.48,65.38z"/>
+			<path d="M85.51,53.31h2.29v6.87c0,2.97-1.74,4.74-4.58,4.74c-2.82,0-4.56-1.77-4.56-4.74v-6.87h2.29v7.06
+				c0,1.52,0.85,2.4,2.29,2.4c1.4,0,2.27-0.89,2.27-2.4V53.31L85.51,53.31z"/>
+			<polygon points="90.64,53.31 97.22,53.31 97.22,55.26 92.93,55.26 92.93,57.87 96.57,57.87 96.57,59.82 92.93,59.82 92.93,62.64 
+				97.22,62.64 97.22,64.59 90.64,64.59 90.64,53.31 			"/>
+			<polygon points="0.35,69.58 6.93,69.58 6.93,71.53 2.64,71.53 2.64,74.15 6.28,74.15 6.28,76.1 2.64,76.1 2.64,80.87 0.35,80.87 
+				0.35,69.58 			"/>
+			<path d="M11.23,71.53v2.82h1.29c0.97,0,1.53-0.52,1.53-1.44c0-0.85-0.56-1.39-1.53-1.39H11.23L11.23,71.53z M8.94,69.58h3.45
+				c2.48,0,4.02,1.27,4.02,3.37c0,1.35-0.66,2.37-1.81,2.92l3.55,5h-2.74l-3-4.56h-1.18v4.56H8.94V69.58L8.94,69.58z"/>
+			<path d="M25.96,75.98l-1.55-4.24l-1.55,4.24H25.96L25.96,75.98z M22.91,69.58h3l4.27,11.29h-2.43l-1.08-2.93h-4.52l-1.08,2.93
+				h-2.43L22.91,69.58L22.91,69.58z"/>
+			<polygon points="31.92,69.58 34.86,69.58 39.9,77.66 39.9,69.58 42.19,69.58 42.19,80.87 39.26,80.87 34.21,72.76 34.21,80.87 
+				31.92,80.87 31.92,69.58 			"/>
+			<path d="M53.34,77.5l1.81,1.39c-0.87,1.19-2.23,2.03-3.87,2.24l-1.4,2.34h-2.03l1.42-2.37c-2.93-0.52-4.87-3-4.87-5.87
+				c0-3.23,2.43-5.97,6-5.97c2.05,0,3.72,0.92,4.76,2.29l-1.81,1.4c-0.65-0.92-1.66-1.55-2.95-1.55c-2.13,0-3.64,1.66-3.64,3.82
+				c0,2.16,1.52,3.82,3.64,3.82C51.68,79.05,52.69,78.42,53.34,77.5L53.34,77.5z"/>
+			<path d="M62.95,75.98l-1.55-4.24l-1.55,4.24H62.95L62.95,75.98z M59.9,69.58h3l4.27,11.29h-2.43l-1.08-2.93h-4.52l-1.08,2.93
+				h-2.43L59.9,69.58L59.9,69.58z"/>
+			<polygon points="68.91,69.58 71.2,69.58 71.2,80.87 68.91,80.87 68.91,69.58 			"/>
+			<path d="M75.01,77.77c0.68,0.87,1.58,1.39,2.5,1.39c0.9,0,1.45-0.48,1.45-1.31c0-2.02-5.16-1.56-5.16-5.32
+				c0-1.79,1.47-3.27,3.61-3.27c1.69,0,3,0.76,3.95,1.9l-1.68,1.5c-0.66-0.85-1.4-1.4-2.26-1.4c-0.79,0-1.31,0.52-1.31,1.18
+				c0,2.02,5.16,1.55,5.16,5.37c-0.03,2.1-1.68,3.39-3.74,3.39c-1.9,0-3.19-0.69-4.19-1.89L75.01,77.77L75.01,77.77z"/>
+			<polygon points="83.69,69.58 90.27,69.58 90.27,71.53 85.98,71.53 85.98,74.15 89.62,74.15 89.62,76.1 85.98,76.1 85.98,78.92 
+				90.27,78.92 90.27,80.87 83.69,80.87 83.69,69.58 			"/>
+			<path d="M3.6,115.76l0.08-0.26c-1.1-0.21-1.24-0.21-0.8-1.41l0.45-1.23h1.22c0.55,0,0.55,0.22,0.47,0.82h0.31l0.73-1.99H5.75
+				c-0.27,0.47-0.49,0.82-1.08,0.82h-1.2l0.64-1.75c0.2-0.55,0.31-0.67,1.06-0.67h0.53c0.77,0,0.86,0.21,0.86,0.98h0.31l0.26-1.36
+				H2.54l-0.08,0.26c0.89,0.18,0.97,0.26,0.55,1.41l-0.99,2.71c-0.41,1.13-0.59,1.22-1.61,1.41l-0.07,0.26H3.6L3.6,115.76z
+				 M9.94,112.44c0.16-0.54,0.07-1.01-0.34-1.01c-0.49,0-0.61,0.37-1.11,1.44v-0.61c0-0.44-0.14-0.83-0.54-0.83
+				c-0.46,0-0.89,0.72-1.21,1.43h0.22c0.22-0.32,0.43-0.51,0.6-0.51c0.2,0,0.31,0.31,0,0.98l-0.89,1.99
+				c-0.17,0.37,0.01,0.61,0.37,0.61c0.22,0,0.32-0.06,0.41-0.3l0.88-2.33c0.25-0.31,0.47-0.57,0.75-0.87H9.94L9.94,112.44z
+				 M13.96,111.24l-0.35-0.02l-0.39,0.38h-0.08c-1.89,0-3.52,2.12-3.52,3.66c0,0.43,0.26,0.68,0.68,0.68c0.49,0,0.97-0.7,1.51-1.44
+				l-0.02,0.27c-0.07,0.76,0.17,1.18,0.56,1.18c0.46,0,0.89-0.72,1.21-1.43h-0.22c-0.22,0.32-0.43,0.51-0.6,0.51
+				c-0.17,0-0.3-0.31,0-0.98L13.96,111.24L13.96,111.24z M10.48,114.64c0-1.02,1.13-2.4,1.77-2.4c0.14,0,0.27,0.02,0.39,0.05
+				l-0.66,1.76c-0.38,0.46-0.97,1.03-1.24,1.03C10.58,115.08,10.48,114.94,10.48,114.64 M14.66,112.06h0.76l-1.21,3.3
+				c-0.11,0.28,0.04,0.56,0.33,0.56c0.69,0,1.8-0.68,2.18-1.61h-0.22c-0.31,0.32-0.89,0.75-1.4,0.84l1.11-3.1h1.13l0.14-0.47h-1.1
+				l0.42-1.19h-0.44l-0.79,1.19l-0.94,0.13V112.06L14.66,112.06z M20.06,114.33h-0.28c-0.36,0.42-0.74,0.75-1.12,0.75
+				c-0.39,0-0.59-0.23-0.59-0.75c0-0.22,0.02-0.43,0.07-0.63l2.29-0.75c0.45-1.06-0.09-1.52-0.72-1.52c-1.08,0-2.32,1.81-2.32,3.4
+				c0,0.71,0.34,1.1,0.87,1.1C18.89,115.93,19.53,115.32,20.06,114.33 M19.28,112.04c0.31,0,0.57,0.23,0.43,0.82l-1.42,0.33
+				C18.53,112.53,18.95,112.04,19.28,112.04 M24.36,112.44c0.16-0.54,0.07-1.01-0.34-1.01c-0.49,0-0.61,0.37-1.11,1.44v-0.61
+				c0-0.44-0.14-0.83-0.54-0.83c-0.46,0-0.89,0.72-1.21,1.43h0.22c0.22-0.32,0.43-0.51,0.6-0.51c0.2,0,0.31,0.31,0,0.98l-0.89,1.99
+				c-0.17,0.37,0.01,0.61,0.37,0.61c0.22,0,0.32-0.06,0.41-0.3l0.88-2.33c0.25-0.31,0.47-0.57,0.75-0.87H24.36L24.36,112.44z
+				 M24.37,115.32c-0.17,0.37,0.01,0.61,0.37,0.61c0.22,0,0.32-0.06,0.41-0.3l0.88-2.33c0.41-0.5,1.24-1.03,1.57-1.03
+				c0.24,0,0.21,0.2,0.05,0.5l-1.35,2.59c-0.13,0.26,0.04,0.56,0.33,0.56c0.66,0,1.45-0.6,1.76-1.43h-0.22
+				c-0.22,0.31-0.58,0.65-0.92,0.7l1.16-2.34c0.15-0.3,0.22-0.58,0.22-0.8c0-0.38-0.22-0.63-0.61-0.63c-0.57,0-1.15,0.65-1.84,1.44
+				v-0.61c0-0.44-0.14-0.83-0.54-0.83c-0.25,0-0.49,0.22-0.71,0.52v0.08c0.43-0.02,0.62,0.62,0.31,1.3L24.37,115.32L24.37,115.32z
+				 M31.67,110.25c0.3,0,0.55-0.24,0.55-0.55c0-0.3-0.25-0.55-0.55-0.55c-0.31,0-0.55,0.25-0.55,0.55
+				C31.12,110.01,31.36,110.25,31.67,110.25 M31.43,111.91c0.09-0.31-0.12-0.48-0.27-0.48c-0.66,0-1.45,0.6-1.76,1.43h0.22
+				c0.22-0.31,0.58-0.65,0.92-0.7l-1.27,3.29c-0.12,0.31,0.12,0.48,0.27,0.48c0.63,0,1.37-0.6,1.68-1.43H31
+				c-0.22,0.31-0.58,0.65-0.92,0.7L31.43,111.91L31.43,111.91z M32.46,112.06h0.76l-1.21,3.3c-0.11,0.28,0.04,0.56,0.33,0.56
+				c0.69,0,1.8-0.68,2.18-1.61h-0.22c-0.31,0.32-0.89,0.75-1.4,0.84l1.11-3.1h1.13l0.14-0.47h-1.1l0.42-1.19h-0.44l-0.79,1.19
+				l-0.94,0.13V112.06L32.46,112.06z M37.41,111l1.61-1.51v-0.17h-0.87L37.16,111H37.41L37.41,111z M37.86,114.33h-0.28
+				c-0.36,0.42-0.74,0.75-1.12,0.75c-0.39,0-0.59-0.23-0.59-0.75c0-0.22,0.02-0.43,0.07-0.63l2.29-0.75
+				c0.45-1.06-0.09-1.52-0.72-1.52c-1.08,0-2.32,1.81-2.32,3.4c0,0.71,0.34,1.1,0.87,1.1C36.69,115.93,37.33,115.32,37.86,114.33
+				 M37.08,112.04c0.31,0,0.57,0.23,0.43,0.82l-1.42,0.33C36.33,112.53,36.75,112.04,37.08,112.04"/>
+			<path d="M5.24,98.97l1.61-1.11v-0.17H5.88l-0.89,1.28H5.24L5.24,98.97z M4.58,102.44c0.55,0,0.55,0.22,0.47,0.82h0.31l0.73-1.99
+				H5.78c-0.27,0.47-0.49,0.82-1.08,0.82h-1.2l0.6-1.66c0.2-0.55,0.31-0.66,1.06-0.66h0.53c0.77,0,0.86,0.21,0.86,0.98h0.31
+				l0.26-1.36H2.54l-0.08,0.26c0.89,0.18,0.97,0.26,0.55,1.41l-0.99,2.71c-0.41,1.13-0.59,1.22-1.61,1.41l-0.07,0.26h5.08l0.91-1.44
+				H5.99c-0.58,0.55-1.31,1.07-2.33,1.07c-1.35,0-1.22-0.06-0.78-1.29l0.48-1.32H4.58L4.58,102.44z M10.36,105.98
+				c0-0.53-0.47-0.72-1.24-0.95c-0.66-0.2-0.96-0.26-0.96-0.47c0-0.17,0.14-0.38,0.42-0.53c1.08-0.06,1.79-1.03,1.79-1.85
+				c0-0.17-0.03-0.32-0.09-0.46h0.92l0.14-0.47H9.88c-0.17-0.11-0.38-0.17-0.59-0.17c-1.15,0-1.9,1.01-1.9,1.83
+				c0,0.62,0.4,1.01,0.88,1.1c-0.54,0.24-0.84,0.52-0.84,0.85c0,0.19,0.07,0.32,0.22,0.45c-1.24,0.36-1.73,0.78-1.73,1.37
+				c0,0.57,0.75,0.81,1.65,0.81C9.1,107.49,10.36,106.67,10.36,105.98 M8.57,103.71c-0.27,0-0.38-0.23-0.38-0.5
+				c0-0.74,0.4-1.82,1.02-1.82c0.27,0,0.38,0.23,0.38,0.5C9.59,102.63,9.19,103.71,8.57,103.71 M6.85,106.39
+				c0-0.44,0.42-0.71,1.03-0.95c0.2,0.1,0.5,0.21,0.89,0.34c0.63,0.21,0.87,0.29,0.87,0.48c0,0.41-0.69,0.71-1.62,0.71
+				C7.24,106.97,6.85,106.8,6.85,106.39 M15.28,100.89l-0.35-0.02l-0.39,0.38h-0.08c-1.89,0-3.52,2.12-3.52,3.66
+				c0,0.43,0.26,0.68,0.68,0.68c0.49,0,0.97-0.7,1.51-1.44l-0.02,0.27c-0.07,0.76,0.17,1.18,0.56,1.18c0.46,0,0.89-0.72,1.21-1.43
+				h-0.22c-0.22,0.32-0.43,0.51-0.6,0.51c-0.17,0-0.3-0.31,0-0.98L15.28,100.89L15.28,100.89z M11.8,104.29
+				c0-1.02,1.13-2.4,1.77-2.4c0.14,0,0.27,0.02,0.39,0.05l-0.66,1.76c-0.38,0.46-0.97,1.03-1.24,1.03
+				C11.89,104.73,11.8,104.6,11.8,104.29 M16.18,104.86l2.31-6.05l-0.07-0.09l-1.45,0.17v0.17l0.28,0.22c0.26,0.2,0.17,0.39-0.06,1
+				l-1.8,4.75c-0.13,0.26,0.04,0.56,0.33,0.56c0.66,0,1.37-0.6,1.68-1.43h-0.22C16.97,104.46,16.52,104.8,16.18,104.86 M20.58,99.91
+				c0.3,0,0.55-0.24,0.55-0.55c0-0.3-0.25-0.55-0.55-0.55c-0.31,0-0.55,0.25-0.55,0.55C20.04,99.67,20.28,99.91,20.58,99.91
+				 M20.35,101.56c0.09-0.31-0.12-0.48-0.27-0.48c-0.66,0-1.45,0.6-1.76,1.43h0.22c0.22-0.31,0.58-0.65,0.92-0.7l-1.27,3.29
+				c-0.12,0.31,0.12,0.48,0.27,0.48c0.63,0,1.37-0.6,1.68-1.43h-0.22c-0.22,0.31-0.58,0.65-0.92,0.7L20.35,101.56L20.35,101.56z
+				 M21.38,101.72h0.76l-1.21,3.3c-0.11,0.28,0.04,0.56,0.33,0.56c0.69,0,1.8-0.68,2.18-1.61h-0.22c-0.31,0.32-0.89,0.75-1.4,0.84
+				l1.11-3.1h1.13l0.14-0.47h-1.1l0.42-1.19H23.1l-0.79,1.19l-0.94,0.13V101.72L21.38,101.72z M26.33,100.66l1.61-1.51v-0.17h-0.87
+				l-0.99,1.68H26.33L26.33,100.66z M26.78,103.99H26.5c-0.36,0.42-0.74,0.75-1.12,0.75c-0.39,0-0.59-0.23-0.59-0.75
+				c0-0.22,0.03-0.43,0.07-0.63l2.29-0.75c0.45-1.06-0.09-1.52-0.72-1.52c-1.08,0-2.32,1.81-2.32,3.4c0,0.71,0.34,1.1,0.87,1.1
+				C25.61,105.58,26.25,104.98,26.78,103.99 M26,101.69c0.31,0,0.57,0.23,0.43,0.82L25,102.84C25.25,102.18,25.67,101.69,26,101.69"
+				/>
+			<path d="M5.54,89.03H2.53l-0.08,0.26c0.89,0.18,0.97,0.26,0.55,1.41l-0.98,2.71c-0.41,1.13-0.59,1.22-1.61,1.41l-0.07,0.26h4.58
+				l0.99-1.77H5.57c-0.56,0.62-1.22,1.4-2.24,1.4c-0.77,0-0.86-0.13-0.45-1.29l0.98-2.71c0.41-1.13,0.59-1.22,1.61-1.41L5.54,89.03
+				L5.54,89.03z M8.87,89.56c0.3,0,0.55-0.24,0.55-0.55c0-0.3-0.25-0.55-0.55-0.55c-0.31,0-0.55,0.25-0.55,0.55
+				C8.33,89.32,8.57,89.56,8.87,89.56 M8.64,91.22c0.09-0.31-0.12-0.48-0.27-0.48c-0.66,0-1.45,0.6-1.76,1.43h0.22
+				c0.22-0.31,0.58-0.65,0.92-0.7l-1.27,3.29c-0.12,0.31,0.12,0.48,0.27,0.48c0.63,0,1.37-0.6,1.68-1.43H8.21
+				c-0.22,0.31-0.58,0.65-0.92,0.7L8.64,91.22L8.64,91.22z M13.14,91.65c0-0.67-0.25-0.92-0.71-0.92c-0.58,0-1.13,0.61-1.67,1.36
+				l1.38-3.63l-0.07-0.09l-1.45,0.17v0.17l0.28,0.22c0.26,0.2,0.17,0.41-0.06,1l-1.49,3.84c-0.11,0.28-0.24,0.61-0.24,0.7
+				c0,0.4,0.54,0.77,1.03,0.77C11.27,95.24,13.14,93.21,13.14,91.65 M10.54,94.57c-0.22,0-0.55-0.21-0.55-0.39
+				c0-0.06,0.1-0.31,0.22-0.64l0.37-0.98c0.4-0.47,1-0.98,1.34-0.98c0.21,0,0.36,0.13,0.36,0.44
+				C12.29,92.92,11.45,94.57,10.54,94.57 M16.16,93.64h-0.28c-0.36,0.42-0.74,0.75-1.12,0.75c-0.39,0-0.59-0.23-0.59-0.75
+				c0-0.22,0.02-0.43,0.07-0.63l2.29-0.75c0.45-1.06-0.09-1.52-0.72-1.52c-1.08,0-2.32,1.81-2.32,3.4c0,0.71,0.34,1.1,0.87,1.1
+				C14.98,95.24,15.63,94.63,16.16,93.64 M15.37,91.35c0.31,0,0.57,0.23,0.43,0.82l-1.42,0.33C14.63,91.84,15.04,91.35,15.37,91.35
+				 M20.45,91.75c0.16-0.54,0.07-1.01-0.34-1.01c-0.49,0-0.61,0.37-1.11,1.44v-0.61c0-0.44-0.14-0.83-0.54-0.83
+				c-0.46,0-0.89,0.72-1.21,1.43h0.22c0.22-0.32,0.43-0.51,0.6-0.51c0.2,0,0.31,0.31,0,0.98l-0.89,1.99
+				c-0.17,0.37,0.01,0.61,0.37,0.61c0.22,0,0.32-0.06,0.41-0.3l0.88-2.33c0.25-0.31,0.47-0.57,0.75-0.87H20.45L20.45,91.75z
+				 M21.05,91.37h0.6l-1.21,3.3c-0.11,0.28,0.04,0.56,0.33,0.56c0.69,0,1.8-0.68,2.18-1.61h-0.22c-0.31,0.32-0.89,0.75-1.4,0.84
+				l1.11-3.1h1.13l0.14-0.47h-1.1l0.42-1.19h-0.44l-0.79,1.19l-0.78,0.13V91.37L21.05,91.37z M25.79,90.31l1.61-1.51v-0.17h-0.87
+				l-0.99,1.68H25.79L25.79,90.31z M26.25,93.64h-0.28c-0.36,0.42-0.74,0.75-1.12,0.75c-0.39,0-0.59-0.23-0.59-0.75
+				c0-0.22,0.02-0.43,0.07-0.63l2.29-0.75c0.45-1.06-0.09-1.52-0.72-1.52c-1.08,0-2.32,1.81-2.32,3.4c0,0.71,0.34,1.1,0.87,1.1
+				C25.07,95.24,25.72,94.63,26.25,93.64 M25.46,91.35c0.31,0,0.57,0.23,0.43,0.82l-1.42,0.33C24.71,91.84,25.13,91.35,25.46,91.35"
+				/>
+			<path class="st0" d="M12.4,41.56c-0.03-0.03,0.09,0,0.11-0.06c-0.08,0-0.14,0-0.23,0c-0.03,0-0.03-0.03-0.03-0.06
+				c-0.14,0.03-0.31,0.09-0.45,0.11c-0.2,0.06-0.37,0.2-0.59,0.25c-0.31,0.11-0.57,0.37-0.91,0.48c-0.03,0-0.03-0.03-0.03-0.06
+				c0.03-0.09,0.14-0.11,0.2-0.2c0-0.03,0-0.06-0.03-0.06c0.23-0.31,0.54-0.48,0.82-0.74c0-0.03,0-0.06,0-0.08
+				c0.09-0.11,0.23-0.17,0.28-0.31c0.03-0.08,0.14-0.2,0.28-0.25c-0.03-0.03-0.09-0.03-0.09-0.08c-0.11,0-0.23,0.06-0.34-0.03
+				c0.05-0.05,0.11-0.08,0.18-0.1c-0.02-0.01-0.05-0.02-0.06-0.04c-0.03-0.06,0.05-0.12,0.14-0.14c0.11-0.03,0.25-0.03,0.34-0.11
+				c-0.2-0.03-0.42,0.06-0.62-0.06c0.14-0.37,0.37-0.68,0.71-0.85c0.03,0,0.09,0,0.09,0.03c0,0.14-0.09,0.25-0.23,0.28
+				c0.23,0.06,0.45,0.06,0.68,0.17c-0.03,0.06-0.09,0.03-0.11,0.03c0.14,0.08,0.31,0.03,0.45,0.14c-0.09,0.08-0.17,0-0.25,0
+				c0.88,0.25,1.81,0.45,2.55,1.02c-0.62,0.31-1.27,0.45-1.95,0.59c-0.09,0-0.14,0-0.23-0.03c0,0.03,0,0.09-0.03,0.09
+				c-0.11,0-0.2,0-0.28,0.06C12.65,41.62,12.48,41.65,12.4,41.56L12.4,41.56z M11.82,43.53C11.82,43.54,11.81,43.54,11.82,43.53
+				c-0.11,0.08-0.22,0.16-0.33,0.22c-0.12,0.07-0.25,0.12-0.37,0.18c0,0,0,0,0-0.01c-0.01-0.01-0.03-0.02-0.05-0.01
+				c-0.11,0.06-0.2,0.13-0.29,0.22c-0.01,0.01-0.03,0.03-0.04,0.04c0,0,0,0,0,0c0,0,0,0,0,0c-0.01,0.01-0.03,0.03-0.04,0.04
+				c0,0,0,0,0,0c0,0,0,0,0,0c-0.02,0.02-0.04,0.04-0.06,0.07c-0.01,0.02-0.02,0.03-0.04,0.04c-0.02,0.01-0.07,0.01-0.06-0.02
+				c0,0,0,0,0-0.01c-0.02,0.01-0.03,0.02-0.05,0.03c-0.02,0.01-0.03,0.02-0.04,0.02c-0.01,0-0.01,0-0.02,0c-0.01,0-0.01,0-0.02,0.01
+				c-0.03,0.03-0.07,0.06-0.1,0.09c-0.06,0.05-0.11,0.11-0.16,0.17c0,0,0,0,0,0c0,0,0,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01
+				c0,0-0.01,0.01-0.01,0.01c0,0,0,0,0,0c-0.01,0.01-0.01,0.02-0.02,0.03c0,0,0,0,0,0c0,0.01-0.01,0.01-0.02,0.01
+				c0-0.01-0.01-0.01-0.01-0.02c0,0-0.01-0.01-0.01-0.01c-0.01-0.01-0.02-0.03-0.02-0.05c0,0,0,0,0,0c0,0,0-0.01-0.01-0.01
+				c0.03-0.03,0.06-0.07,0.09-0.1c0,0,0,0,0.01-0.01c0.01-0.01,0.02-0.02,0.03-0.04c0.02-0.02,0.03-0.04,0.05-0.06
+				c0.01-0.01,0.01-0.02,0.02-0.02c0.03-0.04,0.06-0.08,0.09-0.12c0,0,0,0,0,0c0-0.01,0.01-0.01,0.01-0.02
+				c0.01-0.02,0.03-0.04,0.04-0.06c0.01-0.02,0.02-0.04,0.03-0.06c0,0,0,0,0,0c0,0,0,0,0-0.01c0,0,0-0.01,0-0.01
+				c0.01-0.02,0.02-0.04,0.03-0.07c0,0,0,0,0-0.01c0-0.01,0-0.01,0.01-0.02c0-0.01,0.01-0.02,0.01-0.03v0c0,0,0,0,0-0.01
+				c0-0.01,0.01-0.03,0.01-0.04c0-0.01,0-0.01,0-0.02c0.03-0.05,0.07-0.1,0.11-0.15c0,0-0.01,0-0.01,0.01
+				c-0.04,0.03-0.07,0.06-0.11,0.09c-0.03,0.02-0.09-0.02-0.05-0.04c0.02-0.02,0.04-0.04,0.06-0.06c0,0,0,0,0,0
+				c0.05-0.05,0.09-0.11,0.14-0.14c0.03-0.02,0.06-0.04,0.09-0.07c0,0,0.01-0.01,0.01-0.01c0.02-0.03,0.04-0.05,0.06-0.07
+				c0,0,0,0,0,0c0.27-0.26,0.73-0.25,1.08-0.42c0.14-0.06,0.31,0.03,0.45,0c0.08,0,0.17,0,0.25,0.06
+				C12.29,43.23,12.05,43.39,11.82,43.53L11.82,43.53z M12.33,43.77c-0.01,0.03-0.04,0.06-0.07,0.08c0.04,0.01,0.06,0.02,0.04,0.04
+				c-0.07,0.06-0.13,0.12-0.21,0.15c-0.01,0-0.02,0-0.04,0.01c-0.03,0.03-0.07,0.07-0.11,0.1c-0.03,0.03-0.19,0.01-0.14-0.03
+				c0.07-0.06,0.14-0.13,0.21-0.2c0.04-0.04,0.08-0.07,0.12-0.11c0.02-0.02,0.04-0.05,0.06-0.06C12.2,43.73,12.35,43.71,12.33,43.77
+				L12.33,43.77z M11.01,39.52c-0.03,0.06-0.06,0.06-0.08,0.11c-0.03,0.06-0.06,0.08-0.11,0.11c-0.03,0-0.06,0-0.06-0.03
+				c0.03-0.11,0.11-0.23,0.23-0.25C11.01,39.47,11.01,39.5,11.01,39.52L11.01,39.52z M8.66,41.39c0,0-0.03-0.03-0.03-0.06
+				C9,40.86,9.28,40.4,9.54,39.89c0.37-0.2,0.67-0.49,0.96-0.79c0.48-0.51,0.99-0.96,1.59-1.25c0.23-0.08,0.51-0.06,0.74,0.03
+				c-0.09,0.11-0.23,0.08-0.34,0.17c-0.03,0-0.06,0-0.09-0.03c0.03-0.03,0.03-0.06,0.03-0.09c-0.28,0.31-0.68,0.45-0.91,0.82
+				c-0.17,0.28-0.28,0.65-0.65,0.74c-0.11,0.03,0.03-0.09-0.03-0.06C9.96,39.98,9.34,40.63,8.66,41.39L8.66,41.39z M12.99,42.02
+				c-0.06,0-0.17,0.03-0.14-0.03c0.03-0.14,0.23-0.14,0.34-0.2c0.06-0.03,0.14-0.08,0.2-0.06c0.06,0.09,0.14,0.06,0.2,0.11
+				C13.42,42.02,13.19,41.93,12.99,42.02L12.99,42.02z M17.35,44.05c0.16-0.16,0.32-0.33,0.48-0.51h0c0.3-0.34,0.6-0.67,0.94-0.96
+				c0.11-0.09,0.21-0.18,0.31-0.25c0.03-0.03,0.03-0.08,0.06-0.11c-0.14,0.06-0.23,0.17-0.37,0.23c-0.03,0-0.06-0.03-0.03-0.06
+				c0.1-0.08,0.2-0.15,0.3-0.23c-0.01,0-0.01,0-0.02,0C19,42.16,19,42.13,19,42.1c-0.37-0.06-0.65,0.2-0.91,0.42
+				c-0.06,0.03-0.11-0.03-0.14-0.03c-0.42,0.14-0.74,0.51-1.16,0.68c0-0.03,0-0.03,0-0.06c-0.17,0.06-0.33,0.16-0.51,0.2
+				c-0.26,0.06-0.48,0.03-0.71,0.03c-0.34,0.03-0.69,0.11-1.03,0.18c-0.01,0-0.02,0-0.03,0.01c-0.18,0.05-0.36,0.12-0.53,0.21
+				c-0.01,0-0.01,0.01-0.02,0.01c-0.01,0.02-0.03,0.03-0.04,0.05c-0.06,0.07-0.11,0.13-0.19,0.17c-0.17,0.09-0.32,0.24-0.47,0.37
+				c-0.01,0.01-0.03,0.01-0.05,0.01c-0.15,0.15-0.3,0.29-0.46,0.44c-0.01,0.01-0.05,0.02-0.09,0.01c0,0,0,0,0,0
+				c0.01-0.01,0.01-0.02,0.02-0.03c0.02-0.04,0.05-0.08,0.07-0.12c0.03-0.04,0.06-0.09,0.08-0.13c0.04-0.06,0.08-0.12,0.12-0.17
+				c0.01-0.01,0.01-0.03,0-0.04c-0.01-0.01-0.02-0.01-0.04-0.01c0.14-0.14,0.31-0.25,0.48-0.35c0,0,0,0,0,0
+				c-0.02,0.01-0.05-0.01-0.03-0.03c0.02-0.03,0.03-0.05,0.05-0.08c0-0.01,0.01-0.02,0.01-0.03c-0.01-0.01-0.01-0.01-0.02-0.02
+				c-0.05,0.03-0.09,0.06-0.13,0.09c-0.07,0.06-0.12,0.19-0.22,0.18c-0.01,0-0.03,0-0.04-0.01c-0.01,0-0.02-0.01-0.03-0.01
+				c0,0,0,0,0-0.01c0,0,0-0.01,0-0.01c0,0,0,0,0-0.01c0-0.01,0.01-0.02,0.01-0.02c0-0.01,0.01-0.02,0.01-0.02
+				c0-0.01,0.01-0.01,0.01-0.02c0.01-0.01,0.01-0.02,0.02-0.04c0.01-0.01,0.01-0.02,0.02-0.03c0.01-0.02,0.02-0.04,0.04-0.06
+				c0.01-0.01,0.01-0.02,0.02-0.03c0.01-0.02,0.02-0.03,0.03-0.05c0.01-0.02,0-0.04-0.02-0.05c0.05-0.07,0.12-0.13,0.19-0.17h-0.01
+				c0.11-0.05,0.22-0.12,0.33-0.18c0.02-0.01,0.03-0.03,0.05-0.04c-0.16,0.05-0.31,0.13-0.45,0.22c0,0-0.04,0.02-0.05,0.03
+				c0,0-0.03,0.01-0.07-0.03c0-0.01-0.01-0.01-0.01-0.02c0.03-0.06,0.11-0.08,0.17-0.14c0.03,0,0.06,0,0.06,0.03
+				c0.91-0.71,2.15-0.54,3.2-0.91c0.08-0.06,0.17-0.11,0.25-0.17c0.14-0.06,0.25-0.2,0.42-0.28c0.23-0.17,0.4-0.37,0.48-0.65
+				c0-0.03-0.03-0.06-0.03-0.06c-0.37,0.4-0.79,0.71-1.25,0.93c-0.59,0.31-1.25,0.25-1.87,0.34c0.03-0.06,0.09-0.06,0.14-0.06
+				c0-0.09,0.06-0.11,0.11-0.17c0.03,0,0.06,0,0.08,0c0.03,0,0.03-0.06,0.06-0.06c0.06,0,0.14-0.03,0.11-0.03
+				c-0.08-0.11-0.25,0.08-0.4,0c0.06-0.06,0.03-0.14,0.08-0.17c0.03,0,0.08,0,0.11,0c0-0.06,0.06-0.11,0.06-0.11
+				c0.42-0.25,0.82-0.45,1.22-0.68c-0.08,0-0.14,0.08-0.23,0.03c0.06,0,0-0.08,0.06-0.08c0.31-0.09,0.57-0.26,0.88-0.37
+				c-0.11,0-0.2,0.08-0.31,0c0.06-0.03,0.08-0.09,0.17-0.09c0-0.03,0-0.06,0-0.08c0-0.03,0.03-0.03,0.06-0.03
+				c-0.03,0-0.06-0.03-0.06-0.03c0.03-0.06,0.11-0.03,0.17-0.09c-0.03,0-0.08,0-0.08-0.03c0.08-0.11,0.23-0.14,0.37-0.17
+				c-0.03-0.06-0.11,0-0.11-0.06c0-0.03,0.03-0.03,0.06-0.03c-0.03,0-0.03,0-0.06,0c-0.06-0.03-0.03-0.08-0.03-0.11
+				c0.17-0.2,0.17-0.45,0.25-0.68c-0.03,0-0.06,0-0.06-0.03c-0.28,0.31-0.74,0.42-1.16,0.54c-0.03,0-0.11,0-0.14,0
+				c-0.14,0.06-0.34,0.06-0.48-0.03c-0.11-0.06-0.17-0.14-0.28-0.23c-0.23-0.14-0.45-0.25-0.71-0.34c-0.71-0.23-1.44-0.34-2.18-0.31
+				c0.31-0.17,0.66-0.18,0.99-0.28c0.48-0.14,0.93-0.31,1.44-0.28c-0.08-0.03-0.2,0-0.28,0c-0.4-0.03-0.79,0.08-1.22,0.17
+				c-0.28,0.06-0.54,0.17-0.82,0.23c-0.17,0.06-0.26,0.23-0.45,0.2c0,0,0-0.06,0-0.09c0.28-0.34,0.62-0.68,1.08-0.71
+				c0.51-0.08,0.99,0,1.5,0.06c0.37,0.03,0.71,0.11,1.08,0.2c0.14,0,0.17,0.23,0.28,0.25c0.17,0.06,0.34,0,0.51,0.11
+				c0-0.06-0.03-0.11,0-0.17c0.11-0.11,0.25,0.03,0.37-0.03c0.23-0.14-0.2-0.4-0.31-0.59c0-0.03,0.03-0.06,0.03-0.06
+				c0.23,0.2,0.4,0.42,0.68,0.57c0.14,0.06,0.48,0.14,0.42-0.03c-0.14-0.31-0.42-0.57-0.65-0.85c0-0.03,0-0.09,0-0.11
+				c-0.06,0-0.06-0.03-0.08-0.06c0-0.03,0-0.09,0-0.11c-0.11-0.06-0.09-0.17-0.14-0.26c-0.08-0.14-0.03-0.34-0.08-0.51
+				c-0.06-0.17-0.09-0.31-0.11-0.48c-0.08-0.48-0.2-0.91-0.26-1.36c-0.06-0.54,0.31-0.96,0.57-1.44c0.2-0.34,0.42-0.68,0.79-0.91
+				c0.09-0.34,0.31-0.62,0.54-0.91c0.23-0.28,0.6-0.44,0.87-0.57c0.4-0.18,0.75-0.29,0.75-0.29H0.31v14.99h13.77
+				c0.54-0.39,1.08-0.57,1.83-0.94C16.26,44.69,17.07,44.32,17.35,44.05L17.35,44.05z"/>
+			<path class="st1" d="M41.53,30.82H25.4c0,0,0.03,0.01,0.15,0.07c0.13,0.07,0.3,0.16,0.41,0.22c0.21,0.11,0.41,0.24,0.54,0.45
+				c0.06,0.08,0.14,0.25,0.08,0.37c-0.06,0.14-0.08,0.37-0.23,0.42c-0.17,0.08-0.4,0.08-0.59,0.06c-0.11,0-0.23-0.03-0.34-0.06
+				c0.42,0.17,0.82,0.37,1.1,0.76c0.03,0.06,0.14,0.08,0.25,0.08c0.03,0,0.03,0.06,0.03,0.08c-0.06,0.06-0.11,0.08-0.09,0.17
+				c0.03,0,0.06,0,0.09,0c0.14-0.06,0.11-0.34,0.31-0.25c0.14,0.08,0.2,0.28,0.11,0.42c-0.11,0.11-0.23,0.2-0.34,0.28
+				c-0.03,0.06-0.03,0.14,0,0.2c0.09,0.11,0.11,0.23,0.14,0.34c0.09,0.2,0.11,0.42,0.2,0.62c0.11,0.42,0.23,0.85,0.2,1.27
+				c0,0.23-0.11,0.42-0.03,0.65c0.06,0.23,0.2,0.4,0.31,0.59c0.11,0.17,0.23,0.28,0.31,0.45c0.17,0.28,0.48,0.57,0.34,0.91
+				c-0.08,0.2-0.4,0.17-0.59,0.28c-0.17,0.14-0.03,0.37,0.06,0.51c0.14,0.25-0.17,0.42-0.37,0.51c0.06,0.08,0.17,0.06,0.2,0.11
+				c0.03,0.14,0.17,0.23,0.08,0.37c-0.11,0.17-0.45,0.25-0.28,0.51c0.11,0.2,0.04,0.42-0.03,0.62c-0.08,0.25-0.31,0.37-0.51,0.42
+				c-0.17,0.06-0.37,0.06-0.54,0.03c-0.06-0.03-0.11-0.06-0.17-0.06c-0.48-0.06-0.96-0.2-1.44-0.2c-0.14,0.03-0.28,0.06-0.4,0.11
+				c-0.13,0.09-0.24,0.2-0.34,0.3c0,0,0,0,0,0c-0.02,0.02-0.04,0.05-0.06,0.07c-0.01,0.01-0.02,0.03-0.04,0.04
+				c-0.01,0.01-0.02,0.02-0.02,0.03c-0.08,0.1-0.16,0.21-0.22,0.33c0,0.01-0.01,0.01-0.01,0.02c-0.01,0.01-0.01,0.03-0.02,0.04
+				c-0.09,0.17-0.16,0.35-0.21,0.52c-0.19,0.65-0.11,1.21,0.03,1.34c0.04,0.04,0.93,0.31,1.56,0.59c0.29,0.13,0.5,0.23,0.67,0.34
+				h15.83V30.82L41.53,30.82z"/>
+			<path class="st2" d="M26.36,36.29c0.11,0.03,0.28,0.03,0.28,0.09c-0.06,0.23-0.4,0.28-0.57,0.51h-0.09
+				c-0.08,0.06-0.06,0.2-0.14,0.2c-0.09-0.03-0.17,0-0.25,0.03c0.11,0.11,0.25,0.2,0.42,0.17c0.03,0,0.08,0.06,0.08,0.11
+				c0,0,0.03,0,0.06-0.03c0.03,0,0.06,0,0.06,0.03v0.11c-0.09,0.11-0.23,0.06-0.34,0.09c0.23,0.06,0.45,0.06,0.65,0
+				c0.17-0.06,0-0.34,0.11-0.48c-0.06,0,0-0.08-0.06-0.08c0.06-0.06,0.11-0.14,0.17-0.17c0.06,0,0.14-0.03,0.17-0.09
+				c0-0.06-0.11-0.08-0.08-0.14c0.17-0.11,0.31-0.28,0.26-0.45c-0.03-0.08-0.26-0.08-0.4-0.14c-0.14-0.06-0.31,0-0.48,0.03
+				c-0.14,0-0.28,0.09-0.43,0.11c-0.2,0.06-0.37,0.17-0.54,0.28c0.2-0.08,0.4-0.11,0.62-0.17C26.05,36.29,26.2,36.25,26.36,36.29
+				L26.36,36.29z"/>
+		</g>
+	</g>
+</switch>
+<i:aipgf  id="adobe_illustrator_pgf" i:pgfEncoding="zstd/base64" i:pgfVersion="24">
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+rHaOEqnO9Hqug2RTN0W8tdP8aqdu8KDTaKWeXLOaWHWrWHeukm7H1iQq5m31rOcsjZXS2TXoG32b
+eHZUb1T9s1tSw3Pr10pPNpk+VGk0z87d1BZd3abeHqs0eamHbsxVmbZHpifPt2fTFNWtdpfGeXps
+ja+ZaISJN8fKJx6m+abPyjpGNuZdO1qa2++xGxcqne2V9+QPqjHeLtoaYZ5f0u8cjX1Ss8U0v3/s
+DKJi2lZr7WSmwbWfNXNbalq2uXZu+DSoesdnyrhYa0073zTq0oNnlOrUZiYep9la1TR2dErNjQhf
+u66f0zSn3uM1af1rMZGO3bzeJLPVvR7KNKZ3J9Woret3NtPcFR1LY3Stmh3uj9G8Lr3Hafb3lm15
+9TjT/JnnmrV57OZWy7NdXTyHae4mEfG2xUyzJju35rVpWec01ZjPah66USrfa89aBzWNldWWnq54
+lGxqD9NsMfXOYt7mFeWxbdJ88i3d6LxSMU60AChQAVMBBSZrQgWMIzRQGEHELzgiVICwsIEIXHAk
+FJgIDwpDBA4QEQwNoMDQkAEBJjRMgLAgoSGDCAsOIIAhAIIY2lND/Zl8Lc1zlgoBIQ==
+	]]>
+	<![CDATA[
+	Ta/SwV9NkWtXl9ZOAzAVPFhwiGCIsJBBhQ4kSDgQhAKzwYMDRIQGBDAVmEGgoK4Uj97qs6z2Z6en
+bHXN0En/92dDOqWmB0HvqBCN7Zh09n2y9mrkw3OeSlLLRDqq77qo54hlRxMv1c7OsUxp0Q6xNI3Q
+TNHQnrp7ELVU6+yU9k2zc5l6arTEvNMRLdFeq3oOt2zPFLFszexUpMey6LW2p6XWmd2y8FjW4cH8
+7tnra4e2m+0PKZrtddNjLbotFdmedmmWtq/Rvno9iZsk/qqZ2k2pMNVsJ7o7df5dnc+2c3td+vI2
+U3/N8lTNznmIZYnn61ld+XPe14e7inikqN5Ec17Xl4inlEf0kRJfqnoufVakhqiXIOGcdqZDWi26
+zDKbrpk2O5/+bJFlmuEh+dxsiHfSyjDRMNfsrbyk81KdL+/z7bJLny+TLJ/ndN7osteJ1iuzoQ99
+LzvdolT02l1pTMwjOv2s9J0mQjyeXD6UPsqTaExVk+/4TpK8Xo8R9SAmlp7N0gpHO6pI6tWD59Va
+LTt6XjtX5X2u4EvUbrU/eXW7r/JrRPdDtKNWrkNWdr8qJLO7U9UPD10WwGPdXi9Mu7FAsM+qhK6O
+qvRqNz3t/CrXl7vHWVdndWs3VvnqdEWalXe80lMuECSnRQtIsIAEuj0+ENjn0CcTO6VLZ8cOterY
+yse+4lHKOrfDc0qLZFRKtvdq79zt9w4mLiGe0zz9UaVzub5zWlnHqrXPk2nbnsuyH+dRO4R3Rb6T
+aFr1O1408qGf10xNjex/7VoHf1h07M5bSY82fvX520mWrkPlvTxDshpzCV1Gzs0r5/XWDtqSv5tW
++aQl/VHiQSMpmmXhrXbVHWZtYvmnfFK5TEU+KT1flWmzuqePSdPWZw+CS7NzZNuoVqTqdKm/V18e
+TCfeqbqDqUl6PZamVueYdipPKc8z6/ez17XpWKZX+U5vsu2P8FivdgevZqo6Sqe1qVq/tbu7l+Zf
+dUjnK6RXlebLrtWldW0el/Zg2fTU8ot4l/fZVj94zqf5lM7yzs/ES8t76uLVW/lD6+nPe4ZJSGVG
+qejrZu4z16uYadvLY+lb1av8nr9Hzp+u4jlfaDNprW9330pFxcrUNB2Sk/TOqexD433TGn1Ghri+
+W++nyltV+qzOpea7leoes7JNqntV2XlV0mLa3aqy6HW/m05W2Wiv7ubfkqmPrAzrnmVf2t2p6mS9
+UyWi6dTwtS5Up5rSSahdJyrh3auLRXgjOso6OySjf3xnoaqVdhN/unlInVtHdvt1lrbTTT3dE09q
+LCI6fK3xax/PiFe1ViUpXjd/nr6hKa/oOjSsM9106hLiVX27V3if7Wi9hqo2vN+p7t1r7jEqe53S
+XYVrJz3v5Dq07l1PdIyK6DDv5Mpj1911MtortVfRnb0yZumpq7plVu69VltVdboXz1V1hXrrwpu5
+6LzKJ0w8dNHm6V2p9HL17leJZ11aZUnou62u6r5Uu2gVXlU3vK3x9Txe6yXdmmndIBikKzU6fZER
+Pu9bRao9uK773qr3rzv8+lT2ssRS+15FPKndoq9+icerOqU+K1s72nZDo6UdKb1Jt5p17x1Mb+GZ
+Fp3zpKun0FR0h3t+TqtqOvVSE2/1mgsRb5t0Um3Xs3cF2+ybau9ZtOdVrkK9yt/5fToZ3vGa6KA6
+KzPxVtulE29WeEx9/Q9XrcYr0R66icpWp96pkvSdpMp6lt5XfStd1LtS+VfOtC+6nFROc6HzjPfc
+Sqrv3e+qLhXxji4spNu9qvLuLK2y2qq8l7dOUunTcu9GVVg2NPMS3v3Sw9/vPZl+prKpD/de+jxG
+ZduV3pdKdW/xXGXfqZpVbcvnKtrdru1hEp531eisjM6pZal697qM9TqW3tE6lnFWUiotHUIwSfs6
+aVloIku9tF0v5uvorkIwTjvcrG+plRCCyd08o0+r8ne6e30dq+TSe81TGpZvDc2y7PLZKcv2vGc3
+Gp3Fet4t7VhVRp+dsuywtgyztPKQliXeZ6/cO5T1KzLaE8uopPYrxLr7rfbE49mrxcKrtaPXR698
+tq47/evq3JXaoumutWq179Wf6htdeY9WpXZId7RCqx9vlxWa1uq+unS2qoNDHBEmNEQwNHDQkEGE
+Cxckp19cOiZ80lGyvfue05f03rQ868uWt8f8L1q/lHfKmD6fc52pFqnRJv269vRwb/V4bpqGe7VL
+tcJbvFUb104+X0x1ruYZdY1LtHhycSl/Z1fJTrSIhOukvBNSHeGqnczyRs9D5v3d0SCRapb98kjP
+rx6eMiOyPUr7ffdJe6t/WZre3lp6z03JeVa7t2g0amhEP8Z6OZOOZb9MKf08qZLz/Bedsltn3ir5
+jp0u3CTcveOv4qntJF19REq7tNeeMwRjIvpm4e/sg2pLRCQ9EMytGdbedCPdU74atKXvuRmn0nOP
+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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	OkWWhyA9zpTIgjr5K1aFGTH4h5KFNwQiHRibOiBAJcKSAYo6xJGtgKdmOC0Cz3MId/CFyTwUJd6I
+w9JG4F2hW3C7AKlSLLqjttFI9pF/GYH5hlYQrvLvmYgEEk2EayEQ45EJYnSubanAkXSxiRqydWUI
+WegPE2V9qcDynxp70iE+ZMwBPuheq4vVLlbzvqO/t/I6+AihvBgzTDKepogXRpg7OatROva8iSQE
+qwL8hseLCsBrYYoJLGcx+YkAnwiEsMEHJLWBjbPum+2y9CMOwCWDGm9BBk0Bl+cgKRBEvnz1t6Yi
+o/42u6qBbB/tD2OPHW46x/hP7xob4saQ9YdssQPAkGKVUCh3NtkU0J8qUb17IZHJDaeNiywSloYk
+XuIAOOMUCCzu4CbQha8pMMmKYYt2Ivb9yH+zMWqu4uCDrQpMe8BWNUAm0AoYMY+1vQL+yLEAZDC5
+P60xX7FAdGQs6urRWcAwQDa01YGYmNrb6blrju78/7NIQGZI4OxBhU0FsyMibIeUhWuwQfxjrzdt
+DoyaARm8IRqkaFeNMKRAkwYoRnmqP3DclJH09Naz5uLsLhKzkOUAztLQ7IZylMG2JuMkdUJjpJAD
+FtlcQMZRYLWLsWS6YFDRHpOFQYiBVCU6GYqQFEtIODp4+lWCBdILEDII/Ra0Hz7Ot5/3U6TSLFCM
+OBpbHQ5zluos5f1jvi8FAttyqUSK/9iEKmRdL81RYLJimIhhUJgUjQ+V+jHHtIBiH3NuHYAb2QJw
+TyrVPlaPoeziKuCuPr+MOHjK08XMAkxpRTZnwnRk7qzUPf4FEpGUqm1LMmqMq4i6K2KKPgdd0QKu
+QZAeME1XDB5328fsvvDqdfDXx9I4bWEdbLRRULfGUoYmfQJ+vfVjCmelsreMdlTTlq50QgSyUnSD
+52QgsoD4J2FKC9QVUXdJeYJ0+fgQpR5ihGFeHCCH0D0amyHB2F8gUwDRVvSEnnpPNHrmvR0BROvu
+fEDxsfU1wOnbd7OQ8SmISRC3zHTkMb41MU0tWJ6fyg90OY43BBrksLb+DzlagAZv7GfjkOL22EDH
+CHQ8QKS5x4YvQpzh2/9ueiy83sQL7oW8pMm9nmLKA3Z86IDQY0wkVfJg89nz2EI5VMAei2V8S4Z3
+Aen82gqprnUByjTFKeMLtQ4GIdVoVoH1kRbGBAZHLvhLyVUBGZ8UUGOP1XWFgFV8rIY1wLILpzgB
+VJTKAEbGx5AnAKv4GKD9T4aPOUb6nwUf67j+igaMf+CD2H74ewwJ6acZ2a3Hcr0CqxOux5LGfXhM
+dRkLwOrYcXjVTy2nUrbAoit1lfNPfERwXvkVI5KF44umjwUtfM3u2vfBR617NvgY5Mnt+QVh6y8w
+8V065/UXucKRq4+xx2ywp5+YSj48+qOHHKKgT2KPzlPnDX9D0TO/hxjMjuWnWMW9qAGQcTnW1oDr
+rdx0Fh/HWQ1PGI/BQ/D8jLHvTugdAyPvIGr+inbPGvcUMfdFog9y3cXBAU/x2KDDnjYeOzheB1Fl
+pll/atmi6kSIRT0GaWf6v56PV0Ka6HcfjAO3wOBANXY1/tkSFI+1zuXuAyONyr/+qpwtud147HQi
+f5bj8UnsmnEqMCoeCOQQv3rHZnCGu7RjqIbwidox8osuzAcHtvTMBNvh9z/wgxPfJP9eL+kt6N8D
+gHfWn4Mbu1u82MfTgSAkUN4wcB9H7l5TDVe4RQR0cejtvFNGJA/wNjGjsd1ofQac2uFsx1Yd2sEg
+00XNtv7qMlKyu5ZSW8UWaJ7VEXYKbe3rJutYeeuaTzQicmtRQgpk1mZOIMavloJSVl8bTFENzTqG
+pqRmFCkdQv3tQ3Qay0ZM51rHmlgEuT/D4iEt1AwkNLpVAU46ArtQJ+9HMAOf/gbatiRCQxI05wZB
+NQksTsBnlIDA5ZGr5cwERJawN+vSDPsSvEVbhqONbu5/awKB3xjym+C2agxz6ARfjzGkeILvuRgO
++gRvrBhkoGAOuaGg8VWsKx7to6DdHMNMKWizhmH3e5zxCytPHbMRFxUgKI7pXw25xgaDJcZRTDB8
+RRw4A0OzhIN5YzgUOM7/gp16mPfSg1bAlLZhlCv4nH21Ajrm0dcNEu6CNWZ82rbIvWxHbTTrZbuP
+2ek/VItxo7wumq8jiJcf6xbU4STPsNjFXX6YCjrZ5U9DIbm6PFkT4tLlQko4fi6PkxHcmcuZhECY
+XL7kh4nH5czdwXO4POcGkb/ljDMEyFteCgxCcstTWChbW46QAtIykYQLLSYHICRMLem9wcmvmLzX
+BcdWTC5LoIizZKIDnVRMAD8Br4Ik3xfQCVlyFKEYa89A6fNhFa14FEAxxEafmF59qWFwTEBum4lJ
+1HlZcqV92NwKGWMS0+Gqsk6oXoWJMJDGiN3Jp0g1lH4Pk/OqauY93hyqFN5QokzFwUpELh0MXd/Z
+QWNRIeNtwIRqkz84WyH6sEnjNVEP0wGGKmnYlIIvSTGm+DZkBC3XVndSZaXEeQbKJ8VvLFMqqdS8
+DGw6pI7GIRgaxoIKbW+U6dCAehiF88CDfVBP8L84JIr+ub/RhRHV+14tjAbQJ8LCKBTge1ZQZJO9
+9QFF6+iPjMII9+T96wfTPWEs1AWzPHGFsij1ThxUpQF2YtUo8dGJV9vEPjnxkSTRwImFJ8K1R5zG
+A9Epm1hEHrRqiuBjykaTRTPqfRtsmz98IxMDXSEyWGyLQ7rJZ3x7wR6IDw3AJYvjq7VVMCKYze6V
+ahPJq+jsqiLEoKYUkGnVnUSXUiiyl5IpqfRb1Um8QXXFc7rgcoeE+1jw8ICBNio4ZsBg/QRjamGC
+vAoYAIQE/QcYxA5B79sIUW2QMYDh/joQD4AhzAZy/S98kQyEy0UIugXC6l8gSoFk+Bc+SqC8/kIc
+QSDj/IUHFn8BgixEtjEb+I4PhajNoVBhg1awoXk4gCKQoTEMQAfza4T93/H4dSTCNyH0ABMhaU5z
+X2mz1L6G1AYoxoImUqIERbsNMCR8A4GW+6olEOawv5QCQufTx4c0X1FU7PX8YfKPGctPFv7cg8av
+Ynyhqg2yf58e975l8EU3x8k9uueDUdoT816u7QnYV+ped1w9FO7VQqcvYXshtEWP9egJmOdpax6Y
+aB6W5HGTVn5u61XYyKsVeK7B8d0NzoLiwwfDwPDOv51TCf482Wmm+87wW0cJcZc6GRawpk1GG8BV
+gOD2GowXoGSVl9eqIlZ5BRfsAZNX8bjOldWvzhnyCmvqKh2v+zjGi2UuiteKxnRT8kGx2CDowqvZ
+OK9y8KJbcyiUTbAScz5/F5gLXYN4NlA11twFbYAV1SBDyOuCmkp1nChMI44xHhekeRTFUx0aIIX4
+FoGGszIcFngmLwgH5M2AfuC0zYxdAOBbe5me4Lf0Vebj9y76ZLAE98gkI/4x2DniGJE4hl0BzJ2Y
+tUwAxLeTC1N00oN5HhskfmDMdWjz/1+Uz+x8ByM7sfsQm+jqAlHr3VQftGv4D5C72ovifsADw95+
+iX+HYEhi12yIYOiIKNPVZtJXtpBV8PQEMMGAg+mS9OADCSaVSnGRRMEQBDu+YRwB8Z0jhFM+ma5h
+88R0lW9Qug4ifnQVD6Q4YkeXCH9g9SaDaYh4PhGxBQNE+AWDwNFlESjtARNdkLOA3xSMwQDB0SV3
+mBNvdE1FofoBFQTDJjMZDiglulBEH1Jp0IMXedEAsMmah6tcoJ5OhJQD656J+mRdJ9wqNcb4qEEA
+QhNaLz1RVulgsGEgBwBN3IrvImEBtQtDKrL0rfFFcsSXkWShNJqKyfIcPrgCPr3516spd1XTuQy7
+1aTzb8B+w3y3hDCaUCan/27XN208nYPULlLr4PMdTRu1/nq0Goks7GtRHGnRczCMH/CxKza9kRjh
+4XmAr84TTQvnojonfEE0KYC6vyGHc2JAsVRNyiSLgTIvS8+6W6JLgXCHjXITAKmWowDtGRl+jjHA
+viNOQwiVEmwxcgo0CwGR4IgZoOG1pKIoUR4jnnAjJGV/IFN0PCQ0B8SMq9b6vWpq6I68KRPQgOMQ
+a0ZFrJLjOjDCt5eSux1QByRSNmxP5Sii67JoTdkpntG/rBo8HV866kj4KT4ceqSeuUAHCc6Ypkq1
+Namrrch+4AxMcn8ZOTJC4f3IDHjrVLKwMHL0HBh4NeMFisvBN+yjMbGbYQwdhdxLvt+suYAL0LLR
+X1UzN92nuqSxLz6uiQNAqTDt3Ue6K3ynkcO2V+jufj/LoTfNLOPuPIDki/92iQp8+sbQyt6uci/Q
+kqY0HTuzwfeL+Vc9VAa8+6XL5gBrtpt7qFjF9gvFVsysdqVIw7Q+b+M+9g+AybGecKh0xn8kUoK7
+8rlrl+XIEh6IyxymAG9BhQ60c3YAtsPHdoU1KNvlbPa0XVLTWYCrCCrluglytquloYKSvG7FXfl5
+RyyGu5FFZdVDM4XluLsdt3G+OIttFvP3oQ874R0cP7QgV4yLQLQwIb2k0IgEwjilB9GwNzaX+yHp
+MwoXGOMFmjz1AtEmTBdwTTb7us/uxVGOicbmqwH/KyE63jNu5BAteoY01/uIaOzIoSu7C+PlIfrX
+G3vD59AaU35xhKE7t3JCuz9kAfIO6h40NcY5UNu1xbUPWiI+FFr1xd6HhIQcltQPw4NWtdwKWnzq
+wuBBN/5hWQUZ7wueuIl5JSFUZL0O+rA04DCBLCyyKMDacvVymAlr+yKgF6C3GH6LHiC4mq8rQsgd
+591yp7a8ggYu/yiSMuVxeVMbA9Hyy+WbuRwttGkyIeyQjvPc01zelsQA1HLo8uUR0lVdjkQa+1xb
+pgTfF39KM3U5VyDaVISW+BKLDShVGvUuL+tSRabdWwWhWfe8EomXX326xHKXx1GgE7Xl23yLqmgl
+4MNtOadEO6BBlpfnYvPnZLmjZdRW7gdw08gDO39I5fmF9RAB9HlzgsIVnlQeJ2UMdip/phG7Z+uO
+Uzmzkatgry7OpnItSSWTK9+RmewW6wVFKu/bfwV/xJqlS+UDqNN5nOZLKrf6P6gADYCk8mxSD6Ut
+uomSchIkC2Wk8qWZaqtSuedXkkBggwN/VM6bE30SlSu2Sd0t34YRlfOjTGjZtyW153xUPppHxK6v
+cBGVp9VwM+4LsnJU3gvT4yGwqHaLyvm3o0Op2039+2GG8iArPgalBiKDdDc8GuSYysAmgwqOPUmE
+B0KpjuZU4MOsDExZb2pw15MqWaspW2CQiP1fsApO4UpdCZZO8S3clG0fwRYk2p3ZGTawotrt5wt2
+wXAMOvsjgxm8m/IycymDtd4UkkBPCNV3oskgFwvZZ4+Pb4pO0yYDwyps21QM1bAtqgr69/Boy4EV
+INZ9D4YVXKcnD3P6C8UxJyT/EaQCGPo+0VsEDhzzUtagxWCysy8TunXS75WKAHZXXBzHeNAOFJYH
+9DgkmHZ40wIomZEaOhBQBziq60SnXmWXNOw3JeUgoRD4MiG+Pc/eMuzOp9FeVxthIA==
+	]]>
+	<![CDATA[
+	OeckwJKH7A+13FlA7V4do8+NeosDFwE1XtVgIFcGPKg56d+BcFUJRqOkmss/MZ7om7aF175/KOxw
+/mkzj6X6Tod7G/gOjvjIVTDDsrYncdGu0q3pBxJx69AibtBEIeuqUGDVIysY4uWmjimFigl1hOB4
+GiCt+ohkEbPXDo0gh8L7UZE/0cs7xH6E52za2BjWKN1WgTwRfj7GRyancCR9EAQkTNNSnYT6mJOh
+RQSka7jerOsaNVdDTW1LhqR1EnA7S5Oeorta8sfrxKwMRVo+QFxpHoEXIpBCva9cH8J+u4tgjAa5
+k5S2N4nhPUhGgeUbg3LgrRgeKbiV3kuz0w/kFcebgR3qjLeFArqbFEHJtaglObmjMxtknGSEAJ3z
+53gh98NWAB3Y7gqUL8ftKbNw34zHtWXR3ISS34zUK8eIpwZN50lEKAmHUcEglXwib4M2z0zm4ry4
+oDN8y+nLEU7s4iesspzn9HjAjFfCJHn01LNdbkOHIOj8y90BqbnWSl3jkwQ2b6Ua65LuZOXuHqfj
+jI+3HHnHLrCu+dQTf8aTIbAwP4aGQRGRW0mneKpSDb2IXYY0ZaE+PKwKtywc1sdTliAx9XSUIeFI
+NOPzUVlAD17MOpARssKQUjyOs52KLJI5iF4esHvF5xAMjOVvjH/9vKH4Qi296jS2xiU9apgpsACq
+PyItgbGKBDaMh6suwqQjxsiqxquzqdcsZQsMlYSnRSXpFOKr099fdqKeuyOgZqGedSMI0tKgYve/
+FKmmXAVGJspLKvlcPc3MDEVpBS+FIuuhxBiXhbxA3GBTm1DgfWXOZcEupAsa4HxOjph91ywiVF2V
+wPPgDDnYDENoks0AwjsutHPwlE+ifyFG4xtQpsqIdQNOBgslferCrtd5E4J/ontodyEhgEazJZzu
+puBImxNszA4g7KlWMOxAsRs1Qz/RVHiVinlaYxpWa5MmD1Mc9QzYHIZtD49hLxuMwupA4eKesgjg
+oBi0rtws1QXKOsLTcTzGGqBLFUEUKJhqNgfqkgM+X9x75BFOgQxNyzOgyHiwZFtkfhqrexIJiRy5
+JTontzvQU7ppTV1IxhMf9vSHeB54Q2yGgn79YNTi4WKDAr4v3QKTON9REri/e8UNeD71LRMwGPMa
+KMDniPcQgJ1xi83vCJ8jaUb4ifllp+gdCDLtTvk9xavmrBPVsfvNfVB4Zif+N/VbkOAdejekgbNR
+5IXmAfJUr1VHj2GhSZUJ2PSpxAWCYXa1gMgVco8N1s9k1BDELH/E/Hj8JXruQurX8Mcw51bGYN1i
+67vFrEx/b1la6oWZdzQ7Za7A0rO/FNXKY5GeX0MdmaU/zrg4hMIUYoOZEyEIhz+YQvGvsE6y8HpH
+7PFfsFvRZ+Q2I8NYbRsEQalLKwP48TjZ9eXdC2wRXIcsXI06cVAGa7yyCdCpkobGxJ7O6WNvt7Qo
+goEBqYV1IXloEixLmn8qrYp9du4k6gVxs95lAlaZxgQJSF1G+5DwplIO+A9rZnLtdw47ZOm9wZQd
+rZUZJGSMIS8iPCoKUwrwNCK3iXKJhnWSBBEJrR0E1gmGYBzSH6B0w2D2/DaX4tX4yikQINGzzAWY
+fZe8wgK7InM2AnRU2X+f5CDGfisM66D9EFt28zUg297htMZLGvydaSS5csoaGVh01V7f4inddUXf
+XkMxdQddQKBTxau18UnzxULZInFaNX6CEItKfXklQqr3cEIRlNItIm14Oqn8yzOZED10K3BKSVU3
+tQJSjxkJOUbito/9D0G0RvUHLaTFmADhKiV04tMBDtC9o8iJ4s1pVC5I3RsJDthfDTjs22sGuR73
+ihgAo7/ZJe3CkJ5F6szm8CqrjMo8Sn9JUugmLRGwsJKAza3ERJA+zBVBQD7qkeSR+Q+I4BDcJdNn
+bDwhcn/RoQmiWtHoBRpyAqjMFymiGRnrqYdyUUOfBp1E+LFX4PTraUVg4/NPGnB8ga9NBCuu23BF
+x4QdcQDA81m64kf/xBDfOzk+XJuWI152N+tqKt4XGC1T9YzbE4AdA6ILId05R6lwYzwuz/v2amQL
+FlT00R8wG6Jbs8d/p1FMYxs77ASytNLy8+GWif9rvOuM1WQKs+F0xVOpAC/27bO1HiUTj6Kp4Lr3
+FkJJJpNuXjQPi6XLQZm4K1U8JmuSuAKtaDmoQdi9XtwAQF7NlXn9G8sA9dSnKD2/eACkHm+jff4l
+2zTQyZttW9K7uSN5KFTNpuQWmHnNnzFVXuKpEryiTLVAOIzY84UEohSw5d51LH0LqmaRJt4y7cbY
+zSldD47CIU1d4JmAfjFrA+e6V3zL5gKGsovp/U5TZ/L8HCuVJ1wAkd43orqxcM1CiLSsZeW4+iOY
+GSWkmURbbZ7BpMRYq4NFGMtronHZYWIz76xXKeINwebkZBVnEzWL78qyUyGqbrmzf0yYeQNyN9Yx
+SAab5+FUIoUPD0UcUNoBA6u+2RyeSNbSe3ZYX3vj2Uss3dWeOZk1MwUEMNCQLrUVqxB1+ZRpstAr
+46qylpwu3cE1kXBSHlzNewSm67UoYrbTd9rf4WJGzJvhtgU6c44sOhwgFVS9ng6SWVSBSIQuiFFl
+qOGCAg3W3D1tCBvvdUeOtwFaKJTGiLgvAE2Cywz02Ch8cUpH0TuWvAVuqbLcLK10fjga0gBD+QWP
+1PhUQzCjPFqU8sL3fHkM6VxeOHKbikUbJXezXoHXrFTrMPN5QM0hl6sxJ1JrJwelsa75Y3SbOFba
+St+Gvm3RPCOgz2FoYqyJGvNuaeBG2538jeaL1BiUyr0N368IVqmW1SqSpiwVshqnnC4OrCWL2yQz
+ulQkdahn8IZlGlvcJqUoB9nZlaHysDPQ4Ksd4cs6xSsbV6/cZUgm8jTDhUIAQxZiKTpJfgLlF0vX
+T7IQkhzA7ytvOWhkYA6MWSV1FeWz8qswEvTImLBwR9JPlgbjgaqEy2A2gzAdIFoy8DA3ZaneOo84
+nno8GSrqOPzM3JwJTrO7vXFk15gwpQF3/i9GFK8WuqNIhzRAKfOxMugu4YjhMiTgeMgb7nyjTnmk
+6gqTSDRjJcpL8c+slU+OB8oyjyQIHSF1axxGtUpaA7sjmV2fP8QQHcNZY+1baEUSr06DkJWrTmK4
+dzQZCB2l/PzVA/8amYPW3HVQbuCxCQ1YocBFEKukB0RskvoEq2N9wdDfJlPAUo9LTwe8/NJCag1T
+cFoxnTOAwMHPR3mPPlutB4DkJeiM2b6n2dVgHPNhNzUVdy7UvQLaPw/JDRJMm43e2PeLFooAxRbE
+gGwcNa5eqoO6fzGduORORZ9ULYCR0vzK0Rx6kNdr02SWf4htz0n1lSoXuR1pW1RaZElTaAMYaMMR
+Ia8SJw2MbLUAfaBnO+/KNUL8QxE1WjpkKm5VxfB7tM8VGpNL1V3tlTGqoON8mTq6UjbRB7wBpVeN
+W8ignsh5+qCOnrYPZ8dnejq0+2vtJZyTPRUnNbhEE9+RpBeEPE5xgtnDhi5IZDhkCAhSdn20SLiB
+Q1dVMJX7XglSTUYjRBg9rN127Au+xEpyRtU8FhauCG6yL+/LQZ6kAWqVk4jAncydK5OHt5RHE8Yt
+09UaHybDrb+KRWtuCS9vh0CqJ7buYxAqTSf6BSO+IdP14AgLQmreK6WJ7j3qDq1xijRUFFi8/NSw
+4JVw4XV4aiDbkWJayNmw+ZRU1SOtHwPiAj3b4pfBHAyRlFRNAAd6S0eGknR2jKMthNTIqHGh0FHH
+HLiJwdcSQwp6YxMFJE+PwkuR8TdYoiz5w19nzAtf+IJXeL7hzYKdCW4NkTKhbRI1BCqpTww1gycU
+M2odEEEfin7Pn2FAdj+4aWXKt3ChpHuWiVI4caifmYU48WiR5bbakk8aD+NTTfcutjFqzyI8cDFK
+RB7LsbKywWY3MDFGaoL40S99VB+houMMxNE580kip9zf8pIhK+b15Tla00ACof3s1cO2ewnE0KYx
+JSHil0+nEZXG39mc6YfOBmXqceuxFXoyR8plE1rrsUD/fJPadnVkPcmHQVMa1pp587/gVOjoU1CF
+bLDxkdXOSib1nh2ZCoMwvHNHKFJYqAizFBCSECSkYXDv0HJVXuAJlkajA2D1jcIZ6VZmvlfDYHXP
+YefzZUgkuChQ0dzzP+IovWtdn84T6oJdMo3fEx6iE9O+6VDJSQPqZqSpbWqGpP71zq1+ilr6z1hw
+UNu7OUUjFeuLa9W72f416aJ+Jg/juefnf/5QSWm+tICGOQH214IN6z7paPOIhK5wRQ1gwJjPyWyI
+giqXZemESoAdwqq/FI6swuYN6v6m+ZyAc6RtjAqPxMJlkRx6ySkMyTj458aAdMPeJxZuuPw5kNfs
+rxgdzP5p8dt+RSoqvqRk+KkpEbAXbSyDZbM9bu4tRuem1Q6Zr10XUeylAkkY5JITpjMWod3lYa6f
+7fZ608UQFai0TYfaHzIMdxXE+1v6Ja5LWcw3ZlPLtv7vwUpJ7/nO/ZzcwGE/80vxNKugNGYWpAiC
+kfJEvJFD8OIq59Y21jG2E39gWaZHSH/XOkbXGpKA3uHL5y6VOy2lXD8QRFWYZk6Okel33AKE7XKV
+pkSXcMSjDhC387kvOHJNuhutcPIwdrM3G225tIhohVvJ4wI+myGqLU3a+myVemwJ2cSfvs6I+a+o
+AbZ75WSNiFmpYiAcnhN98Dm3xmPWaQ+EHnRA/aqRnIir4m4biQe+yMlShCNn8VaY1A1g/DkTnSVk
+gY04lvPloecMxZiN5LTgnW5dCF00/6wPU4eUR05WLHYA4z9d2ROyHwaAzKk6eJk/AIdsu0RWoaX1
+gHwqhybyQKDXMJP7M5zJAtaYfpVzqDxdtDcHsYqm3M4YntEL1/Ikizpg5ZlbeSnRJxNTJu+gRqWq
+E+uAXzFaLJx3Q65FgEgK18UHOPsnzd1v1apM6IPSv3hH20qI/ek5lYHeOmxAW2Qt41HObgVLDunZ
+yTNiyiRjUiYBxOMrGyD4LphLzObJw/zo9cJWDf/055JGZqDfJibI4b1qnqDLzNdGb3SyUIkPIpKT
+2HbgbSxRR20Z+SX8Xb9V3zpyFe0x5YaNPQr1xSRFiOB7x8VQSL7Ue+zon1SWck5h3LLUt8YQehsk
+nvBag8KV0C1swHLMR9hBKP0et+DtSyAMaO/m7WdiGMQF9YLQwWByWbVp01qhmMrgB1y6ZUAFOQ2J
+qJPc5suFyameTNzxPXzH5OehgDoligbAWHyuagWhSz8VY4bW7Fx0qmfUsCKoNPFW7yXgxow/CmCT
+En70sWU1bcWCNCG9Ex7/IhKYjIdrYQF/nGqdFrg4O+NDtF0+TTzt1ocquHFoMSgtzzkLG2F8CA7x
+SE58XMxcZwAC+fkkSDBKIL9g10ESF9hVEQRbY6ram7Rvho/TmCv65wI9VQmMTntRtNNuCC1yiAcz
+o7gI1WPfq+5IQzseUC8ZjmlM5d1me8ePorp060Bp0VREKU87wDyI98/MJCijYHm59g==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+vdsvlfLe+VLHc3/ua9vuSz+ve7nk99r27f5Feft5jut1X/f1jve63vu9PIPndW/P+LVf97Ut82LX
+8fruS/zu+wHoKPW51m19rmv+1vs9x2uct3U8x23ex/W5LvmbBAADeOV93Zd63csDgJV5qaNsUdpl
+q7QBMABSSrnztj3X5Y7PdWn3c13Wum/r9o3zPt7zN67rta7ftj3XABjASAwADOBVv/q6t+9+vm27
+L3V+tm+7t8sbMiElTQwUTM8iqQAYgImuw9Btvt73ep/zmufrFwy99++bz+87v31bz/E7n+++v3u7
+5/k77/Od9/sehu/PO3/v+M3Xt7/jMG4/x+vc1+ear20exsue7X3O917fbf2+b/vWb/ue7V3fX/W8
+7/ps6/ac57WP8/uO+/y86zuez3WN73aN73Z/13O+4/nOz3W+13ae67Ot73uN6/Zu86+93ud8t3n+
+zvlcz3Ufz+9ah2Hy7v3N7/3u4/pu67iN53O/4zie53zv97g+53Ve2zie43Zu4zuf73Nu23re2za+
+2/qc5/Zu4/ec73s/73XPz3he6/jM23rO1/Y+8/ad5/rc2/3c273dz3je23du2zfe2w==
+	]]>
+	<![CDATA[
+	vG3fc337dW2q+f2e6zvvZ5u/c/u+8zznc/zW7/y+796/8XrXX3h/5/Ws3z1v17l/97d963dv17a+
+57Pe3zh/77dt4/zt4/3M93fO3/d95/7N+zee5/zd2/t82zie3ziO33eP4zne2/eM57qO5/4Lz33c
+tm3ez/MZz338ft33zfc3nt85juvznd95b+O5nPuyfd/8fe95j+e73ed8ntv53s97vtd5zuO37/sy
+j9987c997cs9n9e6nvf7nOO5jts5n+t4Ltc5jue97fv+7N+2X7/62s5tv5/5297528b5PL/v/bZ3
+2+dr/jbZu/66czm/97q+7TuX63ufbX22bX/27duu95yf/dq3b/u2cxyfd3u371y2cxufcbv3df22
+7b6fbdu/8Z63+7m++brXdd7Pe9zO933G8frm/Rmv75u/65vHTTqO83ut87vv471f73PP1/hc8z2+
+67lu77Zd731ez32P370/9zM+nuO5j993bsp9HL99f/ZxX9f3vu/5nq9zvvf1vb/7e655v+7r3cZr
+vdf7/u71vMfx/J5rvNd7H+/rGff33u9v/MZx38d7v+d1/+7ve757H797H797O8/tu7d7/K57+8Z9
+Ht/9uZ953pTjur/3uI3vOV/jPY7zNc7buXzf+r2/9n72933ncX/u+1zu+32/69nH+b3m73rm93rX
+87y3+3zn99q033Zez/u+13Zv87Ou+z3f87fe47OP1z7ez/mu17mu4/6t13X+que6rvPafu37vuf3
+vuszv8++7e/9y959e/Zre59tv877vcf7Pa9zf+53u559n79t3q5vO5fnm7dve7/tvc5z/p7t++Zr
+E8/rfD/n/G3POn/vuJ/LPD7vO8/j8677843f+rzXOz7vvJ3jdc739z7zPG/Xc87rOZ/Lec/7fM/v
+O26683u+cXz2+bvu6zmv+x6fcTzXcVOe233O4/3O63Zv37PP3/1uz3Zu93av4/Pd2/Pdz3ff4zme
+7zo/47iP13ee9/et8/mM57Ze332u97vf3/a897ef673d4/ed27fO7zOe6/ut5/Od5/Jc671f57Wf
+2ziv2/Zs234/2/d873Vv3z7Pv3K7n3Ecx2d8x/37xufbtvHb529et+96vvN7xvG89+9Z72/ct/Ud
+9+sZx3f/9m/f7mfd33M7n/X8xutZz+vZzvHa7/vbvl9zrfv2zc93ruP9vPu57ue8b+fyzNs6nvu4
+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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+N2ROOmRGZFbMeEFKoUIGBqvMbxYpBY2MGRYxTOjSlal3FDS2ve/+TC77OQoUco9CJpdpZvAaeaa+
+7RpfBm9fyMyQlC9kyhs1SGV+z3VslQKAAcjckDnRxECpqgDKWBFiYmJiYmJiYmJiYmJiYmJiYmJi
+YmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmYxs5hZzCxmFjOLmcXMYmYxs5hZzCxmFjOL
+mcXMYmYxs5hZzCxmFjOLmcXMYmYxs5hZzCxmFjOLmcXMYmYxs5hZzCxmFjOLmcXMYmYxs5hZzCxm
+FjOLmcXMYmYxs5hZzGw2m81iZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9ls
+NpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2
+m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDab
+zWaz2Ww2m81ms9lsNpvNZrPZbDabzWJms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDab
+zWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvN
+ZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81m
+s9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNYmaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81m
+s9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz
+2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81ms9lsNpvNZrPZ
+bDabzWaz2Ww2m81ms9lsNpvNZrPZbDabzWaz2Ww2m81yrrPC2zZiKgOsgJkhfe6vC61pSsgvuWpP
+frbHoR8fa4dzelPSmsocN+pwwlOOPqCIxFCdVqxKMkVX27yd5qplEj6P5fcdgn5JjuC1Cn+L0PHM
+dUwQHeBuC73rDhgVWK6bICCwt8XmF8fqVPPRT2Q3pZoiyEdMkiMjUoq+d5JEqWrsdVV6eweU18tt
+WQ7n9TqZntujuHIaHX4xWobNc1+SKqeDcjoyKMZh6HYd7XmtprUcTg5+LZ+9huQxwWfTq/qpiYph
+U9vqJAl3HMxpuAjyZpmCYX4MYU6LOw2kpiHUHKGlpwx7U/TTMsSmKPn1y7AXvREZvnx4Fg9PUtGP
+Odqhh5OjzLZPLTt7Wuxp/TnK6Djmw7eE/NKr8uNH44UywAoYlLz+zXEnQ7jb2s1m3jYRmrqczR52
+JXisQ0RFxMoIClHfilc9/FbOJhfDfAzVzmYGu5bczoR6lh3fSTLtcFCNU4ffn6Zxt9XhJlrLGE9e
+Q/qoXpb2OljrmNBxi49HZZ5FpIhzmz3kWPccy/MTHOtkKXecb5Isfq6DdaJhEqVYdC9Ft9tGrQqb
+XxNaikqxJ7tQa47WE4SOPFhMYrs+hxyrbl2wUCFwHBJJvONmj3PDLxS7MNz+kKOrTVfqaULJjxn2
+49eT3056Lbl12XEK5HDxYuSJrSfJHG+Poz1u9LIyHufLcbSmMJveYSUEiReZ6DTJEzpsARDA7Hkx
+oD/lti6nE2scFqz2MGFFwIYK1cvOnGZ/HYyWfXJ8O5u2s9nJ8EX0SUIFTA4UEZI+v8cRH8WT31dh
+Cq3SE+c4utcBkd9ehqaXTfk9LZoOsWtVu+IeB2sgnvG7O63lgOCiuAL66KN4i+BKhl9zjIdgytmw
+HU4dfqM1NbUsHYInZ2OH4GhVX/NrY0ViAeJN6rcvwVwETe0qf1934gTLaSH3vOLrK/1Ogt8es+xN
+UuX3sOTZBsGX0+KPOwHtO2JSWpDAZDwOf9s8fiV3NbFq7W2xtrm/bSW7KLiV7Tspnm+TNNHyC69X
+PDsLj4/kdi16L8cxqSbMZz+xaC5+ntT8TxP3uvvzPiXpapvTi5rstalF+/LrzZAnw34UfbKcu07l
+bMzNx0dFWbI7cs/5CLLdppdhyU1D6nmTIyx+eTqG7HWM04jmw6NYtP662eNAJ8mLX9xt+Ri65hZm
+1PeQIqKy56JV/axrXpKkVpXJrgoNl8QtqBR/1ORNUyfDnQTpbvOQIYxo76EiW4EisWD2BK88OobY
+E8WDj+D1ZxT1rpM7G9zjSOxaetvQquJimJLjrDVNraenDHWx00tPBrU/LU98j/19vVmSWnYVw6q2
+nbsO5WxuMfSoqAu3TS3rCT/+896OJm8bSU19s4y5jv6+PBx1UQSZY4n9ltixHoKlVW3FMOgs087G
+3baRqsJq+QSvVy/rMUdPCZZaFSW//lmiICDpBmTlsi1MoBWmHkUKRErLmdNojzO17NtxJMgHDoIy
+OX6xamtVP+ToMUfQaapcd6SuMLf95zlS0xLc3iHyGpnhVpu2XjYvx1eOg9iV5TS503jRW71pTG5R
+K9qP4+x98ueNePYVLBNsfnWw68PvQ4qoFlWxIrVmmTfRT+vC9tzGiUxHiwmJB99NMS9DEIuu5lcG
+PxB6luB0jEfnIeJqwexHNUVzTMJr0xzjZmmPIT6GrNhN4W+ZDYtUUydDfQRVMOuyZRv0ZE7Lw2+k
+nn4pyvgahgkMJMOeFjXx/b40Z6+zPW/uuJjb5s8jxfH7dTHofVh2R88SW3bhcVJqhlqUdMctrFIK
+FsoOv1wEU3Cr8vckNtXHcP66+fP+FD29LWt+TXBaNruqdy297H6W/lneoNePH2o1VXA5Bqp0kuM8
+KbZb5wY/E5u6UH2KUIHRjPyTi+5n+EnJEnuCVJPlOjfY8aAnGkdXir5a9k9RHDVxsyStLD+C+/jN
+ncaPnupNP6aIix/b6dShSANrhfg8f56hNDWxbMier1iNZEZ+rI5Fq6qTpj6e+0iSUA==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	L9Hp2J7nqJqbZ+l9Y9BLNRC187GTn0gNx+R2xI79chSdY4yORyqqg17ucSXUZLmtHX4mOU63jtxw
+Si9LgtugkqQ7Dgc/vxw/qLmS39Tb8qMocsssvj0T4l9yS1LLk5vyZliy3yQ9/8LtFJEHxd9dsUtK
+yY859qjZn2WoVU0znJsjjKgfIuZkh5YRlc/+omNRmorQk0SnWbVsmuPfZUFwu6plFy2b2hb2uhn0
+8tQs3XOqnmP6jQLykPB6y655NL3LkhbFHEX7dQW1rsnHR83y77b7ac7g5xHDFuyi7DiJx5e/LyTX
+Ty8cb5t5Qgeb01D0Wqb0p/i2iq/PHWeCnCDBbyieWw9kua7dtpR6yugXNr8odpXBsPU+P1VJbcuP
+JO15c9fpozh/30mWY7zOgqAbintphtCzpI77Eaw/b/68EV1v4AEQYHmNyGh7ct5+pvuZ7ieKjyIN
+hrd5moxKMEpS4u5LOxycFF9KoRmsk0lun9j09bibDFexC0LN2ev6cnTJsIuOQSq6n2Usjqz3jWL5
+o6o+auZjeHvcyn6/YpcnRRn02s5TNW2Uoid4HaLj+ijKnbaLH0g9T3C7Mgr1qfrC6ZhSaMVrtaJl
+l+zGbFnEpn9qnt52Bj+0s6HDDobkm+i0rH5jcxtqVds0R/Ar0vMop82i5zlJlKum7PZLblVueoPc
+j5aklsXBD9WmMnsWoWUT/ObLMTdH1/Naz/OsqX+adLfpIjha1ZKatuD2BKdjdEx/XMlNUfHam+It
+eqK1ZMksrHZrxFItoL9l0yWfPrSq88fhIhfD4xXSn4rhVi2jgPoeNV00/ALqQ/Tas5r9OX5O8wW7
+Kjp9ktMpvv6y59Crum4ZBbehFL1D0D9LkuyShHxXboNcFqbbL6VQSd/3KGqT476moXo+4TZLz1u5
+LXJZX0V3s+TNcuXfV+4Ka1p4QocTZIMDBSVV2+RmQ38hjKdv0WdWi+YgB28dUocBuFpHhcwF84Rc
+UIztOY0RlQ3Vp8R2+dBLQT5WreNpWxdVigTH5cfHu2k/epbseAh+j1a1P02W43yVzdGV7byWszmx
+qMyWUZxGKyRRi+k0iuUaRUW2TaLr/FRvsvxPsyXk05xGLCCQCZbRTudUyyOhz9+2e+iFztHUqh70
+9M+SNce9WfbneXrdVxy34HgnRT8979OMR5E0zzRJsl23n2YKbmGYQiz8bVpPj0mymuZy3Ou+UTKs
+ap07BFXu2sL0WVHytPg4C8izo+nLCgWzQrF4vQW9Fv0SMcOyxAqYFaSP7J5zs7xLUqTnQW8bfx3M
+dVwxWwQLGBgjMJbPLqLj7deF3HYlx6i3xUXQc5Kodz25q0qOfzQNneUPMCcwpdCPmr1J5uOHWk0T
+nGbJsV2SbtetXrbGCxWjpVq57ig1+RHky7A/R5LQD/N68ejpkt0cIy0Yq5LqTVl+3FXDv7uO5ngW
+RfjrWvS7gBkqiEDhEtPvj3qa3tWzpr+rru65Z9WZDE88fA0ZzEZrVePnLrhMA+JH8rpfz9Ds9qzq
+n+bLv9OIoXZAkREBg8KihSrJsUmGXzdNYlfTy6qQPDBKYCxGXCtCXDAoEkmGRW/Ln6VOhiL1hDku
+N8u8JEXrWkrX8wME/PhIOQ4lNEq1sattcuflI/mnKAlv16xALn+Ocl8d/FxvS1JPG+RyESStqkp+
+XbBMKlalk7/nT7PVNP8sS+36n2XK4ZwgILPX8eQ4c0K18D3VuBoEYUI+KS1D53hqU1jb9CRI4uc1
+XFROdt6vb5+usFkeyWkUi/Ij2G4bz2qymEIhvf52necsSfZ7BdSvfPgW7KLc1T9JGSckP6ygEbWt
+3HEi9uzDiomOFJJXLefkGHvdXZIoXKyXvrebtnI2s9ep4takojf44aPYdlwrx1tMJxGe/6ClBxVh
++UzzWtWMwGiYvGZUphCbiuAXxiRCwW0IJUOnOGrRUw2jaKF+mJFpwU8WP1ObquR0jNYpRekXueVU
+3OqlqJrh3SxBrPrad1nPq2g5RMdPr5uHIf55MVrOzzLkbNKOG7nsiS2vIH1mRB7T2+LkmHpZFB4n
+va4cfnYIelCTRK9jRn3J37v6fldPFw2bWvVzkqc3LelnHCqwmtjqRNN3WX5YNYS/Q3abZ9MU7GIy
+jDmJdqCMkOj2KW59l8VRk4UUYtF6keT93Wk/uYnUbMvI4+Jx1Z7bpnmL4A8mMRor0gpfn+jxCC6v
+6pl12yS4rcOv5d+RiDlxwAwVB4ihogZFIslrU/zKo8hynLk5oY+dX5YiOu45zTsEXW17uS6Eov1I
+hlA0D8d8HEd6nmaVSsWv5xw9pnh7XbxpPjnenyeeGICnHFlAn5TQL4pf0suaWtUvxVwE91L0nCbt
+dSH0fOH4bpohNV297Yum/zSNu643y30U1Q4HF0NVDPumKWJTkh53OZU87/uB5Y8LrxvHcpteip7U
+NLnpyU67aJ1S8/uzaQ2sdYJh2eto0DO1asgtk+g1DFmrZrXayzKkoil8nmJVV/zyo4iHIOplXXUc
+YyQW8/3V+z5qi3rjEB0XqagdfrYI3uUIo0LtQCMj+4Dy0ow5gX6YUVGCRgshVMjMeKVE6JgnQ5hW
+qkXF6lOUVcs1SFw7UGBFqHDRoSIz4Wu8DGH8jaKFMtk2f5onfD0DZqIhW4XcdGuGeZMcwS2MSzWS
+45G7ovz8Sog3tayHJF1zfJtl6nWgOF7deS2OnnI0weka06+y3yl87gLyeFR0R81SDIPY1ifHGdFe
+hIqYH1LIsJxCrPnVz9PjsiF9btLbKB96RZSjSI1eTKJXXrvy+ofdWl1ttu1fVzXDI7ec4rFZRLyM
+v0fz+7+uzrYzyqqfJ8tnH1JiB5iRYoVr9busPIo4KabaNQ873gRbRroPKSE1QmIqv6dFx7TooWAW
+Za9fMguz4Zfctt7V1K53Wa5dd3Y6olbdxbEGwxEEhN02GhRD6WpaWdrzXE1LQT5Cqlpj5WQldUo3
+TfY6PBT5kYw57g5DV9PAAQggF0GVUajV9yXXud8XUtFV3LbgtsSiovSMt40Vw7AcZ7ft3TS/HD/o
+mYJfWD2b9PtOkrQYvvLdRN+t582gd4LZFdHf2vOREOhE16i2hV74V9WcHPMR7ENv9a6hFXXdswwT
+GahdYdArwa2L1klFKtTyyVcw+zlN+vteds0S+ncRfNHyCH634Jfl70srSlJP/jTfMHTZeIltX27D
+w8/UpiZ93lICzaRIMiZRCX5FryvjhERmlYLpd4t+UXS6pc9JctqFCCvE4xG9bQqXyobKSAyXZbaL
+0s8v2y3BaY6VECFWyJxwHNSuKU6gGC0TCo+TVtQ/yU9arpA+NTJWqo5bQj6NEFZILucjSHebSD1T
+tZyq5ZA9d+W5PJIgFYUBeWS0UCV2PHLPIXhdcteR3Rbx+5s07e8LIkUmAR0zIsDDBg0R16uOdfQ8
+2fQrv0fsKdPfGyyvBfB4ccNEBtPrFT6r9Puk6yRcx9n19TgTa/ZoERmiZqXGCIulBFLdNa6qakiu
+4vi/LCynW0gfkz43xSwpdkNr2pcl2+HkJGjywVmoRjOkkMhNu+b3T0vTu7ZmuC/HHyVDahjm05Pc
+9Z+m9DjGIDiC3VfjUs6Wdp7fuh7WdbUNZJqxu47ZtEcc9RAEtWsLfvEonuZZtLZx54EnTowfH27X
+4SGIi6CpnkF1bbOuiK5BbauX5Px1KmdDd9wegij4Jcmx23EgVUXBsV6S9yjaYmiLIH+WJL9fI4PN
+JJp2tJOfN2JFiweO2JEDReZiCoXcFu10UDO9btq52dAe94LdEx1/GX1atEwiPI6b44rKFKNFBTfN
+Guw+6Gh62VZN/yjqm6Z/micarnmxSq2bbjawt7Vkd8XXYXQMm2MTPR+padxxJHnNogSSEX1QMduS
+XdW72iB3glsleOAoIZX8NT3BLcl+n+x3rIZJ9PnkqiqgvoZJiMjv32SYak8YLNEOFBgNkxYOE1cL
+yL9HUT/JHjXvEBSlJ0xJRLLfL//Og4pMRslLNb+r2GXFb+xxfmqK8HkNklgPFhOZ0T+C136q3ihq
+mmfR63pS08SiMPo12e0ZMhUNVynl52fw86DmjZSRkv/T0u3YXqP4eghe15BCqdeNwc2l1POQMXFB
+4lrVLoxKBISLGR9UxKyIrV5OoxMt2yMYs+EdKTIaJbCXkUcl1MvuGgXDp5pm8TrPpq745SmJ4uMt
+TB8XT+6SYRLL4uIIWlPT/O5nmXrXkLldyWOW/jbpbxHd/pyn5zRD6nl6WxGrftAyRcMu3VbZ9Ox9
+njM9xbALv2Uw7E1z5dO3gDwiNGU5HJjjahCEO65G5mIxleDOW7WttLIwen4Z/TAaBqEk6p77Fx4p
+lWS4rITieB7HHU1X9Qwz+kXsGeWy+TjqKfryfX5tW467xVAFuyufXYWLpAAeLnKwlOwlyTIKrYxC
+IPXkw+6DkiNXNcGsyV1BrYpum/t5Jv9HNcuz1+Vi+KPmbpL8WcqwVi9KTOIwTMWsa25RdnsVszsp
+3mM4h5/Ip6+JvUDr2mqdFCoTjZirRcpUYsspFtVFEN40E/yKeHzY42iwQ7lqi0dHIfqkWrUvwz01
+67M0OY1kYLBaDG3wA62nTOkjE9pXfHwkp2WwY+U4ySfkWVt8FEesiXpRkmre4AeDntjpkJ2OjN9p
+VqqPit7kB1JLkt4W4W2YLaNgt+W0Euya9DvKnrto2D/JUqua4Fbk97y4WqJYPrkrEC0hMmCplc8O
+q2ORavonyZdiCm5vtJiYhHwYKiVGxGix8vspVxWd5B1+IvasYYlYRr9ukiyg/AcUJw3w4YYSNVi8
+9PnTnh72/LSojJJYCpjrZM+sW04B9SJ4zfLZc5zAaoy0YrrNp+ffsjT4fU5RxJowXKYxhVKQQjWo
+kYtJVJNki5Zd80tKx1SLumY3lssjdy3J8IiOdRU10TCKUd+C5N+ApVY8u0zXQ3IdJ8u0o5kbEBN/
+jzGJQmoac9xeliX+PoPkJXMKtWiY7roVZIN6ZVQL25/nap08/FbIVjdcSlDAVCak0Am3/1ieGSm5
+ETNzi2QuhqZ2Ha3pqVVpnLxinMhQMu1B0RH9ltX1KEV50RPB4RK+RrmqilfKJXXST9NzkiienUX0
+j+j3yVX91NzZ9I9fFNMoZdcj/A1DCoXk+imWP2p6iyE+ijPoueYXD71Y27z4OBAtJj60oIzwOUg9
+cVFEOZx/TYeI0aIUx3b4qV5VpcdZ8LuLYUhV9RSNxe8k1K9orf6S9IQfajVJfLxE9Id8+BSTKIXf
+tRi2aFkkv1/3vJrZlv2i6JdXTRouLDUmLH0rl+AXhuSj9DcpNd9Ng8GuDT9XBEM+vojH83HXz7t6
+1vMEryWeW0SvQSk6h6ALv1U27Z+kihcKpiQy6XWRvHbxSsUokZ1m2UfJHi8mJx59NbujNiXh7xD9
+NrmrCC1ZcxtiTRgVKUXs9VnRT0qWWDRGwyf8TYLPrznOx1AlxL9yWuSmJn/uwhKplA==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	NDBiMC1hMjk0LTM1MjM0NjI5MTdkMjczZjU2YmM5LTA0NGEtNDgzMi04YTM1LTQwOWE3NmQ2OWUy
+MzI0MTg4bTEwU1ZHRmlsLyA6DQovWE1MTm9kZTsgKHhtbG5vZGUtYXR0cmlidXRlL0FycmFjaGls
+ZHJlbjIgL0ludG5vZGV0KDAldmFsdXhuYW07ICh4QUlfX2lkaWRvYmplY3RmeXkxMGh3LC4wNWJh
+c2VGcmVxdWVuY3R1cmJyZXN1bHRudW1PY3RhdmVzdHVyYnVsZW5jbm9TdGl0Y2hzVGlsMWZlVGlu
+b3BlaW5Tb3VyY2VHcmFwaGljQ2l0MS9EZWYgOzRmcmFjdGFsTm9pcy01QnJpc2VMw6lnw6hyLTQ0
+MWRpbGExLnJhZGl1TW9ycGhvbG9nYi1kT2Zmc2UwMjUxbm4xYjNzczJSeENoYW5uZWxTZWxBeXlE
+aXNwbGFjZW1lbnRNYXBiMCAxbWF0cmlNNXN0ZERldmlhdGlvMnRvdG9kdXJmcm9tTmxpbmVhY2Fs
+Y01vZHJlYWRkaXRpdjBiZWdhbHdheXJlc3Rhcm5vbmNjdW11ZnJlZXpmaWxsMWFuaW1lR2F1c3Np
+YW5CbGMxLWNjMTBjYzhjY2NjMWNjY2NjMk1lcmdlTmIxQUlfRGlsYV8zMTY2RXJvc2VyMjY2Rmxv
+dWVuXzQxNzctSW1pQm9peXkxNWIyKG9CbHVycmVkZGRjb2xmbG9vZC06YmxhY2s7IG9wYWNpdHk6
+MC5zdHlGbG9vc2hhZG93QzFTc3VyZmFjZXdobGlnaHRpbmctQ29uc3RhbjNhemltdTZlbGV2MURp
+TGluZ3NwZWN1bGFyT3VFeHBvbmVsU2FyaXRobWV0bGl0UGFpMGtrNDQzMzExMTExMDIoMEdyYXkt
+T3h4Q29tcEJsdXJUMS5Db21wWGZlckZpdGFiMlZGdW5jLjcgMCBHMUIxbmVudFRyYW5zZkNvbXBB
+MjFQaXhlbDUwIDVSMSAxOzIwIDE1OzIwMCAyMDA7IDE1IDIwOzEgMWluZGVmaW5yZXBlYXREMXNw
+bGlyZW1vdmRkg4ioopU0MyMAAEFRAOIIAoYFYJbFehRCAzYSAGAgCMUwOMUwAAAAAAAAAIAQUBDA
+MQwAiECRqEGAGIspDXcjN+rS00uwXyEkHT++pW7jD3fzBPIcoSy3iy37YcsMdgtCQwNCQHANrQwo
+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
+	]]>
+	<![CDATA[
+	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
+kfvwKC+6ybW8SmhityveTGv31vuzpF3i8/27LX07Sy7r1aawIu9S7Zq+99SalCrcab2GsiOKmLhs
+bd1K19tk22Sjp+hqK+PtXp2O3X9pq307xDG6fe2KSveE8b+2OSy24l/aMRPzxsd8zV7UWIsasbLy
+Sier04dvmm6oci6nfp391jz18HBO6lx1mLV1tnJReeu33TOzfV7rzh3t7YX0bWozs1U+nT69zqup
+7mzUZm3OJrPpxppkOf3rtcNKHnxdHuet1Kc8u+Mz5Dtum9l7n8omcbKHbbZtJnn56Ki1qV98mzur
+SaSqWask5EVCQZwzqTQyig02XSUIBe16kgJTGIcYp9n9d/ffKdsbc7UTCyuNr02FiL8em1kv3+7p
+3ZF5e3cOiHlb53B0d1dtlnnLecpMh6bszM5nOmTmaWZuZh6ZmXmox8aol+zQim9tPdW9wb2zcTks
+4Q3q4a8VV7Fzb1utao8vIjpYIqMdq3v2Oh93XHnMZ+xwfMb8c2A1Nkbrvt3MPuZwWI2Hi42ZnZma
+izjIeGRkZGRERkRGZObMbOxGRURsbMRG7sRGREJsRGxszEPezJ+qd/++vb/azWxsm1qqppbZ222b
+10ineHe+46U7YmKmXe16l62pusdSRSW0K5aqrs0RNXPV6mbNheiQeIjIlg6LiA6JiISIh67ZLW9z
+87ymlt3LDr1Zl3e2d7yqnHumlsdneJZnWTe3Z7dn2pmtD7ZYibvaa5tWUnyLart4VsnJy8eEjKmY
+P7RjO+Y8Jrdt3SEh5ykhs1ofMiEb4yUb8tgnkxfvicm8eONOSka2xlazNT67Gl7aKfU4LXnkWHMB
+Ca4wKARAQgSw63oduOealapamY1KFTMDs0bF/trvsIs7k0+7GLmokJsvn2eqy/zPmrtsT01rv9u5
+e0UsKqzStM22U7Tn7a9p3NX1eqPlD63Tzq6/Hd+P/92z1dSqk89aMU0ZU88U8RoPObWW1a6TGVHt
+qi2XlTvzfliJfK8vY2WirqUl4XKZpbK1FXKhrlHdXbWe7Hw7puKqZl1cxD7dqjUuY6zjzxTGBR7A
+jYmL21hqdu1/M9f+/ZsWppu6peoAkICEBgwOCIYIEzCggZajIYLhAQlIQwYUIBzSUIFImPCAIUID
+jArIH0GEhgkWRMBsp8K2JWtplXmnpVR5zXnHsfAisv3s6tVHTSFPNp8R4vw6+jW5XHmncF6ZC3E4
+j+5m0jPf0o8Q764S74RccmO9NKbzcXGukauWL8dz2bPyj1zfuq5o6W/11weuI+P6FN2mu+gYkfi5
+19rYvWiSXduUV8G+vdiPlzdGqgsuHX+zaK99Sxtc0lPuf4LMx5+Nmnf3Kp3vJb3V4i5f97KphFd6
+eEnddJ5TzuFean0+v9OzX5VZnfdMSHpMsX8FtSSrl7bYLsvaJEvpRVVz9s3StTuMbmoY+ea/2n5R
+T5t02ntZ0yRPytpSW06Pt+hXGAe15X/vffJ5z5m0lsjcpHK7JU2h6u34lG5+ksavJrM3ocllpfcX
+oaSotBNtZa2jkQAASALzEAAAUCAOiMXDEcFgLM4AAPcHFIAE2ahAKkmjWYwDQZIyxBAAAAAEAAAA
+AMAQDACUCQDAUQsYeC2AiQc6cek6hJ6YTxzD0b251PNRcgJAF3k/bBY+u0Ooe47cNCYzZyrGb/b4
+N94u4OsltTPO+aC3vigEn3lSxNt+VDjQ3OLfjN8CGcHxTIDjv1QvwN7UTsnm8adA2GFAXEwVDSB+
+odraZURR5cGUkKdVPp6oW9KS41Q3jmG8kd7rbzmw/GMbA1JVMKmAybxTZ6j+cEo0Jn811WuVGFSU
+IjfWyyR9MTVq0CtXTESS/egptrG/ADskjIbS3iDnjw1MYNpyjsQ099BmXgxa5HXeaeA5HX0AnZp1
+mssxMEtkI4VL+CwigSzr7IxWTHzjV0ZbXOhNPWUMsQirXZto5KBTMr9EQ5dd3IuUXzvQDU4VLck5
+batytx2xNjFdxMj8qwddNmMPR6QeqC47/z7mkclN9RYExqmxmAUErKtpTIaCDX+mxxK1Xn1/GmZq
+xJahVg0Gj4cPvFA/4QIfssMJoYaIGeBvuY19zXX+hp0I3F5rGTjrXE7vhC1pRbcDSksy5TrWQR3U
+ghbFwIYaYpKCIUkJ7sNX68NeghSyaqtURYh68OILejrOQUwp3G4KooUvrQ+0ynp6TQRg2HxhX3sG
+W6/YuaQFS+5e3XbdAf8Ie9IaJ5qzHaBaEBImnJ1gWvRPbW8fBJCrjbj9I53vKjwPiB5Hm4fD3NJH
+sQ6Z1aImPBXEFI7pUhSv62QuwdtRGxpXllEPrhaoAnX75sbQop/ddU7Fk1kVZrh+yfUqAXpogqgJ
+CDoWw+BC3qvAiidTie9D8NOZlQI2/UjBHbIGWFrBkAd0ZtDmoIe1WRBWD6W9HyscRjVY6PGTeldP
+6u7mP2JEWhA9lWIFfWi1qvt5iZfgVnZrBm6oWwekPmh3rr9ZhlNlsgw9X7PI8WR2ZeZcNoyMbE0m
+GJrhOAnfyNCwnfnC3VfqIMDsHDNWki1DD7u+5ly4eUkGvijLCuudCWMzgWwpm0gkZgZziVlhwRGY
+lCoEAAd/8Mtom+7o0Q8FGQ4sz15ILTkqrrlnnwBHak7Pd2sZRgEymQeBd8eVVUuOCgL9WCuejmsM
+r5rCYdqUFYMjJNvQMFClIOip2Nyeax1CKSa0boansEPLoZ/2eGyFh6qcldU1QsIHxziicnnVOf6M
+FuAU+9lZcOxGKkuOZTSxk3/0MXxJ+VdJmnu3tGBQRn9iGVMMCwg6dQ2Z4AtsqoklFCOdag5pZmK8
+BvwfJUSQhI1DhXVqkwRfJiBq0QhM9RMTwi40xk8lg0qmr0eASD+D8QuElhiH1gQ0s6z08PiZcjni
+6Xd9ojtxZdmoiYI+gRAs+wQJqa5vZlAUyLv/0EkDYWPQJo80dXDmj8AYAVRZb4fNeUkE9+M+Zly0
+XL9MriZVSuXDego2wvtHMzOOPVBxIPaV2akjMReNe/HBva6zy58wVF7F4rW0L+jbNQ==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	3Peklyp/m7r3/rWdj7LArtGt4c+o+U4VctNBnZ6DsiXow+OiPcffdzOMWmQtAVQ7kOjxnXayYTxq
+YL2fcjb2pPpzqIhSMxm6ngghIE1nqI2vA4vHU+D5T6gr2xXVil3oCkLKaBBJy6Rydbf1TZEavvyh
+uOGGSntshWE47viDDnPK4qj3/6yOF+yflezNZKXnIEqZTpXEhb0nrgOejldg0Lu7gMzahNGwbdX7
+mgpJw8vSSj3MXL8QZ5qNTwqXrg28eKt17G8LbieMYR8Ty4csquMylmA02pp9FX0lE1eOkR4ctkvH
+yi5EqAVQs8zO1UPZxUybsMRjDktvSSkgD3kRW/6cd3mYT49Wi2gC936y0T/znFJNCehLspccXJLd
+oSpWRjKkzQ6htdglQz44LFa8QKzEFoUadAwbJfPue18F++RyICNr6Iq5/DDlNYV45ILh7MyvcPPC
+xR0BblDGFJTLIG2BIidajtOItuksYJYTFqBlHrMR71o9NGC1bU6UvWWNRDOze5Yk74JgKk6eosP/
+g2N54kP7S3gK/IcvQVaXfncZf9FMDt/fdm5xl/wfrlmoV6rLE+Mks8Yklb6e333wVhdgeQnXGMhq
+7D5jwrERcnt3JWNVRxTgunj8HA6nMer+goSGGBhCibbI3T9Cacu5jXGX9WYyTcRuNVKtuWA4npeu
+gdwoXnzLODFL5EpCRiNDRveRJwghwumXwlIVq0M4m1X3fimpy0E3AV7BSw09kY8lwAMfukTGCbLf
+YXWX0ZlBzoIiKb2I1UKFygecw/0j6Ir8hjTfzKF/NkdOQn7ciV2yBgLTLiay9LrUYofGtypAFa0m
+QecQyuU+sAigCv1QZzXdjyPMLsLu0R9ABGuRXNQgjTyULxZG8DisxcJlyVaxjquVWpFI1InK3KH+
+41ABQWEp62QrBKlfX/VmagIrV7wsO6TMRR1ujtpoLtDhUD2PaKnAQ3ic5lkZnqx+8kg+08U1vc64
+iyrzTblV0YCdXG4Giqlj0pi0W3EXlK2NKX3GKHgqQ9zR3rAXr/CDRf8m+xgWN6xJPd3FgIuYpWC0
+rZB70Q+MVVapnvdsjFbk6Q467zWzYmr2hDrH0knpKJdnW46UUwKoLRsJ6mz6kFH0BDaEQ55/Q86+
+C5NRQu+ocvmD9Pb9Ug25w1fU50g1O2zcO14LKQTdvByATntMEtNQKQqL5936BklJ2FAgB5ifdNkB
+HJMHA+FvaXGW9y0USZq7sdJJnzMXTMMyYaAC82UyKmppVDZZfi54TtPUwT5mgt/80kzykHVXJ24K
+e5hA60IiUMyRC+WTUjQ3IW73VzgKSC8RvMSv7p2mFx8LJalpPJ7v8KCYVUEJ5U0S0mz15NCVTgl/
+qgHJtjxxxYO5MwFH5OPzoncIUZU/9ASUewF43QrMqfcEdshzJeHmrXoYJQWS5/nBLjk3GbRjG83O
+JpYOUmjH6Ze0fnpxmQxhWQP4tyZHayH1yfEymy20P05chYbirtWYJknpd5kwVMm3D7tQEMBJdsGL
+tzPaZPThpsyODhBjoEgh567bvAfIsn+BkZRMICPxUQ71eitebgXcwsSBh3Ov4KbLoE89CkTkRMKG
+DGsjAY4+PRfGO4bZf3Kpl1hBa7IPifT7dALvs4OUIgUvbJwCOk4UBnsd2nnuEvx6RT4bECZsdIsq
+U6nX/KsFdnlPlRiX3UkIkkQyGpfaAFoEiwxjUU0zr1MjA5354f4wGtoaLSTa66qka1EH9JT4CHld
+RHTDi4zyD6QmAg+plBdLe0mJWM7noCvqnaSVjRhpP51vuT94jyuT1T5svP9yr5V5m28TqgRmBDyD
+E7WE2UsYbH5uPkZHHiE3iqcxktSDzDcAM+JCVQjJSU9oQaun8sBeDgdjkRpI3bT7rCUOOFymleGo
+6QB0XFr61JcCHdO2TKevJ2s9oJpU9s50zr6HOyHCGY/aQaHhyStrpJJJ/myzLG61UBEnV1GEqVAq
+3j3RBYR5STFvcmWakXeuW1HBBCa4jSsr/DdHyRqpN8Rfb4QClipEP6uTunHMoym1kPg9WDwzbC3F
+kh+yQW2piPh32FUpjtkldRkVYzd72t/Rbhf6QZzI2Z4pIKUeN0pkXE+ztHsK2zJVFQqxQYZ6qAXQ
+ZKBAcnbdvqUeUuRDRLYMU+bbzsSoKmZt2p0Q8KpWKE2Il/W80Udx/Bfer5msFQNLMevm2iwjwEcH
+euUzQTE2Lg4hKZdvOQoH7RrpCrWxiE3JthlU4iXv2V44UZBuK9a5s5xELFvo84SLQ0Re2UBvYo+X
+mxS9lq/xH2tFkA7g5yr6+zdAqrEvy2UfbrSg94BQaoZDwSzDKJrhkc1rSMBqxCGWJ5yvZ3NLZgoB
+xPsAqfi7qTzAseWg5xffVAenso+4mc14qIZEv+O7YS1coY1+/XzJjGrYXhf7AkP5qu5fAfgdZwIu
+k059o9y9TAEafPBAtOc4SvMjPRL726EAjF9oqJY6eSHYpHeXUbTBBgxlszFmIhEEK1Ygd5Ryprap
+ZbGJ7CmbTE73Q+6kc4qGWBfkS3l4+bVXnr2jCaHW0i7lvq3HtoeVeJm63C6A6bfPAE2vclukvQYZ
+zJiLWUvc7DWdK+mj/HTPS0N0IQ+0jfRhWt/NlNAZgsiZw5WmKe4f8EUFeJFJCGwGiovJFiGpD0Xq
+CrQvqM3uZYL1lISpdLFcIEjfF2CWiFQlDDV4GgyP4FOa5vsr0L0ty/PKnTvQrJYCDvfZesCT+9HY
++zBsQVVWxfcUUFxkQACVX+xRHvEXU3YGUbqoM0ShWAo5mA5tAs7f6bmOKlUHxChC0FywEHDVmx2E
+HfHl4O2ptIw9EwkyZyp0j9eLnXCFG/OiI8Kxn++tTvyN7FaKe22h4gpseqROtoxWta0+zMGaNItA
+B/jXPOVmow2d2/WGkVEAju3xWgOIOtJ6/q4kWvjzzI8MzTlKu24WGB7v/Qh+skzNyJkTYoAb6IRV
+PfDkYJzdPd1IAw/DbfTRzSR/t4UWkaCQBLtHB7pK78ZiUHPbw13m5yw1WYFcVE9Irh2UIGEacVgO
+6GfQnEphJdG5D6oqRtcCfb3XQVMtsrQ0IiFkxaQaz8kZAhkFJBBcM/MWmK6q9t8UEDFLk7+LnIi3
+wPtVVmokZSOolxV/khwgFMQqn2W0CIqOjt0SglpBP1HVKljDCbi+WUeOKZu5ut7s0E0kUyGRaV8w
+NoShkFCE2hgS11SI+iw5r9Z/drx2mA9P49tlwX9g+XFv6klkIFidd0SlPjwvpI3b+I0FE9tzIvX8
+t2b3wphs/rFRtJQxJU+b8i5ILqe5/X9PJA4dnJQYoIK4O+xBX3WjN4QVvlebAtHP2qMTLQY7mC1R
+UVcqHs95R7Gg1m/BumObuKYhV4lX/DwDr/bZKir7U5ppHQuxS6vg9wuaVLE1Kwii1MariIzBP5bk
+JTQ3KRp8wwRL1/Dh/K4R1kEDgh1K7mfboF8XNGVrCgep/6vY53rix0FtNU0ZtAd70r9la75GcDiI
+gkY6UAfQdgpvZZQe98xxoKFyUgC4x8GVlAEBjbMLbvYYeb3S0NaDDJS0JECvhCmCpBeyazNl3zGB
+k9/VNJQ2lME4eQPOAZozlU5YLj8OT3NHEs2aS/f3CNRJf3pPcnBi98PNOZySHJJhjhXWqI6kMB/J
+yD6EvL2Pnu/5JypeZMpcqkXq+FZ5f0t2jmB8nRmwh8HVHeEJy6FfW10mOys6HDxR/y4YTt2bVuIy
+o/2NRGGNMtQVgz1LC7BmS/w8PU+47AWMx6EqtoLj4TSnctQM35dlrauA6jr/RjjDMLACzFwAZF9V
+y3BQYKW9BtwRBOoq+Y+2BK67CpdiU2iDHi6QXSkpHwE6RoYiI4QclDlT4BiDGYlyaJOEC/pWQUlU
+H4XEFRRr4PtzVml8L4Rp53UVUOBzn0OdpBO66GAtMAmd9aEz2qUww/dSvGRBM4dRoMBPziOl9HsN
+N8vAL2fqiilW3m22crcG+kR5YKCf8Ay0+qxjs/IZNViNxQVDqjgmtUfnLZjg0r0ZTgUEAumc0CJL
+4Vy//oRuMGMpdI4qkyABwd93yk1ydkj6qQat3TEmYDbCKKZ5E4AIU9ibyQRRDqO1WQmAlIN5xLf0
+OZJyebY7E0+ZMknMTTDszKnip2vyDaJmwllVHp5G/svpJAYYKYNsMWGphgepkQ5fh/c0vENpyS8t
+gpH0WgaB0ibPT7jQPVIOYLlo8yXd1gVFHmHB5JqB3fc7JRbyinZclh2zC/pe0bH4wCm95/dk1gmj
+ACOQOzW5hg8ueh1WdfNxDuOHrOfRqCjZomsIuP2k8OefpwVV4Fm5Jb1ZlzsyIMEzSfcx3nkgCa3E
+7C/GSeT5kbZj4ZgTxUIkYmk4qh3rJKJIqQlxcSzpGvBJC00XWTLZxLWgoegL7YTYj81jEl1B0mxf
+P9Y3JaCi7Pu/CDGUnOacbksSOUru4aGySWv0PSDRGORqTLvcXyye9/H4r8nQRsN22z2nxuxKIMl7
+5R+p9TZOUP7O1smFuvmEXbche4sHnQkJlX+VymSbHVM98jTV+zTFAz85GF6qK7dtu4WAaH0Et3dX
+B4Zikd54cIlw1ey46pUCBQMMKBaokPL+4RttyOx/sXTqcFZX3TgKB/Cd+j2s1abRuAgyqPTJ9hgH
+DWOOmS2Axy5ShRAKidEzx+zHH3cw/yI3A2eOt1xt7zXXSkt7GslZoegeSty0JJU81796NBFwNhWD
+jS2j/IP8HXTJOFXIG2O/bWd47ih8YaJboK0a/cBSnENnrY78NYt6bOdHutKv9HYvwAoWsCWTto/w
+NYqaZcwX+KO/mCh7RqahO070VbbsQqDt+ovUd6GK/pPW1FBLkb4WMHGlplXlQH+pqS0Lgj9hwXlQ
+kQ8hsUeUMAOAcmdl8TlQKin8yzKTXu6XsWG6prIFmSo98zICRG0wWv7oQ/JI0i5dRa4Bkg0nsDqw
+A+kgYQx7l0Tqzny6nu4/D29yWyjLKo8dRCeSuhb/WS7wo2VYafk2AIws9etdCU535JDQWJ3S80RI
+2YVhCdaWJfnY9Zqn3+pxN5YDcdU2Hr/qverNVWLhvgHmFlsxydYz43OUDHtHBbOe3QxYKggSQE9u
+x8G3d1jwIbzGuqvgVa/qWnf0CGRoko5Q1F8gPYqgIKMqWxNgeRD3oHzP48w/Ybm6kklp64noOY3G
+VpMrKT3LeBxTHN6GAqXFEVjEv80Q4RtzlL9p4q3FrXdZURybNKcYge8t8TW9ORM5QcMMSS6/tfci
+6T3BIoyNl5kwkcxh+Qz9Fd2JLf5Y85pxrmakcmWGTpWn0QCprrPGTBPHLSHL9z1w/vbrXv34BQYR
+0ovhbaHwE2NTB8bHBJnOHCWI3InTtP/lB8ukADZt0D7UbK5zABeXCblxzjpsj4dDyXozWWDc8Md0
+O8XXxjnfwj5RApQy/fAsqmsBBP1OB9RD2XBwUz8SPx5jns6KaUAaOWe0i5XodJF3jg==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	ROXddm8Vblc3ohQTllXbRoFDW/w8dD4iM+spZLS+phB9l4yyVkWhaORCkh0bNdAhs8iMFjvQyw5q
+faPMIzJSZb6qTYObZSnqTQs7YVi47+YnB3+AS4wbSg/Isy3FLz41YwDNsZE5cr1peu1c7uyGJrib
+6dXOOTP32JFn0gZoLfNMiZ4WwjMH4qHMMVh7v9TWQKiRkXdH4/dAaNIZWuhT6tK487xMNiqkHZsn
+q5WRhiNZRj5F37+n5VbtBlOc42OBHmrRnuTN6vW8u9IJWlFmLeFiqR3Iy/VSp9H6UXS4KEQmxM5X
+5u/FKz1l/qUA4Yrho29gzJqcRSADo99n/7joXniXmp6dK45llJu65/hryZTZRimm/Q5Mh7KJPEXD
+6eHnlBiPccqvd0O/z/148X7a+V4hlALnxphVsqfISSpVHuUwmx4x0H1TrBqfQkD6XYnYxigXvmFU
+dnPeO76uVHRe4HfYf/uEjtjcrPTdYB3Zh4TriO/1ajdu14ofNpbr2m6B4q7F6PUZCZuOR1OZWpRc
+1mWlE/+OOp48j2B6+SNeqa3mvlnCRXoLIcZngwZ6igyFbH8E2xnTo4Pg9D2lFFJiDx/GPbGhnyE2
+dHroC/vW+AJTCgYo0wg5BsV/MZHEGUrhJI0qS1eaTGngalAT5qYFz+etJRZLaSnCLX8F0VsfTtyX
+LkcGyrJN4HfOTqZ15/kADOFqQ/weLD+v7axFQ4xVNu5asR1Wo2Rle779DlWkz3IBu5XIJ7wvJsYa
+XJq0xrZrsH/0TLJHUsJULf24oLGY6bk7QxGmF2SbPz26XK0NrBsTK57kRj3kJtSoCmnvdnVsbt1U
+6mhUFzK/SIYUMB1mB/kK2kFkLUfvMBH1Ibib1F7cbIKu01Td3Prdz7AUsRgP5bEu3SDlzNzWXqJP
+1WykH9qVxbn545ciGUYvf8E9hNgE63W4i2V6JT7+6snyZ7hKBcvExGAMVgUSq9NUTcvQtwFhZr2Z
+lumlssHc4eWGy8r0FALbevR99p+Ydv8lyRezrQYr9DqUE8/klRdAOaAC2pXJSQ/wMhUlPXS9LV5J
+UvkmHmjJooE9mX+VIOak0AUuMfB18wCWqZqOXyFTdDBxsdepeiqNMAE41v5NBJzTAAIH2meFaKf0
+ue6nr9L9Fgz4KRi8YeMpGrSK793by+ltRHCy3Rba8pSiV+OVRueM9aWMjbWpSZuklzSNglFKu6ZE
+jVJxT0CAT4w0vcriVl5RwpFrxR+Vi+vJTpG61iq1qtIF5Y7FcrueO3u6ZRMo4wr+cD3jeiWZGMm2
+6pkM0SBP7+I1eRWsiP63o1kjBt5Rs+1qKNFU25yeUeChv6NCd5ajvNUYos4iYSeJEBFvkCLgUCHD
++g56SBuhy8VRl+6XnSHC9XEUtB63aDsOjzCgeinREP5rZ5tycVS+xD9Crz/Bumtyi55j08hNPg3h
+m3tDq23HjX4jruqao+NKuNZLXg3xCQMU6YAcvZq9HH+8Y28Mf+yyxyr40VaxveKkzdZdVOyrkU8Y
+yvnBAg9KiL2hvffmNz0WO9+4mZrrTQOFvuk4BO6GPp/9s9X9r0HpoK8gdMztGnDSW5G0oisrj4FR
+cbqrs2K/66ZK7y42tjzRN170bZwgvYTWRM+0NZdMTcFtOJHSS6aqflupkH6AUvkJq0vW7DblCOQF
+4E5kR3o3PpvSkQJkBQMKJ9JrOvAAgHQDy8AXlPKzWC644ILLynf3W1o6gmAwR92gsutcXjiqNpjs
+cURH65Q2JSVl3FrUwfFCB47VpUD/BWIGIQd/rd664287D3Pd/c5anDWlqq8GVfXlNXvP/eYYX+7r
+3vZyl3vc881xj2Nt8W+eN88Xd5d7Hndv12mM8X/Wfz3sdRdzjvP/29z95d1nvPnV9q13u80/77uz
+1+Vrv9v/OO/tefk19xxbjnfHPQ//a5y33buz9z73Xsae1jzbqzXXV3NQ9bV245uz5vdt95hri7PF
+e+fcaUpVexrUR2K9m/Puqr7d/vuaY4t17rDd/xpz7eXLL7dd1pSq5txv7nXH+Xd734x35+38m/v8
+/Opuc89y7N3XufvbeW+5z1jnnLmmVJ9nu3fWXZe5tzPndpev/S5zjDWo+p6Hsd03W7659rjfu7sX
+Y/572/c6rPHVHM+6y5jrnT3v6o7/5brXnHsY/+U48857q7Xncftfc387Lndb67vztp639X/ubu48
+y2lQVW/7PHudZz19d9dl/ZzG93LOdWez5X83/rf6t7ev9jrM7+/Muff3n+s0qPocW+x1G/++3nea
+g6o7Tam+p0HVt5nLbz0vW91x/8+v7bjHve56OOd/qzmo72lK9d9qUFVbzUdyddb/z3V+L/9zK0m7
+6JGMYIGPBDU7SzKmYElyUEJ9aqelpEoiiY2g6JHEUoqFYkEALNVRtItgSjaGXh6p87CgWN7C1QOa
+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
+	]]>
+	<![CDATA[
+	DE+e1Mb8cm9591xr3GXsdb89ne1/1tnLNndc57v5Z/6/b+4wtt3F3Ht2dzdz77e+3Nv43tfc4v0e
+tt/9hxP1NNMupuRHUq3H8fO9X1/8nPNs/3qc22w77HX7u+7vW72v7m7u/nac5p3G2Ht9sd35drm7
+Nmd873OLdc54b+9u61lP83z3486zmW/u7df65k7z73R+j3v7cn05/9x5Om/cWS9v77fF2+ue/+/d
+cYs399zyzO3zx7fbmPt6vct55n5n73Yev/m3vvhxp7us88We/p27xx3m73HMLd5X6y5/lz972tMc
+1P9/rDv7NmvNtd56Z7v5W1oqND9JtdVSLc87/vvu599x7OHH9t7t5W7nrtu321nz/c/9ttbi3eFr
+/26sd7f59rZ3O80x9vb1sM6ae3bbffdr/DbjjuO8P3Oc73Ob77YYc09/zprfz1vb1zdrUFXr7jH2
+urtvxlZrq/9ijvnmWWPPZs1B1VtTqr+13jfj/b/za8/TmHvc4s5uD3uX59/dztjuTmOtubf6ejlv
+7mGdc9abc07jzQMt0BSScCoghAa7YLEWu2CxisUpIlGWR2izGUUGQPtQLEANn7dJoDhAvYZ5gHoN
+4zlJT+VKGHQoVkEmKTePhy69waqEpDaU9DX6BwRi9KmFz9swvk0FdJKeie5QbMKHcvlYQpZNJQGF
+VxnzpOdE7qf1eZvIzS5NCCUzlYdi0clQIP4/ODUxGkp6saQ0kTtwRQuhEMt00KlcGUSFCI9RN8CR
+8P0e+BovFwToID8cO1VgEj0oapwPxeJhksUGjmRS09iE8IgDcnWqG1jlCaNA/GgcjBRx7IUBju8f
+igUuRY3TwfUwUfEBx0ZRXvQ2A5GaBbMT5lqTbJppS4P5yNihMK6GT2bzUCxG3YnhItixSblYjvOS
+0kRuw1RxDroz1OhQ7ASmCTGOiANi9KDGJnJlIoeW6BNBMQapr8IBpRDGpVNYVTigVak7QAwljOdj
+bSAFzeiWxVonZTHM/lPSLBbFGJTlGHz9Q45EYcjbxPYdQsZiL9bEOw/FAoI6H+7pflIQo48YGHmb
+cvJhaAwo8sA4b6+OaWJungQEkudqTJOTSBIMcMJLY5qcA4aEJUtgeDRIEZHaw886QgMVHbS6iFsa
+mtsCH4oFS+LVQHlIPbgal67bLqTE7eBiTnyLaFVCrzOipjq4TPBEEyHqoBwU9udlGXlCc4CB4jFg
+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
+	]]>
+	<![CDATA[
+	AAA4IBQNyQSDySxJoQF8FIAEXEgmZEZKLjQRSqTBOByJcSAGUhTFMAYZ45BCyhTROAEYYbnYBhAL
+OafbnllCUCvyfpvm8uJgnasKE6uydfUqzFxxqjSpZsE2yewSxKLbzIMntr+cxEKYrFI5ua+Y0eIt
+uHJdrRSubkEvJBhOFvzMoBZ5z3TK/lBacgVNhyOSBJQgYhdsjZ4s/oOv8AnWtsOUGxSxmMbPpyja
+LdgKS1Fcl2uXVrtnJq4XDGS9PXaYCU6QgzLARsZWumAXJCsKB6FmsywEhZqYTKHY+rVRqgiP3gTG
+qg/N4MRXJuBvKnrO3t9KDqXD4EVqZSGzIg+HHR/QqANXt3Pla8WGNTqEpIO15/ObEVPr/8W2BB8N
+x32pLN9KQwQYn4+VNI6HuAomcyF9nKIUNFfzN4WdYIu1RHB2Axjt4q7GMZwj1OYwXIe7ts2jszcP
+Y5GrnBSI8ikhbVJiHV4zkv1r9s6xCMLmenHIWdUWlyR3unDxNnESuJksfHk8ETQLwMcevbB3+qgJ
+CikFzquakfWYBZW6BrTU0Flg/6asNKRrwro0/Q8mdv8obthGZiMT9mCh2ShCypOaEpkagGMXQ/om
+jQRGuWXws3jdvE2aUymDK0p//1/OCFGkDfsPo3Rr+sMTOtEK8brT/IqKvyEhpRy4cZwqqLD0TF6c
+T2oC8qs38HX2eU/wkXpeApY4+xSGXMLw+ojPRKx9fVgxUbRNTBuReGMPKYN6BLAu3EiwoqDFpIwi
+0m+P10ozyrCEaF6oABgXqHOYmDaedh0wtFuDZdz7P4BLHRz1dXLK8pcNPYKZQy7tNcim2XLZ4o49
+GEGPgO9cUlZRzE6jyMwMfbUWeMmEY7snoijz1HvNUhenqUqnZSRnwoxOSDzPhrUPCMQQJXIOC6Yc
+jPIh3ji6wKdKx0vWRFTirlkyzGx6eM+EEDer4BCHfdMR0gPDEDVfaeP4hRLpudbOhX0Osc5q4U9x
+ciMZhNgnMhMGYjkKIYY1QJk3h3jhkzwgxLN5+cchnmetvQmU1oQYONEEkGr94wU5yoAfouajFjya
+gENe6EurZUJc4Oc5OOMBoocYyfwLDJsJtJDA4oHT5R3ih4KjKI+tjHjCvRLQ4SGy3XPABSFezeak
+PsRzlIvCuLYmxAhaAcWH+DfRwz7hPYRYiFvZ3CTEDIieED9s1UXjIf6JsmU1OAcDDVwYjncmxCGv
+/GNVsxQHKP75ViPrIQ7LpAv9wdCq1wZmCPFAd07OUuHOAlmSm2AIcYAvXlwakQi8Emrm0u3htDaX
+8Bp7ENR46rCnisZ2VTMPXkIq6rJGiJ0mSeH2y9L6Tp8qkzEI3GVbwpGHyyv9lE7EVz1Ph5A9nC59
+bCMXJjs+1TNwTCzBpU+ugpQqPH3+GpMiYp2L1k6gAWEB9Q0baKOgoC7PdkBerCjAkxVAWVKnq/N4
+tcKYRRP73lbqz58R+5LQflHK5w/YTT3lcwNMhWcd5G552oeBiF5bd++A7nQowigDPVB4XKUFjmy2
+iGUew8y0D4lJR3cxRRejLI83IGLNAjNLofcrXDIBDWVDquNdkktlgBfmDfTp2s8gThfe9LhnUVdt
+8VxmIxPoY1qFhfvbtIlxWaQuuf5S/GDsohML5mpgD2DxrulO3ir8D2dUocLycDqssYqBjoVVivcu
+FJWVeHjfiWr0ri2gW0VeF5ruDgqoUpba3NZnEtTeNOQ/hE+795xTYCgbWy+6rOEgVOQ4aeKxILgd
+nr1YTvqD5U046iLCq+XSiTxfcmWA28L2hrC81tISPwuHpvaPoZGDG5JurdFRW6kRwun47ISoWuH4
+/Hm40XNu4rFV8wSDv7Juq8/ooy73fiDn0wcMFK2fToF2hvUhmqq2kA94egbL0glrEkd6ozGq250z
+eEQOLAmOyFP7ozN4avvEpQbHgCbwurLCARNnMMncy+tAmOFYzc0mmSZpM/q21GC8CuV1dG2ZacjF
+Xd1150zbpOUM1n5QZQ9RmCdv3pq5I9hkCMPn76mH3AHYCXi1ALaDoIYgv0MkaNmd2s7lu0+yOEsu
+Wyr4huTozgSgEr6EmGmT1p4Fv58ny/WmIQRzgMwOIfc9dAqpsL1WBSALlQLxkjCr1sYXgJgrRGHQ
+zQLaNfJXRy0a4ODKf5BHCkdmL+1Mw7fCGc0ozGQ8KsTEv0uwYhMPX/Ik2Rer7nwyrXzQuYzSgMBK
+Vn88GRmCcpSMSekSmVxWaZjPdTexaNUDFZO71gbk8+1en2wEk4nN9R/EhPypf4R7ssdzdFmfi/tG
+FG3xMoDkjw3dn0aHfYfxqwuzPdDCayMye5muCduxywY8zEhVcJfQgNNfuCXamQSIvT8wXoITA2Od
+dhml9oo7CUUOR67SQvaAqgEhIs2H4wzl8QhmFgyinSP5qJBWuiLwdYIVJ4ZI0+EqP634ydv/JYCA
+QTcmyUdlEwwnhAuSXWQa01UZ9Q2+/UUDy5XhN2e0Murob3DOsf4aSJqALmSDtfOPnj0P50d4ohhg
+g5lqHlWaN1iO1HHY4P/pTqgokHv+BhP/JTCE1T/E+6TSmNerRGGDNx6GF8Cnccna8HuGIka0Obfw
+Bu/1LC4niGGZuDYwYYOVCOyXwtje4La0V4QpbLBy96brNICr7E2SDaYDy1Awlrfp8GKDlduvc96K
+IC+TAf55mytc3nBmp25RpjJhDlDQqLKkQyZ5tEgFdvm2nIvUct2hoAUPoKa7oCR+nu1IXvAzB5vW
++fhtsRdEpKI6HcUtug7Qho0SPQRPwL366c3gsTL2VsUDv+7nyPcflPBRFskZbwPK+4RNJWdHc3T3
+PIVC/xfMGMl8ZcRw+VMel8ZioD56MUrEyI+K+PkQZkbaCJ6ajS+4RcDPZZwjrW3mIFTKMJniVLxQ
+QRaqmWjQp0eutpkpEZ30z8yd0zhxZhv/dTpzAbU0EN339QHllpZ6qmRHlTalpsqGXWb8M2mldmGy
+5Vd4/hPTSq1xdvJLr+snThnRjS+KCBYhdfVliVbR1fQvySL0E8TFrvAF5myVUTa+fUXzGlsX/OgZ
+r/dWopyFIt4/EVwTkiCzCc9NqLlBVpd7U+rfxf6tOfNERlUSJ2nm+TXSelomP/XLXtbOQS8QOy6D
+Y0JSranxBog71X4npfJtz0s1iXYEeLvkQhlk61t6beZaLWbNjxUHSzl8vwzCj6vbSrQkkH8IzreI
+YQawswA276y7I4jSaG/bE9AA4hyKAGsIFpqjkSN/KccjCijTkG+9qmIWwJC6vIIFxSPA4kUDhlbO
+jrkz9jikI8DehunQelIAG/f0dgeKqs+htSIB1ueRVoeDIDcstvUFMEeS338N6TICbGRBeFRrzoYA
+3yTgAkbNeldaWW8+WE3fUACLeZ9+kTw+Z6gfQAYf1/NcqVpR0+hEcWq9I2nHR+gBvDPmkFSrmlWQ
+3FeMm7xPuVuFGo56pCWmJTFXHotBZgcdwcbLMbdOZlRvdEuGp0HbiByGNwZyAaFbPaztmlvBTC1v
+78DAcjnG6lsFgTrDpfvqeDiiJAirX0RocePS+ecDEnnFcWcM2zC4uHWc5KjssF+wP/vUXZ4Qyt5n
+M2Y0BjXM2FJUfimaU9dBKI66R3g7lc8UVgrqLGJcpBSF74R3jmy88UpM6OMPcypHBK3WhPMqnV8c
+dVzxzDxo9AhR8YcoznIDuiMgatGvvcHbAlY+TtaqejEwU/+mIKhuuOf8fAAX3rdmu6ZfAptOOXO1
+0vRrRAHKcxMNl20ScyWlMg4A2IKqNjL6smyTXEf6NDXmao3ikpWrvxEC4TWmnw28qq3FStFVX6B3
+5msuJQNrdcHl5td935RoIq68sVrR6ALjmJjMz+GXlJV8iYGY4wLtqb4zQN08hW95L3dc/YVSqgm4
+JiMO5XRcqoRV/HgeiZnck9ed+TBVIq7oJeDjfQJW9vVM5O3nWmAqVvSc9509F/mZzhGZUVHVO8FG
+pTmvx796lhhjXf9tNXk01dHep9Ql6zfVV/7qvdCkmw1iJwwDEvytSg4NBCCZM9JcdhS7q1ZpvufY
+QVc9Ux0c1P4SD2a7AGzNhOx2IupepBZxN7wTT5mOvp5j9CGojdJxZlN2Gy0Zad7imWenbKKkPjim
+06SPjRqWx9+F/dpMDYTBNFMjVQQrGEdqD1ftLEo0pLiAIu0RNvrguUSakiwqESKG5OdH6Upix6Um
+lRJRf4T6Qqp4wEY+olbUyV5hWIP0VfNlPjfgKkzjXZ9ykb6B/kEOVqOQmK0MpP7YhogCzfR2k4T0
+xaPbk2HYQBHSFyDQfCQhydQLkZ9EgOaTlmhEKZXw+QbJAz5FzV7pq736tHHPy3gdE3bp63MlQTOQ
+681Nguc7fE2sW/rGcMDiCYxffAg+pglNmKbSuApXWkAmX5y5RhsyXY3GwILfxD/+rFPFJHRDiRFU
+Rntt4M2EJUOpVYYqXHMjN+AcsdLf4w5PSIbVUm4KFNoUVy7humCgxiqRdfLRnJzGbiNBmSwyfa0v
+3ZZ5W9xrgK2ZDE73PT6F81GZBexpU2f1J/dj7oUVwdDEBAQmz44gyBQMn0a4wSG7zalHhlkrMyzZ
+qZPMzcC4F6IhuLSGAdhmEFQTuTO544OBXVzi2SJTdOEuUtAJ+AH+f1QD9y1OVsmPGskTOoesTAYt
+5TYTr8TU4MqE6vj6+l3c4OwRWhNbfHZnHA0hxMEuLJNGCe7Xz88tnRqkfRFsuWaASOq7gWAwNiSd
+WY+IydfLUGDRzRxi+5kTuij3EjClNRJ6YEltUTeoI88XRb16EX5m3mgeI8GVjWmukm1fYpsenFy3
+FiX9J0WTjLP+8ea/4s1ExvSfhSVjJHOxM2kGsxPpIOoib/Eg6FoYMJiJpdyG8gJj3k9rk5u8dpFq
+60WZIilmUETO0iZ3UqWUaNvOpOpY4EJq+hOl6gw9ijJwoZde33TTGSzCPMERtebM2lNmPdpmNFRz
+pmMQCvXNgcvBcn3DY7+VCvHMHaXXt5RVIziGor69LtcXyueDM2IU1xezVEsr6rimvvqy6+v/HAcu
+FQenL9cXjjvLIJquvO2MX18Fr7F3eMQN7a45FhEWmfZ4T8W+dyaYInXZOIODA+uLVT51/cV+gApO
+Dg5hB/70jOjKlxhgEJzcwlWTwSFKy1ZcmaKWyh2SpbObiueHKLMHh7R3uS44lI0VUxQsR6kopnyu
+jezB0XjTxnHs4H5D4ypocHRJ2CcjqXZIvjjWhbrhdQEj2iLNjiAuYsKZD+aetURRui6Iz45Hn6qN
+NHaGtyAh/LaBy1wCALuGIVIjZ5B7qC1B94O8p+7aSpDU3KwmNeKgUjROhtVpwIPgEEUwhScztZwy
+v90O1Iezdav6ElNy1fK26k+XSXtTA3sW00/tODLB6kdpgrp2We0O8sqAYkpcM8IayPUipGK8eBZH
+RgnwB8QPdnQg5nxKakW7DV22J8hDFajYjjX6uz6/b5ZKw310gscFLwg50Up9172t5Q==
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+	<![CDATA[
+	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
+	]]>
+</i:aipgf>
+</svg>
diff --git a/web/images/i18n/fr.png b/web/images/i18n/fr.png
new file mode 100644
index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71
Binary files /dev/null and b/web/images/i18n/fr.png differ
diff --git a/web/images/i18n/gb.png b/web/images/i18n/gb.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff701e19f6d2c0658fb23b1d94124cba4ce60851
Binary files /dev/null and b/web/images/i18n/gb.png differ
diff --git a/web/images/i18n/us.png b/web/images/i18n/us.png
new file mode 100644
index 0000000000000000000000000000000000000000..10f451fe85c41c6c9a06d543a57114ae2f87ecc1
Binary files /dev/null and b/web/images/i18n/us.png differ
diff --git a/web/images/inrae_logo.svg b/web/images/inrae_logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..032bd8f746fe474b456338cc37df6cd70d8b5348
--- /dev/null
+++ b/web/images/inrae_logo.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+  <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+  <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+  <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+  <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+  <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+  <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+  <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+  <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+  ]>
+<svg width="106" height="146" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <style type="text/css">.st0{clip-path:url(#SVGID_2_);}
+    .st1{clip-path:url(#SVGID_4_);fill:#00A3A6;}</style>
+  <g class="layer">
+    <title>Layer 1</title>
+    <g id="svg_2">
+      <g id="svg_3">
+        <g id="svg_4">
+          <defs>
+            <rect id="SVGID_1_" x="-21.5" y="31.8" width="148.91" height="70.61"/>
+          </defs>
+          <clipPath id="SVGID_2_">
+            <use xlink:href="#SVGID_1_" id="svg_5"/>
+          </clipPath>
+          <g class="st0" id="svg_6">
+            <defs>
+              <rect id="SVGID_3_" x="-21.5" y="31.8" width="148.91" height="70.61"/>
+            </defs>
+            <clipPath id="SVGID_4_">
+              <use xlink:href="#SVGID_3_" id="svg_7"/>
+            </clipPath>
+            <path class="st1" d="m4.9,53.58l-4.55,0c-0.18,0 -0.33,0.15 -0.33,0.33l0,26.33c0,0.18 0.15,0.33 0.33,0.33l4.55,0c0.18,0 0.33,-0.15 0.33,-0.33l0,-26.33c0,-0.18 -0.15,-0.33 -0.33,-0.33" id="svg_8"/>
+            <path class="st1" d="m30.55,53.58l-4.53,0c-0.18,0 -0.33,0.15 -0.33,0.33l0,17.61l-11.16,-17.78c-0.06,-0.1 -0.17,-0.15 -0.28,-0.15l-4.56,0c-0.18,0 -0.33,0.15 -0.33,0.33l0,26.33c0,0.18 0.15,0.33 0.33,0.33l4.57,0c0.18,0 0.33,-0.15 0.33,-0.33l0,-17.54l11.11,17.71c0.06,0.1 0.17,0.15 0.28,0.15l4.57,0c0.18,0 0.33,-0.15 0.33,-0.33l0,-26.33c0,-0.18 -0.15,-0.33 -0.33,-0.33" id="svg_9"/>
+            <path class="st1" d="m49.68,69.2c1.41,-0.65 2.54,-1.56 3.36,-2.71c0.89,-1.24 1.33,-2.79 1.33,-4.62c0,-2.67 -0.87,-4.75 -2.59,-6.17c-1.7,-1.41 -4.14,-2.12 -7.24,-2.12l-9.25,0c-0.18,0 -0.33,0.15 -0.33,0.33l0,26.33c0,0.18 0.15,0.33 0.33,0.33l4.57,0c0.18,0 0.33,-0.15 0.33,-0.33l0,-9.8l4.57,0l5.18,9.95c0.06,0.11 0.17,0.18 0.29,0.18l4.89,0c0.18,0 0.33,-0.15 0.33,-0.33l0,-0.23c0,-0.06 -0.01,-0.11 -0.04,-0.16l-5.73,-10.65zm-1.73,-4.18c-0.8,0.72 -1.94,1.08 -3.39,1.08l-4.37,0l0,-8.17l4.49,0c1.5,0.02 2.63,0.39 3.36,1.1c0.73,0.7 1.1,1.73 1.1,3.04c0,1.26 -0.39,2.23 -1.19,2.95" id="svg_10"/>
+            <path class="st1" d="m71.8,71.39l0.04,0.1l-7.67,0l0.61,-1.74l3.22,-9.25l3.8,10.89zm20.29,-13.46c1.15,0 2.27,0.21 3.34,0.63c-2.68,4.95 -6.98,8.84 -12.16,11.01c-0.23,-0.81 -0.34,-1.63 -0.34,-2.47c0,-5.05 4.11,-9.16 9.16,-9.17m13.8,9.17c0,-1.85 -0.39,-3.67 -1.11,-5.37c-0.13,-0.19 -0.26,-0.08 -0.31,-0.03l-2.74,4.3c-0.25,0.43 -0.42,0.73 -0.47,1.8c0,0.07 -0.01,0.13 -0.02,0.19c-0.45,4.64 -4.37,8.28 -9.13,8.28c-0.89,0 -1.78,-0.13 -2.63,-0.39c-1.45,-0.44 -2.79,-1.24 -3.86,-2.31c-0.04,-0.04 -0.08,-0.08 -0.11,-0.12c5.85,-2.58 10.74,-7.08 13.82,-12.7c0.67,-1.23 1.26,-2.52 1.75,-3.84c0.05,-0.13 0.01,-0.28 -0.1,-0.37c-1.02,-0.86 -2.16,-1.57 -3.38,-2.1c-1.74,-0.76 -3.58,-1.14 -5.49,-1.14c0,0 -0.01,0 -0.01,0c0,0 0,0 -0.01,0c-4.72,0 -8.88,2.39 -11.37,6.02c-1.52,2.21 -2.41,4.89 -2.41,7.77c0,1.3 0.18,2.6 0.55,3.84c-0.63,0.13 -1.26,0.24 -1.89,0.32l-6.6,-17.47c-0.05,-0.13 -0.17,-0.21 -0.31,-0.21l-4.1,0c-0.14,0 -0.26,0.08 -0.31,0.21l-9.93,26.33c-0.04,0.1 -0.02,0.21 0.04,0.3c0.06,0.09 0.16,0.14 0.27,0.14l4.75,0c0.14,0 0.26,-0.09 0.31,-0.22l1.59,-4.58l10.65,0l0.05,0.14l1.55,4.44c0.05,0.13 0.17,0.22 0.31,0.22l4.77,0c0.11,0 0.21,-0.05 0.27,-0.14c0.06,-0.09 0.08,-0.2 0.04,-0.3l-1.74,-4.6c0.74,-0.12 1.48,-0.28 2.21,-0.46c0.02,-0.01 0.04,-0.01 0.06,-0.01c0.02,0.03 0.04,0.06 0.06,0.09c0.9,1.26 2,2.34 3.27,3.24c2.33,1.64 5.06,2.51 7.91,2.51l0,0c0.01,0 0.01,0 0.02,0c7.59,0.01 13.78,-6.17 13.78,-13.78" id="svg_11"/>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/web/images/loader.gif b/web/images/loader.gif
new file mode 100644
index 0000000000000000000000000000000000000000..41b695c3d39826b1d1ec5f8340b29dcefc15c693
Binary files /dev/null and b/web/images/loader.gif differ
diff --git a/web/images/loader.txt b/web/images/loader.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8c9f6e18d2308205a3498f8024fcfe4e029e7119
--- /dev/null
+++ b/web/images/loader.txt
@@ -0,0 +1,6 @@
+http://www.ajaxload.info/
+
+    Code : Yannick Croissant
+    Design : Kath
+    Generated gifs are totally free for use
+
diff --git a/web/images/logo_home.png b/web/images/logo_home.png
new file mode 100644
index 0000000000000000000000000000000000000000..eecaf2de53edf7967db5f2dbd8aa6f1e159e201d
Binary files /dev/null and b/web/images/logo_home.png differ
diff --git a/web/images/main/icon_padlock.gif b/web/images/main/icon_padlock.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f70cc953a51da12b8c8757fbef6df64b6ea97e9a
Binary files /dev/null and b/web/images/main/icon_padlock.gif differ
diff --git a/web/images/puce.png b/web/images/puce.png
new file mode 100644
index 0000000000000000000000000000000000000000..e11cb0d6fe824caa37dd712dc0057ed8def58749
Binary files /dev/null and b/web/images/puce.png differ
diff --git a/web/images/puce_hover.png b/web/images/puce_hover.png
new file mode 100644
index 0000000000000000000000000000000000000000..f231d32db8f93e30dbdf0a2d28095cca0b10221e
Binary files /dev/null and b/web/images/puce_hover.png differ
diff --git a/web/robots.txt b/web/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..214e4119653f9c6a4c48cd0ebb06a6754f00f62b
--- /dev/null
+++ b/web/robots.txt
@@ -0,0 +1,4 @@
+# www.robotstxt.org/
+# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449
+
+User-agent: *
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff9f2c860d34a98b14605df339b1cb9785cc84c3
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,110 @@
+const Encore = require('@symfony/webpack-encore');
+const LiveReloadPlugin = require('webpack-livereload-plugin');
+const glob = require('glob');
+const path = require('path');
+const fs = require('fs');
+const _ = require('lodash');
+
+// Génère la configuration avec l'aide de webpack-encore
+Encore
+    .setOutputPath('web/assets/')
+    .setPublicPath('/assets')
+    .cleanupOutputBeforeBuild()
+
+    .enableLessLoader()
+    .enableSourceMaps(!Encore.isProduction())
+
+    .autoProvideVariables({
+        '$': 'jquery',
+        'jQuery': 'jquery',
+        'window.jQuery': 'jquery',
+        'moment': 'moment',
+        'window.moment': 'moment',
+        '_': 'lodash',
+        'window._': 'lodash'
+    })
+
+    .addEntry('locales/en', ['@IrsteaBdohInternationalisationBundle/locales/en'])
+    .addEntry('locales/fr', ['@IrsteaBdohInternationalisationBundle/locales/fr'])
+
+    .createSharedEntry('vendor', ['jquery', 'lodash', 'moment'])
+
+    .addPlugin(new LiveReloadPlugin())
+;
+
+const bundleAliases = findBundleAliases();
+
+const bundleEntries = findBundleEntries(bundleAliases, /^@IrsteaBdoh(\w*)Bundle/);
+_.each(bundleEntries, (module, entry) => Encore.addEntry(entry, module));
+
+const config = Encore.getWebpackConfig();
+
+const vendor = `${__dirname}/vendor`;
+_.assign(
+    config.resolve.alias,
+    bundleAliases,
+    {
+        'translator$': `${vendor}/willdurand/js-translation-bundle/Resources/js/translator.js`,
+        'sonataadmin': `${vendor}/sonata-project/admin-bundle/Resources/public`,
+        'sonatacore': `${vendor}/sonata-project/core-bundle/Resources/public`
+    }
+);
+
+module.exports = config;
+
+/**
+ * @returns {{string: string}}
+ */
+function findBundleAliases() {
+    const aliases = {};
+
+    // Enregistre les dossiers 'Resources/assets' de nos bundles sous la forme '@BundleName'
+    for (const assetPath of glob.sync(`${__dirname}/src/**/*Bundle/Resources/assets/`)) {
+        const bundlePath = assetPath.substr(0, assetPath.lastIndexOf('Resources/assets'));
+        const [bundleClassFile] = glob.sync(`${bundlePath}*Bundle.php`);
+        const bundleName = bundleClassFile.substr(bundlePath.length, bundleClassFile.length - bundlePath.length - 4);
+        aliases[`@${bundleName}`] = assetPath.substr(0, assetPath.length - 1);
+    }
+
+    return aliases;
+}
+
+/**
+ * @param {{}} aliases
+ * @param {RegExp} nameRegex
+ * @returns {{string: string}}
+ */
+function findBundleEntries(aliases, nameRegex) {
+    const entries = {};
+    _.each(aliases, (assetPath, alias) => {
+        const snakeAlias = _.snakeCase(alias.replace(nameRegex, '$1'));
+
+        for (const entryPath of glob.sync(`${assetPath}/entries/**/*.js`)) {
+            const modulePath = extractModulePath(entryPath);
+            if (!modulePath) {
+                continue;
+            }
+            const moduleName = alias + modulePath.substr(assetPath.length);
+            let entryName = snakeAlias + modulePath.substr(assetPath.length + 8);
+            if (entryName[0] === '/') {
+                entryName = entryName.substr(1);
+            }
+            entries[entryName] = moduleName;
+        }
+    });
+    return entries;
+}
+
+/**
+ * @param {string} entryPath
+ * @returns {string|boolean}
+ */
+function extractModulePath(entryPath) {
+    if (path.basename(entryPath) === 'index.js') {
+        return path.dirname(entryPath);
+    }
+    if (fs.existsSync(`${path.dirname(entryPath)}/index.js`)) {
+        return false;
+    }
+    return entryPath.substr(0, entryPath.length - 3);
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..e1464d0a7208ffa62e5257d053d002b5bdf7bd84
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,5263 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@claviska/jquery-minicolors@^2.2.6":
+  version "2.2.6"
+  resolved "https://registry.yarnpkg.com/@claviska/jquery-minicolors/-/jquery-minicolors-2.2.6.tgz#00b4c1e4e31e4da483501785d5c2ed3fccfdedc9"
+  dependencies:
+    jquery ">= 1.7.x"
+
+"@symfony/webpack-encore@^0.15.1":
+  version "0.15.1"
+  resolved "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.15.1.tgz#4097cb94fd831443126c75e97df6691f9e02b275"
+  dependencies:
+    babel-core "^6.24.0"
+    babel-loader "^7.1.0"
+    babel-preset-env "^1.2.2"
+    chalk "^1.1.3"
+    clean-webpack-plugin "^0.1.16"
+    css-loader "^0.26.2"
+    extract-text-webpack-plugin "^3.0.0"
+    fast-levenshtein "^2.0.6"
+    file-loader "^0.10.1"
+    friendly-errors-webpack-plugin "^1.6.1"
+    fs-extra "^2.0.0"
+    loader-utils "^1.1.0"
+    lodash ">=3.5 <5"
+    pkg-up "^1.0.0"
+    pretty-error "^2.1.1"
+    resolve-url-loader "^2.0.2"
+    style-loader "^0.13.2"
+    webpack ">=2.2.0 <4"
+    webpack-chunk-hash "^0.4.0"
+    webpack-dev-server "^2.4.5"
+    yargs "^8.0.1"
+
+abbrev@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+accepts@~1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
+  dependencies:
+    mime-types "~2.1.16"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0, acorn@^5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7"
+
+adjust-sourcemap-loader@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.1.0.tgz#412d92404eb61e4113635012cba53a33d008e0e2"
+  dependencies:
+    assert "^1.3.0"
+    camelcase "^1.2.1"
+    loader-utils "^1.0.2"
+    lodash.assign "^4.0.1"
+    lodash.defaults "^3.1.2"
+    object-path "^0.9.2"
+    regex-parser "^2.2.1"
+
+ajv-keywords@^1.0.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv-keywords@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0"
+
+ajv@^4.7.0, ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.0.0, ajv@^5.1.5, ajv@^5.2.0:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    json-schema-traverse "^0.3.0"
+    json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+almond@~0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/almond/-/almond-0.3.3.tgz#a0e7c95ac7624d6417b4494b1e68bff693168a20"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
+ansi-html@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
+  dependencies:
+    color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+aproba@^1.0.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-flatten@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
+
+array-includes@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1.js@^4.0.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^1.3.0, async@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.2, async@^2.4.1:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
+  dependencies:
+    lodash "^4.14.0"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773"
+
+autoprefixer@^6.3.1:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+ayepromise@~1.1.0, ayepromise@~1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ayepromise/-/ayepromise-1.1.2.tgz#e04d6857c183df6d101787c3636d41691db80894"
+
+babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.24.0, babel-core@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.0"
+    debug "^2.6.8"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.7"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+
+babel-generator@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.6"
+    trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+  dependencies:
+    babel-helper-explode-assignable-expression "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-loader@^7.1.0:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
+  dependencies:
+    find-cache-dir "^1.0.0"
+    loader-utils "^1.0.2"
+    mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-functions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+  dependencies:
+    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+    babel-plugin-syntax-exponentiation-operator "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+  dependencies:
+    regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-preset-env@^1.2.2, babel-preset-env@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-to-generator "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.23.0"
+    babel-plugin-transform-es2015-classes "^6.23.0"
+    babel-plugin-transform-es2015-computed-properties "^6.22.0"
+    babel-plugin-transform-es2015-destructuring "^6.23.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+    babel-plugin-transform-es2015-for-of "^6.23.0"
+    babel-plugin-transform-es2015-function-name "^6.22.0"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.22.0"
+    babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-umd "^6.23.0"
+    babel-plugin-transform-es2015-object-super "^6.22.0"
+    babel-plugin-transform-es2015-parameters "^6.23.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+    babel-plugin-transform-exponentiation-operator "^6.22.0"
+    babel-plugin-transform-regenerator "^6.22.0"
+    browserslist "^2.1.2"
+    invariant "^2.2.2"
+    semver "^5.3.0"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+
+batch@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@1.18.2:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    bytes "3.0.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.1"
+    http-errors "~1.6.2"
+    iconv-lite "0.4.19"
+    on-finished "~2.3.0"
+    qs "6.5.1"
+    raw-body "2.3.2"
+    type-is "~1.6.15"
+
+body-parser@~1.14.0:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9"
+  dependencies:
+    bytes "2.2.0"
+    content-type "~1.0.1"
+    debug "~2.2.0"
+    depd "~1.1.0"
+    http-errors "~1.3.1"
+    iconv-lite "0.4.13"
+    on-finished "~2.3.0"
+    qs "5.2.0"
+    raw-body "~2.1.5"
+    type-is "~1.6.10"
+
+bonjour@^3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+  dependencies:
+    array-flatten "^2.1.0"
+    deep-equal "^1.0.1"
+    dns-equal "^1.0.0"
+    dns-txt "^2.0.2"
+    multicast-dns "^6.0.1"
+    multicast-dns-service-types "^1.1.0"
+
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+bootstrap@^3.3:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71"
+
+brace-expansion@^1.1.7:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  dependencies:
+    pako "~0.2.0"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
+browserslist@^2.1.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8"
+  dependencies:
+    caniuse-lite "^1.0.30000718"
+    electron-to-chromium "^1.3.18"
+
+buffer-indexof@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588"
+
+bytes@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^1.0.2, camelcase@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0, camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000743"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000743.tgz#bc8df2a257cf91ba024322266295af3ded852306"
+
+caniuse-lite@^1.0.30000718:
+  version "1.0.30000743"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000743.tgz#f4f5c6750676ff8f6144ea40456c3729d5341769"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
+  dependencies:
+    ansi-styles "^3.1.0"
+    escape-string-regexp "^1.0.5"
+    supports-color "^4.0.0"
+
+chokidar@^1.6.0, chokidar@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+clap@^1.0.9:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.2.tgz#683f6f93a320794d129386d74b2a1d2d66fede7e"
+  dependencies:
+    chalk "^1.1.3"
+
+clean-webpack-plugin@^0.1.16:
+  version "0.1.17"
+  resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.17.tgz#71c57242e6d47204d46f809413176e7bed28ec49"
+  dependencies:
+    rimraf "^2.6.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+clone@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+clone@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+  dependencies:
+    q "^1.1.2"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.0.0, color-name@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+compressible@~2.0.11:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a"
+  dependencies:
+    mime-db ">= 1.29.0 < 2"
+
+compression@^1.5.2:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db"
+  dependencies:
+    accepts "~1.3.4"
+    bytes "3.0.0"
+    compressible "~2.0.11"
+    debug "2.6.9"
+    on-headers "~1.0.1"
+    safe-buffer "5.1.1"
+    vary "~1.1.2"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+connect-history-api-fallback@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@~1.0.1, content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^0.3.3:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
+
+convert-source-map@^1.1.1, convert-source-map@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^2.4.0, core-js@^2.5.0:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+crypto-browserify@^3.11.0:
+  version "3.11.1"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-font-face-src@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/css-font-face-src/-/css-font-face-src-0.2.2.tgz#09bdaaef731b952dc7c2969bfde86559b94fffae"
+
+css-loader@^0.26.2:
+  version "0.26.4"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd"
+  dependencies:
+    babel-code-frame "^6.11.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano ">=2.6.1 <4"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.0.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.0.0"
+    postcss-modules-local-by-default "^1.0.1"
+    postcss-modules-scope "^1.0.0"
+    postcss-modules-values "^1.1.0"
+    source-list-map "^0.1.7"
+
+css-mediaquery@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0"
+
+css-select@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+css-what@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+css@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
+  dependencies:
+    inherits "^2.0.1"
+    source-map "^0.1.38"
+    source-map-resolve "^0.3.0"
+    urix "^0.1.0"
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4":
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
+cssom@~0.3.0:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+datatables.net-bs@^1.10.13:
+  version "1.10.16"
+  resolved "https://registry.yarnpkg.com/datatables.net-bs/-/datatables.net-bs-1.10.16.tgz#b0854f5b374f713ae3db4156c7cea8a760c3de76"
+  dependencies:
+    datatables.net "1.10.16"
+    jquery ">=1.7"
+
+datatables.net@1.10.16, datatables.net@^1.10.13:
+  version "1.10.16"
+  resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.10.16.tgz#4b052d1082824261b68eed9d22741b711d3d2469"
+  dependencies:
+    jquery ">=1.7"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64"
+  dependencies:
+    ms "2.0.0"
+
+debug@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-equal@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+del@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
+  dependencies:
+    globby "^6.1.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    p-map "^1.1.1"
+    pify "^3.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1, depd@~1.1.0, depd@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-node@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dns-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+
+dns-packet@^1.0.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a"
+  dependencies:
+    ip "^1.1.0"
+    safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+  dependencies:
+    buffer-indexof "^1.0.0"
+
+doctrine@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+dom-converter@~0.1:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+  dependencies:
+    utila "~0.3"
+
+dom-serializer@0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+  dependencies:
+    domelementtype "1"
+
+domutils@1.1:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+  dependencies:
+    domelementtype "1"
+
+domutils@1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+drmonty-datatables-plugins@^1.10.12:
+  version "1.10.12"
+  resolved "https://registry.yarnpkg.com/drmonty-datatables-plugins/-/drmonty-datatables-plugins-1.10.12.tgz#32fd57f562c938c2da4445cea9675330dd968eb1"
+  dependencies:
+    jquery ">=1.7"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.18:
+  version "1.3.24"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.24.tgz#9b7b88bb05ceb9fa016a177833cc2dde388f21b6"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+enhanced-resolve@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.7"
+
+entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+errno@^0.1.1, errno@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+  dependencies:
+    prr "~0.0.0"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+error-stack-parser@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.1.tgz#a3202b8fb03114aa9b40a0e3669e48b2b65a010a"
+  dependencies:
+    stackframe "^1.0.3"
+
+es-abstract@^1.7.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.30"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939"
+  dependencies:
+    es6-iterator "2"
+    es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-symbol "^3.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint@^4.6.1:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.7.1.tgz#849804136953ebe366782f9f8611e2cbd1b54681"
+  dependencies:
+    ajv "^5.2.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.0.1"
+    doctrine "^2.0.0"
+    eslint-scope "^3.7.1"
+    espree "^3.5.1"
+    esquery "^1.0.0"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^9.17.0"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "^4.0.1"
+    text-table "~0.2.0"
+
+espree@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e"
+  dependencies:
+    acorn "^5.1.1"
+    acorn-jsx "^3.0.0"
+
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
+  dependencies:
+    estraverse "^4.1.0"
+    object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+eventsource@0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+  dependencies:
+    original ">=0.0.5"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+excanvas@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/excanvas/-/excanvas-1.0.0.tgz#61f00d6c20869f6132c9719a089f2452fc44e6fb"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+express@^4.13.3:
+  version "4.16.1"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.1.tgz#6b33b560183c9b253b7b62144df33a4654ac9ed0"
+  dependencies:
+    accepts "~1.3.4"
+    array-flatten "1.1.1"
+    body-parser "1.18.2"
+    content-disposition "0.5.2"
+    content-type "~1.0.4"
+    cookie "0.3.1"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "~1.1.1"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "1.1.0"
+    fresh "0.5.2"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.2"
+    qs "6.5.1"
+    range-parser "~1.2.0"
+    safe-buffer "5.1.1"
+    send "0.16.1"
+    serve-static "1.13.1"
+    setprototypeof "1.1.0"
+    statuses "~1.3.1"
+    type-is "~1.6.15"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
+extend@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972"
+  dependencies:
+    iconv-lite "^0.4.17"
+    jschardet "^1.4.2"
+    tmp "^0.0.31"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extract-text-webpack-plugin@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.1.tgz#605a8893faca1dd49bb0d2ca87493f33fd43d102"
+  dependencies:
+    async "^2.4.1"
+    loader-utils "^1.1.0"
+    schema-utils "^0.3.0"
+    webpack-sources "^1.0.1"
+
+extsprintf@1.3.0, extsprintf@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+fast-deep-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+faye-websocket@^0.10.0, faye-websocket@~0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+  dependencies:
+    websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+  dependencies:
+    websocket-driver ">=0.5.1"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-loader@^0.10.1:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842"
+  dependencies:
+    loader-utils "^1.0.2"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+finalhandler@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+forwarded@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+
+fresh@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+friendly-errors-webpack-plugin@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.6.1.tgz#e32781c4722f546a06a9b5d7a7cfa28520375d70"
+  dependencies:
+    chalk "^1.1.3"
+    error-stack-parser "^2.0.0"
+    string-length "^1.0.1"
+
+fs-extra@^2.0.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.36"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-to-regexp@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.1.0.tgz#e0369d426578fd456d47dc23b09de05c1da9ea5d"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.17.0, globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+handle-thing@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@3.1.3, hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+hpack.js@^2.1.6:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+  dependencies:
+    inherits "^2.0.1"
+    obuf "^1.0.0"
+    readable-stream "^2.0.1"
+    wbuf "^1.1.0"
+
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-entities@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+htmlparser2@~3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+  dependencies:
+    domelementtype "1"
+    domhandler "2.1"
+    domutils "1.1"
+    readable-stream "1.0"
+
+http-deceiver@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@1.6.2, http-errors@~1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-errors@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
+  dependencies:
+    inherits "~2.0.1"
+    statuses "1"
+
+http-parser-js@>=0.4.0:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.6.tgz#195273f58704c452d671076be201329dd341dc55"
+
+http-proxy-middleware@~0.17.4:
+  version "0.17.4"
+  resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+  dependencies:
+    http-proxy "^1.16.2"
+    is-glob "^3.1.0"
+    lodash "^4.17.2"
+    micromatch "^2.3.11"
+
+http-proxy@^1.16.2:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+https-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+iconv-lite@0.4.13:
+  version "0.4.13"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.17:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+ignore@^3.3.3:
+  version "3.3.5"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"
+
+image-size@~0.5.0:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inlineresources@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/inlineresources/-/inlineresources-0.3.2.tgz#162d394742bfc08f3b7b03a16a308a740036edc3"
+  dependencies:
+    ayepromise "~1.1.0"
+    css-font-face-src "~0.2.2"
+    url "~0.11.0"
+  optionalDependencies:
+    cssom "~0.3.0"
+
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+internal-ip@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
+  dependencies:
+    meow "^3.3.0"
+
+interpret@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0"
+
+invariant@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip@^1.1.0, ip@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+ipaddr.js@1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-resolvable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+  dependencies:
+    tryit "^1.0.1"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-wsl@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+"jqplot@https://github.com/jqPlot/jqPlot.git#master":
+  version "1.0.9"
+  resolved "https://github.com/jqPlot/jqPlot.git#1870d3beddd96dc62b948196c4eb9dfd5833e763"
+
+jquery-form@^3.46:
+  version "3.50.0"
+  resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-3.50.0.tgz#d7c969b51e094e12da6991eb61ff5af25f59798f"
+  dependencies:
+    jquery ">=1.5"
+
+jquery-mousewheel@~3.1.13:
+  version "3.1.13"
+  resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5"
+
+jquery-ui@^1.12:
+  version "1.12.1"
+  resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.12.1.tgz#bcb4045c8dd0539c134bc1488cdd3e768a7a9e51"
+
+jquery@*, jquery@2.2.4, "jquery@>= 1.7.x", jquery@>=1.5, jquery@>=1.7, "jquery@>=1.9.1 <3":
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02"
+
+js-base64@^2.1.9:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.9.1:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^2.6.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jschardet@^1.4.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@^3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+kind-of@^3.0.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+less-loader@^4.0.5:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd"
+  dependencies:
+    clone "^2.1.1"
+    loader-utils "^1.1.0"
+    pify "^2.3.0"
+
+less@^2.3.1:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    mime "^1.2.11"
+    mkdirp "^0.5.0"
+    promise "^7.1.1"
+    request "^2.72.0"
+    source-map "^0.5.3"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+livereload-js@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash._baseassign@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._bindcallback@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._createassigner@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
+  dependencies:
+    lodash._bindcallback "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash.restparam "^3.0.0"
+
+lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash.assign@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
+  dependencies:
+    lodash._baseassign "^3.0.0"
+    lodash._createassigner "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash.assign@^4.0.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.defaults@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c"
+  dependencies:
+    lodash.assign "^3.0.0"
+    lodash.restparam "^3.0.0"
+
+lodash.defaults@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.isarguments@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.keys@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+  dependencies:
+    lodash._getnative "^3.0.0"
+    lodash.isarguments "^3.0.0"
+    lodash.isarray "^3.0.0"
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.restparam@^3.0.0:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+loglevel@^1.4.1:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.0.tgz#3863984a2c326b986fbb965f378758a6dc8a4324"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lru-cache@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+macaddress@^0.2.8:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
+
+make-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
+  dependencies:
+    pify "^2.3.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+math-expression-evaluator@^1.2.14:
+  version "1.2.17"
+  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^3.3.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0:
+  version "1.30.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+
+mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
+  version "2.1.17"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+  dependencies:
+    mime-db "~1.30.0"
+
+mime@1.4.1, mime@^1.2.11, mime@^1.3.4:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+mimic-fn@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+moment@^2.16:
+  version "2.18.1"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
+
+ms@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+multicast-dns-service-types@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+
+multicast-dns@^6.0.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde"
+  dependencies:
+    dns-packet "^1.0.1"
+    thunky "^0.1.0"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-forge@0.6.33:
+  version "0.6.33"
+  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc"
+
+node-glob@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/node-glob/-/node-glob-1.2.0.tgz#5240ffedefc6d663ce8515e5796a4d47a750c0d5"
+  dependencies:
+    async "^1.3.0"
+    glob-to-regexp "^0.1.0"
+
+node-libs-browser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.1.4"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "0.0.1"
+    os-browserify "^0.2.0"
+    path-browserify "0.0.0"
+    process "^0.11.0"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.0.5"
+    stream-browserify "^2.0.1"
+    stream-http "^2.3.1"
+    string_decoder "^0.10.25"
+    timers-browserify "^2.0.2"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.36:
+  version "0.6.38"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d"
+  dependencies:
+    hawk "3.1.3"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+  dependencies:
+    boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-path@^0.9.2:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+obuf@^1.0.0, obuf@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+on-headers@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@^1.3.0, once@^1.3.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+opn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519"
+  dependencies:
+    is-wsl "^1.1.0"
+
+optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+original@>=0.0.5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
+  dependencies:
+    url-parse "1.0.x"
+
+os-browserify@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  dependencies:
+    lcid "^1.0.0"
+
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-map@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parseurl@~1.3.0, parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+path-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+pify@^2.0.0, pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+pkg-up@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26"
+  dependencies:
+    find-up "^1.0.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+portfinder@^1.0.9:
+  version "1.0.13"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
+  dependencies:
+    async "^1.5.2"
+    debug "^2.2.0"
+    mkdirp "0.5.x"
+
+postcss-calc@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+  dependencies:
+    postcss "^5.0.2"
+    postcss-message-helpers "^2.0.0"
+    reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+  dependencies:
+    colormin "^1.0.5"
+    postcss "^5.0.13"
+    postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+  dependencies:
+    postcss "^5.0.11"
+    postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+  dependencies:
+    postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+  dependencies:
+    postcss "^5.0.14"
+    uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
+  dependencies:
+    postcss "^5.0.4"
+    uniqid "^4.0.0"
+
+postcss-merge-idents@^2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.10"
+    postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+  dependencies:
+    browserslist "^1.5.2"
+    caniuse-api "^1.5.2"
+    postcss "^5.0.4"
+    postcss-selector-parser "^2.2.2"
+    vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+  dependencies:
+    object-assign "^4.0.1"
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+  dependencies:
+    postcss "^5.0.12"
+    postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.2"
+    postcss-value-parser "^3.0.2"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+  dependencies:
+    alphanum-sort "^1.0.2"
+    has "^1.0.1"
+    postcss "^5.0.14"
+    postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+  dependencies:
+    postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^1.4.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.8"
+    postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+  dependencies:
+    flatten "^1.0.2"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+  dependencies:
+    is-svg "^2.0.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+    svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+  version "5.2.17"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b"
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^6.0.1:
+  version "6.0.12"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535"
+  dependencies:
+    chalk "^2.1.0"
+    source-map "^0.5.7"
+    supports-color "^4.4.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-error@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
+  dependencies:
+    renderkid "^2.0.1"
+    utila "~0.4"
+
+private@^0.1.6, private@^0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+promise@^7.1.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  dependencies:
+    asap "~2.0.3"
+
+proxy-addr@~2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.5.2"
+
+prr@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@^1.1.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
+
+qs@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be"
+
+qs@6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+query-string@^4.1.0:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+querystringify@0.0.x:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
+
+querystringify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+rasterizehtml@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/rasterizehtml/-/rasterizehtml-1.2.4.tgz#a576120d5aefe7ea58724bdc5800a2d1e73043f4"
+  dependencies:
+    ayepromise "~1.1.1"
+    css-mediaquery "~0.1.2"
+    inlineresources "~0.3.2"
+    sane-domparser-error "~0.2.0"
+    url "~0.10.1"
+    xmlserializer "~0.4.0"
+
+raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+raw-body@~2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774"
+  dependencies:
+    bytes "2.4.0"
+    iconv-lite "0.4.13"
+    unpipe "1.0.0"
+
+raw-loader@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
+
+rc@^1.1.7:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+readable-stream@1.0:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+reduce-css-calc@^1.2.6:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+  dependencies:
+    balanced-match "^0.4.2"
+    math-expression-evaluator "^1.2.14"
+    reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+  dependencies:
+    balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
+
+regenerator-transform@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-parser@^2.2.1:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.8.tgz#da4c0cda5a828559094168930f455f532b6ffbac"
+
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+renderkid@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319"
+  dependencies:
+    css-select "^1.1.0"
+    dom-converter "~0.1"
+    htmlparser2 "~3.3.0"
+    strip-ansi "^3.0.0"
+    utila "~0.3"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@2.81.0, request@^2.72.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requires-port@1.0.x, requires-port@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-url-loader@^2.0.2:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.1.0.tgz#27c95cc16a4353923fdbdc2dbaf5eef22232c477"
+  dependencies:
+    adjust-sourcemap-loader "^1.1.0"
+    camelcase "^4.0.0"
+    convert-source-map "^1.1.1"
+    loader-utils "^1.0.0"
+    lodash.defaults "^4.0.0"
+    rework "^1.0.1"
+    rework-visit "^1.0.0"
+    source-map "^0.5.6"
+    urix "^0.1.0"
+
+resolve-url@~0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+rework-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a"
+
+rework@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7"
+  dependencies:
+    convert-source-map "^0.3.3"
+    css "^2.0.0"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+rx-jquery@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/rx-jquery/-/rx-jquery-1.1.7.tgz#08bec7e92625427db85bf3bd8703ad3831b889d5"
+  dependencies:
+    jquery "*"
+    rx "*"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+rx@*, rx@^4.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+sane-domparser-error@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/sane-domparser-error/-/sane-domparser-error-0.2.0.tgz#adec5360c8a394526c204e61b00ea125f7b2b01f"
+
+sax@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
+  dependencies:
+    ajv "^5.0.0"
+
+script-loader@^0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7"
+  dependencies:
+    raw-loader "~0.5.1"
+
+select-hose@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+
+select2-bootstrap-theme@^0.1.0-beta.9:
+  version "0.1.0-beta.10"
+  resolved "https://registry.yarnpkg.com/select2-bootstrap-theme/-/select2-bootstrap-theme-0.1.0-beta.10.tgz#b9426ecfc03bf4a235e76a132377574310469ac0"
+
+select2@^4.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.3.tgz#207733fe91eacb9cb1a13f12463401f472449e0f"
+  dependencies:
+    almond "~0.3.1"
+    jquery-mousewheel "~3.1.13"
+
+selfsigned@^1.9.1:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52"
+  dependencies:
+    node-forge "0.6.33"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+
+send@0.16.1:
+  version "0.16.1"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.1"
+    destroy "~1.0.4"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.6.2"
+    mime "1.4.1"
+    ms "2.0.0"
+    on-finished "~2.3.0"
+    range-parser "~1.2.0"
+    statuses "~1.3.1"
+
+serve-index@^1.7.2:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+  dependencies:
+    accepts "~1.3.4"
+    batch "0.6.1"
+    debug "2.6.9"
+    escape-html "~1.0.3"
+    http-errors "~1.6.2"
+    mime-types "~2.1.17"
+    parseurl "~1.3.2"
+
+serve-static@1.13.1:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
+  dependencies:
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    parseurl "~1.3.2"
+    send "0.16.1"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.9"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sockjs-client@1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12"
+  dependencies:
+    debug "^2.6.6"
+    eventsource "0.1.6"
+    faye-websocket "~0.11.0"
+    inherits "^2.0.1"
+    json3 "^3.3.2"
+    url-parse "^1.1.8"
+
+sockjs@0.3.18:
+  version "0.3.18"
+  resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207"
+  dependencies:
+    faye-websocket "^0.10.0"
+    uuid "^2.0.2"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761"
+  dependencies:
+    atob "~1.1.0"
+    resolve-url "~0.2.1"
+    source-map-url "~0.3.0"
+    urix "~0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-url@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9"
+
+source-map@^0.1.38:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+  dependencies:
+    spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+spdy-transport@^2.0.18:
+  version "2.0.20"
+  resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d"
+  dependencies:
+    debug "^2.6.8"
+    detect-node "^2.0.3"
+    hpack.js "^2.1.6"
+    obuf "^1.1.1"
+    readable-stream "^2.2.9"
+    safe-buffer "^5.0.1"
+    wbuf "^1.7.2"
+
+spdy@^3.4.1:
+  version "3.4.7"
+  resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
+  dependencies:
+    debug "^2.6.8"
+    handle-thing "^1.2.5"
+    http-deceiver "^1.2.7"
+    safe-buffer "^5.0.1"
+    select-hose "^2.0.0"
+    spdy-transport "^2.0.18"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+stackframe@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b"
+
+statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-http@^2.3.1:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.2.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+  dependencies:
+    strip-ansi "^3.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringstream@~0.0.4:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+style-loader@^0.13.2:
+  version "0.13.2"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb"
+  dependencies:
+    loader-utils "^1.0.2"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e"
+  dependencies:
+    has-flag "^2.0.0"
+
+svgo@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+  dependencies:
+    coa "~1.0.1"
+    colors "~1.1.2"
+    csso "~2.3.1"
+    js-yaml "~3.7.0"
+    mkdirp "~0.5.1"
+    sax "~1.2.1"
+    whet.extend "~0.9.9"
+
+table@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435"
+  dependencies:
+    ajv "^4.7.0"
+    ajv-keywords "^1.0.0"
+    chalk "^1.1.1"
+    lodash "^4.0.0"
+    slice-ansi "0.0.4"
+    string-width "^2.0.0"
+
+tapable@^0.2.7:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar-pack@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+thunky@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e"
+
+time-stamp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+
+timers-browserify@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
+  dependencies:
+    setimmediate "^1.0.4"
+
+tiny-lr@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d"
+  dependencies:
+    body-parser "~1.14.0"
+    debug "~2.2.0"
+    faye-websocket "~0.10.0"
+    livereload-js "^2.2.0"
+    parseurl "~1.3.0"
+    qs "~5.1.0"
+
+tmp@^0.0.31:
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+toastr@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/toastr/-/toastr-2.1.2.tgz#fd69066ae7578a5b3357725fc9c7c335e9b681df"
+
+tough-cookie@~2.3.0:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+  dependencies:
+    punycode "^1.4.1"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+trumbowyg@^2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/trumbowyg/-/trumbowyg-2.8.1.tgz#1bc05b32e760f8f28a49db63076d8bcb3bf072de"
+
+tryit@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.10, type-is@~1.6.15:
+  version "1.6.15"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.15"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-js@^2.8.29:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqid@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
+  dependencies:
+    macaddress "^0.2.8"
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+urix@^0.1.0, urix@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-parse@1.0.x:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
+  dependencies:
+    querystringify "0.0.x"
+    requires-port "1.0.x"
+
+url-parse@^1.1.8:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19"
+  dependencies:
+    querystringify "~1.0.0"
+    requires-port "1.0.x"
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+url@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@^0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+utila@~0.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
+
+utila@~0.4:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+uuid@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+  dependencies:
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
+
+vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+vendors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vm-browserify@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+watchpack@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
+  dependencies:
+    async "^2.1.2"
+    chokidar "^1.7.0"
+    graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
+  dependencies:
+    minimalistic-assert "^1.0.0"
+
+webpack-chunk-hash@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.4.0.tgz#6b40c3070fbc9ff0cfe0fe781c7174af6c7c16a4"
+
+webpack-dev-middleware@^1.11.0:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.3.4"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+    time-stamp "^2.0.0"
+
+webpack-dev-server@^2.4.5:
+  version "2.9.1"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz#7ac9320b61b00eb65b2109f15c82747fc5b93585"
+  dependencies:
+    ansi-html "0.0.7"
+    array-includes "^3.0.3"
+    bonjour "^3.5.0"
+    chokidar "^1.6.0"
+    compression "^1.5.2"
+    connect-history-api-fallback "^1.3.0"
+    del "^3.0.0"
+    express "^4.13.3"
+    html-entities "^1.2.0"
+    http-proxy-middleware "~0.17.4"
+    internal-ip "1.2.0"
+    ip "^1.1.5"
+    loglevel "^1.4.1"
+    opn "^5.1.0"
+    portfinder "^1.0.9"
+    selfsigned "^1.9.1"
+    serve-index "^1.7.2"
+    sockjs "0.3.18"
+    sockjs-client "1.1.4"
+    spdy "^3.4.1"
+    strip-ansi "^3.0.1"
+    supports-color "^4.2.1"
+    webpack-dev-middleware "^1.11.0"
+    yargs "^6.6.0"
+
+webpack-livereload-plugin@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/webpack-livereload-plugin/-/webpack-livereload-plugin-1.0.0.tgz#c197397ebe2a922d91da81642e000eb52c949299"
+  dependencies:
+    tiny-lr "^0.2.0"
+
+webpack-sources@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.5.3"
+
+"webpack@>=2.2.0 <4":
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^5.1.5"
+    ajv-keywords "^2.0.0"
+    async "^2.1.2"
+    enhanced-resolve "^3.4.0"
+    escope "^3.6.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^4.2.1"
+    tapable "^0.2.7"
+    uglifyjs-webpack-plugin "^0.4.6"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+    yargs "^8.0.2"
+
+websocket-driver@>=0.5.1:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
+  dependencies:
+    http-parser-js ">=0.4.0"
+    websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d"
+
+whet.extend@~0.9.9:
+  version "0.9.9"
+  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+  version "1.2.14"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+xmlserializer@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/xmlserializer/-/xmlserializer-0.4.0.tgz#9726a8a10e4ba66c531a6c209d3ad3b7a1641dc3"
+
+xtend@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^6.6.0:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^4.2.0"
+
+yargs@^8.0.1, yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"