From 03ff21736e27fe9acf5ca292c9f7fcd7cdb6f548 Mon Sep 17 00:00:00 2001
From: Pierre Jarriges <pierre.jarriges@tutanota.com>
Date: Sun, 18 Jul 2021 13:58:43 +0200
Subject: [PATCH] bundle minified prod

---
 build.js                                      |   39 +-
 package-lock.json                             | 1942 ++++++++++++++++-
 package.json                                  |   10 +-
 public/education/education.js                 |  665 +-----
 public/games/games.js                         |  772 +------
 public/main.js                                |  965 +-------
 .../software-development.js                   |  812 +------
 .../home-page-components/news-articles.css    |   17 -
 public/style/home-page-components/whoami.css  |   17 -
 public/style/homepage.css                     |   17 -
 public/style/pages/education/education.css    |   17 -
 .../game-studio-club/game-studio-club.css     |    3 -
 public/style/pages/games/games.css            |   17 -
 .../software-development.css                  |   17 -
 .../pages/story-logic-app/story-logic-app.css |    3 -
 public/style/style.css                        | 1275 +----------
 public/style/theme.css                        |    3 -
 src/style.scss                                |    1 +
 18 files changed, 1977 insertions(+), 4615 deletions(-)
 delete mode 100644 public/style/home-page-components/news-articles.css
 delete mode 100644 public/style/home-page-components/whoami.css
 delete mode 100644 public/style/homepage.css
 delete mode 100644 public/style/pages/education/education.css
 delete mode 100644 public/style/pages/education/subpages/game-studio-club/game-studio-club.css
 delete mode 100644 public/style/pages/games/games.css
 delete mode 100644 public/style/pages/software-development/software-development.css
 delete mode 100644 public/style/pages/story-logic-app/story-logic-app.css
 delete mode 100644 public/style/theme.css

diff --git a/build.js b/build.js
index 1e0c84d..4635aa0 100644
--- a/build.js
+++ b/build.js
@@ -4,19 +4,38 @@
 
 const fs = require("fs");
 const browserify = require("browserify");
+const Uglify = require("uglify-js");
+const _dir = process.cwd();
 const config = require("./config");
-const curDir = process.cwd();
 const build_conf = config.build;
+const build_minified = process.argv.includes("prod");
+
+function build_bundle(input_path, output_path) {
+    if (build_minified) {
+        const bundle = browserify()
+            .add(input_path)
+            .bundle();
+        let stream = "";
+        bundle.on("data", chunk => stream += chunk);
+        bundle.on("end", () => {
+            const minified = Uglify.minify(stream);
+            const out = fs.createWriteStream(output_path);
+            out.write(minified.code);
+        });
+    } else {
+        browserify()
+            .add(input_path)
+            .bundle()
+            .pipe(fs.createWriteStream(output_path));
+    }
+}
 
 // Handle home page
-const b = browserify();
-b.add(`${curDir}/src/main.js`)
-    .bundle()
-    .pipe(fs.createWriteStream(`${curDir}/public/main.js`));
+build_bundle(`${_dir}/src/main.js`, `${_dir}/public/main.js`)
 
 // Handle subpages
 function getPageHtml(pageName, pageMeta) {
-    let html = fs.readFileSync(`${curDir}/public/index.html`, "utf-8");
+    let html = fs.readFileSync(`${_dir}/public/index.html`, "utf-8");
     const setMeta = function (metaName, value) {
         html = html.replace(
             html.match(new RegExp(`<meta\\s*name="${metaName}"[^>]+>`, "g"))[0],
@@ -186,11 +205,7 @@ function createPages(rootdir, destdir) {
             fs.mkdirSync(targetDirPath);
         }
 
-        const b = browserify();
-
-        b.add(fPath)
-            .bundle()
-            .pipe(fs.createWriteStream(`${targetDirPath}/${p}.js`));
+        build_bundle(fPath, `${targetDirPath}/${p}.js`);
 
         const page = fs.createWriteStream(`${targetDirPath}/index.html`);
         const pageMeta = JSON.parse(fs.readFileSync(`${fPath}/meta.json`, "utf-8"));
@@ -219,4 +234,4 @@ function createPages(rootdir, destdir) {
     }
 }
 
-createPages(`${curDir}/src/pages`, `${curDir}/public`);
+createPages(`${_dir}/src/pages`, `${_dir}/public`);
diff --git a/package-lock.json b/package-lock.json
index e9126f7..e33ac69 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,19 +1,1907 @@
 {
     "name": "kuadrado-website",
     "version": "1.0.3",
-    "lockfileVersion": 1,
+    "lockfileVersion": 2,
     "requires": true,
-    "dependencies": {
-        "JSONStream": {
+    "packages": {
+        "": {
+            "version": "1.0.3",
+            "license": "MIT",
+            "dependencies": {
+                "object-to-html-renderer": "^1.0.0"
+            },
+            "devDependencies": {
+                "browserify": "^17.0.0",
+                "sass": "^1.32.0",
+                "uglify-js": "^3.13.10"
+            }
+        },
+        "node_modules/acorn": {
+            "version": "7.4.1",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-node": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+            "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^7.0.0",
+                "acorn-walk": "^7.0.0",
+                "xtend": "^4.0.2"
+            }
+        },
+        "node_modules/acorn-walk": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/anymatch": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+            "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+            "dev": true,
+            "dependencies": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/array-filter": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
+            "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
+            "dev": true
+        },
+        "node_modules/asn1.js": {
+            "version": "5.4.1",
+            "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+            "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^4.0.0",
+                "inherits": "^2.0.1",
+                "minimalistic-assert": "^1.0.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "node_modules/asn1.js/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/assert": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+            "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+            "dev": true,
+            "dependencies": {
+                "object-assign": "^4.1.1",
+                "util": "0.10.3"
+            }
+        },
+        "node_modules/assert/node_modules/inherits": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+            "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+            "dev": true
+        },
+        "node_modules/assert/node_modules/util": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+            "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+            "dev": true,
+            "dependencies": {
+                "inherits": "2.0.1"
+            }
+        },
+        "node_modules/available-typed-arrays": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
+            "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==",
+            "dev": true,
+            "dependencies": {
+                "array-filter": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+            "dev": true
+        },
+        "node_modules/base64-js": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+            "dev": true
+        },
+        "node_modules/binary-extensions": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/bn.js": {
+            "version": "5.1.3",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+            "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+            "dev": true
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "dev": true,
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/brorand": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+            "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+            "dev": true
+        },
+        "node_modules/browser-pack": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+            "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+            "dev": true,
+            "dependencies": {
+                "combine-source-map": "~0.8.0",
+                "defined": "^1.0.0",
+                "JSONStream": "^1.0.3",
+                "safe-buffer": "^5.1.1",
+                "through2": "^2.0.0",
+                "umd": "^3.0.0"
+            },
+            "bin": {
+                "browser-pack": "bin/cmd.js"
+            }
+        },
+        "node_modules/browser-resolve": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+            "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+            "dev": true,
+            "dependencies": {
+                "resolve": "^1.17.0"
+            }
+        },
+        "node_modules/browserify": {
+            "version": "17.0.0",
+            "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz",
+            "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==",
+            "dev": true,
+            "dependencies": {
+                "assert": "^1.4.0",
+                "browser-pack": "^6.0.1",
+                "browser-resolve": "^2.0.0",
+                "browserify-zlib": "~0.2.0",
+                "buffer": "~5.2.1",
+                "cached-path-relative": "^1.0.0",
+                "concat-stream": "^1.6.0",
+                "console-browserify": "^1.1.0",
+                "constants-browserify": "~1.0.0",
+                "crypto-browserify": "^3.0.0",
+                "defined": "^1.0.0",
+                "deps-sort": "^2.0.1",
+                "domain-browser": "^1.2.0",
+                "duplexer2": "~0.1.2",
+                "events": "^3.0.0",
+                "glob": "^7.1.0",
+                "has": "^1.0.0",
+                "htmlescape": "^1.1.0",
+                "https-browserify": "^1.0.0",
+                "inherits": "~2.0.1",
+                "insert-module-globals": "^7.2.1",
+                "JSONStream": "^1.0.3",
+                "labeled-stream-splicer": "^2.0.0",
+                "mkdirp-classic": "^0.5.2",
+                "module-deps": "^6.2.3",
+                "os-browserify": "~0.3.0",
+                "parents": "^1.0.1",
+                "path-browserify": "^1.0.0",
+                "process": "~0.11.0",
+                "punycode": "^1.3.2",
+                "querystring-es3": "~0.2.0",
+                "read-only-stream": "^2.0.0",
+                "readable-stream": "^2.0.2",
+                "resolve": "^1.1.4",
+                "shasum-object": "^1.0.0",
+                "shell-quote": "^1.6.1",
+                "stream-browserify": "^3.0.0",
+                "stream-http": "^3.0.0",
+                "string_decoder": "^1.1.1",
+                "subarg": "^1.0.0",
+                "syntax-error": "^1.1.1",
+                "through2": "^2.0.0",
+                "timers-browserify": "^1.0.1",
+                "tty-browserify": "0.0.1",
+                "url": "~0.11.0",
+                "util": "~0.12.0",
+                "vm-browserify": "^1.0.0",
+                "xtend": "^4.0.0"
+            },
+            "bin": {
+                "browserify": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/browserify-aes": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+            "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+            "dev": true,
+            "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"
+            }
+        },
+        "node_modules/browserify-cipher": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+            "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+            "dev": true,
+            "dependencies": {
+                "browserify-aes": "^1.0.4",
+                "browserify-des": "^1.0.0",
+                "evp_bytestokey": "^1.0.0"
+            }
+        },
+        "node_modules/browserify-des": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+            "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+            "dev": true,
+            "dependencies": {
+                "cipher-base": "^1.0.1",
+                "des.js": "^1.0.0",
+                "inherits": "^2.0.1",
+                "safe-buffer": "^5.1.2"
+            }
+        },
+        "node_modules/browserify-rsa": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+            "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^5.0.0",
+                "randombytes": "^2.0.1"
+            }
+        },
+        "node_modules/browserify-sign": {
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+            "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^5.1.1",
+                "browserify-rsa": "^4.0.1",
+                "create-hash": "^1.2.0",
+                "create-hmac": "^1.1.7",
+                "elliptic": "^6.5.3",
+                "inherits": "^2.0.4",
+                "parse-asn1": "^5.1.5",
+                "readable-stream": "^3.6.0",
+                "safe-buffer": "^5.2.0"
+            }
+        },
+        "node_modules/browserify-sign/node_modules/readable-stream": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/browserify-zlib": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+            "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+            "dev": true,
+            "dependencies": {
+                "pako": "~1.0.5"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+            "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+            "dev": true,
+            "dependencies": {
+                "base64-js": "^1.0.2",
+                "ieee754": "^1.1.4"
+            }
+        },
+        "node_modules/buffer-from": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+            "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+            "dev": true
+        },
+        "node_modules/buffer-xor": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+            "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+            "dev": true
+        },
+        "node_modules/builtin-status-codes": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+            "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+            "dev": true
+        },
+        "node_modules/cached-path-relative": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
+            "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
+            "dev": true
+        },
+        "node_modules/call-bind": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+            "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.1",
+                "get-intrinsic": "^1.0.2"
+            }
+        },
+        "node_modules/chokidar": {
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+            "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+            "dev": true,
+            "dependencies": {
+                "anymatch": "~3.1.1",
+                "braces": "~3.0.2",
+                "glob-parent": "~5.1.0",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.5.0"
+            },
+            "engines": {
+                "node": ">= 8.10.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.1"
+            }
+        },
+        "node_modules/cipher-base": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+            "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/combine-source-map": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+            "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+            "dev": true,
+            "dependencies": {
+                "convert-source-map": "~1.1.0",
+                "inline-source-map": "~0.6.0",
+                "lodash.memoize": "~3.0.3",
+                "source-map": "~0.5.3"
+            }
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+            "dev": true
+        },
+        "node_modules/concat-stream": {
+            "version": "1.6.2",
+            "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+            "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+            "dev": true,
+            "engines": [
+                "node >= 0.8"
+            ],
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^2.2.2",
+                "typedarray": "^0.0.6"
+            }
+        },
+        "node_modules/console-browserify": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+            "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+            "dev": true
+        },
+        "node_modules/constants-browserify": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+            "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+            "dev": true
+        },
+        "node_modules/convert-source-map": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+            "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
+            "dev": true
+        },
+        "node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+            "dev": true
+        },
+        "node_modules/create-ecdh": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+            "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^4.1.0",
+                "elliptic": "^6.5.3"
+            }
+        },
+        "node_modules/create-ecdh/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/create-hash": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+            "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+            "dev": true,
+            "dependencies": {
+                "cipher-base": "^1.0.1",
+                "inherits": "^2.0.1",
+                "md5.js": "^1.3.4",
+                "ripemd160": "^2.0.1",
+                "sha.js": "^2.4.0"
+            }
+        },
+        "node_modules/create-hmac": {
+            "version": "1.1.7",
+            "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+            "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+            "dev": true,
+            "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"
+            }
+        },
+        "node_modules/crypto-browserify": {
+            "version": "3.12.0",
+            "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+            "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+            "dev": true,
+            "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",
+                "randomfill": "^1.0.3"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/dash-ast": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
+            "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
+            "dev": true
+        },
+        "node_modules/define-properties": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+            "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+            "dev": true,
+            "dependencies": {
+                "object-keys": "^1.0.12"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/defined": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+            "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+            "dev": true
+        },
+        "node_modules/deps-sort": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
+            "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
+            "dev": true,
+            "dependencies": {
+                "JSONStream": "^1.0.3",
+                "shasum-object": "^1.0.0",
+                "subarg": "^1.0.0",
+                "through2": "^2.0.0"
+            },
+            "bin": {
+                "deps-sort": "bin/cmd.js"
+            }
+        },
+        "node_modules/des.js": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+            "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "minimalistic-assert": "^1.0.0"
+            }
+        },
+        "node_modules/detective": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+            "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+            "dev": true,
+            "dependencies": {
+                "acorn-node": "^1.6.1",
+                "defined": "^1.0.0",
+                "minimist": "^1.1.1"
+            },
+            "bin": {
+                "detective": "bin/detective.js"
+            },
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/diffie-hellman": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+            "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^4.1.0",
+                "miller-rabin": "^4.0.0",
+                "randombytes": "^2.0.0"
+            }
+        },
+        "node_modules/diffie-hellman/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/domain-browser": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+            "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4",
+                "npm": ">=1.2"
+            }
+        },
+        "node_modules/duplexer2": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+            "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+            "dev": true,
+            "dependencies": {
+                "readable-stream": "^2.0.2"
+            }
+        },
+        "node_modules/elliptic": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+            "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+            "dev": true,
+            "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"
+            }
+        },
+        "node_modules/elliptic/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/es-abstract": {
+            "version": "1.18.0-next.2",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz",
+            "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==",
+            "dev": true,
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "es-to-primitive": "^1.2.1",
+                "function-bind": "^1.1.1",
+                "get-intrinsic": "^1.0.2",
+                "has": "^1.0.3",
+                "has-symbols": "^1.0.1",
+                "is-callable": "^1.2.2",
+                "is-negative-zero": "^2.0.1",
+                "is-regex": "^1.1.1",
+                "object-inspect": "^1.9.0",
+                "object-keys": "^1.1.1",
+                "object.assign": "^4.1.2",
+                "string.prototype.trimend": "^1.0.3",
+                "string.prototype.trimstart": "^1.0.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/es-to-primitive": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+            "dev": true,
+            "dependencies": {
+                "is-callable": "^1.1.4",
+                "is-date-object": "^1.0.1",
+                "is-symbol": "^1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/events": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+            "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.x"
+            }
+        },
+        "node_modules/evp_bytestokey": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+            "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+            "dev": true,
+            "dependencies": {
+                "md5.js": "^1.3.4",
+                "safe-buffer": "^5.1.1"
+            }
+        },
+        "node_modules/fast-safe-stringify": {
+            "version": "2.0.7",
+            "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+            "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
+            "dev": true
+        },
+        "node_modules/fill-range": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+            "dev": true,
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/foreach": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+            "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+            "dev": true
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+            "dev": true
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz",
+            "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==",
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+            "dev": true
+        },
+        "node_modules/get-assigned-identifiers": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+            "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
+            "dev": true
+        },
+        "node_modules/get-intrinsic": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz",
+            "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.1",
+                "has": "^1.0.3",
+                "has-symbols": "^1.0.1"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.1.6",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+            "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+            "dev": true,
+            "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"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+            "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/has": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/has-symbols": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+            "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/hash-base": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+            "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.6.0",
+                "safe-buffer": "^5.2.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/hash-base/node_modules/readable-stream": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/hash.js": {
+            "version": "1.1.7",
+            "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+            "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "minimalistic-assert": "^1.0.1"
+            }
+        },
+        "node_modules/hmac-drbg": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+            "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+            "dev": true,
+            "dependencies": {
+                "hash.js": "^1.0.3",
+                "minimalistic-assert": "^1.0.0",
+                "minimalistic-crypto-utils": "^1.0.1"
+            }
+        },
+        "node_modules/htmlescape": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+            "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/https-browserify": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+            "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+            "dev": true
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+            "dev": true
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+            "dev": true
+        },
+        "node_modules/inline-source-map": {
+            "version": "0.6.2",
+            "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+            "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+            "dev": true,
+            "dependencies": {
+                "source-map": "~0.5.3"
+            }
+        },
+        "node_modules/insert-module-globals": {
+            "version": "7.2.1",
+            "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz",
+            "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
+            "dev": true,
+            "dependencies": {
+                "acorn-node": "^1.5.2",
+                "combine-source-map": "^0.8.0",
+                "concat-stream": "^1.6.1",
+                "is-buffer": "^1.1.0",
+                "JSONStream": "^1.0.3",
+                "path-is-absolute": "^1.0.1",
+                "process": "~0.11.0",
+                "through2": "^2.0.0",
+                "undeclared-identifiers": "^1.1.2",
+                "xtend": "^4.0.0"
+            },
+            "bin": {
+                "insert-module-globals": "bin/cmd.js"
+            }
+        },
+        "node_modules/is-arguments": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+            "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+            "dev": true,
+            "dependencies": {
+                "call-bind": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-binary-path": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+            "dev": true,
+            "dependencies": {
+                "binary-extensions": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-buffer": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+            "dev": true
+        },
+        "node_modules/is-callable": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+            "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-core-module": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+            "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+            "dev": true,
+            "dependencies": {
+                "has": "^1.0.3"
+            }
+        },
+        "node_modules/is-date-object": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+            "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-generator-function": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz",
+            "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+            "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+            "dev": true,
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-negative-zero": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+            "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-number": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/is-regex": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+            "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+            "dev": true,
+            "dependencies": {
+                "has-symbols": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-symbol": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+            "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+            "dev": true,
+            "dependencies": {
+                "has-symbols": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/is-typed-array": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz",
+            "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==",
+            "dev": true,
+            "dependencies": {
+                "available-typed-arrays": "^1.0.2",
+                "call-bind": "^1.0.0",
+                "es-abstract": "^1.18.0-next.1",
+                "foreach": "^2.0.5",
+                "has-symbols": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+            "dev": true
+        },
+        "node_modules/jsonparse": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+            "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+            "dev": true,
+            "engines": [
+                "node >= 0.2.0"
+            ]
+        },
+        "node_modules/JSONStream": {
             "version": "1.3.5",
             "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
             "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
             "dev": true,
-            "requires": {
-                "jsonparse": "^1.2.0",
-                "through": ">=2.2.7 <3"
+            "dependencies": {
+                "jsonparse": "^1.2.0",
+                "through": ">=2.2.7 <3"
+            },
+            "bin": {
+                "JSONStream": "bin.js"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/labeled-stream-splicer": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
+            "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "stream-splicer": "^2.0.0"
+            }
+        },
+        "node_modules/lodash.memoize": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+            "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
+            "dev": true
+        },
+        "node_modules/md5.js": {
+            "version": "1.3.5",
+            "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+            "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+            "dev": true,
+            "dependencies": {
+                "hash-base": "^3.0.0",
+                "inherits": "^2.0.1",
+                "safe-buffer": "^5.1.2"
+            }
+        },
+        "node_modules/miller-rabin": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+            "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+            "dev": true,
+            "dependencies": {
+                "bn.js": "^4.0.0",
+                "brorand": "^1.0.1"
+            },
+            "bin": {
+                "miller-rabin": "bin/miller-rabin"
+            }
+        },
+        "node_modules/miller-rabin/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/minimalistic-assert": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+            "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+            "dev": true
+        },
+        "node_modules/minimalistic-crypto-utils": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+            "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+            "dev": true
+        },
+        "node_modules/minimatch": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.5",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+            "dev": true
+        },
+        "node_modules/mkdirp-classic": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+            "dev": true
+        },
+        "node_modules/module-deps": {
+            "version": "6.2.3",
+            "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
+            "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
+            "dev": true,
+            "dependencies": {
+                "browser-resolve": "^2.0.0",
+                "cached-path-relative": "^1.0.2",
+                "concat-stream": "~1.6.0",
+                "defined": "^1.0.0",
+                "detective": "^5.2.0",
+                "duplexer2": "^0.1.2",
+                "inherits": "^2.0.1",
+                "JSONStream": "^1.0.3",
+                "parents": "^1.0.0",
+                "readable-stream": "^2.0.2",
+                "resolve": "^1.4.0",
+                "stream-combiner2": "^1.1.1",
+                "subarg": "^1.0.0",
+                "through2": "^2.0.0",
+                "xtend": "^4.0.0"
+            },
+            "bin": {
+                "module-deps": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/normalize-path": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-assign": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+            "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-inspect": {
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+            "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
+            "dev": true
+        },
+        "node_modules/object-keys": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/object-to-html-renderer": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/object-to-html-renderer/-/object-to-html-renderer-1.0.0.tgz",
+            "integrity": "sha512-ZB+jYQ0cjH+I4YWx6UcifaOP26ZY/KEdIzYZc9h96L/hGWbBx/aSBSnR/rn30+Y/0SaR/JNfLZiBhKorJNJ7Rg=="
+        },
+        "node_modules/object.assign": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+            "dev": true,
+            "dependencies": {
+                "call-bind": "^1.0.0",
+                "define-properties": "^1.1.3",
+                "has-symbols": "^1.0.1",
+                "object-keys": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+            "dev": true,
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/os-browserify": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+            "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+            "dev": true
+        },
+        "node_modules/pako": {
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+            "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+            "dev": true
+        },
+        "node_modules/parents": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+            "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+            "dev": true,
+            "dependencies": {
+                "path-platform": "~0.11.15"
+            }
+        },
+        "node_modules/parse-asn1": {
+            "version": "5.1.6",
+            "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+            "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+            "dev": true,
+            "dependencies": {
+                "asn1.js": "^5.2.0",
+                "browserify-aes": "^1.0.0",
+                "evp_bytestokey": "^1.0.0",
+                "pbkdf2": "^3.0.3",
+                "safe-buffer": "^5.1.1"
+            }
+        },
+        "node_modules/path-browserify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+            "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+            "dev": true
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+            "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+            "dev": true
+        },
+        "node_modules/path-platform": {
+            "version": "0.11.15",
+            "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+            "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/pbkdf2": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+            "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+            "dev": true,
+            "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"
+            },
+            "engines": {
+                "node": ">=0.12"
+            }
+        },
+        "node_modules/picomatch": {
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+            "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/process": {
+            "version": "0.11.10",
+            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+            "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.6.0"
+            }
+        },
+        "node_modules/process-nextick-args": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+            "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+            "dev": true
+        },
+        "node_modules/public-encrypt": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+            "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+            "dev": true,
+            "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",
+                "safe-buffer": "^5.1.2"
+            }
+        },
+        "node_modules/public-encrypt/node_modules/bn.js": {
+            "version": "4.11.9",
+            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+            "dev": true
+        },
+        "node_modules/punycode": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+            "dev": true
+        },
+        "node_modules/querystring": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+            "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.x"
+            }
+        },
+        "node_modules/querystring-es3": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+            "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.x"
+            }
+        },
+        "node_modules/randombytes": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+            "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "^5.1.0"
+            }
+        },
+        "node_modules/randomfill": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+            "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+            "dev": true,
+            "dependencies": {
+                "randombytes": "^2.0.5",
+                "safe-buffer": "^5.1.0"
+            }
+        },
+        "node_modules/read-only-stream": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+            "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+            "dev": true,
+            "dependencies": {
+                "readable-stream": "^2.0.2"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "2.3.7",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "dev": true,
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/readable-stream/node_modules/safe-buffer": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+            "dev": true
+        },
+        "node_modules/readable-stream/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
+        "node_modules/readdirp": {
+            "version": "3.5.0",
+            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+            "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+            "dev": true,
+            "dependencies": {
+                "picomatch": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            }
+        },
+        "node_modules/resolve": {
+            "version": "1.19.0",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+            "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+            "dev": true,
+            "dependencies": {
+                "is-core-module": "^2.1.0",
+                "path-parse": "^1.0.6"
+            }
+        },
+        "node_modules/ripemd160": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+            "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+            "dev": true,
+            "dependencies": {
+                "hash-base": "^3.0.0",
+                "inherits": "^2.0.1"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "dev": true
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+            "dev": true
+        },
+        "node_modules/sass": {
+            "version": "1.32.4",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz",
+            "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==",
+            "dev": true,
+            "dependencies": {
+                "chokidar": ">=2.0.0 <4.0.0"
+            },
+            "bin": {
+                "sass": "sass.js"
+            },
+            "engines": {
+                "node": ">=8.9.0"
+            }
+        },
+        "node_modules/sha.js": {
+            "version": "2.4.11",
+            "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+            "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "safe-buffer": "^5.0.1"
+            },
+            "bin": {
+                "sha.js": "bin.js"
+            }
+        },
+        "node_modules/shasum-object": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
+            "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
+            "dev": true,
+            "dependencies": {
+                "fast-safe-stringify": "^2.0.7"
+            }
+        },
+        "node_modules/shell-quote": {
+            "version": "1.7.2",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+            "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+            "dev": true
+        },
+        "node_modules/simple-concat": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+            "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+            "dev": true
+        },
+        "node_modules/source-map": {
+            "version": "0.5.7",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stream-browserify": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+            "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "~2.0.4",
+                "readable-stream": "^3.5.0"
+            }
+        },
+        "node_modules/stream-browserify/node_modules/readable-stream": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/stream-combiner2": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+            "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+            "dev": true,
+            "dependencies": {
+                "duplexer2": "~0.1.0",
+                "readable-stream": "^2.0.2"
+            }
+        },
+        "node_modules/stream-http": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz",
+            "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==",
+            "dev": true,
+            "dependencies": {
+                "builtin-status-codes": "^3.0.0",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.6.0",
+                "xtend": "^4.0.2"
+            }
+        },
+        "node_modules/stream-http/node_modules/readable-stream": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/stream-splicer": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
+            "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.0.2"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string.prototype.trimend": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
+            "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
+            "dev": true,
+            "dependencies": {
+                "call-bind": "^1.0.0",
+                "define-properties": "^1.1.3"
+            }
+        },
+        "node_modules/string.prototype.trimstart": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
+            "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
+            "dev": true,
+            "dependencies": {
+                "call-bind": "^1.0.0",
+                "define-properties": "^1.1.3"
+            }
+        },
+        "node_modules/subarg": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+            "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+            "dev": true,
+            "dependencies": {
+                "minimist": "^1.1.0"
+            }
+        },
+        "node_modules/syntax-error": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+            "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+            "dev": true,
+            "dependencies": {
+                "acorn-node": "^1.2.0"
+            }
+        },
+        "node_modules/through": {
+            "version": "2.3.8",
+            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+            "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+            "dev": true
+        },
+        "node_modules/through2": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+            "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+            "dev": true,
+            "dependencies": {
+                "readable-stream": "~2.3.6",
+                "xtend": "~4.0.1"
+            }
+        },
+        "node_modules/timers-browserify": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+            "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+            "dev": true,
+            "dependencies": {
+                "process": "~0.11.0"
+            },
+            "engines": {
+                "node": ">=0.6.0"
+            }
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+            "dev": true,
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/tty-browserify": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+            "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+            "dev": true
+        },
+        "node_modules/typedarray": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+            "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+            "dev": true
+        },
+        "node_modules/uglify-js": {
+            "version": "3.13.10",
+            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.10.tgz",
+            "integrity": "sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg==",
+            "dev": true,
+            "bin": {
+                "uglifyjs": "bin/uglifyjs"
+            },
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/umd": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+            "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+            "dev": true,
+            "bin": {
+                "umd": "bin/cli.js"
+            }
+        },
+        "node_modules/undeclared-identifiers": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
+            "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
+            "dev": true,
+            "dependencies": {
+                "acorn-node": "^1.3.0",
+                "dash-ast": "^1.0.0",
+                "get-assigned-identifiers": "^1.2.0",
+                "simple-concat": "^1.0.0",
+                "xtend": "^4.0.1"
+            },
+            "bin": {
+                "undeclared-identifiers": "bin.js"
+            }
+        },
+        "node_modules/url": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+            "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+            "dev": true,
+            "dependencies": {
+                "punycode": "1.3.2",
+                "querystring": "0.2.0"
+            }
+        },
+        "node_modules/url/node_modules/punycode": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+            "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+            "dev": true
+        },
+        "node_modules/util": {
+            "version": "0.12.3",
+            "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz",
+            "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "is-arguments": "^1.0.4",
+                "is-generator-function": "^1.0.7",
+                "is-typed-array": "^1.1.3",
+                "safe-buffer": "^5.1.2",
+                "which-typed-array": "^1.1.2"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+            "dev": true
+        },
+        "node_modules/vm-browserify": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+            "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+            "dev": true
+        },
+        "node_modules/which-typed-array": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz",
+            "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==",
+            "dev": true,
+            "dependencies": {
+                "available-typed-arrays": "^1.0.2",
+                "call-bind": "^1.0.0",
+                "es-abstract": "^1.18.0-next.1",
+                "foreach": "^2.0.5",
+                "function-bind": "^1.1.1",
+                "has-symbols": "^1.0.1",
+                "is-typed-array": "^1.1.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
             }
         },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+            "dev": true
+        },
+        "node_modules/xtend": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4"
+            }
+        }
+    },
+    "dependencies": {
         "acorn": {
             "version": "7.4.1",
             "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
@@ -164,9 +2052,9 @@
             "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
             "dev": true,
             "requires": {
-                "JSONStream": "^1.0.3",
                 "combine-source-map": "~0.8.0",
                 "defined": "^1.0.0",
+                "JSONStream": "^1.0.3",
                 "safe-buffer": "^5.1.1",
                 "through2": "^2.0.0",
                 "umd": "^3.0.0"
@@ -187,7 +2075,6 @@
             "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==",
             "dev": true,
             "requires": {
-                "JSONStream": "^1.0.3",
                 "assert": "^1.4.0",
                 "browser-pack": "^6.0.1",
                 "browser-resolve": "^2.0.0",
@@ -209,6 +2096,7 @@
                 "https-browserify": "^1.0.0",
                 "inherits": "~2.0.1",
                 "insert-module-globals": "^7.2.1",
+                "JSONStream": "^1.0.3",
                 "labeled-stream-splicer": "^2.0.0",
                 "mkdirp-classic": "^0.5.2",
                 "module-deps": "^6.2.3",
@@ -860,11 +2748,11 @@
             "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
             "dev": true,
             "requires": {
-                "JSONStream": "^1.0.3",
                 "acorn-node": "^1.5.2",
                 "combine-source-map": "^0.8.0",
                 "concat-stream": "^1.6.1",
                 "is-buffer": "^1.1.0",
+                "JSONStream": "^1.0.3",
                 "path-is-absolute": "^1.0.1",
                 "process": "~0.11.0",
                 "through2": "^2.0.0",
@@ -993,6 +2881,16 @@
             "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
             "dev": true
         },
+        "JSONStream": {
+            "version": "1.3.5",
+            "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+            "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+            "dev": true,
+            "requires": {
+                "jsonparse": "^1.2.0",
+                "through": ">=2.2.7 <3"
+            }
+        },
         "labeled-stream-splicer": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
@@ -1077,7 +2975,6 @@
             "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
             "dev": true,
             "requires": {
-                "JSONStream": "^1.0.3",
                 "browser-resolve": "^2.0.0",
                 "cached-path-relative": "^1.0.2",
                 "concat-stream": "~1.6.0",
@@ -1085,6 +2982,7 @@
                 "detective": "^5.2.0",
                 "duplexer2": "^0.1.2",
                 "inherits": "^2.0.1",
+                "JSONStream": "^1.0.3",
                 "parents": "^1.0.0",
                 "readable-stream": "^2.0.2",
                 "resolve": "^1.4.0",
@@ -1488,6 +3386,15 @@
                 "readable-stream": "^2.0.2"
             }
         },
+        "string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dev": true,
+            "requires": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
         "string.prototype.trimend": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
@@ -1508,15 +3415,6 @@
                 "define-properties": "^1.1.3"
             }
         },
-        "string_decoder": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-            "dev": true,
-            "requires": {
-                "safe-buffer": "~5.2.0"
-            }
-        },
         "subarg": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
@@ -1581,6 +3479,12 @@
             "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
             "dev": true
         },
+        "uglify-js": {
+            "version": "3.13.10",
+            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.10.tgz",
+            "integrity": "sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg==",
+            "dev": true
+        },
         "umd": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
diff --git a/package.json b/package.json
index 8be3810..4f7800f 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,9 @@
     "main": "src/main.js",
     "scripts": {
         "test": "echo \"Error: no test specified\" && exit 1",
-        "style": "sass --watch ./src:public/style",
-        "build": "node build.js"
+        "style": "sass --watch ./src/style.scss ./public/style/style.css --style=compressed",
+        "build": "node build.js",
+        "build-prod": "node build.js prod"
     },
     "repository": "https://gitlab.com/peter_rabbit/kuadrado-website",
     "author": "Kuadrado",
@@ -17,6 +18,7 @@
     },
     "devDependencies": {
         "browserify": "^17.0.0",
-        "sass": "^1.32.0"
+        "sass": "^1.32.0",
+        "uglify-js": "^3.13.10"
     }
-}
+}
\ No newline at end of file
diff --git a/public/education/education.js b/public/education/education.js
index 9a7ac52..bc6aad7 100644
--- a/public/education/education.js
+++ b/public/education/education.js
@@ -1,660 +1,11 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-function getServerUrl() {
-    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
-        }`;
-}
-
-module.exports = {
-    getServerUrl,
-    build: {
-        protected_dirs: ["assets", "style", "articles"],
-        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
-    },
-};
-
-},{}],2:[function(require,module,exports){
-const { getServerUrl } = require("./config");
-
-module.exports = {
-    images_url: `${getServerUrl()}assets/images/`,
-    articles_url: `${getServerUrl()}articles/`,
-};
-
-},{"./config":1}],3:[function(require,module,exports){
-"use strict";
-
-module.exports = {
-    setRenderCycleRoot(renderCycleRoot) {
-        this.renderCycleRoot = renderCycleRoot;
-    },
-    objectToHtml: function objectToHtml(obj) {
-        const { tag } = obj;
-
-        const node = document.createElement(tag);
-        const excludeKeys = ["tag", "contents", "style_rules", "state"];
-
-        Object.keys(obj)
-            .filter(attr => !excludeKeys.includes(attr))
-            .forEach(attr => {
-                if (attr === "class") {
-                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
-                } else {
-                    node[attr] = obj[attr];
-                }
-            });
-        if (obj.contents && typeof obj.contents === "string") {
-            node.innerHTML = obj.contents;
-        } else {
-            obj.contents &&
-                obj.contents.length > 0 &&
-                obj.contents.forEach(el => {
-                    switch (typeof el) {
-                        case "string":
-                            node.innerHTML = el;
-                            break;
-                        case "object":
-                            node.appendChild(objectToHtml(el));
-                            break;
-                    }
-                });
-        }
-
-        if (obj.style_rules) {
-            Object.keys(obj.style_rules).forEach(rule => {
-                node.style[rule] = obj.style_rules[rule];
-            });
-        }
-
-        return node;
-    },
-    renderCycle: function () {
-        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
-            mode: "replace",
-        });
-    },
-    subRender(object, htmlNode, options = { mode: "append" }) {
-        const insert = this.objectToHtml(object);
-        switch (options.mode) {
-            case "append":
-                htmlNode.appendChild(insert);
-                break;
-            case "override":
-                htmlNode.innerHTML = "";
-                htmlNode.appendChild(insert);
-                break;
-            case "insert-before":
-                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
-                break;
-            case "adjacent":
-                /**
-                 * options.insertLocation must be one of:
-                 *
-                 * afterbegin
-                 * afterend
-                 * beforebegin
-                 * beforeend
-                 */
-                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
-                break;
-            case "replace":
-                htmlNode.parentNode.replaceChild(insert, htmlNode);
-                break;
-            case "remove":
-                htmlNode.remove();
-                break;
-        }
-    },
-};
-
-},{}],4:[function(require,module,exports){
-"use strict";
-
-class WebPage {
-    constructor(args) {
-        Object.assign(this, args);
-    }
-}
-
-module.exports = WebPage;
-},{}],5:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-const WebPage = require("../../lib/web-page");
-
-const EDU_THEMES = [
-    // {
-    //     title: "Création de jeux vidéo",
-    //     description: "Conception, graphisme et animation, programmation, je vous accompagne dans la découverte des techniques pour créer un jeu vidéo de A à Z",
-    //     image: "learning_theme_conception.png",
-    //     pageUrl: "gamedev",
-    // },
-    {
-        title: "Programmation",
-        description: `<b>Franchissez le mur du code !</b><br />
-        Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`,
-        image: "learning_theme_coding.png",
-        // pageUrl: "coding",
-    },
-    {
-        title: "Dessin numérique et animation 2D",
-        description: `Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br />
-        Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`,
-        image: "learning_theme_2d.png",
-        // pageUrl: "2d",
-    },
-    {
-        title: "Maths et physique",
-        description: "Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.",
-        image: "learning_theme_math.png",
-        // pageUrl: "math",
-    },
-    // {
-    //     title: "Musique et sons électroniques",
-    //     description: "Découvrez des logiciels libres de composition musicales, de synthèse sonore et de prise de son.",
-    //     image: "learning_theme_sound.png",
-    //     pageUrl: "sound",
-    // },
-    {
-        title: "Aide informatique générale",
-        description: "Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.",
-        image: "learning_theme_pc.png",
-        // pageUrl: "popularization"
-    },
-    {
-        title: "Stage GNU/Linux",
-        description: `<b>Passez le cap du libre ! </b><br/>
+!function s(a,o,r){function i(t,e){if(!o[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=o[t]={exports:{}},a[t][0].call(n.exports,function(e){return i(a[t][1][e]||e)},n,n.exports,s,a,o,r)}return o[t].exports}for(var c="function"==typeof require&&require,e=0;e<r.length;e++)i(r[e]);return i}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),a=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!a.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],5:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");e=e("../../lib/web-page");const a=[{title:"Programmation",description:`<b>Franchissez le mur du code !</b><br />
+        Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`,image:"learning_theme_coding.png"},{title:"Dessin numérique et animation 2D",description:`Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br />
+        Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`,image:"learning_theme_2d.png"},{title:"Maths et physique",description:"Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.",image:"learning_theme_math.png"},{title:"Aide informatique générale",description:"Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.",image:"learning_theme_pc.png"},{title:"Stage GNU/Linux",description:`<b>Passez le cap du libre ! </b><br/>
         Stage de 4 séances pour installer Linux, faire ses premiers pas avec les logiciels libres et acquérir une autonomie suffisante pour une utilisation basique.
-        `,
-        image: "learning_theme_linux.png"
-    }
-];
-
-class EducationPage extends WebPage {
-    render() {
-        return {
-            tag: "div",
-            id: "education-page",
-            typeof: "EducationalOrganization",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-header logo-left",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "page-contents-center grid-wrapper",
-                            contents: [
-                                {
-                                    tag: "div",
-                                    class: "logo",
-                                    contents: [
-                                        {
-                                            tag: "img",
-                                            alt: "image brain",
-                                            src: `${images_url}brain.svg`,
-                                        },
-                                    ],
-                                },
-                                { tag: "h1", contents: "Pédagogie" },
-                                {
-                                    tag: "p",
-                                    contents: `Animation d'ateliers informatiques accessibles à tous. 
-                                    Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`,
-                                },
-                            ],
-                        },
-                    ],
-                },
-                {
-                    tag: "div",
-                    class: "title-banner",
-                },
-                {
-                    tag: "section",
-                    class: "bg-dark",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "page-contents-center",
-                            contents: [
-                                {
-                                    tag: "ul",
-                                    class: "edu-themes",
-                                    contents: EDU_THEMES.map(theme => {
-                                        return {
-                                            tag: "li",
-                                            class: "edu-theme",
-                                            contents: [
-                                                { tag: "img", width: 250, height: 140, class: "pixelated", src: `${images_url}${theme.image}` },
-                                                { tag: "h3", contents: theme.title },
-                                                { tag: "p", contents: theme.description },
-                                            ]
-                                        }
-                                    })
-                                },
-                            ]
-                        },
-                    ]
-                },
-                {
-                    tag: "section",
-                    class: "practical-info",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "page-contents-center",
-                            contents: [
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Pour qui ?" },
-                                        {
-                                            tag: "p",
-                                            class: "info-body",
-                                            contents: `Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/>
+        `,image:"learning_theme_linux.png"}];class o extends e{render(){return{tag:"div",id:"education-page",typeof:"EducationalOrganization",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image brain",src:`${s}brain.svg`}]},{tag:"h1",contents:"Pédagogie"},{tag:"p",contents:`Animation d'ateliers informatiques accessibles à tous. 
+                                    Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`}]}]},{tag:"div",class:"title-banner"},{tag:"section",class:"bg-dark",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"ul",class:"edu-themes",contents:a.map(e=>({tag:"li",class:"edu-theme",contents:[{tag:"img",width:250,height:140,class:"pixelated",src:`${s}${e.image}`},{tag:"h3",contents:e.title},{tag:"p",contents:e.description}]}))}]}]},{tag:"section",class:"practical-info",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour qui ?"},{tag:"p",class:"info-body",contents:`Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/>
                                             Les séances ont lieu en groupes mixtes. Capacité limitée à 5 personnes.
-                                            `
-                                        }
-                                    ]
-                                },
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Où ça ?" },
-                                        {
-                                            tag: "p",
-                                            class: "info-body",
-                                            contents: "Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>"
-                                        }
-                                    ]
-                                },
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Quel matériel ?" },
-                                        {
-                                            tag: "p",
-                                            class: "info-body",
-                                            contents: `Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) 
+                                            `}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Où ça ?"},{tag:"p",class:"info-body",contents:"Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>"}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quel matériel ?"},{tag:"p",class:"info-body",contents:`Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) 
                                             mais il est possible d'amener le sien. 
-                                            <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.`
-                                        }
-                                    ]
-                                },
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Quand ?" },
-                                        {
-                                            tag: "ul",
-                                            class: "info-body tabled",
-                                            contents: [
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Mardi" },
-                                                        { tag: "span", contents: "16h - 18h" },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Mercredi" },
-                                                        { tag: "span", contents: "14h - 16h" },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Jeudi" },
-                                                        { tag: "span", contents: "16h - 18h" },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    class: "fullwidth",
-                                                    contents: "<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>"
-                                                }
-                                            ]
-                                        },
-                                    ]
-                                },
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Combien ça coûte ?" },
-                                        {
-                                            tag: "ul",
-                                            class: "info-body tabled",
-                                            contents: [
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Inscription au mois" },
-                                                        { tag: "span", contents: "50€, accès à toutes les plages horaires." },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Inscription à la séance" },
-                                                        { tag: "span", contents: "15€" },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Cours particuliers" },
-                                                        { tag: "span", contents: "30€/h, sur place ou en visio. Horaires à définir." },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Stage 4 séances de 2h" },
-                                                        { tag: "span", contents: "40€ par personne, horaires et dates à définir selon la demande." },
-                                                    ]
-                                                }
-                                            ]
-                                        }
-                                    ]
-                                },
-                                {
-                                    tag: "div",
-                                    class: "info-block",
-                                    contents: [
-                                        { tag: "h3", class: "info-title", contents: "Pour s'inscrire ou en savoir plus" },
-                                        {
-                                            tag: "ul",
-                                            class: "info-body",
-                                            contents: [
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "Me contacter" },
-                                                        {
-                                                            tag: "a",
-                                                            href: "mailto:contact@kuadrado-software.fr",
-                                                            contents: "contact@kuadrado-software.fr",
-                                                        }
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "" },
-                                                        {
-                                                            tag: "a",
-                                                            href: "tel:+33475780872",
-                                                            contents: "04 75 78 08 72",
-                                                            property: "telephone",
-                                                        },
-                                                    ]
-                                                },
-                                                {
-                                                    tag: "li",
-                                                    contents: [
-                                                        { tag: "span", contents: "ou passer directement me voir au local !" }
-                                                    ]
-                                                }
-                                            ]
-                                        }
-                                    ]
-                                }
-                            ]
-                        }
-                    ]
-
-                },
-            ],
-        };
-    }
-}
-
-module.exports = EducationPage;
-
-},{"../../../constants":2,"../../lib/web-page":4}],6:[function(require,module,exports){
-"use strict";
-const runPage = require("../../run-page");
-const EducationPage = require("./education");
-runPage(EducationPage);
-
-},{"../../run-page":7,"./education":5}],7:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-const Template = require("./template/template");
-
-module.exports = function runPage(PageComponent) {
-    const template = new Template({ page: new PageComponent() });
-    objectHtmlRenderer.setRenderCycleRoot(template);
-    objectHtmlRenderer.renderCycle();
-};
-
-},{"./template/template":9,"object-to-html-renderer":3}],8:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-
-const NAV_MENU_ITEMS = [
-    { url: "/games/", text: "Jeux" },
-    {
-        url: "/education/",
-        text: "Pédagogie",
-        // submenu: [
-        //     { url: "/gamedev", text: "Création de jeux vidéo" },
-        // ]
-    },
-    { url: "/software-development/", text: "Software" }
-];
-
-class NavBar {
-    constructor() {
-        this.initEventHandlers();
-    }
-
-    handleBurgerClick() {
-        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
-    }
-
-    initEventHandlers() {
-        window.addEventListener("click", event => {
-            if (
-                event.target.id !== "nav-menu-list" &&
-                !event.target.classList.contains("burger") &&
-                !event.target.parentNode.classList.contains("burger")
-            ) {
-                document.getElementById("nav-menu-list").classList.remove("responsive-show");
-            }
-        });
-    }
-
-    renderHome() {
-        return {
-            tag: "div",
-            class: "home",
-            contents: [
-                {
-                    tag: "a",
-                    href: "/",
-                    contents: [
-                        {
-                            tag: "img",
-                            alt: "Logo Kuadrado",
-                            src: `${images_url}logo_kuadrado.svg`,
-                        },
-                        {
-                            tag: "img",
-                            alt: "Kuadrado Software",
-                            class: "logo-text",
-                            src: `${images_url}logo_kuadrado_txt.svg`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-
-    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
-        return {
-            tag: "ul",
-            id: "nav-menu-list",
-            class: isSubmenu ? "submenu" : "",
-            contents: menuItemsArray.map(item => {
-                const { url, text, submenu } = item;
-                const href = `${parentUrl}${url}`;
-                return {
-                    tag: "li",
-                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
-                    contents: [
-                        {
-                            tag: "a",
-                            href,
-                            contents: text,
-                        },
-                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
-                };
-            }),
-        };
-    }
-
-    renderResponsiveBurger() {
-        return {
-            tag: "div",
-            class: "burger",
-            onclick: this.handleBurgerClick.bind(this),
-            contents: [{ tag: "span", contents: "···" }],
-        };
-    }
-
-    render() {
-        return {
-            tag: "nav",
-            contents: [
-                this.renderHome(),
-                this.renderResponsiveBurger(),
-                this.renderMenu(NAV_MENU_ITEMS),
-            ],
-        };
-    }
-}
-
-module.exports = NavBar;
-
-},{"../../../constants":2}],9:[function(require,module,exports){
-"use strict";
-
-const { in_construction } = require("../../config");
-const { images_url } = require("../../constants");
-const NavBar = require("./components/navbar");
-
-class Template {
-    constructor(props) {
-        this.props = props;
-    }
-    render() {
-        return {
-            tag: "main",
-            contents: [
-                {
-                    tag: "header",
-                    contents: [new NavBar().render()],
-                },
-                in_construction && {
-                    tag: "section",
-                    class: "warning-banner",
-                    contents: [
-                        {
-                            tag: "strong",
-                            class: "page-contents-center",
-                            contents: "Site en construction ...",
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    id: "page-container",
-                    contents: [this.props.page.render()],
-                },
-                {
-                    tag: "footer",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "logo",
-                            contents: [
-                                {
-                                    tag: "img",
-                                    alt: `logo Kuadrado`,
-                                    src: `${images_url}logo_kuadrado.svg`,
-                                },
-                                {
-                                    tag: "img",
-                                    class: "text-logo",
-                                    alt: "Kuadrado Software",
-                                    src: `${images_url}logo_kuadrado_txt.svg`,
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
-                        },
-                        {
-                            tag: "div",
-                            contents: [
-                                { tag: "strong", contents: "<blue>Contact : </blue>" },
-                                {
-                                    tag: "a",
-                                    href: "mailto:contact@kuadrado-software.fr",
-                                    contents: "contact@kuadrado-software.fr",
-                                },
-                            ],
-                        },
-                        {
-                            tag: "div",
-                            class: "social",
-                            contents: [
-                                {
-                                    tag: "strong",
-                                    contents: "<blue>Sur les réseaux : </blue>",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://www.linkedin.com/company/kuadrado-software",
-                                    target: "_blank",
-                                    contents: "in",
-                                    title: "Linkedin",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://twitter.com/KuadradoSoft",
-                                    target: "_blank",
-                                    contents: "t",
-                                    title: "Twitter",
-                                    style_rules: { fontFamily: "serif" },
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: `Copyright © ${new Date()
-                                .getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = Template;
-
-},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]);
+                                            <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.`}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quand ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Mardi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",contents:[{tag:"span",contents:"Mercredi"},{tag:"span",contents:"14h - 16h"}]},{tag:"li",contents:[{tag:"span",contents:"Jeudi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",class:"fullwidth",contents:"<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>"}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Combien ça coûte ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Inscription au mois"},{tag:"span",contents:"50€, accès à toutes les plages horaires."}]},{tag:"li",contents:[{tag:"span",contents:"Inscription à la séance"},{tag:"span",contents:"15€"}]},{tag:"li",contents:[{tag:"span",contents:"Cours particuliers"},{tag:"span",contents:"30€/h, sur place ou en visio. Horaires à définir."}]},{tag:"li",contents:[{tag:"span",contents:"Stage 4 séances de 2h"},{tag:"span",contents:"40€ par personne, horaires et dates à définir selon la demande."}]}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour s'inscrire ou en savoir plus"},{tag:"ul",class:"info-body",contents:[{tag:"li",contents:[{tag:"span",contents:"Me contacter"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"li",contents:[{tag:"span",contents:""},{tag:"a",href:"tel:+33475780872",contents:"04 75 78 08 72",property:"telephone"}]},{tag:"li",contents:[{tag:"span",contents:"ou passer directement me voir au local !"}]}]}]}]}]}]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":4}],6:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./education");s(e)},{"../../run-page":7,"./education":5}],7:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),a=e("./template/template");t.exports=function(e){e=new a({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":9,"object-to-html-renderer":3}],8:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),a=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,o=!1,r=""){return{tag:"ul",id:"nav-menu-list",class:o?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,a=`${r}${t}`;return{tag:"li",class:o||window.location.pathname!==a?"":"active",contents:[{tag:"a",href:a,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(a)]}}}},{"../../../constants":2}],9:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:a}=e("../../constants"),o=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new o).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${a}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${a}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]);
\ No newline at end of file
diff --git a/public/games/games.js b/public/games/games.js
index 70c0356..0d18235 100644
--- a/public/games/games.js
+++ b/public/games/games.js
@@ -1,769 +1,3 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-function getServerUrl() {
-    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
-        }`;
-}
-
-module.exports = {
-    getServerUrl,
-    build: {
-        protected_dirs: ["assets", "style", "articles"],
-        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
-    },
-};
-
-},{}],2:[function(require,module,exports){
-const { getServerUrl } = require("./config");
-
-module.exports = {
-    images_url: `${getServerUrl()}assets/images/`,
-    articles_url: `${getServerUrl()}articles/`,
-};
-
-},{"./config":1}],3:[function(require,module,exports){
-"use strict";
-
-module.exports = {
-    setRenderCycleRoot(renderCycleRoot) {
-        this.renderCycleRoot = renderCycleRoot;
-    },
-    objectToHtml: function objectToHtml(obj) {
-        const { tag } = obj;
-
-        const node = document.createElement(tag);
-        const excludeKeys = ["tag", "contents", "style_rules", "state"];
-
-        Object.keys(obj)
-            .filter(attr => !excludeKeys.includes(attr))
-            .forEach(attr => {
-                if (attr === "class") {
-                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
-                } else {
-                    node[attr] = obj[attr];
-                }
-            });
-        if (obj.contents && typeof obj.contents === "string") {
-            node.innerHTML = obj.contents;
-        } else {
-            obj.contents &&
-                obj.contents.length > 0 &&
-                obj.contents.forEach(el => {
-                    switch (typeof el) {
-                        case "string":
-                            node.innerHTML = el;
-                            break;
-                        case "object":
-                            node.appendChild(objectToHtml(el));
-                            break;
-                    }
-                });
-        }
-
-        if (obj.style_rules) {
-            Object.keys(obj.style_rules).forEach(rule => {
-                node.style[rule] = obj.style_rules[rule];
-            });
-        }
-
-        return node;
-    },
-    renderCycle: function () {
-        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
-            mode: "replace",
-        });
-    },
-    subRender(object, htmlNode, options = { mode: "append" }) {
-        const insert = this.objectToHtml(object);
-        switch (options.mode) {
-            case "append":
-                htmlNode.appendChild(insert);
-                break;
-            case "override":
-                htmlNode.innerHTML = "";
-                htmlNode.appendChild(insert);
-                break;
-            case "insert-before":
-                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
-                break;
-            case "adjacent":
-                /**
-                 * options.insertLocation must be one of:
-                 *
-                 * afterbegin
-                 * afterend
-                 * beforebegin
-                 * beforeend
-                 */
-                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
-                break;
-            case "replace":
-                htmlNode.parentNode.replaceChild(insert, htmlNode);
-                break;
-            case "remove":
-                htmlNode.remove();
-                break;
-        }
-    },
-};
-
-},{}],4:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-
-class ImageCarousel {
-    constructor(props) {
-        this.props = props;
-        this.id = performance.now();
-        this.state = {
-            showImageIndex: 0,
-        };
-        this.RUN_INTERVAL = 5000;
-        this.props.images.length > 1 && this.run();
-    }
-
-    run() {
-        this.runningInterval = setInterval(() => {
-            let { showImageIndex } = this.state;
-            const { images } = this.props;
-            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
-            this.refreshImage();
-        }, this.RUN_INTERVAL);
-    }
-
-    setImageIndex(i) {
-        clearInterval(this.runningInterval);
-        this.state.showImageIndex = i;
-        this.refreshImage();
-    }
-
-    refreshImage() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    render() {
-        const { showImageIndex } = this.state;
-        const { images } = this.props;
-        return {
-            tag: "div",
-            id: this.id,
-            class: "image-carousel",
-            contents: [
-                {
-                    tag: "img",
-                    property: "image",
-                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
-                    src: images[showImageIndex],
-                },
-                images.length > 1 && {
-                    tag: "div",
-                    class: "carousel-bullets",
-                    contents: images.map((_, i) => {
-                        const active = showImageIndex === i;
-                        return {
-                            tag: "span",
-                            class: `bullet ${active ? "active" : ""}`,
-                            onclick: this.setImageIndex.bind(this, i),
-                        };
-                    }),
-                },
-            ],
-        };
-    }
-}
-
-module.exports = ImageCarousel;
-
-},{"object-to-html-renderer":3}],5:[function(require,module,exports){
-"use strict";
-
-const { fetchjson, fetchtext } = require("./fetch");
-
-function getArticleBody(text) {
-    return text.replaceAll("\n", "<br/>");
-}
-
-function getArticleDate(date) {
-    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
-}
-
-function loadArticles(dir_url) {
-    return new Promise((resolve, reject) => {
-        fetchjson(`${dir_url}/index.json`)
-            .then(json => {
-                Promise.all(
-                    json.articles.map(async artDir => {
-                        const artPath = `${artDir}/${artDir}.json`;
-                        const art = await fetchjson(`${dir_url}/${artPath}`);
-                        const tmpSplit = artPath.split("/");
-                        tmpSplit.pop();
-                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
-                        return Object.assign(art, { path: absArtPath });
-                    })
-                )
-                    .then(articles => {
-                        populateArticles(articles)
-                            .then(completeArticles => resolve(completeArticles))
-                            .catch(e => reject(e));
-                    })
-                    .catch(e => reject(e));
-            })
-            .catch(e => console.log(e));
-    });
-}
-
-function populateArticles(articles) {
-    return new Promise((resolve, reject) => {
-        Promise.all(
-            articles.map(async article => {
-                if (article.body.indexOf("<file>") !== -1) {
-                    const txtPath = article.body.replace("<file>", "");
-                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
-                    article.body = textValue;
-                    article.date = article.date ? new Date(article.date) : undefined;
-                }
-                return article;
-            })
-        )
-            .then(completeArticles => resolve(completeArticles.sort((a, b) => a.date - b.date)))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    loadArticles,
-    getArticleBody,
-    getArticleDate,
-    populateArticles,
-};
-
-},{"./fetch":6}],6:[function(require,module,exports){
-"use strict";
-
-function fetchjson(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.json())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-function fetchtext(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.text())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    fetchjson,
-    fetchtext,
-};
-
-},{}],7:[function(require,module,exports){
-"use strict";
-
-class WebPage {
-    constructor(args) {
-        Object.assign(this, args);
-    }
-}
-
-module.exports = WebPage;
-},{}],8:[function(require,module,exports){
-"use strict";
-
-const ImageCarousel = require("../../../generic-components/image-carousel");
-const { getArticleBody } = require("../../../lib/article-utils");
-
-class TeamMember {
-    constructor(props) {
-        this.props = props;
-    }
-
-    render() {
-        const { title, subtitle, body, images, path } = this.props;
-        return {
-            tag: "div",
-            class: "team-member",
-            typeof: "Person",
-            property: "author",
-            contents: [
-                {
-                    tag: "div",
-                    class: "team-member-img",
-                    contents: [
-                        {
-                            tag: "img",
-                            alt: `ìmage team member ${title}`,
-                            src: images.map(im => `${path}/images/${im}`)[0],
-                            property: "image",
-                        },
-                    ],
-                },
-                {
-                    tag: "h3",
-                    class: "team-member-title",
-                    contents: title,
-                    property: "name",
-                },
-                {
-                    tag: "strong",
-                    class: "team-member-subtitle",
-                    contents: subtitle,
-                    property: "jobTitle",
-                },
-                {
-                    tag: "p",
-                    class: "team-member-body",
-                    contents: getArticleBody(body),
-                    property: "description",
-                },
-            ],
-        };
-    }
-}
-
-class GameArticle {
-    constructor(props) {
-        this.props = props;
-    }
-
-    render() {
-        const {
-            title,
-            tags,
-            body,
-            subtitle,
-            images,
-            path,
-            team_subarticles,
-            image_banner,
-        } = this.props;
-        return {
-            tag: "article",
-            typeof: "VideoGame",
-            additionalType: "Article",
-            class: "game-article",
-            contents: [
-                {
-                    tag: "h2",
-                    property: "name",
-                    class: "game-title",
-                    contents: title,
-                },
-                {
-                    tag: "div",
-                    class: "game-banner",
-                    contents: [
-                        { tag: "img", class: "pixelated", src: `${path}/images/${image_banner}` },
-                    ],
-                },
-                {
-                    tag: "div",
-                    class: "game-tags",
-                    contents: tags.map(tag => {
-                        return { tag: "span", contents: tag, property: "about" };
-                    }),
-                },
-                {
-                    tag: "h3",
-                    class: "game-subtitle",
-                    contents: subtitle,
-                    property: "alternativeHeadline",
-                },
-                {
-                    tag: "div",
-                    class: "game-description",
-                    property: "description",
-                    contents: getArticleBody(body),
-                },
-                new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(),
-                {
-                    tag: "div",
-                    class: "game-team",
-                    contents: [
-                        {
-                            tag: "h2",
-                            contents: "L'équipe",
-                        },
-                        {
-                            tag: "div",
-                            class: "team-members",
-                            contents: team_subarticles.map(tsa =>
-                                new TeamMember({ ...tsa }).render()
-                            ),
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = GameArticle;
-
-},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(require,module,exports){
-"use strict";
-
-const { articles_url } = require("../../../../constants");
-const { loadArticles, populateArticles } = require("../../../lib/article-utils");
-const objectHtmlRenderer = require("object-to-html-renderer")
-const GameArticle = require("./game-article");
-
-class GameArticles {
-    constructor(props) {
-        this.props = props;
-        this.state = {
-            articles: [],
-        };
-        this.id = performance.now();
-        this.loadArticles();
-    }
-
-    loadArticles() {
-        loadArticles(`${articles_url}games`)
-            .then(articles => {
-                Promise.all(
-                    articles.map(async a => {
-                        if (a.team_subarticles) {
-                            a.team_subarticles = await populateArticles(
-                                a.team_subarticles.map(sa => Object.assign(sa, { path: a.path }))
-                            );
-                        }
-                        return a;
-                    })
-                ).then(completeArticles => {
-                    this.state.articles = completeArticles;
-                    this.refresh();
-                });
-            })
-            .catch(e => console.log(e));
-    }
-
-    renderPlaceholder() {
-        return {
-            tag: "article",
-            class: "placeholder",
-            contents: [{ tag: "div" }, { tag: "div" }],
-        };
-    }
-
-    refresh() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    render() {
-        const { articles } = this.state;
-        return {
-            tag: "section",
-            class: "game-articles page-contents-center",
-            id: this.id,
-            contents:
-                articles.length > 0
-                    ? articles.map(article => new GameArticle({ ...article }).render())
-                    : [this.renderPlaceholder()],
-        };
-    }
-}
-
-module.exports = GameArticles;
-
-},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-const WebPage = require("../../lib/web-page");
-const GameArticles = require("./components/game-articles");
-
-class GamesPage extends WebPage {
-    render() {
-        return {
-            tag: "div",
-            id: "games-page",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-header logo-left",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "page-contents-center grid-wrapper",
-                            contents: [
-                                {
-                                    tag: "div",
-                                    class: "logo",
-                                    contents: [
-                                        {
-                                            tag: "img",
-                                            alt: "image game controller",
-                                            src: `${images_url}game_controller.svg`,
-                                        },
-                                    ],
-                                },
-                                { tag: "h1", contents: "Jeux" },
-                                {
-                                    tag: "p",
-                                    contents: `Création de jeux vidéos indépendants.
-                                    <br/>Jeux web, PC et projets en cours de développement`,
-                                },
-                            ],
-                        },
-                    ],
-                },
-                new GameArticles().render(),
-            ],
-        };
-    }
-}
-
-module.exports = GamesPage;
-
-},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(require,module,exports){
-"use strict";
-
-"use strict";
-const runPage = require("../../run-page");
-const GamesPage = require("./games");
-runPage(GamesPage);
-
-},{"../../run-page":12,"./games":10}],12:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-const Template = require("./template/template");
-
-module.exports = function runPage(PageComponent) {
-    const template = new Template({ page: new PageComponent() });
-    objectHtmlRenderer.setRenderCycleRoot(template);
-    objectHtmlRenderer.renderCycle();
-};
-
-},{"./template/template":14,"object-to-html-renderer":3}],13:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-
-const NAV_MENU_ITEMS = [
-    { url: "/games/", text: "Jeux" },
-    {
-        url: "/education/",
-        text: "Pédagogie",
-        // submenu: [
-        //     { url: "/gamedev", text: "Création de jeux vidéo" },
-        // ]
-    },
-    { url: "/software-development/", text: "Software" }
-];
-
-class NavBar {
-    constructor() {
-        this.initEventHandlers();
-    }
-
-    handleBurgerClick() {
-        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
-    }
-
-    initEventHandlers() {
-        window.addEventListener("click", event => {
-            if (
-                event.target.id !== "nav-menu-list" &&
-                !event.target.classList.contains("burger") &&
-                !event.target.parentNode.classList.contains("burger")
-            ) {
-                document.getElementById("nav-menu-list").classList.remove("responsive-show");
-            }
-        });
-    }
-
-    renderHome() {
-        return {
-            tag: "div",
-            class: "home",
-            contents: [
-                {
-                    tag: "a",
-                    href: "/",
-                    contents: [
-                        {
-                            tag: "img",
-                            alt: "Logo Kuadrado",
-                            src: `${images_url}logo_kuadrado.svg`,
-                        },
-                        {
-                            tag: "img",
-                            alt: "Kuadrado Software",
-                            class: "logo-text",
-                            src: `${images_url}logo_kuadrado_txt.svg`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-
-    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
-        return {
-            tag: "ul",
-            id: "nav-menu-list",
-            class: isSubmenu ? "submenu" : "",
-            contents: menuItemsArray.map(item => {
-                const { url, text, submenu } = item;
-                const href = `${parentUrl}${url}`;
-                return {
-                    tag: "li",
-                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
-                    contents: [
-                        {
-                            tag: "a",
-                            href,
-                            contents: text,
-                        },
-                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
-                };
-            }),
-        };
-    }
-
-    renderResponsiveBurger() {
-        return {
-            tag: "div",
-            class: "burger",
-            onclick: this.handleBurgerClick.bind(this),
-            contents: [{ tag: "span", contents: "···" }],
-        };
-    }
-
-    render() {
-        return {
-            tag: "nav",
-            contents: [
-                this.renderHome(),
-                this.renderResponsiveBurger(),
-                this.renderMenu(NAV_MENU_ITEMS),
-            ],
-        };
-    }
-}
-
-module.exports = NavBar;
-
-},{"../../../constants":2}],14:[function(require,module,exports){
-"use strict";
-
-const { in_construction } = require("../../config");
-const { images_url } = require("../../constants");
-const NavBar = require("./components/navbar");
-
-class Template {
-    constructor(props) {
-        this.props = props;
-    }
-    render() {
-        return {
-            tag: "main",
-            contents: [
-                {
-                    tag: "header",
-                    contents: [new NavBar().render()],
-                },
-                in_construction && {
-                    tag: "section",
-                    class: "warning-banner",
-                    contents: [
-                        {
-                            tag: "strong",
-                            class: "page-contents-center",
-                            contents: "Site en construction ...",
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    id: "page-container",
-                    contents: [this.props.page.render()],
-                },
-                {
-                    tag: "footer",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "logo",
-                            contents: [
-                                {
-                                    tag: "img",
-                                    alt: `logo Kuadrado`,
-                                    src: `${images_url}logo_kuadrado.svg`,
-                                },
-                                {
-                                    tag: "img",
-                                    class: "text-logo",
-                                    alt: "Kuadrado Software",
-                                    src: `${images_url}logo_kuadrado_txt.svg`,
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
-                        },
-                        {
-                            tag: "div",
-                            contents: [
-                                { tag: "strong", contents: "<blue>Contact : </blue>" },
-                                {
-                                    tag: "a",
-                                    href: "mailto:contact@kuadrado-software.fr",
-                                    contents: "contact@kuadrado-software.fr",
-                                },
-                            ],
-                        },
-                        {
-                            tag: "div",
-                            class: "social",
-                            contents: [
-                                {
-                                    tag: "strong",
-                                    contents: "<blue>Sur les réseaux : </blue>",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://www.linkedin.com/company/kuadrado-software",
-                                    target: "_blank",
-                                    contents: "in",
-                                    title: "Linkedin",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://twitter.com/KuadradoSoft",
-                                    target: "_blank",
-                                    contents: "t",
-                                    title: "Twitter",
-                                    style_rules: { fontFamily: "serif" },
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: `Copyright © ${new Date()
-                                .getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = Template;
-
-},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]);
+!function n(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(i)return i(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return c(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],7:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,s){"use strict";const i=e("../../../generic-components/image-carousel"),{getArticleBody:l}=e("../../../lib/article-utils");class g{constructor(e){this.props=e}render(){const{title:e,subtitle:t,body:s,images:n,path:r}=this.props;return{tag:"div",class:"team-member",typeof:"Person",property:"author",contents:[{tag:"div",class:"team-member-img",contents:[{tag:"img",alt:`ìmage team member ${e}`,src:n.map(e=>`${r}/images/${e}`)[0],property:"image"}]},{tag:"h3",class:"team-member-title",contents:e,property:"name"},{tag:"strong",class:"team-member-subtitle",contents:t,property:"jobTitle"},{tag:"p",class:"team-member-body",contents:l(s),property:"description"}]}}}t.exports=class{constructor(e){this.props=e}render(){const{title:e,tags:t,body:s,subtitle:n,images:r,path:a,team_subarticles:o,image_banner:c}=this.props;return{tag:"article",typeof:"VideoGame",additionalType:"Article",class:"game-article",contents:[{tag:"h2",property:"name",class:"game-title",contents:e},{tag:"div",class:"game-banner",contents:[{tag:"img",class:"pixelated",src:`${a}/images/${c}`}]},{tag:"div",class:"game-tags",contents:t.map(e=>({tag:"span",contents:e,property:"about"}))},{tag:"h3",class:"game-subtitle",contents:n,property:"alternativeHeadline"},{tag:"div",class:"game-description",property:"description",contents:l(s)},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"game-team",contents:[{tag:"h2",contents:"L'équipe"},{tag:"div",class:"team-members",contents:o.map(e=>new g({...e}).render())}]}]}}}},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(e,t,s){"use strict";const{articles_url:n}=e("../../../../constants"),{loadArticles:r,populateArticles:a}=e("../../../lib/article-utils"),o=e("object-to-html-renderer"),c=e("./game-article");t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${n}games`).then(e=>{Promise.all(e.map(async t=>(t.team_subarticles&&(t.team_subarticles=await a(t.team_subarticles.map(e=>Object.assign(e,{path:t.path})))),t))).then(e=>{this.state.articles=e,this.refresh()})}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div"},{tag:"div"}]}}refresh(){o.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{articles:e}=this.state;return{tag:"section",class:"game-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new c({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/game-articles");class o extends r{render(){return{tag:"div",id:"games-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image game controller",src:`${n}game_controller.svg`}]},{tag:"h1",contents:"Jeux"},{tag:"p",contents:`Création de jeux vidéos indépendants.
+                                    <br/>Jeux web, PC et projets en cours de développement`}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(e,t,s){"use strict";const n=e("../../run-page");e=e("./games");n(e)},{"../../run-page":12,"./games":10}],12:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":14,"object-to-html-renderer":3}],13:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],14:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]);
\ No newline at end of file
diff --git a/public/main.js b/public/main.js
index 9df16af..82098e2 100644
--- a/public/main.js
+++ b/public/main.js
@@ -1,501 +1,10 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-function getServerUrl() {
-    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
-        }`;
-}
-
-module.exports = {
-    getServerUrl,
-    build: {
-        protected_dirs: ["assets", "style", "articles"],
-        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
-    },
-};
-
-},{}],2:[function(require,module,exports){
-const { getServerUrl } = require("./config");
-
-module.exports = {
-    images_url: `${getServerUrl()}assets/images/`,
-    articles_url: `${getServerUrl()}articles/`,
-};
-
-},{"./config":1}],3:[function(require,module,exports){
-"use strict";
-
-module.exports = {
-    setRenderCycleRoot(renderCycleRoot) {
-        this.renderCycleRoot = renderCycleRoot;
-    },
-    objectToHtml: function objectToHtml(obj) {
-        const { tag } = obj;
-
-        const node = document.createElement(tag);
-        const excludeKeys = ["tag", "contents", "style_rules", "state"];
-
-        Object.keys(obj)
-            .filter(attr => !excludeKeys.includes(attr))
-            .forEach(attr => {
-                if (attr === "class") {
-                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
-                } else {
-                    node[attr] = obj[attr];
-                }
-            });
-        if (obj.contents && typeof obj.contents === "string") {
-            node.innerHTML = obj.contents;
-        } else {
-            obj.contents &&
-                obj.contents.length > 0 &&
-                obj.contents.forEach(el => {
-                    switch (typeof el) {
-                        case "string":
-                            node.innerHTML = el;
-                            break;
-                        case "object":
-                            node.appendChild(objectToHtml(el));
-                            break;
-                    }
-                });
-        }
-
-        if (obj.style_rules) {
-            Object.keys(obj.style_rules).forEach(rule => {
-                node.style[rule] = obj.style_rules[rule];
-            });
-        }
-
-        return node;
-    },
-    renderCycle: function () {
-        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
-            mode: "replace",
-        });
-    },
-    subRender(object, htmlNode, options = { mode: "append" }) {
-        const insert = this.objectToHtml(object);
-        switch (options.mode) {
-            case "append":
-                htmlNode.appendChild(insert);
-                break;
-            case "override":
-                htmlNode.innerHTML = "";
-                htmlNode.appendChild(insert);
-                break;
-            case "insert-before":
-                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
-                break;
-            case "adjacent":
-                /**
-                 * options.insertLocation must be one of:
-                 *
-                 * afterbegin
-                 * afterend
-                 * beforebegin
-                 * beforeend
-                 */
-                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
-                break;
-            case "replace":
-                htmlNode.parentNode.replaceChild(insert, htmlNode);
-                break;
-            case "remove":
-                htmlNode.remove();
-                break;
-        }
-    },
-};
-
-},{}],4:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-
-class ImageCarousel {
-    constructor(props) {
-        this.props = props;
-        this.id = performance.now();
-        this.state = {
-            showImageIndex: 0,
-        };
-        this.RUN_INTERVAL = 5000;
-        this.props.images.length > 1 && this.run();
-    }
-
-    run() {
-        this.runningInterval = setInterval(() => {
-            let { showImageIndex } = this.state;
-            const { images } = this.props;
-            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
-            this.refreshImage();
-        }, this.RUN_INTERVAL);
-    }
-
-    setImageIndex(i) {
-        clearInterval(this.runningInterval);
-        this.state.showImageIndex = i;
-        this.refreshImage();
-    }
-
-    refreshImage() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    render() {
-        const { showImageIndex } = this.state;
-        const { images } = this.props;
-        return {
-            tag: "div",
-            id: this.id,
-            class: "image-carousel",
-            contents: [
-                {
-                    tag: "img",
-                    property: "image",
-                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
-                    src: images[showImageIndex],
-                },
-                images.length > 1 && {
-                    tag: "div",
-                    class: "carousel-bullets",
-                    contents: images.map((_, i) => {
-                        const active = showImageIndex === i;
-                        return {
-                            tag: "span",
-                            class: `bullet ${active ? "active" : ""}`,
-                            onclick: this.setImageIndex.bind(this, i),
-                        };
-                    }),
-                },
-            ],
-        };
-    }
-}
-
-module.exports = ImageCarousel;
-
-},{"object-to-html-renderer":3}],5:[function(require,module,exports){
-"use strict";
-
-class KuadradoValues {
-    render() {
-        return {
-            tag: "section",
-            class: "kuadrado-values",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-contents-center",
-                    contents: [
-                        {
-                            tag: "h2",
-                            contents: "<blue>Éthique</blue>",
-                        },
-                        {
-                            tag: "ul",
-                            class: "values-list",
-                            contents: [
-                                [
-                                    "<emoji>📖</emoji> <blue>Partage des connaissances</blue>",
-                                    `Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, 
-                                    pour aller plus loin ensemble, le partage du savoir est fondamental.`,
-                                ],
-                                [
-                                    "<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>",
-                                    `Toutes mes productions numériques, jeux vidéo, web, software, sont 
+!function n(r,a,o){function i(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(c)return c(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return i(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<o.length;e++)i(o[e]);return i}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",class:"kuadrado-values",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"<blue>Éthique</blue>"},{tag:"ul",class:"values-list",contents:[["<emoji>📖</emoji> <blue>Partage des connaissances</blue>",`Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, 
+                                    pour aller plus loin ensemble, le partage du savoir est fondamental.`],["<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>",`Toutes mes productions numériques, jeux vidéo, web, software, sont 
                                     <b><a href="https://fr.wikipedia.org/wiki/Logiciel_libre" target="_blank">libres et open source</a></b>.
-                                    <br/> ainsi que les outils engagés dans leur fabrication.`,
-                                ],
-                                [
-                                    "<emoji>🌿</emoji> <blue>Écologie</blue>",
-                                    `Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament
+                                    <br/> ainsi que les outils engagés dans leur fabrication.`],["<emoji>🌿</emoji> <blue>Écologie</blue>",`Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament
                                     à travers internet.
                                     <br/>Il est primordial de construire le numérique dans une direction de légèreté et d'économie de 
-                                    ressources.`,
-                                ],
-                            ].map(v => {
-                                const [title, body] = v;
-                                return {
-                                    tag: "li",
-                                    contents: [
-                                        { tag: "h3", contents: title },
-                                        { tag: "p", contents: body },
-                                    ],
-                                };
-                            }),
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = KuadradoValues;
-
-},{}],6:[function(require,module,exports){
-"use strict";
-
-const { articles_url } = require("../../constants");
-const objectHtmlRenderer = require("object-to-html-renderer");
-const ImageCarousel = require("../generic-components/image-carousel");
-const { loadArticles, getArticleDate, getArticleBody } = require("../lib/article-utils");
-
-class NewsArticles {
-    constructor() {
-        this.id = performance.now().toString();
-        this.state = {
-            loading: true,
-            articles: [],
-            showArticleIndex: -1,
-        };
-        this.loadArticles();
-    }
-
-    loadArticles() {
-        loadArticles(`${articles_url}news`).then(articles => {
-            this.state.articles = articles;
-            this.state.showArticleIndex = this.state.articles.length - 1;
-            this.refresh();
-        });
-    }
-
-    refresh() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    renderArticle(articleData) {
-        return {
-            tag: "article",
-            class: `${articleData.images ? "grid-2" : "grid-1"}`,
-            typeof: "Article",
-            contents: [
-                {
-                    tag: "div",
-                    class: "date",
-                    contents: [
-                        {
-                            tag: "time",
-                            property: "datePublished",
-                            contents: getArticleDate(articleData.date),
-                        },
-                    ],
-                },
-                {
-                    tag: "div",
-                    class: "title",
-                    contents: [
-                        {
-                            tag: "h3",
-                            contents: articleData.title,
-                            property: "headline",
-                        },
-                    ],
-                },
-                {
-                    tag: "div",
-                    class: "subtitle",
-                    contents: [
-                        {
-                            tag: "strong",
-                            contents: articleData.subtitle,
-                            property: "alternativeHeadline",
-                        },
-                    ],
-                },
-                {
-                    tag: "div",
-                    class: "body",
-                    contents: [
-                        {
-                            tag: "p",
-                            contents: getArticleBody(articleData.body),
-                            property: "articleBody",
-                        },
-                    ],
-                },
-                articleData.images &&
-                    new ImageCarousel({
-                        images: articleData.images.map(img => `${articleData.path}/images/${img}`),
-                    }).render(),
-            ],
-        };
-    }
-
-    renderArticlePlaceholder() {
-        return {
-            tag: "article",
-            class: "article-placeholder",
-            contents: [
-                { tag: "div", class: "date" },
-                { tag: "div", class: "title" },
-                { tag: "div", class: "subtitle" },
-                { tag: "div", class: "body" },
-                { tag: "div", class: "image-carousel" },
-            ],
-        };
-    }
-
-    handleChangeArticle(dir) {
-        let { showArticleIndex, articles } = this.state;
-        showArticleIndex =
-            dir === "prev"
-                ? showArticleIndex - 1 >= 0
-                    ? showArticleIndex - 1
-                    : 0
-                : showArticleIndex + 1 <= articles.length - 1
-                ? showArticleIndex + 1
-                : articles.length - 1;
-        this.state.showArticleIndex = showArticleIndex;
-        this.refresh();
-    }
-
-    render() {
-        const { articles, showArticleIndex } = this.state,
-            showNext = showArticleIndex < articles.length - 1,
-            showPrev = showArticleIndex > 0;
-        return {
-            tag: "div",
-            id: this.id,
-            class: "articles-displayer page-contents-center",
-            contents:
-                articles.length > 0
-                    ? [
-                          this.renderArticle(articles[showArticleIndex]),
-                          {
-                              tag: "div",
-                              class: "prev-next-buttons",
-                              contents: [
-                                  {
-                                      tag: "button",
-                                      class: `prev-btn ${!showPrev ? "disabled" : "active"}`,
-                                      contents: "Précédent",
-                                      onclick: this.handleChangeArticle.bind(this, "prev"),
-                                  },
-                                  {
-                                      tag: "button",
-                                      class: `next-btn ${!showNext ? "disabled" : "active"}`,
-                                      contents: "Suivant",
-                                      onclick: this.handleChangeArticle.bind(this, "next"),
-                                  },
-                              ],
-                          },
-                      ]
-                    : [this.renderArticlePlaceholder()],
-        };
-    }
-}
-
-module.exports = NewsArticles;
-
-},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../constants");
-
-class ThemeCard {
-    constructor(props) {
-        this.props = props;
-    }
-
-    render() {
-        return {
-            tag: "a",
-            class: "theme-card",
-            href: this.props.href,
-            contents: [
-                {
-                    tag: "div",
-                    class: "card-img",
-                    contents: [{ tag: "img", alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/, "")}`,src: `${images_url}${this.props.img}` }],
-                },
-                {
-                    tag: "div",
-                    class: "card-title",
-                    contents: [{ tag: "h2", class: "section-title", contents: this.props.title }],
-                },
-                {
-                    tag: "div",
-                    class: "card-description",
-                    contents: [{ tag: "p", contents: this.props.description }],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = ThemeCard;
-
-},{"../../constants":2}],8:[function(require,module,exports){
-"use strict";
-
-class WhoAmI {
-    render() {
-        return {
-            tag: "section",
-            id: "whoami",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-contents-center",
-                    contents: [
-                        {
-                            tag: "h2",
-                            contents: "Qui sommes-nous-je ?",
-                        },
-                        {
-                            tag: "div",
-                            class: "presentation-card",
-                            contents: [
-                                {
-                                    tag: "div",
-                                    class: "header",
-                                    contents: [
-                                        {
-                                            tag: "div",
-                                            class: "pic",
-                                            contents: [
-                                                {
-                                                    tag: "img",
-                                                    alt:
-                                                        "portrait Pierre Jarriges pixel art by Lucie Ventadour",
-                                                    src: "assets/images/pijar_profile_lt_square.png",
-                                                },
-                                            ],
-                                        },
-                                        {
-                                            tag: "div",
-                                            class: "header-text",
-                                            contents: [
-                                                {
-                                                    tag: "h3",
-                                                    contents: "Pierre Jarriges",
-                                                },
-                                                {
-                                                    tag: "h4",
-                                                    contents:
-                                                        "Artiste, auteur BD, compositeur, développeur informatique",
-                                                },
-                                                {
-                                                    tag: "strong",
-                                                    contents:
-                                                        "Créateur de <blue>Kuadrado Software</blue> en Février 2021.",
-                                                },
-                                            ],
-                                        },
-                                    ],
-                                },
-                                {
-                                    tag: "div",
-                                    class: "body",
-                                    contents: [
-                                        {
-                                            tag: "p",
-                                            contents: `
+                                    ressources.`]].map(e=>{var[t,e]=e;return{tag:"li",contents:[{tag:"h3",contents:t},{tag:"p",contents:e}]}})}]}]}}}},{}],6:[function(e,t,s){"use strict";const{articles_url:n}=e("../../constants"),r=e("object-to-html-renderer"),a=e("../generic-components/image-carousel"),{loadArticles:o,getArticleDate:i,getArticleBody:c}=e("../lib/article-utils");t.exports=class{constructor(){this.id=performance.now().toString(),this.state={loading:!0,articles:[],showArticleIndex:-1},this.loadArticles()}loadArticles(){o(`${n}news`).then(e=>{this.state.articles=e,this.state.showArticleIndex=this.state.articles.length-1,this.refresh()})}refresh(){r.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}renderArticle(t){return{tag:"article",class:`${t.images?"grid-2":"grid-1"}`,typeof:"Article",contents:[{tag:"div",class:"date",contents:[{tag:"time",property:"datePublished",contents:i(t.date)}]},{tag:"div",class:"title",contents:[{tag:"h3",contents:t.title,property:"headline"}]},{tag:"div",class:"subtitle",contents:[{tag:"strong",contents:t.subtitle,property:"alternativeHeadline"}]},{tag:"div",class:"body",contents:[{tag:"p",contents:c(t.body),property:"articleBody"}]},t.images&&new a({images:t.images.map(e=>`${t.path}/images/${e}`)}).render()]}}renderArticlePlaceholder(){return{tag:"article",class:"article-placeholder",contents:[{tag:"div",class:"date"},{tag:"div",class:"title"},{tag:"div",class:"subtitle"},{tag:"div",class:"body"},{tag:"div",class:"image-carousel"}]}}handleChangeArticle(e){let{showArticleIndex:t,articles:s}=this.state;t="prev"===e?0<=t-1?t-1:0:t+1<=s.length-1?t+1:s.length-1,this.state.showArticleIndex=t,this.refresh()}render(){var{articles:e,showArticleIndex:t}=this.state,s=t<e.length-1,n=0<t;return{tag:"div",id:this.id,class:"articles-displayer page-contents-center",contents:0<e.length?[this.renderArticle(e[t]),{tag:"div",class:"prev-next-buttons",contents:[{tag:"button",class:`prev-btn ${n?"active":"disabled"}`,contents:"Précédent",onclick:this.handleChangeArticle.bind(this,"prev")},{tag:"button",class:`next-btn ${s?"active":"disabled"}`,contents:"Suivant",onclick:this.handleChangeArticle.bind(this,"next")}]}]:[this.renderArticlePlaceholder()]}}}},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(e,t,s){"use strict";const{images_url:n}=e("../../constants");t.exports=class{constructor(e){this.props=e}render(){return{tag:"a",class:"theme-card",href:this.props.href,contents:[{tag:"div",class:"card-img",contents:[{tag:"img",alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/,"")}`,src:`${n}${this.props.img}`}]},{tag:"div",class:"card-title",contents:[{tag:"h2",class:"section-title",contents:this.props.title}]},{tag:"div",class:"card-description",contents:[{tag:"p",contents:this.props.description}]}]}}}},{"../../constants":2}],8:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",id:"whoami",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"Qui sommes-nous-je ?"},{tag:"div",class:"presentation-card",contents:[{tag:"div",class:"header",contents:[{tag:"div",class:"pic",contents:[{tag:"img",alt:"portrait Pierre Jarriges pixel art by Lucie Ventadour",src:"assets/images/pijar_profile_lt_square.png"}]},{tag:"div",class:"header-text",contents:[{tag:"h3",contents:"Pierre Jarriges"},{tag:"h4",contents:"Artiste, auteur BD, compositeur, développeur informatique"},{tag:"strong",contents:"Créateur de <blue>Kuadrado Software</blue> en Février 2021."}]}]},{tag:"div",class:"body",contents:[{tag:"p",contents:`
                                             “ La création de <b><blue>Kuadrado Software</blue></b> vient de la volonté de développer différents axes ensembles :
                                             <br /><br />
                                             <emoji>🎮</emoji> D'une part exprimer une passion en créant des <b>jeux vidéo indépendants</b> sur un modèle léger et artisanal dans 
@@ -515,467 +24,5 @@ class WhoAmI {
                                             dans le même état d'esprit, former des équipes de travail et de création, et s'inscrire dans un tissu 
                                             local de savoir-faire, tout en gardant un modèle d'entreprise basé sur l'indépendance, afin de rester aussi léger, libéral, 
                                             et modulaire que possible.”
-                                            `,
-                                        },
-                                    ],
-                                },
-                            ],
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = WhoAmI;
-
-},{}],9:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../constants");
-const KuadradoValues = require("./home-page-components/kuadrado-values");
-const NewsArticles = require("./home-page-components/news-articles");
-const ThemeCard = require("./home-page-components/theme-card");
-const WhoAmI = require("./home-page-components/whoami");
-const WebPage = require("./lib/web-page");
-
-class HomePage extends WebPage {
-    render() {
-        return {
-            tag: "div",
-            id: "home-page",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-header",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "big-logo page-contents-center",
-                            contents: [
-                                {
-                                    tag: "img",
-                                    alt: "logo Kuadrado",
-                                    src: `${images_url}logo_kuadrado.svg`,
-                                },
-                                {
-                                    tag: "img",
-                                    class: "logo-text",
-                                    alt: "Kuadrado",
-                                    src: `${images_url}logo_kuadrado_txt.svg`,
-                                },
-                            ],
-                        },
-                        { tag: "h1", contents: "Kuadrado Software", class: "page-contents-center" },
-                        {
-                            tag: "p",
-                            class: "page-contents-center",
-                            contents: `Créations numériques, jeux vidéo, pédagogie.`,
-                        },
-                        {
-                            tag: "ul",
-                            class: "philo-bubbles",
-                            contents: ["Simplicité", "Légèreté", "Écologie"].map(word => {
-                                return {
-                                    tag: "li",
-                                    contents: [{ tag: "span", contents: word }],
-                                };
-                            }),
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    class: "page-contents-center poles",
-                    contents: [
-                        {
-                            title: "Jeux",
-                            img: "game_controller.svg",
-                            href: "/games/",
-                            description:
-                                "Créations vidéoludiques, jeux web et jeux PC, projets en cours.",
-                        },
-                        {
-                            title: "Pédagogie",
-                            img: "brain.svg",
-                            href: "/education/",
-                            description: `S'approprier la technologie par le partage de connaissances.`,
-                        },
-                        {
-                            title: "Software",
-                            img: "meca_proc.svg",
-                            href: "/software-development/",
-                            description: `R&D, projets expérimentaux, web et outillage logiciel`,
-                        },
-                    ].map(cardProps => new ThemeCard(cardProps).render()),
-                },
-                {
-                    tag: "section",
-                    class: "page-philo",
-                    contents: [
-                        {
-                            tag: "p",
-                            class: "page-contents-center",
-                            contents: `Travailler pour le plaisir de créer, de maîtriser et de comprendre.`,
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    class: "page-contents-center",
-                    id:"news",
-                    contents: [
-                        { tag: "h2", contents: "Actu", class: "section-title" },
-                        new NewsArticles().render(),
-                    ],
-                },
-                new KuadradoValues().render(),
-                new WhoAmI().render(),
-            ],
-        };
-    }
-}
-
-module.exports = HomePage;
-
-},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(require,module,exports){
-"use strict";
-
-const { fetchjson, fetchtext } = require("./fetch");
-
-function getArticleBody(text) {
-    return text.replaceAll("\n", "<br/>");
-}
-
-function getArticleDate(date) {
-    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
-}
-
-function loadArticles(dir_url) {
-    return new Promise((resolve, reject) => {
-        fetchjson(`${dir_url}/index.json`)
-            .then(json => {
-                Promise.all(
-                    json.articles.map(async artDir => {
-                        const artPath = `${artDir}/${artDir}.json`;
-                        const art = await fetchjson(`${dir_url}/${artPath}`);
-                        const tmpSplit = artPath.split("/");
-                        tmpSplit.pop();
-                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
-                        return Object.assign(art, { path: absArtPath });
-                    })
-                )
-                    .then(articles => {
-                        populateArticles(articles)
-                            .then(completeArticles => resolve(completeArticles))
-                            .catch(e => reject(e));
-                    })
-                    .catch(e => reject(e));
-            })
-            .catch(e => console.log(e));
-    });
-}
-
-function populateArticles(articles) {
-    return new Promise((resolve, reject) => {
-        Promise.all(
-            articles.map(async article => {
-                if (article.body.indexOf("<file>") !== -1) {
-                    const txtPath = article.body.replace("<file>", "");
-                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
-                    article.body = textValue;
-                    article.date = article.date ? new Date(article.date) : undefined;
-                }
-                return article;
-            })
-        )
-            .then(completeArticles => resolve(completeArticles.sort((a, b) => a.date - b.date)))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    loadArticles,
-    getArticleBody,
-    getArticleDate,
-    populateArticles,
-};
-
-},{"./fetch":11}],11:[function(require,module,exports){
-"use strict";
-
-function fetchjson(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.json())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-function fetchtext(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.text())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    fetchjson,
-    fetchtext,
-};
-
-},{}],12:[function(require,module,exports){
-"use strict";
-
-class WebPage {
-    constructor(args) {
-        Object.assign(this, args);
-    }
-}
-
-module.exports = WebPage;
-},{}],13:[function(require,module,exports){
-"use strict";
-
-const HomePage = require("./homepage");
-const runPage = require("./run-page");
-
-runPage(HomePage);
-
-},{"./homepage":9,"./run-page":14}],14:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-const Template = require("./template/template");
-
-module.exports = function runPage(PageComponent) {
-    const template = new Template({ page: new PageComponent() });
-    objectHtmlRenderer.setRenderCycleRoot(template);
-    objectHtmlRenderer.renderCycle();
-};
-
-},{"./template/template":16,"object-to-html-renderer":3}],15:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-
-const NAV_MENU_ITEMS = [
-    { url: "/games/", text: "Jeux" },
-    {
-        url: "/education/",
-        text: "Pédagogie",
-        // submenu: [
-        //     { url: "/gamedev", text: "Création de jeux vidéo" },
-        // ]
-    },
-    { url: "/software-development/", text: "Software" }
-];
-
-class NavBar {
-    constructor() {
-        this.initEventHandlers();
-    }
-
-    handleBurgerClick() {
-        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
-    }
-
-    initEventHandlers() {
-        window.addEventListener("click", event => {
-            if (
-                event.target.id !== "nav-menu-list" &&
-                !event.target.classList.contains("burger") &&
-                !event.target.parentNode.classList.contains("burger")
-            ) {
-                document.getElementById("nav-menu-list").classList.remove("responsive-show");
-            }
-        });
-    }
-
-    renderHome() {
-        return {
-            tag: "div",
-            class: "home",
-            contents: [
-                {
-                    tag: "a",
-                    href: "/",
-                    contents: [
-                        {
-                            tag: "img",
-                            alt: "Logo Kuadrado",
-                            src: `${images_url}logo_kuadrado.svg`,
-                        },
-                        {
-                            tag: "img",
-                            alt: "Kuadrado Software",
-                            class: "logo-text",
-                            src: `${images_url}logo_kuadrado_txt.svg`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-
-    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
-        return {
-            tag: "ul",
-            id: "nav-menu-list",
-            class: isSubmenu ? "submenu" : "",
-            contents: menuItemsArray.map(item => {
-                const { url, text, submenu } = item;
-                const href = `${parentUrl}${url}`;
-                return {
-                    tag: "li",
-                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
-                    contents: [
-                        {
-                            tag: "a",
-                            href,
-                            contents: text,
-                        },
-                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
-                };
-            }),
-        };
-    }
-
-    renderResponsiveBurger() {
-        return {
-            tag: "div",
-            class: "burger",
-            onclick: this.handleBurgerClick.bind(this),
-            contents: [{ tag: "span", contents: "···" }],
-        };
-    }
-
-    render() {
-        return {
-            tag: "nav",
-            contents: [
-                this.renderHome(),
-                this.renderResponsiveBurger(),
-                this.renderMenu(NAV_MENU_ITEMS),
-            ],
-        };
-    }
-}
-
-module.exports = NavBar;
-
-},{"../../../constants":2}],16:[function(require,module,exports){
-"use strict";
-
-const { in_construction } = require("../../config");
-const { images_url } = require("../../constants");
-const NavBar = require("./components/navbar");
-
-class Template {
-    constructor(props) {
-        this.props = props;
-    }
-    render() {
-        return {
-            tag: "main",
-            contents: [
-                {
-                    tag: "header",
-                    contents: [new NavBar().render()],
-                },
-                in_construction && {
-                    tag: "section",
-                    class: "warning-banner",
-                    contents: [
-                        {
-                            tag: "strong",
-                            class: "page-contents-center",
-                            contents: "Site en construction ...",
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    id: "page-container",
-                    contents: [this.props.page.render()],
-                },
-                {
-                    tag: "footer",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "logo",
-                            contents: [
-                                {
-                                    tag: "img",
-                                    alt: `logo Kuadrado`,
-                                    src: `${images_url}logo_kuadrado.svg`,
-                                },
-                                {
-                                    tag: "img",
-                                    class: "text-logo",
-                                    alt: "Kuadrado Software",
-                                    src: `${images_url}logo_kuadrado_txt.svg`,
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
-                        },
-                        {
-                            tag: "div",
-                            contents: [
-                                { tag: "strong", contents: "<blue>Contact : </blue>" },
-                                {
-                                    tag: "a",
-                                    href: "mailto:contact@kuadrado-software.fr",
-                                    contents: "contact@kuadrado-software.fr",
-                                },
-                            ],
-                        },
-                        {
-                            tag: "div",
-                            class: "social",
-                            contents: [
-                                {
-                                    tag: "strong",
-                                    contents: "<blue>Sur les réseaux : </blue>",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://www.linkedin.com/company/kuadrado-software",
-                                    target: "_blank",
-                                    contents: "in",
-                                    title: "Linkedin",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://twitter.com/KuadradoSoft",
-                                    target: "_blank",
-                                    contents: "t",
-                                    title: "Twitter",
-                                    style_rules: { fontFamily: "serif" },
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: `Copyright © ${new Date()
-                                .getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = Template;
-
-},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]);
+                                            `}]}]}]}]}}}},{}],9:[function(e,t,s){"use strict";const{images_url:n}=e("../constants"),r=e("./home-page-components/kuadrado-values"),a=e("./home-page-components/news-articles"),o=e("./home-page-components/theme-card"),i=e("./home-page-components/whoami");class c extends e("./lib/web-page"){render(){return{tag:"div",id:"home-page",contents:[{tag:"div",class:"page-header",contents:[{tag:"div",class:"big-logo page-contents-center",contents:[{tag:"img",alt:"logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",class:"logo-text",alt:"Kuadrado",src:`${n}logo_kuadrado_txt.svg`}]},{tag:"h1",contents:"Kuadrado Software",class:"page-contents-center"},{tag:"p",class:"page-contents-center",contents:"Créations numériques, jeux vidéo, pédagogie."},{tag:"ul",class:"philo-bubbles",contents:["Simplicité","Légèreté","Écologie"].map(e=>({tag:"li",contents:[{tag:"span",contents:e}]}))}]},{tag:"section",class:"page-contents-center poles",contents:[{title:"Jeux",img:"game_controller.svg",href:"/games/",description:"Créations vidéoludiques, jeux web et jeux PC, projets en cours."},{title:"Pédagogie",img:"brain.svg",href:"/education/",description:"S'approprier la technologie par le partage de connaissances."},{title:"Software",img:"meca_proc.svg",href:"/software-development/",description:"R&D, projets expérimentaux, web et outillage logiciel"}].map(e=>new o(e).render())},{tag:"section",class:"page-philo",contents:[{tag:"p",class:"page-contents-center",contents:"Travailler pour le plaisir de créer, de maîtriser et de comprendre."}]},{tag:"section",class:"page-contents-center",id:"news",contents:[{tag:"h2",contents:"Actu",class:"section-title"},(new a).render()]},(new r).render(),(new i).render()]}}}t.exports=c},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":11}],11:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],12:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],13:[function(e,t,s){"use strict";var n=e("./homepage");const r=e("./run-page");r(n)},{"./homepage":9,"./run-page":14}],14:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":16,"object-to-html-renderer":3}],15:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],16:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]);
\ No newline at end of file
diff --git a/public/software-development/software-development.js b/public/software-development/software-development.js
index 6d902af..f17ce36 100644
--- a/public/software-development/software-development.js
+++ b/public/software-development/software-development.js
@@ -1,810 +1,2 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-function getServerUrl() {
-    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
-        }`;
-}
-
-module.exports = {
-    getServerUrl,
-    build: {
-        protected_dirs: ["assets", "style", "articles"],
-        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
-    },
-};
-
-},{}],2:[function(require,module,exports){
-const { getServerUrl } = require("./config");
-
-module.exports = {
-    images_url: `${getServerUrl()}assets/images/`,
-    articles_url: `${getServerUrl()}articles/`,
-};
-
-},{"./config":1}],3:[function(require,module,exports){
-"use strict";
-
-module.exports = {
-    setRenderCycleRoot(renderCycleRoot) {
-        this.renderCycleRoot = renderCycleRoot;
-    },
-    objectToHtml: function objectToHtml(obj) {
-        const { tag } = obj;
-
-        const node = document.createElement(tag);
-        const excludeKeys = ["tag", "contents", "style_rules", "state"];
-
-        Object.keys(obj)
-            .filter(attr => !excludeKeys.includes(attr))
-            .forEach(attr => {
-                if (attr === "class") {
-                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
-                } else {
-                    node[attr] = obj[attr];
-                }
-            });
-        if (obj.contents && typeof obj.contents === "string") {
-            node.innerHTML = obj.contents;
-        } else {
-            obj.contents &&
-                obj.contents.length > 0 &&
-                obj.contents.forEach(el => {
-                    switch (typeof el) {
-                        case "string":
-                            node.innerHTML = el;
-                            break;
-                        case "object":
-                            node.appendChild(objectToHtml(el));
-                            break;
-                    }
-                });
-        }
-
-        if (obj.style_rules) {
-            Object.keys(obj.style_rules).forEach(rule => {
-                node.style[rule] = obj.style_rules[rule];
-            });
-        }
-
-        return node;
-    },
-    renderCycle: function () {
-        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
-            mode: "replace",
-        });
-    },
-    subRender(object, htmlNode, options = { mode: "append" }) {
-        const insert = this.objectToHtml(object);
-        switch (options.mode) {
-            case "append":
-                htmlNode.appendChild(insert);
-                break;
-            case "override":
-                htmlNode.innerHTML = "";
-                htmlNode.appendChild(insert);
-                break;
-            case "insert-before":
-                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
-                break;
-            case "adjacent":
-                /**
-                 * options.insertLocation must be one of:
-                 *
-                 * afterbegin
-                 * afterend
-                 * beforebegin
-                 * beforeend
-                 */
-                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
-                break;
-            case "replace":
-                htmlNode.parentNode.replaceChild(insert, htmlNode);
-                break;
-            case "remove":
-                htmlNode.remove();
-                break;
-        }
-    },
-};
-
-},{}],4:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-
-class ImageCarousel {
-    constructor(props) {
-        this.props = props;
-        this.id = performance.now();
-        this.state = {
-            showImageIndex: 0,
-        };
-        this.RUN_INTERVAL = 5000;
-        this.props.images.length > 1 && this.run();
-    }
-
-    run() {
-        this.runningInterval = setInterval(() => {
-            let { showImageIndex } = this.state;
-            const { images } = this.props;
-            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
-            this.refreshImage();
-        }, this.RUN_INTERVAL);
-    }
-
-    setImageIndex(i) {
-        clearInterval(this.runningInterval);
-        this.state.showImageIndex = i;
-        this.refreshImage();
-    }
-
-    refreshImage() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    render() {
-        const { showImageIndex } = this.state;
-        const { images } = this.props;
-        return {
-            tag: "div",
-            id: this.id,
-            class: "image-carousel",
-            contents: [
-                {
-                    tag: "img",
-                    property: "image",
-                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
-                    src: images[showImageIndex],
-                },
-                images.length > 1 && {
-                    tag: "div",
-                    class: "carousel-bullets",
-                    contents: images.map((_, i) => {
-                        const active = showImageIndex === i;
-                        return {
-                            tag: "span",
-                            class: `bullet ${active ? "active" : ""}`,
-                            onclick: this.setImageIndex.bind(this, i),
-                        };
-                    }),
-                },
-            ],
-        };
-    }
-}
-
-module.exports = ImageCarousel;
-
-},{"object-to-html-renderer":3}],5:[function(require,module,exports){
-"use strict";
-
-const { fetchjson, fetchtext } = require("./fetch");
-
-function getArticleBody(text) {
-    return text.replaceAll("\n", "<br/>");
-}
-
-function getArticleDate(date) {
-    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
-}
-
-function loadArticles(dir_url) {
-    return new Promise((resolve, reject) => {
-        fetchjson(`${dir_url}/index.json`)
-            .then(json => {
-                Promise.all(
-                    json.articles.map(async artDir => {
-                        const artPath = `${artDir}/${artDir}.json`;
-                        const art = await fetchjson(`${dir_url}/${artPath}`);
-                        const tmpSplit = artPath.split("/");
-                        tmpSplit.pop();
-                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
-                        return Object.assign(art, { path: absArtPath });
-                    })
-                )
-                    .then(articles => {
-                        populateArticles(articles)
-                            .then(completeArticles => resolve(completeArticles))
-                            .catch(e => reject(e));
-                    })
-                    .catch(e => reject(e));
-            })
-            .catch(e => console.log(e));
-    });
-}
-
-function populateArticles(articles) {
-    return new Promise((resolve, reject) => {
-        Promise.all(
-            articles.map(async article => {
-                if (article.body.indexOf("<file>") !== -1) {
-                    const txtPath = article.body.replace("<file>", "");
-                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
-                    article.body = textValue;
-                    article.date = article.date ? new Date(article.date) : undefined;
-                }
-                return article;
-            })
-        )
-            .then(completeArticles => resolve(completeArticles.sort((a, b) => a.date - b.date)))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    loadArticles,
-    getArticleBody,
-    getArticleDate,
-    populateArticles,
-};
-
-},{"./fetch":6}],6:[function(require,module,exports){
-"use strict";
-
-function fetchjson(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.json())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-function fetchtext(url) {
-    return new Promise((resolve, reject) => {
-        fetch(url)
-            .then(r => r.text())
-            .then(r => resolve(r))
-            .catch(e => reject(e));
-    });
-}
-
-module.exports = {
-    fetchjson,
-    fetchtext,
-};
-
-},{}],7:[function(require,module,exports){
-"use strict";
-
-class WebPage {
-    constructor(args) {
-        Object.assign(this, args);
-    }
-}
-
-module.exports = WebPage;
-},{}],8:[function(require,module,exports){
-"use strict";
-
-const { articles_url } = require("../../../../constants");
-const ImageCarousel = require("../../../generic-components/image-carousel");
-const { loadArticles, getArticleBody, getArticleDate } = require("../../../lib/article-utils");
-const objectHtmlRenderer = require("object-to-html-renderer")
-
-class SoftwareArticle {
-    constructor(props) {
-        this.props = props;
-    }
-
-    render() {
-        const { title, date, body, subtitle, images, path, technical, releases } = this.props;
-        return {
-            tag: "article",
-            class: "software-article",
-            typeof: "SoftwareApplication",
-            additionalType: "Article",
-            contents: [
-                {
-                    tag: "h2",
-                    class: "software-title",
-                    contents: title,
-                    property: "name",
-                },
-                {
-                    tag: "time",
-                    class: "software-date",
-                    contents: getArticleDate(date),
-                    property: "datePublished",
-                },
-                {
-                    tag: "h3",
-                    class: "software-subtitle",
-                    contents: subtitle,
-                    property: "alternativeHeadline",
-                },
-                {
-                    tag: "div",
-                    class: "software-description",
-                    contents: getArticleBody(body),
-                    property: "description",
-                },
-                new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(),
-                {
-                    tag: "div",
-                    class: "software-technical",
-                    contents: [
-                        {
-                            tag: "h2",
-                            contents: "Details",
-                        },
-                        {
-                            tag: "ul",
-                            class: "technical-details",
-                            contents: [
-                                {
-                                    tag: "li",
-                                    class: "detail",
-                                    contents: [
-                                        { tag: "label", contents: "Stack" },
-                                        {
-                                            tag: "div",
-                                            contents: [
-                                                {
-                                                    tag: "ul",
-                                                    contents: technical.stack.map(tech => {
-                                                        return {
-                                                            tag: "li",
-                                                            contents: tech,
-                                                            property: "about",
-                                                        };
-                                                    }),
-                                                },
-                                            ],
-                                        },
-                                    ],
-                                },
-                                {
-                                    tag: "li",
-                                    class: "detail",
-                                    contents: [
-                                        { tag: "label", contents: "Version actuelle" },
-                                        {
-                                            tag: "div",
-                                            contents: technical.version,
-                                            property: "version",
-                                        },
-                                    ],
-                                },
-                                {
-                                    tag: "li",
-                                    class: "detail",
-                                    contents: [
-                                        { tag: "label", contents: "License" },
-                                        {
-                                            tag: "div",
-                                            contents: technical.license,
-                                            property: "license",
-                                        },
-                                    ],
-                                },
-                                {
-                                    tag: "li",
-                                    class: "detail",
-                                    contents: [
-                                        {
-                                            tag: "label",
-                                            contents: "Code source",
-                                        },
-                                        {
-                                            tag: "a",
-                                            href: technical.repository,
-                                            target: "_blank",
-                                            contents: technical.repository.replace(
-                                                /https?:\/\/(www\.)?/g,
-                                                ""
-                                            ),
-                                            property: "url",
-                                        },
-                                    ],
-                                },
-                            ],
-                        },
-                        releases && {
-                            tag: "h2",
-                            contents: "Releases",
-                        },
-                        releases && {
-                            tag: "ul",
-                            class: "releases",
-                            contents: [
-                                {
-                                    tag: "li",
-                                    class: "detail",
-                                    contents: [
-                                        {
-                                            tag: "label",
-                                            class: "label",
-                                            contents: "Plateforme",
-                                        },
-                                        {
-                                            tag: "label",
-                                            class: "label",
-                                            contents: "Téléchargement",
-                                        },
-                                    ],
-                                },
-                            ].concat(
-                                releases.map(rel => {
-                                    return {
-                                        tag: "li",
-                                        class: "release detail",
-                                        contents: [
-                                            {
-                                                tag: "label",
-                                                contents: rel.platform,
-                                            },
-                                            {
-                                                tag: "a",
-                                                download: rel.download,
-                                                href: `${path}/release/${rel.download}`,
-                                                contents: rel.download,
-                                                property: "url",
-                                            },
-                                        ],
-                                    };
-                                })
-                            ),
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-class SoftwareArticles {
-    constructor(props) {
-        this.props = props;
-        this.state = {
-            articles: [],
-        };
-        this.id = performance.now();
-        this.loadArticles();
-    }
-
-    loadArticles() {
-        loadArticles(`${articles_url}software`)
-            .then(articles => {
-                this.state.articles = articles;
-                this.refresh();
-                this.fixScroll();
-            })
-            .catch(e => console.log(e));
-    }
-
-    renderPlaceholder() {
-        return {
-            tag: "article",
-            class: "placeholder",
-            contents: [
-                { tag: "div", class: "title" },
-                { tag: "div", class: "body" },
-                { tag: "div", class: "details" },
-            ],
-        };
-    }
-
-    refresh() {
-        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
-            mode: "replace",
-        });
-    }
-
-    fixScroll() {
-        if (window.location.href.includes("#")) {
-            window.scrollTo(
-                0,
-                document.getElementById(window.location.href.match(/#.+/)[0].replace("#", ""))
-                    .offsetTop
-            );
-        }
-    }
-
-    render() {
-        const { articles } = this.state;
-        return {
-            tag: "section",
-            class: "software-articles page-contents-center",
-            id: this.id,
-            contents:
-                articles.length > 0
-                    ? articles.map(article => new SoftwareArticle({ ...article }).render())
-                    : [this.renderPlaceholder()],
-        };
-    }
-}
-
-module.exports = SoftwareArticles;
-
-},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-const WebPage = require("../../lib/web-page");
-const SoftwareArticles = require("./components/software-articles");
-
-class SoftwareDevelopment extends WebPage {
-    render() {
-        return {
-            tag: "div",
-            id: "software-page",
-            contents: [
-                {
-                    tag: "div",
-                    class: "page-header logo-left",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "page-contents-center grid-wrapper",
-                            contents: [
-                                {
-                                    tag: "div",
-                                    class: "logo",
-                                    contents: [
-                                        {
-                                            tag: "img",
-                                            alt: `image mechanic electronic`,
-                                            src: `${images_url}meca_proc.svg`,
-                                        },
-                                    ],
-                                },
-                                { tag: "h1", contents: "Software" },
-                                {
-                                    tag: "p",
-                                    contents: `R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web.`,
-                                },
-                            ],
-                        },
-                    ],
-                },
-                new SoftwareArticles().render(),
-            ],
-        };
-    }
-}
-
-module.exports = SoftwareDevelopment;
-
-},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(require,module,exports){
-"use strict";
-
-"use strict";
-const runPage = require("../../run-page");
-const SoftwareDevelopment = require("./software-development");
-runPage(SoftwareDevelopment);
-
-},{"../../run-page":11,"./software-development":9}],11:[function(require,module,exports){
-"use strict";
-
-const objectHtmlRenderer = require("object-to-html-renderer")
-const Template = require("./template/template");
-
-module.exports = function runPage(PageComponent) {
-    const template = new Template({ page: new PageComponent() });
-    objectHtmlRenderer.setRenderCycleRoot(template);
-    objectHtmlRenderer.renderCycle();
-};
-
-},{"./template/template":13,"object-to-html-renderer":3}],12:[function(require,module,exports){
-"use strict";
-
-const { images_url } = require("../../../constants");
-
-const NAV_MENU_ITEMS = [
-    { url: "/games/", text: "Jeux" },
-    {
-        url: "/education/",
-        text: "Pédagogie",
-        // submenu: [
-        //     { url: "/gamedev", text: "Création de jeux vidéo" },
-        // ]
-    },
-    { url: "/software-development/", text: "Software" }
-];
-
-class NavBar {
-    constructor() {
-        this.initEventHandlers();
-    }
-
-    handleBurgerClick() {
-        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
-    }
-
-    initEventHandlers() {
-        window.addEventListener("click", event => {
-            if (
-                event.target.id !== "nav-menu-list" &&
-                !event.target.classList.contains("burger") &&
-                !event.target.parentNode.classList.contains("burger")
-            ) {
-                document.getElementById("nav-menu-list").classList.remove("responsive-show");
-            }
-        });
-    }
-
-    renderHome() {
-        return {
-            tag: "div",
-            class: "home",
-            contents: [
-                {
-                    tag: "a",
-                    href: "/",
-                    contents: [
-                        {
-                            tag: "img",
-                            alt: "Logo Kuadrado",
-                            src: `${images_url}logo_kuadrado.svg`,
-                        },
-                        {
-                            tag: "img",
-                            alt: "Kuadrado Software",
-                            class: "logo-text",
-                            src: `${images_url}logo_kuadrado_txt.svg`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-
-    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
-        return {
-            tag: "ul",
-            id: "nav-menu-list",
-            class: isSubmenu ? "submenu" : "",
-            contents: menuItemsArray.map(item => {
-                const { url, text, submenu } = item;
-                const href = `${parentUrl}${url}`;
-                return {
-                    tag: "li",
-                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
-                    contents: [
-                        {
-                            tag: "a",
-                            href,
-                            contents: text,
-                        },
-                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
-                };
-            }),
-        };
-    }
-
-    renderResponsiveBurger() {
-        return {
-            tag: "div",
-            class: "burger",
-            onclick: this.handleBurgerClick.bind(this),
-            contents: [{ tag: "span", contents: "···" }],
-        };
-    }
-
-    render() {
-        return {
-            tag: "nav",
-            contents: [
-                this.renderHome(),
-                this.renderResponsiveBurger(),
-                this.renderMenu(NAV_MENU_ITEMS),
-            ],
-        };
-    }
-}
-
-module.exports = NavBar;
-
-},{"../../../constants":2}],13:[function(require,module,exports){
-"use strict";
-
-const { in_construction } = require("../../config");
-const { images_url } = require("../../constants");
-const NavBar = require("./components/navbar");
-
-class Template {
-    constructor(props) {
-        this.props = props;
-    }
-    render() {
-        return {
-            tag: "main",
-            contents: [
-                {
-                    tag: "header",
-                    contents: [new NavBar().render()],
-                },
-                in_construction && {
-                    tag: "section",
-                    class: "warning-banner",
-                    contents: [
-                        {
-                            tag: "strong",
-                            class: "page-contents-center",
-                            contents: "Site en construction ...",
-                        },
-                    ],
-                },
-                {
-                    tag: "section",
-                    id: "page-container",
-                    contents: [this.props.page.render()],
-                },
-                {
-                    tag: "footer",
-                    contents: [
-                        {
-                            tag: "div",
-                            class: "logo",
-                            contents: [
-                                {
-                                    tag: "img",
-                                    alt: `logo Kuadrado`,
-                                    src: `${images_url}logo_kuadrado.svg`,
-                                },
-                                {
-                                    tag: "img",
-                                    class: "text-logo",
-                                    alt: "Kuadrado Software",
-                                    src: `${images_url}logo_kuadrado_txt.svg`,
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
-                        },
-                        {
-                            tag: "div",
-                            contents: [
-                                { tag: "strong", contents: "<blue>Contact : </blue>" },
-                                {
-                                    tag: "a",
-                                    href: "mailto:contact@kuadrado-software.fr",
-                                    contents: "contact@kuadrado-software.fr",
-                                },
-                            ],
-                        },
-                        {
-                            tag: "div",
-                            class: "social",
-                            contents: [
-                                {
-                                    tag: "strong",
-                                    contents: "<blue>Sur les réseaux : </blue>",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://www.linkedin.com/company/kuadrado-software",
-                                    target: "_blank",
-                                    contents: "in",
-                                    title: "Linkedin",
-                                },
-                                {
-                                    tag: "a",
-                                    href: "https://twitter.com/KuadradoSoft",
-                                    target: "_blank",
-                                    contents: "t",
-                                    title: "Twitter",
-                                    style_rules: { fontFamily: "serif" },
-                                },
-                            ],
-                        },
-                        {
-                            tag: "span",
-                            contents: `Copyright © ${new Date()
-                                .getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
-                        },
-                    ],
-                },
-            ],
-        };
-    }
-}
-
-module.exports = Template;
-
-},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]);
+!function s(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(i)return i(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=a[t]={exports:{}},r[t][0].call(n.exports,function(e){return c(r[t][1][e]||e)},n,n.exports,s,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";const s=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){s.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:n}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[n].replace(/\.[A-Za-z]+/,"")}`,src:e[n]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${n===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,n){"use strict";const{fetchjson:a,fetchtext:s}=e("./fetch");function o(e){return new Promise((t,n)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await s(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>n(e))})}t.exports={loadArticles:function(r){return new Promise((t,n)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var n=await a(`${r}/${t}`);const s=t.split("/");s.pop();e=`${r}/${s.join("/")}`;return Object.assign(n,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>n(e))}).catch(e=>n(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,n){"use strict";t.exports={fetchjson:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>n(e))})},fetchtext:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>n(e))})}}},{}],7:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,n){"use strict";const{articles_url:s}=e("../../../../constants"),i=e("../../../generic-components/image-carousel"),{loadArticles:r,getArticleBody:l,getArticleDate:d}=e("../../../lib/article-utils"),a=e("object-to-html-renderer");class o{constructor(e){this.props=e}render(){const{title:e,date:t,body:n,subtitle:s,images:r,path:a,technical:o,releases:c}=this.props;return{tag:"article",class:"software-article",typeof:"SoftwareApplication",additionalType:"Article",contents:[{tag:"h2",class:"software-title",contents:e,property:"name"},{tag:"time",class:"software-date",contents:d(t),property:"datePublished"},{tag:"h3",class:"software-subtitle",contents:s,property:"alternativeHeadline"},{tag:"div",class:"software-description",contents:l(n),property:"description"},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"software-technical",contents:[{tag:"h2",contents:"Details"},{tag:"ul",class:"technical-details",contents:[{tag:"li",class:"detail",contents:[{tag:"label",contents:"Stack"},{tag:"div",contents:[{tag:"ul",contents:o.stack.map(e=>({tag:"li",contents:e,property:"about"}))}]}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Version actuelle"},{tag:"div",contents:o.version,property:"version"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"License"},{tag:"div",contents:o.license,property:"license"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Code source"},{tag:"a",href:o.repository,target:"_blank",contents:o.repository.replace(/https?:\/\/(www\.)?/g,""),property:"url"}]}]},c&&{tag:"h2",contents:"Releases"},c&&{tag:"ul",class:"releases",contents:[{tag:"li",class:"detail",contents:[{tag:"label",class:"label",contents:"Plateforme"},{tag:"label",class:"label",contents:"Téléchargement"}]}].concat(c.map(e=>({tag:"li",class:"release detail",contents:[{tag:"label",contents:e.platform},{tag:"a",download:e.download,href:`${a}/release/${e.download}`,contents:e.download,property:"url"}]})))}]}]}}}t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${s}software`).then(e=>{this.state.articles=e,this.refresh(),this.fixScroll()}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div",class:"title"},{tag:"div",class:"body"},{tag:"div",class:"details"}]}}refresh(){a.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}fixScroll(){window.location.href.includes("#")&&window.scrollTo(0,document.getElementById(window.location.href.match(/#.+/)[0].replace("#","")).offsetTop)}render(){const{articles:e}=this.state;return{tag:"section",class:"software-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new o({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/software-articles");class o extends r{render(){return{tag:"div",id:"software-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image mechanic electronic",src:`${s}meca_proc.svg`}]},{tag:"h1",contents:"Software"},{tag:"p",contents:"R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web."}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./software-development");s(e)},{"../../run-page":11,"./software-development":9}],11:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":13,"object-to-html-renderer":3}],12:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],13:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]);
\ No newline at end of file
diff --git a/public/style/home-page-components/news-articles.css b/public/style/home-page-components/news-articles.css
deleted file mode 100644
index 4fa2a44..0000000
--- a/public/style/home-page-components/news-articles.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined variable.
- *    ,
- * 22 |                     color: $medium_grey;
- *    |                            ^^^^^^^^^^^^
- *    '
- *   src/home-page-components/news-articles.scss 22:28  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined variable.\a    \2577 \a 22 \2502                      color: $medium_grey;\a    \2502                             ^^^^^^^^^^^^\a    \2575 \a   src/home-page-components/news-articles.scss 22:28  root stylesheet";
-}
diff --git a/public/style/home-page-components/whoami.css b/public/style/home-page-components/whoami.css
deleted file mode 100644
index f5a7027..0000000
--- a/public/style/home-page-components/whoami.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined mixin.
- *   ,
- * 5 |         @include flex-center-col;
- *   |         ^^^^^^^^^^^^^^^^^^^^^^^^
- *   '
- *   src/home-page-components/whoami.scss 5:9  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined mixin.\a   \2577 \a 5 \2502          @include flex-center-col;\a   \2502          ^^^^^^^^^^^^^^^^^^^^^^^^\a   \2575 \a   src/home-page-components/whoami.scss 5:9  root stylesheet";
-}
diff --git a/public/style/homepage.css b/public/style/homepage.css
deleted file mode 100644
index 00062e1..0000000
--- a/public/style/homepage.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined variable.
- *   ,
- * 7 |         color: $light_2;
- *   |                ^^^^^^^^
- *   '
- *   src/homepage.scss 7:16  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined variable.\a   \2577 \a 7 \2502          color: $light_2;\a   \2502                 ^^^^^^^^\a   \2575 \a   src/homepage.scss 7:16  root stylesheet";
-}
diff --git a/public/style/pages/education/education.css b/public/style/pages/education/education.css
deleted file mode 100644
index 8c81e7e..0000000
--- a/public/style/pages/education/education.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined variable.
- *    ,
- * 25 |         background-color: $yellow_2;
- *    |                           ^^^^^^^^^
- *    '
- *   src/pages/education/education.scss 25:27  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined variable.\a    \2577 \a 25 \2502          background-color: $yellow_2;\a    \2502                            ^^^^^^^^^\a    \2575 \a   src/pages/education/education.scss 25:27  root stylesheet";
-}
diff --git a/public/style/pages/education/subpages/game-studio-club/game-studio-club.css b/public/style/pages/education/subpages/game-studio-club/game-studio-club.css
deleted file mode 100644
index 90586b2..0000000
--- a/public/style/pages/education/subpages/game-studio-club/game-studio-club.css
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-/*# sourceMappingURL=game-studio-club.css.map */
diff --git a/public/style/pages/games/games.css b/public/style/pages/games/games.css
deleted file mode 100644
index e86516d..0000000
--- a/public/style/pages/games/games.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined variable.
- *    ,
- * 15 |                     color: $light_2;
- *    |                            ^^^^^^^^
- *    '
- *   src/pages/games/games.scss 15:28  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined variable.\a    \2577 \a 15 \2502                      color: $light_2;\a    \2502                             ^^^^^^^^\a    \2575 \a   src/pages/games/games.scss 15:28  root stylesheet";
-}
diff --git a/public/style/pages/software-development/software-development.css b/public/style/pages/software-development/software-development.css
deleted file mode 100644
index e9e1acc..0000000
--- a/public/style/pages/software-development/software-development.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Error: Undefined variable.
- *    ,
- * 11 |                 color: $light_2;
- *    |                        ^^^^^^^^
- *    '
- *   src/pages/software-development/software-development.scss 11:24  root stylesheet */
-
-body::before {
-  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
-      "Droid Sans Mono", monospace, monospace;
-  white-space: pre;
-  display: block;
-  padding: 1em;
-  margin-bottom: 1em;
-  border-bottom: 2px solid black;
-  content: "Error: Undefined variable.\a    \2577 \a 11 \2502                  color: $light_2;\a    \2502                         ^^^^^^^^\a    \2575 \a   src/pages/software-development/software-development.scss 11:24  root stylesheet";
-}
diff --git a/public/style/pages/story-logic-app/story-logic-app.css b/public/style/pages/story-logic-app/story-logic-app.css
deleted file mode 100644
index 23d770b..0000000
--- a/public/style/pages/story-logic-app/story-logic-app.css
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-/*# sourceMappingURL=story-logic-app.css.map */
diff --git a/public/style/style.css b/public/style/style.css
index f50842c..450e8b2 100644
--- a/public/style/style.css
+++ b/public/style/style.css
@@ -1,1274 +1 @@
-body {
-  font-family: Arial, Helvetica, sans-serif;
-  margin: 0;
-}
-body * {
-  box-sizing: border-box;
-  color: #35393c;
-  line-height: 1.3em;
-}
-body ul {
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-}
-body a {
-  color: #4baabb;
-  text-decoration: none;
-}
-body a:hover {
-  color: #72e3f0;
-}
-body blue {
-  color: #4baabb;
-}
-body red {
-  color: #9c3030;
-}
-body green {
-  color: #368736;
-}
-body emoji {
-  font-style: initial;
-  font-size: 25px;
-}
-body .bg-blue {
-  background-color: #4baabb;
-  color: white;
-}
-body .bg-dark {
-  background-color: #3c4144;
-  color: #aabbc8;
-}
-body #seo-title {
-  visibility: hidden;
-}
-body img.pixelated {
-  image-rendering: pixelated;
-  image-rendering: -moz-crisp-edges;
-  image-rendering: crisp-edges;
-}
-
-main {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  min-height: 100vh;
-}
-main .warning-banner {
-  background: url("/assets/images/wallpaper_warning.svg");
-  width: 100%;
-  height: 40px;
-  padding: 20px 10%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-}
-main .warning-banner strong {
-  font-size: 18px;
-  color: #1c3db2;
-}
-main .image-carousel {
-  overflow: hidden;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  background-color: black;
-  position: relative;
-}
-main .image-carousel img {
-  position: absolute;
-  max-width: 100%;
-  max-height: 400px;
-}
-main .image-carousel .carousel-bullets {
-  position: absolute;
-  bottom: 0;
-  padding: 20px;
-  display: flex;
-  gap: 10px;
-}
-main .image-carousel .carousel-bullets .bullet {
-  cursor: pointer;
-  width: 8px;
-  height: 8px;
-  background-color: #6b7880;
-  border-radius: 100%;
-  box-shadow: 0 0 3px black;
-}
-main .image-carousel .carousel-bullets .bullet.active {
-  background-color: #d4d9dd;
-}
-@media screen and (max-width: 900px) {
-  main .image-carousel img {
-    max-height: 100%;
-  }
-  main .image-carousel .carousel-bullets {
-    gap: 30px;
-  }
-  main .image-carousel .carousel-bullets .bullet {
-    width: 12px;
-    height: 12px;
-  }
-}
-main header {
-  width: 100%;
-  background-color: white;
-  position: sticky;
-  position: -webkit-sticky;
-  top: 0;
-  z-index: 10;
-}
-main header nav {
-  display: flex;
-  align-items: center;
-  height: 60px;
-}
-main header nav .home {
-  margin: 0 10px;
-}
-main header nav .home a {
-  display: flex;
-  align-items: center;
-  gap: 10px;
-}
-main header nav .home a img {
-  height: 40px;
-  width: auto;
-}
-main header nav .home a img.logo-text {
-  width: 120px;
-  height: auto;
-}
-main header nav ul {
-  display: flex;
-  padding: 0;
-  margin: 0;
-  list-style-type: none;
-  height: 100%;
-}
-main header nav ul li {
-  position: relative;
-}
-main header nav ul li a {
-  display: flex;
-  align-items: center;
-  height: 100%;
-  padding: 10px 20px;
-  color: #96a5ae;
-  font-weight: 800;
-  text-decoration: none;
-}
-main header nav ul li .submenu {
-  visibility: hidden;
-  overflow: hidden;
-  position: absolute;
-  height: auto;
-  max-height: 0;
-  transition: max-height 0.6s;
-  top: 100%;
-  left: 50%;
-  flex-direction: column;
-  background-color: white;
-  white-space: nowrap;
-}
-main header nav ul li.active a {
-  color: #3c4144;
-  border-bottom: 3px solid;
-}
-main header nav ul li:hover a {
-  color: #3c4144;
-}
-main header nav ul li:hover .submenu {
-  visibility: unset;
-  max-height: 1000px;
-}
-main header nav ul li:hover .submenu a {
-  color: #96a5ae;
-  border: none;
-}
-main header nav ul li:hover .submenu li:hover a {
-  color: #3c4144;
-}
-main header nav .burger {
-  display: none;
-}
-@media screen and (max-width: 560px) {
-  main header nav {
-    justify-content: space-between;
-  }
-  main header nav .burger {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    flex-direction: row;
-    flex-direction: column;
-    font-weight: bold;
-    border: 1px solid;
-    margin: 0 20px;
-    cursor: pointer;
-    border-radius: 100%;
-    width: 35px;
-    height: 35px;
-    color: #555d61;
-    font-size: 25px;
-  }
-  main header nav ul {
-    display: none;
-  }
-  main header nav ul.responsive-show {
-    display: flex;
-    flex-direction: column;
-    position: absolute;
-    right: 0;
-    max-width: 100vw;
-    min-width: 50vw;
-    top: 60px;
-    background-color: white;
-    box-shadow: 0 4px 6px 2px #0000000a;
-    height: unset;
-  }
-  main header nav ul.responsive-show li.active a {
-    border: none;
-  }
-  main header nav ul.responsive-show li .submenu {
-    display: flex;
-    visibility: visible;
-    position: relative;
-    height: unset;
-    max-height: unset;
-    transition: max-height 0.6s;
-    top: unset;
-    left: unset;
-    margin-left: 20px;
-  }
-  main header nav ul.responsive-show li .submenu li a {
-    font-weight: 400;
-    font-size: 14px;
-    color: #96a5ae;
-  }
-}
-main #page-container {
-  width: 100%;
-  flex: 1;
-}
-main #page-container .page-header {
-  background-image: url("/assets/images/wallpaper_binary.png");
-  padding: 50px 0;
-}
-main #page-container .page-header h1 {
-  padding: 15px 40px 0;
-  font-size: 25px;
-  color: #4baabb;
-  margin: 0 auto;
-}
-main #page-container .page-header p {
-  color: #72e3f0;
-  font-style: italic;
-  padding: 15px 40px 15px 100px;
-  margin: 0 auto;
-  font-size: 18px;
-}
-main #page-container .page-header p * {
-  color: #72e3f0;
-}
-main #page-container .page-header .big-logo {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  gap: 20px;
-  padding: 20px;
-}
-main #page-container .page-header .big-logo img {
-  width: 200px;
-  max-width: 100%;
-}
-main #page-container .page-header .big-logo img.logo-text {
-  width: 300px;
-  max-width: 100%;
-}
-main #page-container .page-header .logo {
-  padding-left: 30px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-}
-main #page-container .page-header .logo img {
-  width: 100%;
-}
-@media screen and (max-width: 560px) {
-  main #page-container .page-header h1 {
-    padding: 15px 20px 0;
-  }
-  main #page-container .page-header p {
-    padding: 20px 20px 30px 40px;
-    text-align: justify;
-  }
-  main #page-container .page-header .big-logo {
-    flex-direction: column;
-  }
-}
-main #page-container .page-header.logo-left .grid-wrapper {
-  display: grid;
-  grid-template-columns: 120px 1fr;
-  grid-template-rows: auto 1fr;
-}
-main #page-container .page-header.logo-left .grid-wrapper h1 {
-  width: 100%;
-}
-main #page-container .page-header.logo-left .grid-wrapper .logo {
-  grid-column: 1;
-  grid-row: 1;
-  width: 100%;
-}
-main #page-container .page-header.logo-left .grid-wrapper p {
-  margin: 0;
-  grid-column: 1/span 2;
-}
-@media screen and (max-width: 780px) {
-  main #page-container .page-header.logo-left .grid-wrapper h1 {
-    padding: 0 20px;
-  }
-  main #page-container .page-header.logo-left .grid-wrapper .logo {
-    padding: 0 20px;
-  }
-}
-main #page-container .page-philo {
-  background-image: url("/assets/images/wallpaper_binary.png");
-  padding: 120px 30px;
-}
-main #page-container .page-philo p {
-  width: 100%;
-  max-width: 600px;
-  font-size: 18px;
-  color: #aabbc8;
-  text-align: center;
-  font-style: italic;
-  font-weight: bold;
-}
-main #page-container .page-philo p * {
-  color: #aabbc8;
-}
-main #page-container .page-contents-center {
-  width: 1300px;
-  max-width: 100%;
-  margin: 0 auto;
-}
-@media screen and (max-width: 1300px) {
-  main #page-container .page-contents-center {
-    padding: 20px 20px 0;
-  }
-}
-main #page-container h2.page-section-title {
-  color: #4baabb;
-  padding: 20px 0 10px;
-  width: 1300px;
-  max-width: 100%;
-  margin: 0 auto;
-}
-@media screen and (max-width: 1300px) {
-  main #page-container h2.page-section-title {
-    padding: 20px 20px 0;
-  }
-}
-main #page-container #home-page {
-  display: flex;
-  flex-direction: column;
-}
-main #page-container #home-page .section-title {
-  padding: 10px;
-  margin: 0;
-  color: #aabbc8;
-}
-main #page-container #home-page .page-header .philo-bubbles {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-wrap: wrap;
-  gap: 40px;
-  margin: 30px 20px;
-}
-@media screen and (max-width: 780px) {
-  main #page-container #home-page .page-header .philo-bubbles {
-    gap: 20px;
-  }
-}
-main #page-container #home-page .page-header .philo-bubbles li {
-  border-radius: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  background-color: #d4d9dd;
-  width: 100px;
-  height: 100px;
-}
-main #page-container #home-page .page-header .philo-bubbles li * {
-  color: #6b7880;
-}
-@media screen and (max-width: 560px) {
-  main #page-container #home-page .page-header .philo-bubbles li {
-    width: 75px;
-    height: 75px;
-  }
-  main #page-container #home-page .page-header .philo-bubbles li * {
-    font-size: 12px;
-  }
-}
-main #page-container #home-page .page-header .philo-bubbles li:first-child {
-  background-color: #6b7880;
-}
-main #page-container #home-page .page-header .philo-bubbles li:first-child * {
-  color: white;
-}
-main #page-container #home-page .page-header .philo-bubbles li:last-child {
-  background-color: #35393c;
-}
-main #page-container #home-page .page-header .philo-bubbles li:last-child * {
-  color: #96a5ae;
-}
-main #page-container #home-page #news {
-  padding: 60px 20px;
-}
-main #page-container #home-page #news .articles-displayer {
-  margin: 0 auto 40px;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons {
-  display: flex;
-  justify-content: space-between;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn,
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn {
-  border: none;
-  background: none;
-  display: flex;
-  align-items: center;
-  gap: 10px;
-  padding: 5px 0;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled,
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled {
-  visibility: hidden;
-  pointer-events: none;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active,
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active {
-  cursor: pointer;
-  color: #6b7880;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover,
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover {
-  color: #3c4144;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after {
-  content: " ";
-  border-style: solid;
-  border-width: 2px 2px 0 0;
-  width: 8px;
-  height: 8px;
-  transform: rotate(45deg);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-}
-main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before {
-  content: " ";
-  border-style: solid;
-  border-width: 2px 2px 0 0;
-  width: 8px;
-  height: 8px;
-  transform: rotate(-135deg);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-}
-main #page-container #home-page #news .articles-displayer article {
-  display: grid;
-  gap: 5px 50px;
-  grid-template-rows: auto auto auto 1fr;
-  position: relative;
-  padding-left: 20px;
-}
-main #page-container #home-page #news .articles-displayer article.grid-1 {
-  grid-template-columns: 1fr;
-}
-main #page-container #home-page #news .articles-displayer article.grid-2 {
-  grid-template-columns: 1fr 1fr;
-}
-main #page-container #home-page #news .articles-displayer article .date {
-  grid-column: 1;
-  grid-row: 1;
-  text-align: right;
-}
-main #page-container #home-page #news .articles-displayer article .date time {
-  color: #6b7880;
-  font-style: italic;
-  font-size: 12px;
-}
-main #page-container #home-page #news .articles-displayer article .title {
-  grid-column: 1;
-  grid-row: 2;
-}
-main #page-container #home-page #news .articles-displayer article .title h3 {
-  margin: 0 0 10px;
-}
-main #page-container #home-page #news .articles-displayer article .subtitle {
-  grid-column: 1;
-  grid-row: 3;
-  font-style: italic;
-  font-size: 15px;
-}
-main #page-container #home-page #news .articles-displayer article .body {
-  grid-column: 1;
-  grid-row: 4;
-  min-height: 200px;
-  padding-bottom: 40px;
-  text-align: justify;
-}
-main #page-container #home-page #news .articles-displayer article .image-carousel {
-  grid-row: 1/span 4;
-  grid-column: 2;
-}
-main #page-container #home-page #news .articles-displayer article .image-carousel img {
-  max-height: 100%;
-}
-main #page-container #home-page #news .articles-displayer article.article-placeholder {
-  padding: 0;
-}
-main #page-container #home-page #news .articles-displayer article.article-placeholder * {
-  background-color: #d4d9dd;
-}
-main #page-container #home-page #news .articles-displayer article.article-placeholder .date {
-  height: 10px;
-}
-main #page-container #home-page #news .articles-displayer article.article-placeholder .title {
-  height: 40px;
-}
-main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle {
-  height: 30px;
-}
-@media screen and (max-width: 900px) {
-  main #page-container #home-page #news .articles-displayer article {
-    gap: 5px;
-    padding: 0;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 {
-    grid-template-columns: 1fr;
-    grid-template-rows: 300px auto auto auto 1fr;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 .date {
-    grid-row: 2;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 .title {
-    grid-row: 3;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle {
-    grid-row: 4;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 .body {
-    grid-row: 5;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel {
-    grid-row: 1;
-    grid-column: 1;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-1 .date {
-    grid-row: 1;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-1 .title {
-    grid-row: 2;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle {
-    grid-row: 3;
-  }
-  main #page-container #home-page #news .articles-displayer article.grid-1 .body {
-    grid-row: 4;
-  }
-  main #page-container #home-page #news .articles-displayer article .date,
-main #page-container #home-page #news .articles-displayer article .title,
-main #page-container #home-page #news .articles-displayer article .subtitle {
-    padding: 0 10px;
-  }
-  main #page-container #home-page #news .articles-displayer article .body {
-    padding: 0 10px 30px;
-  }
-}
-main #page-container #home-page .poles {
-  display: grid;
-  grid-template-columns: 1fr 1fr 1fr;
-  gap: 30px;
-  padding: 100px 0;
-}
-main #page-container #home-page .poles .theme-card {
-  display: flex;
-  flex-direction: column;
-  width: 100%;
-  cursor: pointer;
-  transition: transform 0.3s;
-}
-main #page-container #home-page .poles .theme-card .card-img {
-  width: 100%;
-  height: 240px;
-  overflow: hidden;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-  position: relative;
-}
-main #page-container #home-page .poles .theme-card .card-img img {
-  position: absolute;
-  max-width: 100%;
-  height: 100%;
-  padding: 10px;
-}
-main #page-container #home-page .poles .theme-card .card-title h2 {
-  margin: 0;
-  text-align: center;
-  padding: 10px 20px;
-  color: #4baabb;
-  display: block;
-  background-color: white;
-}
-main #page-container #home-page .poles .theme-card .card-description {
-  flex: 1;
-  padding: 30px 20px;
-}
-main #page-container #home-page .poles .theme-card .card-description p {
-  margin: 0;
-  color: #4baabb;
-  text-align: center;
-}
-main #page-container #home-page .poles .theme-card:hover {
-  transform: scale(1.03);
-}
-main #page-container #home-page .kuadrado-values {
-  background-image: url("/assets/images/wallpaper_binary_light.png");
-  padding: 100px 0 120px;
-}
-main #page-container #home-page .kuadrado-values *:not(a, blue) {
-  color: #d4d9dd;
-}
-main #page-container #home-page .kuadrado-values h2 {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  margin: 0 auto 60px;
-  width: 120px;
-  height: 120px;
-  background-image: url("/assets/images/wallpaper_binary.png");
-  border-radius: 100%;
-  color: #72e3f0;
-}
-main #page-container #home-page .kuadrado-values ul.values-list {
-  display: grid;
-  grid-template-columns: repeat(3, 1fr);
-  gap: 30px;
-}
-main #page-container #home-page .kuadrado-values ul.values-list li {
-  background-image: url("/assets/images/wallpaper_binary.png");
-  padding: 30px 20px 40px;
-}
-main #page-container #home-page .kuadrado-values ul.values-list li h3 {
-  text-align: center;
-}
-main #page-container #home-page .kuadrado-values ul.values-list li p {
-  text-align: justify;
-}
-main #page-container #home-page #whoami {
-  padding: 20px 0 50px;
-}
-main #page-container #home-page #whoami .page-contents-center {
-  padding: 40px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-}
-main #page-container #home-page #whoami .page-contents-center h2 {
-  text-align: center;
-  background-color: #6b7880;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-  width: 220px;
-  height: 220px;
-  border-radius: 100%;
-  padding: 30px;
-  margin: 40px 0;
-  color: #72e3f0;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header {
-  display: grid;
-  grid-template-columns: auto 1fr;
-  gap: 30px;
-  padding: 50px 0;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img {
-  width: 150px;
-  height: auto;
-  border-radius: 100%;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3 {
-  font-size: 22px;
-  color: #96a5ae;
-  margin: 0;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 {
-  font-size: 18px;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong,
-main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 {
-  color: #96a5ae;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .body p {
-  font-size: 18px;
-  font-style: italic;
-  font-family: serif;
-  color: #555d61;
-}
-main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue, a) {
-  color: #555d61;
-}
-@media screen and (max-width: 560px) {
-  main #page-container #home-page #whoami .page-contents-center .presentation-card .header {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    flex-direction: row;
-    flex-direction: column;
-  }
-  main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text {
-    text-align: center;
-  }
-}
-@media screen and (max-width: 900px) {
-  main #page-container #home-page .poles {
-    grid-template-columns: 1fr;
-    gap: 40px;
-  }
-  main #page-container #home-page .poles .theme-card {
-    transition: transform 0.3s;
-  }
-  main #page-container #home-page .poles .theme-card .card-img {
-    height: 300px;
-  }
-  main #page-container #home-page .poles .theme-card .card-img img {
-    min-width: unset;
-    height: 100%;
-  }
-  main #page-container #home-page .poles .theme-card .card-title h2 {
-    padding: 5px 20px;
-  }
-  main #page-container #home-page .poles .theme-card .card-description {
-    padding: 20px 30px;
-  }
-  main #page-container #home-page .poles .theme-card:hover {
-    transform: none;
-  }
-  main #page-container #home-page .kuadrado-values ul.values-list {
-    grid-template-columns: 1fr;
-  }
-}
-@media screen and (max-width: 1300px) {
-  main #page-container #home-page .poles {
-    padding: 20px;
-  }
-  main #page-container #home-page .articles-displayer {
-    padding: 0;
-  }
-}
-main #page-container #education-page h3.big {
-  font-size: 30px;
-}
-main #page-container #education-page .title-banner {
-  display: flex;
-  justify-content: flex-end;
-  flex-direction: column;
-  height: 20vw;
-  min-height: 250px;
-  background-image: url("/assets/images/popularization_banner.png");
-  background-size: cover;
-  background-repeat: no-repeat;
-  background-position: center;
-}
-main #page-container #education-page .title-banner h2 {
-  color: white;
-  font-size: 2.5em;
-  margin: 40px;
-  text-shadow: 0 0 6px #0003;
-}
-main #page-container #education-page .special-announcement {
-  background-color: #ffd000;
-}
-main #page-container #education-page .special-announcement .page-contents-center {
-  padding: 0 20px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-}
-main #page-container #education-page .special-announcement .page-contents-center p {
-  color: #555d61;
-  font-size: 20px;
-  font-weight: 600;
-  margin: 0;
-  padding: 40px 0;
-}
-main #page-container #education-page .edu-themes {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 50px;
-  font-family: monospace;
-  padding: 70px 0;
-}
-main #page-container #education-page .edu-themes .edu-theme {
-  display: grid;
-  grid-template-columns: auto 1fr;
-}
-main #page-container #education-page .edu-themes .edu-theme * {
-  border-style: dashed;
-  border-color: #00ff00;
-  border-width: 0 0 0 0;
-}
-main #page-container #education-page .edu-themes .edu-theme h3 {
-  color: #00ff00;
-  grid-row: 1;
-  margin: 0;
-  padding: 10px;
-  display: flex;
-  align-items: center;
-  border-width: 0 0 0 1px;
-}
-main #page-container #education-page .edu-themes .edu-theme img {
-  width: 100%;
-  grid-row: 1/span 2;
-  border-width: 1px 0 1px 1px;
-}
-main #page-container #education-page .edu-themes .edu-theme p {
-  text-align: justify;
-  color: #72e3f0;
-  grid-row: 2;
-  margin: 0;
-  padding: 10px 30px 0 10px;
-  border-width: 1px 1px 1px 0;
-}
-main #page-container #education-page .edu-themes .edu-theme p * {
-  color: #72e3f0;
-}
-main #page-container #education-page .practical-info {
-  padding: 50px 0;
-}
-main #page-container #education-page .practical-info .page-contents-center {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 50px;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block {
-  display: grid;
-  grid-template-rows: auto 1fr;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block .info-title {
-  color: #4baabb;
-  margin: 0;
-  border-bottom: 1px dashed #aabbc8;
-  border-left: 1px dashed #aabbc8;
-  padding: 10px;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block .info-body {
-  margin: 0;
-  padding: 20px 10px;
-  border-right: 1px dashed #aabbc8;
-  border-bottom: 1px dashed #aabbc8;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block ul {
-  display: flex;
-  flex-direction: column;
-  gap: 5px;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth) {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 10px;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span {
-  padding: 3px 0;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child {
-  font-weight: bold;
-  color: #6b7880;
-}
-main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child {
-  color: #4baabb;
-}
-@media screen and (max-width: 1200px) {
-  main #page-container #education-page .edu-themes {
-    grid-template-columns: 1fr;
-    gap: 30px;
-    padding: 70px 0;
-  }
-}
-@media screen and (max-width: 780px) {
-  main #page-container #education-page .practical-info .page-contents-center {
-    grid-template-columns: 1fr;
-    gap: 30px;
-  }
-  main #page-container #education-page .practical-info .page-contents-center .info-block .info-title {
-    border-top: 1px dashed #aabbc8;
-  }
-  main #page-container #education-page .practical-info .page-contents-center .info-block .info-body {
-    border-bottom: none;
-  }
-}
-@media screen and (max-width: 560px) {
-  main #page-container #education-page .edu-themes .edu-theme h3 {
-    border-width: 0 0 1px 1px;
-  }
-  main #page-container #education-page .edu-themes .edu-theme img {
-    max-width: 150px;
-    height: auto;
-    grid-row: 1;
-    border-width: 1px 0 0 1px;
-  }
-  main #page-container #education-page .edu-themes .edu-theme p {
-    grid-row: 2;
-    grid-column: 1/span 2;
-    padding: 20px 10px 30px 10px;
-    border-width: 0 1px 1px 1px;
-  }
-}
-main #page-container #games-page .game-articles article {
-  display: grid;
-  grid-template-columns: 0.7fr 1fr;
-  gap: 30px 50px;
-  margin: 20px 0;
-}
-main #page-container #games-page .game-articles article.game-article {
-  grid-template-rows: repeat(7, auto);
-  width: 100%;
-}
-main #page-container #games-page .game-articles article.game-article .game-title {
-  grid-column: 1/span 2;
-  margin: 0;
-  padding: 30px 20px;
-  color: #aabbc8;
-  font-size: 35px;
-  font-style: italic;
-}
-main #page-container #games-page .game-articles article.game-article .game-banner {
-  grid-column: 1/span 2;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-  background-color: black;
-  overflow: hidden;
-}
-main #page-container #games-page .game-articles article.game-article .game-banner img {
-  height: 500px;
-}
-main #page-container #games-page .game-articles article.game-article .game-tags {
-  display: flex;
-  gap: 10px;
-  flex-wrap: wrap;
-  margin: 10px 20px;
-}
-main #page-container #games-page .game-articles article.game-article .game-tags span {
-  font-size: 12px;
-  padding: 4px;
-  background-color: #d4d9dd;
-  color: #6b7880;
-  border-radius: 5px;
-  font-weight: 600;
-}
-main #page-container #games-page .game-articles article.game-article .game-subtitle {
-  grid-column: 1;
-  margin: 10px 20px;
-  color: #6b7880;
-}
-main #page-container #games-page .game-articles article.game-article .game-description {
-  grid-column: 1;
-  text-align: justify;
-  margin: 10px 20px 30px;
-}
-main #page-container #games-page .game-articles article.game-article .image-carousel {
-  grid-column: 2;
-  grid-row: 3/span 4;
-  height: 100%;
-}
-main #page-container #games-page .game-articles article.game-article .game-team {
-  grid-column: 1/span 2;
-}
-main #page-container #games-page .game-articles article.game-article .game-team h2 {
-  color: #6b7880;
-  padding: 10px 20px;
-  font-style: italic;
-  font-size: 20px;
-  margin: 0;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members {
-  display: flex;
-  flex-direction: column;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member {
-  display: grid;
-  grid-template-columns: 80px 1fr;
-  grid-template-rows: auto auto 1fr;
-  margin: 10px;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img {
-  grid-row: 1/span 3;
-  overflow: hidden;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img {
-  width: 100%;
-  padding: 0 10px 0 0;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title {
-  margin: 0 0 5px;
-  color: #6b7880;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle {
-  margin: 0 10px;
-  font-size: 14px;
-  color: #96a5ae;
-  font-style: italic;
-}
-main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body {
-  margin: 10px 10px 20px 20px;
-  text-align: justify;
-}
-main #page-container #games-page .game-articles article.placeholder {
-  height: 400px;
-}
-main #page-container #games-page .game-articles article.placeholder * {
-  background-color: #d4d9dd;
-}
-@media screen and (max-width: 900px) {
-  main #page-container #games-page .game-articles article {
-    grid-template-columns: 1fr;
-  }
-  main #page-container #games-page .game-articles article.game-article {
-    grid-template-rows: repeat(6, auto);
-  }
-  main #page-container #games-page .game-articles article.game-article .game-title {
-    grid-column: 1;
-    padding: 0;
-    font-size: 25px;
-  }
-  main #page-container #games-page .game-articles article.game-article .game-banner {
-    grid-column: 1;
-    margin: 0 -20px;
-  }
-  main #page-container #games-page .game-articles article.game-article .image-carousel {
-    grid-column: 1;
-    grid-row: 3;
-    height: 400px;
-    margin: 0 -20px;
-  }
-  main #page-container #games-page .game-articles article.game-article .game-team {
-    grid-column: 1;
-  }
-  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member {
-    grid-template-columns: 70px 1fr;
-  }
-  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img {
-    grid-row: 1/span 2;
-  }
-  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body {
-    grid-column: 1/span 2;
-  }
-}
-main #page-container #software-page .software-articles {
-  margin: 20px auto 50px;
-}
-main #page-container #software-page .software-articles article.software-article {
-  display: grid;
-  grid-template-columns: 1fr 0.7fr;
-  margin: 0 0 30px;
-  gap: 10px 30px;
-}
-main #page-container #software-page .software-articles article.software-article .software-title {
-  grid-column: 1/span 2;
-  color: #aabbc8;
-  margin: 0;
-  padding: 10px;
-}
-main #page-container #software-page .software-articles article.software-article .software-date {
-  margin: 0;
-  color: #96a5ae;
-  font-style: italic;
-  text-align: right;
-  color: #6b7880;
-  font-style: italic;
-  font-size: 12px;
-}
-main #page-container #software-page .software-articles article.software-article .software-subtitle {
-  grid-column: 1;
-  margin: 10px;
-  color: #6b7880;
-}
-main #page-container #software-page .software-articles article.software-article .software-description {
-  grid-column: 1;
-  text-align: justify;
-  margin: 10px;
-}
-main #page-container #software-page .software-articles article.software-article .image-carousel {
-  grid-column: 2;
-  grid-row: 2/span 6;
-  min-height: 250px;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical {
-  grid-column: 1;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical h2 {
-  color: #6b7880;
-  margin: 0 10px;
-  padding: 10px 0 0;
-  font-size: 16px;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details {
-  margin: 10px;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail {
-  display: grid;
-  grid-template-columns: 1fr auto;
-  font-size: 12px;
-  border-bottom: 1px solid #d4d9dd;
-  padding: 5px 0;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label {
-  font-weight: bold;
-  color: #6b7880;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 10px;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical ul.releases {
-  margin: 10px;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical .detail {
-  display: grid;
-  grid-template-columns: 1fr auto;
-  font-size: 12px;
-  border-bottom: 1px solid #d4d9dd;
-  padding: 5px 0;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical .detail label {
-  font-weight: bold;
-  color: #6b7880;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical .detail .label {
-  color: #aabbc8;
-}
-main #page-container #software-page .software-articles article.software-article .software-technical .detail ul {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 10px;
-}
-@media screen and (max-width: 900px) {
-  main #page-container #software-page .software-articles article.software-article {
-    grid-template-columns: 1fr;
-  }
-  main #page-container #software-page .software-articles article.software-article .software-title {
-    grid-column: 1;
-  }
-  main #page-container #software-page .software-articles article.software-article .image-carousel {
-    grid-column: 1;
-    grid-row: 2;
-    height: 200px;
-  }
-  main #page-container #software-page .software-articles article.software-article .software-technical {
-    grid-column: 1;
-  }
-}
-main #page-container #software-page .software-articles article.placeholder {
-  display: flex;
-  flex-direction: column;
-  gap: 10px;
-  margin: 30px;
-}
-main #page-container #software-page .software-articles article.placeholder * {
-  background-color: #d4d9dd;
-}
-main #page-container #software-page .software-articles article.placeholder .title {
-  height: 60px;
-}
-main #page-container #software-page .software-articles article.placeholder .body {
-  height: 400px;
-}
-main #page-container #software-page .software-articles article.placeholder .details {
-  height: 200px;
-}
-main footer {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  flex-direction: column;
-  width: 100%;
-  background-image: url("/assets/images/wallpaper_binary.png");
-  padding: 40px 20px;
-  gap: 20px;
-  font-size: 12px;
-}
-main footer span {
-  color: #96a5ae;
-  text-align: center;
-}
-main footer .logo {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  gap: 10px;
-}
-main footer .logo img {
-  width: 35px;
-}
-main footer .logo img.text-logo {
-  width: 100px;
-}
-main footer .social {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  gap: 20px;
-}
-main footer .social a {
-  background-color: #555d61;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: row;
-  width: 25px;
-  height: 25px;
-  font-weight: bold;
-  font-size: 16px;
-  border-radius: 100%;
-}
-
-/*# sourceMappingURL=style.css.map */
+body{font-family:Arial,Helvetica,sans-serif;margin:0}body *{box-sizing:border-box;color:#35393c;line-height:1.3em}body ul{margin:0;padding:0;list-style-type:none}body a{color:#4baabb;text-decoration:none}body a:hover{color:#72e3f0}body blue{color:#4baabb}body red{color:#9c3030}body green{color:#368736}body emoji{font-style:initial;font-size:25px}body .bg-blue{background-color:#4baabb;color:#fff}body .bg-dark{background-color:#3c4144;color:#aabbc8}body #seo-title{visibility:hidden}body img.pixelated{image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:crisp-edges}main{display:flex;flex-direction:column;align-items:center;min-height:100vh}main .warning-banner{background:url("/assets/images/wallpaper_warning.svg");width:100%;height:40px;padding:20px 10%;display:flex;justify-content:center;align-items:center;flex-direction:row}main .warning-banner strong{font-size:18px;color:#1c3db2}main .image-carousel{overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#000;position:relative}main .image-carousel img{position:absolute;max-width:100%;max-height:400px}main .image-carousel .carousel-bullets{position:absolute;bottom:0;padding:20px;display:flex;gap:10px}main .image-carousel .carousel-bullets .bullet{cursor:pointer;width:8px;height:8px;background-color:#6b7880;border-radius:100%;box-shadow:0 0 3px #000}main .image-carousel .carousel-bullets .bullet.active{background-color:#d4d9dd}@media screen and (max-width: 900px){main .image-carousel img{max-height:100%}main .image-carousel .carousel-bullets{gap:30px}main .image-carousel .carousel-bullets .bullet{width:12px;height:12px}}main header{width:100%;background-color:#fff;position:sticky;position:-webkit-sticky;top:0;z-index:10}main header nav{display:flex;align-items:center;height:60px}main header nav .home{margin:0 10px}main header nav .home a{display:flex;align-items:center;gap:10px}main header nav .home a img{height:40px;width:auto}main header nav .home a img.logo-text{width:120px;height:auto}main header nav ul{display:flex;padding:0;margin:0;list-style-type:none;height:100%}main header nav ul li{position:relative}main header nav ul li a{display:flex;align-items:center;height:100%;padding:10px 20px;color:#96a5ae;font-weight:800;text-decoration:none}main header nav ul li .submenu{visibility:hidden;overflow:hidden;position:absolute;height:auto;max-height:0;transition:max-height .6s;top:100%;left:50%;flex-direction:column;background-color:#fff;white-space:nowrap}main header nav ul li.active a{color:#3c4144;border-bottom:3px solid}main header nav ul li:hover a{color:#3c4144}main header nav ul li:hover .submenu{visibility:unset;max-height:1000px}main header nav ul li:hover .submenu a{color:#96a5ae;border:none}main header nav ul li:hover .submenu li:hover a{color:#3c4144}main header nav .burger{display:none}@media screen and (max-width: 560px){main header nav{justify-content:space-between}main header nav .burger{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;font-weight:bold;border:1px solid;margin:0 20px;cursor:pointer;border-radius:100%;width:35px;height:35px;color:#555d61;font-size:25px}main header nav ul{display:none}main header nav ul.responsive-show{display:flex;flex-direction:column;position:absolute;right:0;max-width:100vw;min-width:50vw;top:60px;background-color:#fff;box-shadow:0 4px 6px 2px #0000000a;height:unset}main header nav ul.responsive-show li.active a{border:none}main header nav ul.responsive-show li .submenu{display:flex;visibility:visible;position:relative;height:unset;max-height:unset;transition:max-height .6s;top:unset;left:unset;margin-left:20px}main header nav ul.responsive-show li .submenu li a{font-weight:400;font-size:14px;color:#96a5ae}}main #page-container{width:100%;flex:1}main #page-container .page-header{background-image:url("/assets/images/wallpaper_binary.png");padding:50px 0}main #page-container .page-header h1{padding:15px 40px 0;font-size:25px;color:#4baabb;margin:0 auto}main #page-container .page-header p{color:#72e3f0;font-style:italic;padding:15px 40px 15px 100px;margin:0 auto;font-size:18px}main #page-container .page-header p *{color:#72e3f0}main #page-container .page-header .big-logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px;padding:20px}main #page-container .page-header .big-logo img{width:200px;max-width:100%}main #page-container .page-header .big-logo img.logo-text{width:300px;max-width:100%}main #page-container .page-header .logo{padding-left:30px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container .page-header .logo img{width:100%}@media screen and (max-width: 560px){main #page-container .page-header h1{padding:15px 20px 0}main #page-container .page-header p{padding:20px 20px 30px 40px;text-align:justify}main #page-container .page-header .big-logo{flex-direction:column}}main #page-container .page-header.logo-left .grid-wrapper{display:grid;grid-template-columns:120px 1fr;grid-template-rows:auto 1fr}main #page-container .page-header.logo-left .grid-wrapper h1{width:100%}main #page-container .page-header.logo-left .grid-wrapper .logo{grid-column:1;grid-row:1;width:100%}main #page-container .page-header.logo-left .grid-wrapper p{margin:0;grid-column:1/span 2}@media screen and (max-width: 780px){main #page-container .page-header.logo-left .grid-wrapper h1{padding:0 20px}main #page-container .page-header.logo-left .grid-wrapper .logo{padding:0 20px}}main #page-container .page-philo{background-image:url("/assets/images/wallpaper_binary.png");padding:120px 30px}main #page-container .page-philo p{width:100%;max-width:600px;font-size:18px;color:#aabbc8;text-align:center;font-style:italic;font-weight:bold}main #page-container .page-philo p *{color:#aabbc8}main #page-container .page-contents-center{width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container .page-contents-center{padding:20px 20px 0}}main #page-container h2.page-section-title{color:#4baabb;padding:20px 0 10px;width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container h2.page-section-title{padding:20px 20px 0}}main #page-container #home-page{display:flex;flex-direction:column}main #page-container #home-page .section-title{padding:10px;margin:0;color:#aabbc8}main #page-container #home-page .page-header .philo-bubbles{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-wrap:wrap;gap:40px;margin:30px 20px}@media screen and (max-width: 780px){main #page-container #home-page .page-header .philo-bubbles{gap:20px}}main #page-container #home-page .page-header .philo-bubbles li{border-radius:100%;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#d4d9dd;width:100px;height:100px}main #page-container #home-page .page-header .philo-bubbles li *{color:#6b7880}@media screen and (max-width: 560px){main #page-container #home-page .page-header .philo-bubbles li{width:75px;height:75px}main #page-container #home-page .page-header .philo-bubbles li *{font-size:12px}}main #page-container #home-page .page-header .philo-bubbles li:first-child{background-color:#6b7880}main #page-container #home-page .page-header .philo-bubbles li:first-child *{color:#fff}main #page-container #home-page .page-header .philo-bubbles li:last-child{background-color:#35393c}main #page-container #home-page .page-header .philo-bubbles li:last-child *{color:#96a5ae}main #page-container #home-page #news{padding:60px 20px}main #page-container #home-page #news .articles-displayer{margin:0 auto 40px}main #page-container #home-page #news .articles-displayer .prev-next-buttons{display:flex;justify-content:space-between}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn{border:none;background:none;display:flex;align-items:center;gap:10px;padding:5px 0}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled{visibility:hidden;pointer-events:none}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active{cursor:pointer;color:#6b7880}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover{color:#3c4144}main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(45deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(-135deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer article{display:grid;gap:5px 50px;grid-template-rows:auto auto auto 1fr;position:relative;padding-left:20px}main #page-container #home-page #news .articles-displayer article.grid-1{grid-template-columns:1fr}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr 1fr}main #page-container #home-page #news .articles-displayer article .date{grid-column:1;grid-row:1;text-align:right}main #page-container #home-page #news .articles-displayer article .date time{color:#6b7880;font-style:italic;font-size:12px}main #page-container #home-page #news .articles-displayer article .title{grid-column:1;grid-row:2}main #page-container #home-page #news .articles-displayer article .title h3{margin:0 0 10px}main #page-container #home-page #news .articles-displayer article .subtitle{grid-column:1;grid-row:3;font-style:italic;font-size:15px}main #page-container #home-page #news .articles-displayer article .body{grid-column:1;grid-row:4;min-height:200px;padding-bottom:40px;text-align:justify}main #page-container #home-page #news .articles-displayer article .image-carousel{grid-row:1/span 4;grid-column:2}main #page-container #home-page #news .articles-displayer article .image-carousel img{max-height:100%}main #page-container #home-page #news .articles-displayer article.article-placeholder{padding:0}main #page-container #home-page #news .articles-displayer article.article-placeholder *{background-color:#d4d9dd}main #page-container #home-page #news .articles-displayer article.article-placeholder .date{height:10px}main #page-container #home-page #news .articles-displayer article.article-placeholder .title{height:40px}main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle{height:30px}@media screen and (max-width: 900px){main #page-container #home-page #news .articles-displayer article{gap:5px;padding:0}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr;grid-template-rows:300px auto auto auto 1fr}main #page-container #home-page #news .articles-displayer article.grid-2 .date{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-2 .title{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle{grid-row:4}main #page-container #home-page #news .articles-displayer article.grid-2 .body{grid-row:5}main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel{grid-row:1;grid-column:1}main #page-container #home-page #news .articles-displayer article.grid-1 .date{grid-row:1}main #page-container #home-page #news .articles-displayer article.grid-1 .title{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-1 .body{grid-row:4}main #page-container #home-page #news .articles-displayer article .date,main #page-container #home-page #news .articles-displayer article .title,main #page-container #home-page #news .articles-displayer article .subtitle{padding:0 10px}main #page-container #home-page #news .articles-displayer article .body{padding:0 10px 30px}}main #page-container #home-page .poles{display:grid;grid-template-columns:1fr 1fr 1fr;gap:30px;padding:100px 0}main #page-container #home-page .poles .theme-card{display:flex;flex-direction:column;width:100%;cursor:pointer;transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{width:100%;height:240px;overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;position:relative}main #page-container #home-page .poles .theme-card .card-img img{position:absolute;max-width:100%;height:100%;padding:10px}main #page-container #home-page .poles .theme-card .card-title h2{margin:0;text-align:center;padding:10px 20px;color:#4baabb;display:block;background-color:#fff}main #page-container #home-page .poles .theme-card .card-description{flex:1;padding:30px 20px}main #page-container #home-page .poles .theme-card .card-description p{margin:0;color:#4baabb;text-align:center}main #page-container #home-page .poles .theme-card:hover{transform:scale(1.03)}main #page-container #home-page .kuadrado-values{background-image:url("/assets/images/wallpaper_binary_light.png");padding:100px 0 120px}main #page-container #home-page .kuadrado-values *:not(a,blue){color:#d4d9dd}main #page-container #home-page .kuadrado-values h2{display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0 auto 60px;width:120px;height:120px;background-image:url("/assets/images/wallpaper_binary.png");border-radius:100%;color:#72e3f0}main #page-container #home-page .kuadrado-values ul.values-list{display:grid;grid-template-columns:repeat(3, 1fr);gap:30px}main #page-container #home-page .kuadrado-values ul.values-list li{background-image:url("/assets/images/wallpaper_binary.png");padding:30px 20px 40px}main #page-container #home-page .kuadrado-values ul.values-list li h3{text-align:center}main #page-container #home-page .kuadrado-values ul.values-list li p{text-align:justify}main #page-container #home-page #whoami{padding:20px 0 50px}main #page-container #home-page #whoami .page-contents-center{padding:40px;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center h2{text-align:center;background-color:#6b7880;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:220px;height:220px;border-radius:100%;padding:30px;margin:40px 0;color:#72e3f0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:grid;grid-template-columns:auto 1fr;gap:30px;padding:50px 0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img{width:150px;height:auto;border-radius:100%}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3{font-size:22px;color:#96a5ae;margin:0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{font-size:18px}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong,main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{color:#96a5ae}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p{font-size:18px;font-style:italic;font-family:serif;color:#555d61}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue,a){color:#555d61}@media screen and (max-width: 560px){main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text{text-align:center}}@media screen and (max-width: 900px){main #page-container #home-page .poles{grid-template-columns:1fr;gap:40px}main #page-container #home-page .poles .theme-card{transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{height:300px}main #page-container #home-page .poles .theme-card .card-img img{min-width:unset;height:100%}main #page-container #home-page .poles .theme-card .card-title h2{padding:5px 20px}main #page-container #home-page .poles .theme-card .card-description{padding:20px 30px}main #page-container #home-page .poles .theme-card:hover{transform:none}main #page-container #home-page .kuadrado-values ul.values-list{grid-template-columns:1fr}}@media screen and (max-width: 1300px){main #page-container #home-page .poles{padding:20px}main #page-container #home-page .articles-displayer{padding:0}}main #page-container #education-page h3.big{font-size:30px}main #page-container #education-page .title-banner{display:flex;justify-content:flex-end;flex-direction:column;height:20vw;min-height:250px;background-image:url("/assets/images/popularization_banner.png");background-size:cover;background-repeat:no-repeat;background-position:center}main #page-container #education-page .title-banner h2{color:#fff;font-size:2.5em;margin:40px;text-shadow:0 0 6px #0003}main #page-container #education-page .special-announcement{background-color:#ffd000}main #page-container #education-page .special-announcement .page-contents-center{padding:0 20px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #education-page .special-announcement .page-contents-center p{color:#555d61;font-size:20px;font-weight:600;margin:0;padding:40px 0}main #page-container #education-page .edu-themes{display:grid;grid-template-columns:1fr 1fr;gap:50px;font-family:monospace;padding:70px 0}main #page-container #education-page .edu-themes .edu-theme{display:grid;grid-template-columns:auto 1fr}main #page-container #education-page .edu-themes .edu-theme *{border-style:dashed;border-color:lime;border-width:0 0 0 0}main #page-container #education-page .edu-themes .edu-theme h3{color:lime;grid-row:1;margin:0;padding:10px;display:flex;align-items:center;border-width:0 0 0 1px}main #page-container #education-page .edu-themes .edu-theme img{width:100%;grid-row:1/span 2;border-width:1px 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme p{text-align:justify;color:#72e3f0;grid-row:2;margin:0;padding:10px 30px 0 10px;border-width:1px 1px 1px 0}main #page-container #education-page .edu-themes .edu-theme p *{color:#72e3f0}main #page-container #education-page .practical-info{padding:50px 0}main #page-container #education-page .practical-info .page-contents-center{display:grid;grid-template-columns:1fr 1fr;gap:50px}main #page-container #education-page .practical-info .page-contents-center .info-block{display:grid;grid-template-rows:auto 1fr}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{color:#4baabb;margin:0;border-bottom:1px dashed #aabbc8;border-left:1px dashed #aabbc8;padding:10px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{margin:0;padding:20px 10px;border-right:1px dashed #aabbc8;border-bottom:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block ul{display:flex;flex-direction:column;gap:5px}main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth){display:grid;grid-template-columns:1fr 1fr;gap:10px}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span{padding:3px 0}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child{font-weight:bold;color:#6b7880}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child{color:#4baabb}@media screen and (max-width: 1200px){main #page-container #education-page .edu-themes{grid-template-columns:1fr;gap:30px;padding:70px 0}}@media screen and (max-width: 780px){main #page-container #education-page .practical-info .page-contents-center{grid-template-columns:1fr;gap:30px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{border-top:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{border-bottom:none}}@media screen and (max-width: 560px){main #page-container #education-page .edu-themes .edu-theme h3{border-width:0 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme img{max-width:150px;height:auto;grid-row:1;border-width:1px 0 0 1px}main #page-container #education-page .edu-themes .edu-theme p{grid-row:2;grid-column:1/span 2;padding:20px 10px 30px 10px;border-width:0 1px 1px 1px}}main #page-container #games-page .game-articles article{display:grid;grid-template-columns:.7fr 1fr;gap:30px 50px;margin:20px 0}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(7, auto);width:100%}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1/span 2;margin:0;padding:30px 20px;color:#aabbc8;font-size:35px;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1/span 2;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;background-color:#000;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-banner img{height:500px}main #page-container #games-page .game-articles article.game-article .game-tags{display:flex;gap:10px;flex-wrap:wrap;margin:10px 20px}main #page-container #games-page .game-articles article.game-article .game-tags span{font-size:12px;padding:4px;background-color:#d4d9dd;color:#6b7880;border-radius:5px;font-weight:600}main #page-container #games-page .game-articles article.game-article .game-subtitle{grid-column:1;margin:10px 20px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-description{grid-column:1;text-align:justify;margin:10px 20px 30px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:2;grid-row:3/span 4;height:100%}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team h2{color:#6b7880;padding:10px 20px;font-style:italic;font-size:20px;margin:0}main #page-container #games-page .game-articles article.game-article .game-team .team-members{display:flex;flex-direction:column}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{display:grid;grid-template-columns:80px 1fr;grid-template-rows:auto auto 1fr;margin:10px}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 3;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img{width:100%;padding:0 10px 0 0}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title{margin:0 0 5px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle{margin:0 10px;font-size:14px;color:#96a5ae;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{margin:10px 10px 20px 20px;text-align:justify}main #page-container #games-page .game-articles article.placeholder{height:400px}main #page-container #games-page .game-articles article.placeholder *{background-color:#d4d9dd}@media screen and (max-width: 900px){main #page-container #games-page .game-articles article{grid-template-columns:1fr}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(6, auto)}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1;padding:0;font-size:25px}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:1;grid-row:3;height:400px;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{grid-template-columns:70px 1fr}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{grid-column:1/span 2}}main #page-container #software-page .software-articles{margin:20px auto 50px}main #page-container #software-page .software-articles article.software-article{display:grid;grid-template-columns:1fr .7fr;margin:0 0 30px;gap:10px 30px}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1/span 2;color:#aabbc8;margin:0;padding:10px}main #page-container #software-page .software-articles article.software-article .software-date{margin:0;color:#96a5ae;font-style:italic;text-align:right;color:#6b7880;font-style:italic;font-size:12px}main #page-container #software-page .software-articles article.software-article .software-subtitle{grid-column:1;margin:10px;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-description{grid-column:1;text-align:justify;margin:10px}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:2;grid-row:2/span 6;min-height:250px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}main #page-container #software-page .software-articles article.software-article .software-technical h2{color:#6b7880;margin:0 10px;padding:10px 0 0;font-size:16px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul{display:flex;flex-wrap:wrap;gap:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.releases{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical .detail .label{color:#aabbc8}main #page-container #software-page .software-articles article.software-article .software-technical .detail ul{display:flex;flex-wrap:wrap;gap:10px}@media screen and (max-width: 900px){main #page-container #software-page .software-articles article.software-article{grid-template-columns:1fr}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:1;grid-row:2;height:200px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}}main #page-container #software-page .software-articles article.placeholder{display:flex;flex-direction:column;gap:10px;margin:30px}main #page-container #software-page .software-articles article.placeholder *{background-color:#d4d9dd}main #page-container #software-page .software-articles article.placeholder .title{height:60px}main #page-container #software-page .software-articles article.placeholder .body{height:400px}main #page-container #software-page .software-articles article.placeholder .details{height:200px}main footer{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:100%;background-image:url("/assets/images/wallpaper_binary.png");padding:40px 20px;gap:20px;font-size:12px}main footer span{color:#96a5ae;text-align:center}main footer .logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:10px}main footer .logo img{width:35px}main footer .logo img.text-logo{width:100px}main footer .social{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px}main footer .social a{background-color:#555d61;display:flex;justify-content:center;align-items:center;flex-direction:row;width:25px;height:25px;font-weight:bold;font-size:16px;border-radius:100%}/*# sourceMappingURL=style.css.map */
diff --git a/public/style/theme.css b/public/style/theme.css
deleted file mode 100644
index be28275..0000000
--- a/public/style/theme.css
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-/*# sourceMappingURL=theme.css.map */
diff --git a/src/style.scss b/src/style.scss
index ffed060..5095b55 100644
--- a/src/style.scss
+++ b/src/style.scss
@@ -371,6 +371,7 @@ main {
             padding: 20px 0 10px;
             @include page-contents-center;
         }
+
         @import "./homepage.scss";
         @import "./pages/education/education.scss";
         @import "./pages/games/games.scss";
-- 
GitLab